Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Cast All

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Cast All

Mensaje por Wecoc el 2017-11-01, 19:31

Estado que hace que algunas habilidades o items afecten a todo el grupo en vez de a solo un miembro.

Se configura al inicio del script, en las globales CAST_ALL de Skill_Effects e Item_Effects, donde para cada estado puedes asignar una array con las ID de las habilidades que pasan a afectar a todo el grupo.

Notas:
- Si os preguntáis por qué no lo puse en mi lista de Tips & Tricks de batalla, es porque este es bastante más largo y ya puede considerarse un script entero, pese a que sea del mismo estilo.

- Cuidado con las incompatibilidades, porque sobreescribe algunos métodos por defecto:
Game_BattleAction :for_one_friend?, :for_one_friend_hp0?
Scene_Skill :update_skill ( Sección Input.trigger?(Input::C) )
Scene_Battle (3) :update_phase3_skill_select, :update_phase3_item_select
Scene_Battle (4) :make_skill_action_result, :make_item_action_result

- No es compatible con el Advanced Scope. Quizá en un futuro haga una versión para usar con ese script.

No requiere créditos.

Código:
#==============================================================================
# ** [XP] Cast All
#------------------------------------------------------------------------------
# Autor: Wecoc (no requiere créditos)
# Versión: 1.0
#
# Estado que hace que algunas habilidades o items afecten a todo el grupo en vez
# de a solo un miembro. Aliado -> Grupo aliado / Enemigo -> Grupo enemigo
# Nota: Las que tienen efecto Usuario seguirán afectado solo al usuario
#------------------------------------------------------------------------------
# Scope - 0: nada, 1: enemigo, 2: enemigos, 3: aliado, 4: aliados,
# 5: aliado HP 0, 6: aliados HP 0, 7: usuario
#------------------------------------------------------------------------------


module Skill_Effects
 
  # {ID Estado => [IDs Skills con Cast All]}
 
  CAST_ALL = {4 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]}
 
end


module Item_Effects
 
  # {ID Estado => [IDs Items con Cast All]}
 
  CAST_ALL = {}
 
end


#==============================================================================
# ** Game_BattleAction
#==============================================================================

class Game_BattleAction
  attr_accessor :battler

  def initialize(battler=nil)
    @battler = battler
    clear
  end

  def for_one_friend?
    scope = 0
    return false if @battler.nil?
    case @kind
    when 1 # Skill
      scope = @battler.get_skill_scope($data_skills[@skill_id])
    when 2 # Item
      scope = @battler.get_item_scope($data_items[@item_id])
    end
    return [3, 5].include?(scope)
  end

  def for_one_friend_hp0?
    scope = 0
    return false if @battler.nil?
    case @kind
    when 1 # Skill
      scope = @battler.get_skill_scope($data_skills[@skill_id])
    when 2 # Item
      scope = @battler.get_item_scope($data_items[@item_id])
    end
    return [5].include?(scope)
  end
end

#==============================================================================
# ** Game_Battler
#==============================================================================

class Game_Battler
  alias current_action_self_ini initialize unless $@
  def initialize
    current_action_self_ini
    @current_action = Game_BattleAction.new(self)
  end 
 
  def get_item_scope(item)
    result = item.scope
    for state in @states
      if Item_Effects::CAST_ALL.keys.include?(state)
        if Item_Effects::CAST_ALL[state].include?(item.id)
          result = case item.scope
            when 1 then 2 ; when 3 then 4 ; when 5 then 6
            #when 7 then (self.is_a?(Game_Actor) ? 4 : 2)
            else ; result
          end
          break
        end
      end
    end
    return result
  end
 
  def get_skill_scope(skill)
    result = skill.scope
    for state in @states
      if Skill_Effects::CAST_ALL.keys.include?(state)
        if Skill_Effects::CAST_ALL[state].include?(skill.id)
          result = case skill.scope
            when 1 then 2 ; when 3 then 4 ; when 5 then 6
            #when 7 then (self.is_a?(Game_Actor) ? 4 : 2)
            else ; result
          end
          break
        end
      end
    end
    return result
  end
end

#==============================================================================
# ** Scene_Skill
#==============================================================================

class Scene_Skill
  alias update_skill_cast_all update_skill unless $@
  def update_skill
    if Input.trigger?(Input::C)
      @skill = @skill_window.skill
      if @skill == nil or not @actor.skill_can_use?(@skill.id)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      scope = @actor.get_skill_scope(@skill)
      if scope >= 3
        @skill_window.active = false
        @target_window.x = (@skill_window.index + 1) % 2 * 304
        @target_window.visible = true
        @target_window.active = true
        if scope == 4 || scope == 6
          @target_window.index = -1
        elsif scope == 7
          @target_window.index = @actor_index - 10
        else
          @target_window.index = 0
        end
      else
        if @skill.common_event_id > 0
          $game_temp.common_event_id = @skill.common_event_id
          $game_system.se_play(@skill.menu_se)
          @actor.sp -= @skill.sp_cost
          @status_window.refresh
          @skill_window.refresh
          @target_window.refresh
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
    update_skill_cast_all
  end
end

#==============================================================================
# ** Scene_Battle
#==============================================================================

class Scene_Battle
  def update_phase3_skill_select
    @skill_window.visible = true
    @skill_window.update
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      end_skill_select
      return
    end
    if Input.trigger?(Input::C)
      @skill = @skill_window.skill
      if @skill == nil or not @active_battler.skill_can_use?(@skill.id)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      @active_battler.current_action.skill_id = @skill.id
      @skill_window.visible = false
      scope = @active_battler.get_skill_scope(@skill)
      if scope == 1
        start_enemy_select
      elsif scope == 3 or scope == 5
        start_actor_select
      else
        end_skill_select
        phase3_next_actor
      end
      return
    end
  end

  def update_phase3_item_select
    @item_window.visible = true
    @item_window.update
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      end_item_select
      return
    end
    if Input.trigger?(Input::C)
      @item = @item_window.item
      unless $game_party.item_can_use?(@item.id)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      @active_battler.current_action.item_id = @item.id
      @item_window.visible = false
      scope = @active_battler.get_item_scope(@item)
      if scope == 1
        start_enemy_select
      elsif scope == 3 or scope == 5
        start_actor_select
      else
        end_item_select
        phase3_next_actor
      end
      return
    end
  end
 
  def make_skill_action_result
    @skill = $data_skills[@active_battler.current_action.skill_id]
    unless @active_battler.current_action.forcing
      unless @active_battler.skill_can_use?(@skill.id)
        $game_temp.forcing_battler = nil
        @phase4_step = 1
        return
      end
    end
    @active_battler.sp -= @skill.sp_cost
    @status_window.refresh
    @help_window.set_text(@skill.name, 1)
    @animation1_id = @skill.animation1_id
    @animation2_id = @skill.animation2_id
    @common_event_id = @skill.common_event_id
    scope = @active_battler.get_skill_scope(@skill)
    set_target_battlers(scope)
    for target in @target_battlers
      target.skill_effect(@active_battler, @skill)
    end
  end

  def make_item_action_result
    @item = $data_items[@active_battler.current_action.item_id]
    unless $game_party.item_can_use?(@item.id)
      @phase4_step = 1
      return
    end
    if @item.consumable
      $game_party.lose_item(@item.id, 1)
    end
    @help_window.set_text(@item.name, 1)
    @animation1_id = @item.animation1_id
    @animation2_id = @item.animation2_id
    @common_event_id = @item.common_event_id
    index = @active_battler.current_action.target_index
    target = $game_party.smooth_target_actor(index)
    scope = @active_battler.get_item_scope(@item)
    set_target_battlers(scope)
    for target in @target_battlers
      target.item_effect(@item)
    end
  end
end
avatar
Wecoc
Administrador
Administrador



Créditos 12308

Gracias : 653

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Cast All

Mensaje por Wecoc el 2018-11-04, 13:18

He hecho una versión compatible con Advanced Scope tal como mencioné.
El script se vuelve mucho más simple, solo modifica un método. Además con unos mínimos conocimientos de script veréis que es fácil hacer lo mismo para estados que hagan lo contrario, es decir convertir skills que afectan a un grupo a skills que afectan solo a un target.

Tenéis que ponerlo debajo de Advanced Scope para que funcione.

Código:
#==============================================================================
# ** [XP] Cast All [Advanced Scope]
#------------------------------------------------------------------------------
# Autor: Wecoc (no requiere créditos)
# Versión: 1.0
# Esta versión requiere el script Advanced Scope
#------------------------------------------------------------------------------
# Estado que hace que algunas habilidades o items afecten a todo el grupo en vez
# de a solo un miembro. Aliado -> Grupo aliado / Enemigo -> Grupo enemigo
# Nota: Las que tienen efecto Usuario seguirán afectado solo al usuario
#==============================================================================

module Skill_Effects
  
  # {ID Estado => [IDs Skills con Cast All]}
  CAST_ALL = {4 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]}
  
end


module Item_Effects
  
  # {ID Estado => [IDs Items con Cast All]}
  CAST_ALL = {}
  
end

class Scene_Battle
  def set_target_battlers(item)
    if @active_battler.is_a?(Game_Actor)
      allies = $game_party.actors.clone
      enemies = $game_troop.enemies.clone
    else
      allies = $game_troop.enemies.clone
      enemies = $game_party.actors.clone
    end
    index = @active_battler.current_action.target_index
    result = []
    if item.scope_ally == true
      for target in allies
        result.push(target)
      end
    end
    if item.scope_enemy == true
      for target in enemies
        result.push(target)
      end
    end
    if item.scope_user == true
      if !result.include?(@active_battler)
        result.push(@active_battler)
      end
    end
    # --- Transform scope all ---
    scope_all = item.scope_all
    if scope_all == false
      if item.is_a?(RPG::Skill)
        for state in @active_battler.states
          if Skill_Effects::CAST_ALL.keys.include?(state)
            if Skill_Effects::CAST_ALL[state].include(item.id)
              scope_all = true
              break
            end
          end
        end
      elsif item.is_a?(RPG::Item)
        for state in @active_battler.states
          if Item_Effects::CAST_ALL.keys.include?(state)
            if Item_Effects::CAST_ALL[state].include(item.id)
              scope_all = true
              break
            end
          end
        end
      end
    end
    # ------
    if item.scope_user == false
      result.delete(@active_battler)
    end
    if scope_all == false
      if item.scope_random == true
        result.select!{|target| !target.dead?} if item.scope_alive == true
        result.select!{|target| target.dead?} if item.scope_alive == false
      else
        if Scope::DEFAULT_DEAD_SELECT == false
          result.select!{|target| !target.dead?} if item.scope_alive == true
          result.select!{|target| target.dead?} if item.scope_alive == false
        end
      end
    end
    result.select!{|target| !target.dead?} if item.scope_alive == true
    result.select!{|target| target.dead?} if item.scope_alive == false
    for r in item.restrictions
      if r.arity == 1
        result.select!{|target| r.call(target) == true } rescue nil
      else
        result.select!{|target| r.call == true } rescue nil
      end
    end
    if scope_all == false
      if item.scope_random == true
        result = [result[rand(result.size)]]
      else
        result = [result[index]]
      end
    end
    return result
  end
end

Cool
avatar
Wecoc
Administrador
Administrador



Créditos 12308

Gracias : 653

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Cast All

Mensaje por kyonides-arkanthos el 2018-11-06, 06:16

Algo no me queda claro... ¿No se suponía que se podía hacer simplemente si uno selecciona el scope de Todos o All en la base de datos?
avatar
kyonides-arkanthos
Principiante
Principiante

0/3

Créditos 578

Gracias : 85

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Cast All

Mensaje por Wecoc el 2018-11-06, 13:20

Sí, pero este script hace que un estado pueda alterar eso. A ver, es algo difícil de explicar.

El Advanced Scope lo que hace es añadir más posibilidades, puesto que desglosa una única variable "scope" en varias propiedades y además añade restricciones para que no puedas seleccionar a ciertos miembros dada una condición concreta. Además eso puede modificarse in-game, pero lo que no puedes hacer es auto-modificar el tipo de scope si el usuario tiene un estado alterado concreto. Solo con las restricciones de ahí no hay modo de condicionar eso. Para eso está Cast All.

Está basado en el plugin Scope change rules de Tsukihime, ese es más genérico pero nada que no se pueda lograr con ambos scripts y cierta astúcia.

La versión basada en Advanced Scope solo modifica set_target_battlers, así que si alguien quiere alguna modificación similar puede hacerse igual. La versión independiente en cambio es más tediosa.
Se pueden hacer skills que normalmente puedes seleccionar a quien atacar pero bajo un estado se selecciona al azar, o bien condicionarlo por estado del target y hacer un estado Rebote que haga que la skill afecte al atacado, por ejemplo.
avatar
Wecoc
Administrador
Administrador



Créditos 12308

Gracias : 653

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Cast All

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.