Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3773 miembros registrados.
El último usuario registrado es Selu64.

Nuestros miembros han publicado un total de 85868 mensajes en 12230 argumentos.

[XP] Retry Battle

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Retry Battle

Mensaje por Wecoc el 2017-04-13, 21:46

Éste script corto y básico permite volver a intentar la batalla si te matan.
Al ir a Game Over desde batalla sale esa ventana que permite al jugador volver a intentarlo o bien ir al título y rendirse como un fracasado (?)



Se puede activar y desactivar a medio juego usando: $game_system.retry_battle_mode = true/false
Es una escena distinta a la de Game Over así que se puede hacer que se vea de modo muy distinto; sin fondo o con otro fondo o lo que sea... y el Game Over seguirá viendose igual.

Además para scripters se puede añadir alguna otra opción como permitir cambiar equipo antes de volver a intentar batalla, usar items o skills (similar al menú), poner fondos con scroll...
Podéis mirar scripts de MOG como referencia.

Código:
#==============================================================================
# ** [XP] Retry Battle v1.2
#------------------------------------------------------------------------------
# No requiere créditos
#==============================================================================

#==============================================================================
# * Game_Temp
#==============================================================================

class Game_Temp
  attr_accessor :call_retry
  alias retry_battle_ini initialize unless $@
  def initialize
    retry_battle_ini
    @call_retry = false
  end
end

#==============================================================================
# * Game_System
#==============================================================================

class Game_System
 
  attr_accessor :start_battle_save
  attr_accessor :retry_battle_mode
  attr_accessor :retry_battle_costs
 
  alias retry_battle_ini initialize unless $@
  def initialize
    retry_battle_ini
    @start_battle_save = true
    @retry_battle_mode = true
    @retry_battle_costs = []
  end
 
  def set_battle_cost(*args)
    @retry_battle_costs.push(args)
    @retry_battle_costs.uniq!
  end
 
  def clear_battle_costs
    @retry_battle_costs = []
  end
end

#==============================================================================
# * Kernel
#==============================================================================

module Kernel
  alias retry_battle_exit exit unless $@
  def exit(*args)
    if FileTest.exist?("Data/BattleSave.rxdata")
      File.delete("Data/BattleSave.rxdata")
    end
    retry_battle_exit(*args)
  end
end

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

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize
    if $game_system.start_battle_save
      $game_temp.call_retry = false
      file = File.open("Data/BattleSave.rxdata", "wb")
      characters = []
      for i in 0...$game_party.actors.size
        actor = $game_party.actors[i]
        characters.push([actor.character_name, actor.character_hue])
      end
      Marshal.dump(characters, file)
      Marshal.dump(Graphics.frame_count, file)
      Marshal.dump($game_system, file)
      Marshal.dump($game_switches, file)
      Marshal.dump($game_variables, file)
      Marshal.dump($game_self_switches, file)
      Marshal.dump($game_screen, file)
      Marshal.dump($game_actors, file)
      Marshal.dump($game_party, file)
      Marshal.dump($game_troop, file)
      Marshal.dump($game_map, file)
      Marshal.dump($game_player, file)
      file.close
    end
  end
  #--------------------------------------------------------------------------
  # * Judge
  #--------------------------------------------------------------------------
  def judge
    if $game_party.all_dead? or $game_party.actors.size == 0
      if $game_temp.battle_can_lose
        $game_system.bgm_play($game_temp.map_bgm)
        battle_end(2)
        return true
      end
      if $game_system.retry_battle_mode && $game_system.start_battle_save
        $game_temp.call_retry = true
      else
        $game_temp.gameover = true
      end
      return true
    end
    for enemy in $game_troop.enemies
      if enemy.exist?
        return false
      end
    end
    start_phase5
    return true
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    if $game_system.battle_interpreter.running?
      $game_system.battle_interpreter.update
      if $game_temp.forcing_battler == nil
        unless $game_system.battle_interpreter.running?
          unless judge
            setup_battle_event
          end
        end
        if @phase != 5
          @status_window.refresh
        end
      end
    end
    $game_system.update
    $game_screen.update
    if $game_system.timer_working and $game_system.timer == 0
      $game_temp.battle_abort = true
    end
    @help_window.update
    @party_command_window.update
    @actor_command_window.update
    @status_window.update
    @message_window.update
    @spriteset.update
    if $game_temp.transition_processing
      $game_temp.transition_processing = false
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    if $game_temp.message_window_showing
      return
    end
    if @spriteset.effect?
      return
    end
    if $game_temp.gameover
      $scene = Scene_Gameover.new
      return
    end
    if $game_temp.call_retry
      $scene = Scene_RetryBattle.new
      return
    end
    if $game_temp.to_title
      $scene = Scene_Title.new
      return
    end
    if $game_temp.battle_abort
      $game_system.bgm_play($game_temp.map_bgm)
      battle_end(1)
      return
    end
    if @wait_count > 0
      @wait_count -= 1
      return
    end
    if $game_temp.forcing_battler == nil and
      $game_system.battle_interpreter.running?
      return
    end
    case @phase
    when 1  # pre-battle phase
      update_phase1
    when 2  # party command phase
      update_phase2
    when 3  # actor command phase
      update_phase3
    when 4  # main phase
      update_phase4
    when 5  # after battle phase
      update_phase5
    end
  end
end

#==============================================================================
# * Window_RetryCosts
#==============================================================================

class Window_RetryCosts < Window_Selectable
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 224, 32)
    self.active = false
    self.index = -1
    self.back_opacity = 160
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = $game_system.retry_battle_costs
    if @data.size == 0
      self.visible = false
      return
    end
    @item_max = @data.size
    self.height = 32 + @item_max * 32
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(index)
    data = @data[index]
    x = 4
    y = index * 32
    case data[0]
    when :gold
      number = data[1]
      if $game_party.gold >= number
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
      self.contents.draw_text(x, y, 212, 32, number.to_s)
      self.contents.font.color = system_color
      dx = x + self.contents.text_size(number.to_s).width + 8
      self.contents.draw_text(dx, y, 212, 32, $data_system.words.gold)
      self.contents.font.color = normal_color
    when :item, :weapon, :armor
      case data[0]
      when :item
        item = $data_items[data[1]]
        item_number = $game_party.item_number(item.id)
      when :weapon
        item = $data_weapons[data[1]]
        item_number = $game_party.weapon_number(item.id)
      when :armor
        item = $data_armors[data[1]]
        item_number = $game_party.armor_number(item.id)
      end
      number = data[2]
      if item_number >= number
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
      bitmap = RPG::Cache.icon(item.icon_name)
      opacity = self.contents.font.color == normal_color ? 255 : 128
      self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
      self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
      self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
      self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
      self.contents.font.color = normal_color
    end
  end
end

#==============================================================================
# * Scene_RetryBattle
#==============================================================================

class Scene_RetryBattle
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize
    file = File.open("Data/BattleSave.rxdata", "rb")
    characters = Marshal.load(file)
    Graphics.frame_count = Marshal.load(file)
    $game_system        = Marshal.load(file)
    $game_switches      = Marshal.load(file)
    $game_variables    = Marshal.load(file)
    $game_self_switches = Marshal.load(file)
    $game_screen        = Marshal.load(file)
    $game_actors        = Marshal.load(file)
    $game_party        = Marshal.load(file)
    $game_troop        = Marshal.load(file)
    $game_map          = Marshal.load(file)
    $game_player        = Marshal.load(file)
    $game_party.refresh
    file.close
    File.delete("Data/BattleSave.rxdata")
  end
  #--------------------------------------------------------------------------
  # * Main
  #--------------------------------------------------------------------------
  def main
    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.gameover($data_system.gameover_name)
    $game_system.bgm_play(nil)
    $game_system.bgs_play(nil)
    $game_system.me_play($data_system.gameover_me)
    s1 = "Reintentar batalla"
    s2 = "Ir a título"
    @command_window = Window_Command.new(224, [s1, s2])
    @command_window.back_opacity = 160
    @command_window.x = 320 - @command_window.width / 2
    @command_window.y = 320
    @cost_window = Window_RetryCosts.new
    @cost_window.refresh
    @costs = $game_system.retry_battle_costs.clone
    @cost_window.x = 320 - @cost_window.width / 2
    @cost_window.y = 64
    @disabled = false
    if @costs.size > 0
      @disabled = get_disable_costs
      @command_window.disable_item(0) if @disabled
    end
    Graphics.transition(120)
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @command_window.dispose
    @cost_window.dispose
  end
  #--------------------------------------------------------------------------
  # * Get Disable Costs
  #--------------------------------------------------------------------------
  def get_disable_costs
    for i in 0...@costs.size
      data = @costs[i]
      case data[0]
      when :gold
        return true if $game_party.gold < data[1]
      when :item
        return true if $game_party.item_number(data[1]) < data[2]
      when :weapon
        return true if $game_party.weapon_number(data[1]) < data[2]
      when :armor
        return true if $game_party.armor_number(data[1]) < data[2]
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # * Apply Costs
  #--------------------------------------------------------------------------
  def apply_costs
    for i in 0...@costs.size
      data = @costs[i]
      case data[0]
      when :gold
        $game_party.lose_gold(data[1])
      when :item
        $game_party.lose_item(data[1], data[2])
      when :weapon
        $game_party.lose_weapon(data[1], data[2])
      when :armor
        $game_party.lose_armor(data[1], data[2])
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    @command_window.update
    @cost_window.update
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0 # Retry Battle
        if @disabled
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        $game_system.se_play($data_system.battle_start_se)
        $game_system.bgm_play($game_system.battle_bgm)
        apply_costs
        $scene = Scene_Battle.new
        return
      when 1 # Back to title
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Title.new
        return
      end
    end
    if $game_temp.battle_calling
      call_battle
    end
  end
end

Versión 1.1:
Código:
#==============================================================================
# ** [XP] Retry Battle v1.1
#------------------------------------------------------------------------------
# No requiere créditos
#==============================================================================

#==============================================================================
# * Game_Temp
#==============================================================================

class Game_Temp
  attr_accessor :call_retry
  alias retry_battle_ini initialize unless $@
  def initialize
    retry_battle_ini
    @call_retry = false
  end
end

#==============================================================================
# * Game_System
#==============================================================================

class Game_System
  attr_accessor :start_battle_save
  attr_accessor :retry_battle_mode
  alias retry_battle_ini initialize unless $@
  def initialize
    retry_battle_ini
    @start_battle_save = true
    @retry_battle_mode = true
  end
end

#==============================================================================
# * Kernel
#==============================================================================

module Kernel
  alias retry_battle_exit exit unless $@
  def exit(*args)
    if FileTest.exist?("Data/BattleSave.rxdata")
      File.delete("Data/BattleSave.rxdata")
    end
    retry_battle_exit(*args)
  end
end

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

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize
    if $game_system.start_battle_save
      $game_temp.call_retry = false
      file = File.open("Data/BattleSave.rxdata", "wb")
      characters = []
      for i in 0...$game_party.actors.size
        actor = $game_party.actors[i]
        characters.push([actor.character_name, actor.character_hue])
      end
      Marshal.dump(characters, file)
      Marshal.dump(Graphics.frame_count, file)
      Marshal.dump($game_system, file)
      Marshal.dump($game_switches, file)
      Marshal.dump($game_variables, file)
      Marshal.dump($game_self_switches, file)
      Marshal.dump($game_screen, file)
      Marshal.dump($game_actors, file)
      Marshal.dump($game_party, file)
      Marshal.dump($game_troop, file)
      Marshal.dump($game_map, file)
      Marshal.dump($game_player, file)
      file.close
    end
  end
  #--------------------------------------------------------------------------
  # * Judge
  #--------------------------------------------------------------------------
  def judge
    if $game_party.all_dead? or $game_party.actors.size == 0
      if $game_temp.battle_can_lose
        $game_system.bgm_play($game_temp.map_bgm)
        battle_end(2)
        return true
      end
      if $game_system.retry_battle_mode && $game_system.start_battle_save
        $game_temp.call_retry = true
      else
        $game_temp.gameover = true
      end
      return true
    end
    for enemy in $game_troop.enemies
      if enemy.exist?
        return false
      end
    end
    start_phase5
    return true
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    if $game_system.battle_interpreter.running?
      $game_system.battle_interpreter.update
      if $game_temp.forcing_battler == nil
        unless $game_system.battle_interpreter.running?
          unless judge
            setup_battle_event
          end
        end
        if @phase != 5
          @status_window.refresh
        end
      end
    end
    $game_system.update
    $game_screen.update
    if $game_system.timer_working and $game_system.timer == 0
      $game_temp.battle_abort = true
    end
    @help_window.update
    @party_command_window.update
    @actor_command_window.update
    @status_window.update
    @message_window.update
    @spriteset.update
    if $game_temp.transition_processing
      $game_temp.transition_processing = false
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    if $game_temp.message_window_showing
      return
    end
    if @spriteset.effect?
      return
    end
    if $game_temp.gameover
      $scene = Scene_Gameover.new
      return
    end
    if $game_temp.call_retry
      $scene = Scene_RetryBattle.new
      return
    end
    if $game_temp.to_title
      $scene = Scene_Title.new
      return
    end
    if $game_temp.battle_abort
      $game_system.bgm_play($game_temp.map_bgm)
      battle_end(1)
      return
    end
    if @wait_count > 0
      @wait_count -= 1
      return
    end
    if $game_temp.forcing_battler == nil and
      $game_system.battle_interpreter.running?
      return
    end
    case @phase
    when 1  # pre-battle phase
      update_phase1
    when 2  # party command phase
      update_phase2
    when 3  # actor command phase
      update_phase3
    when 4  # main phase
      update_phase4
    when 5  # after battle phase
      update_phase5
    end
  end
end

#==============================================================================
# * Scene_RetryBattle
#==============================================================================

class Scene_RetryBattle
  def initialize
    file = File.open("Data/BattleSave.rxdata", "rb")
    characters = Marshal.load(file)
    Graphics.frame_count = Marshal.load(file)
    $game_system        = Marshal.load(file)
    $game_switches      = Marshal.load(file)
    $game_variables    = Marshal.load(file)
    $game_self_switches = Marshal.load(file)
    $game_screen        = Marshal.load(file)
    $game_actors        = Marshal.load(file)
    $game_party        = Marshal.load(file)
    $game_troop        = Marshal.load(file)
    $game_map          = Marshal.load(file)
    $game_player        = Marshal.load(file)
    $game_party.refresh
    file.close
    File.delete("Data/BattleSave.rxdata")
  end
  #--------------------------------------------------------------------------
  # * Main
  #--------------------------------------------------------------------------
  def main
    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.gameover($data_system.gameover_name)
    $game_system.bgm_play(nil)
    $game_system.bgs_play(nil)
    $game_system.me_play($data_system.gameover_me)
    s1 = "Reintentar batalla"
    s2 = "Ir a título"
    @command_window = Window_Command.new(224, [s1, s2])
    @command_window.back_opacity = 160
    @command_window.x = 320 - @command_window.width / 2
    @command_window.y = 320
    Graphics.transition(120)
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @command_window.dispose
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    @command_window.update
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0 # Retry Battle
        $game_system.se_play($data_system.battle_start_se)
        $game_system.bgm_play($game_system.battle_bgm)
        $scene = Scene_Battle.new
        return
      when 1 # Back to title
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Title.new
        return
      end
    end
    if $game_temp.battle_calling
      call_battle
    end
  end
end

Se puede usar tal cual pero la idea sería modificarlo para que sea único en vuestro proyecto.

PD.- ¿Qué gracia tiene que el jugador pueda reintentar batalla cuando quiera?
Bueno, podéis poner que al pulsar Reintentar por ejemplo se reste algo de experiencia al grupo, de modo que se le asigna una espécie de "coste" a esa opción.
Éste tipo de fin de partida con opción Reintentar pero con coste está presente en varios juegos.


Última edición por Wecoc el 2017-11-12, 17:59, editado 4 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12087

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

Mensaje por BruMaster7Maker el 2017-04-13, 22:06

Está Genial!! Lo probaré
avatar
BruMaster7Maker
Soñador
Soñador

0/3

Créditos 59

Gracias : 17

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

Mensaje por orochii el 2017-04-14, 04:48

También está el hecho de que esto quita el tedio de tener que cargar partida y tenerte que volar la hermosa cutscene de 10 minutos con la cháchara del malo maloso xD (el efecto "me gustaron los efectos pero a la cuarta ya esto aburre" xD).

Buen script Wec, como siempre. :^D
avatar
orochii
Reportero

0/3

Créditos 7418

Gracias : 362

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

Mensaje por Wecoc el 2017-05-10, 13:14

Update a la versión 1.1
Va exactamente igual, solo añadí $game_system.start_battle_save que controla si se guardan o no los datos al empezar batalla (lo que antes se hacía usando $game_system.retry_battle_mode). Esa separación de variables significa que ahora se pueden guardar los datos al inicio de batalla pese a tener el modo "Retry" desactivado, por si en algún punto se quiere usar esa información por otros motivos.

Truco: Máquina del tiempo
Os explicaré un truco para, tal como he dicho, usar la información almacenada por otro motivo. En éste caso concretamente lo usaremos para una habilidad "Time Machine" que recupera el estado de la batalla al que había al iniciarla. Eso significa recuperar el estado de todos los aliados y enemigos. Aún así he puesto otras opciones en el mismo script, en caso de que por ejemplo queráis recuperar solo el estado de un miembro concreto... Para ese tipo de cambios personalizados tendréis que cambiar el script, así que necesitaréis cierto nivel de scripting.

Si queremos usarlo pero sin que se active el Retry Battle, solo hay que desactivarlo por defecto:



Luego necesitaremos un script a parte para el efecto de máquina del tiempo.

Código:
#==============================================================================
# ** [XP] Time Machine
# Recuperar estado inicial de batalla
#------------------------------------------------------------------------------
# Utiliza el script Retry Battle versión 1.1 o superior. No requiere créditos.
#==============================================================================

class Scene_Battle
  alias time_machine_skill_effect make_skill_action_result unless $@
  def make_skill_action_result
    if $game_system.start_battle_save == true
      @skill = $data_skills[@active_battler.current_action.skill_id]
      if @skill.id == 17 # ID de la habilidad Time Machine
        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
        #----------------------------------------------------------------------
        # Recuperar estado inicial
        #----------------------------------------------------------------------
        reset_battle_all
        #----------------------------------------------------------------------
        # Aplicar efectos de la habilidad (órden modificado)
        #----------------------------------------------------------------------
        @help_window.set_text(@skill.name, 1)
        @animation1_id = @skill.animation1_id
        @animation2_id = @skill.animation2_id
        set_target_battlers(@skill.scope)
        for target in @target_battlers
          target.skill_effect(@active_battler, @skill)
        end
        #----------------------------------------------------------------------
        @active_battler.sp -= @skill.sp_cost
        @status_window.refresh
        return
      end
    end
    return time_machine_skill_effect
  end
 
  # Recuperarlo absolutamente todo (interruptores, variables, objetos...)
  def reset_battle_complete
    file = File.open("Data/BattleSave.rxdata", "rb")
    characters = Marshal.load(file)
    frame_count = Marshal.load(file)
    $game_system        = Marshal.load(file)
    $game_switches      = Marshal.load(file)
    $game_variables    = Marshal.load(file)
    $game_self_switches = Marshal.load(file)
    $game_screen        = Marshal.load(file)
    $game_actors        = Marshal.load(file)
    $game_party        = Marshal.load(file)
    $game_troop        = Marshal.load(file)
    $game_map          = Marshal.load(file)
    $game_player        = Marshal.load(file)
    $game_party.refresh
    file.close
  end
 
  # Recuperar estado de todos los aliados y enemigos
  def reset_battle_all
    file = File.open("Data/BattleSave.rxdata", "rb")
    characters = Marshal.load(file)
    frame_count = Marshal.load(file)
    temp_game_system        = Marshal.load(file)
    temp_game_switches      = Marshal.load(file)
    temp_game_variables    = Marshal.load(file)
    temp_game_self_switches = Marshal.load(file)
    temp_game_screen        = Marshal.load(file)
    temp_game_actors        = Marshal.load(file)
    temp_game_party        = Marshal.load(file)
    temp_game_troop        = Marshal.load(file)
    temp_game_map          = Marshal.load(file)
    temp_game_player        = Marshal.load(file)
    file.close
    for i in 0...$game_party.actors.size
      if temp_game_party.actors[i] != nil
        $game_party.actors[i] = temp_game_party.actors[i].clone
      end
    end
    for i in 0...$game_troop.enemies.size
      if temp_game_troop.enemies[i] != nil
        $game_troop.enemies[i] = temp_game_troop.enemies[i].clone
      end
    end
  end
 
  # Recuperar estado de todo el grupo aliado
  def reset_battle_allies
    file = File.open("Data/BattleSave.rxdata", "rb")
    characters = Marshal.load(file)
    frame_count = Marshal.load(file)
    temp_game_system        = Marshal.load(file)
    temp_game_switches      = Marshal.load(file)
    temp_game_variables    = Marshal.load(file)
    temp_game_self_switches = Marshal.load(file)
    temp_game_screen        = Marshal.load(file)
    temp_game_actors        = Marshal.load(file)
    temp_game_party        = Marshal.load(file)
    temp_game_troop        = Marshal.load(file)
    temp_game_map          = Marshal.load(file)
    temp_game_player        = Marshal.load(file)
    file.close
    case @active_battler
    when Game_Actor
      for i in 0...$game_party.actors.size
        if temp_game_party.actors[i] != nil
          $game_party.actors[i] = temp_game_party.actors[i].clone
        end
      end
    when Game_Enemy
      for i in 0...$game_troop.enemies.size
        if temp_game_troop.enemies[i] != nil
          $game_troop.enemies[i] = temp_game_troop.enemies[i].clone
        end
      end
    end
  end
end

class Game_Actor < Game_Battler
  # Recuperar estado de un target concreto (actor)
  def reset_battle_target
    file = File.open("Data/BattleSave.rxdata", "rb")
    characters = Marshal.load(file)
    frame_count = Marshal.load(file)
    temp_game_system        = Marshal.load(file)
    temp_game_switches      = Marshal.load(file)
    temp_game_variables    = Marshal.load(file)
    temp_game_self_switches = Marshal.load(file)
    temp_game_screen        = Marshal.load(file)
    temp_game_actors        = Marshal.load(file)
    temp_game_party        = Marshal.load(file)
    temp_game_troop        = Marshal.load(file)
    temp_game_map          = Marshal.load(file)
    temp_game_player        = Marshal.load(file)
    file.close
    for i in 0...$game_party.actors.size
      if $game_party.actors[i] != nil
        if $game_party.actors[i].actor_id == @actor_id
          $game_party.actors[i] = temp_game_party.actors[i].clone
        end
      end
    end
  end
end

class Game_Enemy < Game_Battler
  # Recuperar estado de un target concreto (enemigo)
  def reset_battle_target
    file = File.open("Data/BattleSave.rxdata", "rb")
    characters = Marshal.load(file)
    frame_count = Marshal.load(file)
    temp_game_system        = Marshal.load(file)
    temp_game_switches      = Marshal.load(file)
    temp_game_variables    = Marshal.load(file)
    temp_game_self_switches = Marshal.load(file)
    temp_game_screen        = Marshal.load(file)
    temp_game_actors        = Marshal.load(file)
    temp_game_party        = Marshal.load(file)
    temp_game_troop        = Marshal.load(file)
    temp_game_map          = Marshal.load(file)
    temp_game_player        = Marshal.load(file)
    file.close
    for i in 0...$game_troop.enemies.size
      if $game_troop.enemies[i] != nil
        if @member_index == i
          $game_troop.enemies[i] = temp_game_troop.enemies[i].clone
        end
      end
    end
  end
end

Para más adelante os tengo una "sorpresa" preparada para éste sistema, pero de momento lo dejo así.


Última edición por Wecoc el 2017-05-12, 16:38, editado 3 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12087

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

Mensaje por BlazeCrimson el 2017-05-11, 13:15

Muy interesante el script, me dan ganas incluso de usarlo en el proyecto que estoy desarrollando. Un gran aporte, como siempre Wecoc.

_________________
Image and video hosting by TinyPic
avatar
BlazeCrimson
Analista
Analista

0/3

Créditos 1124

Gracias : 110

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

Mensaje por AsFzKakarotto el 2017-05-12, 08:10

Gracias Wecoc y sobre todo por tu insistencia... esta vez funciona...
no como lo esperaba pero funciona xd...
•Los aliados recuperan sus puntos de vida iniciales.
•Lo malo es que los enemigos no lo hacen.
•Los enemigos muertos no vuelven a la vida y desconozco si un aliado también.

Quisas con un poquito de mi enginer  más el script pueda terminarlo... jejeje
Pero como dije en el post en que te pedí este sistema.... me conformo con que los aliados
se les devuelvan los HP con un poco más de turnos atrás con el tips & tricks de "Undo"...
y que mejor que finalmente quedo como al inicio de la batalla. Se valora tu ayuda nos vemos...



Última edición por AsFzKakarotto el 2017-05-12, 17:30, editado 3 veces
avatar
AsFzKakarotto
Novato
Novato

0/3

Créditos 98

Gracias : 19

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

Mensaje por Wecoc el 2017-05-12, 16:39

Vale, le he cambiado esa parte, pero la verdad es que no entiendo exactamente qué falla, ni veo cómo arreglarlo. Si sigue dando problemas poco más podré hacer. Cuando puedas pruébalo.

Último intento, si no se soluciona tendrá que ayudarte álguien más.
avatar
Wecoc
Administrador
Administrador



Créditos 12087

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

Mensaje por Mukadelheid el 2017-05-12, 18:59

Eso de reintentar esta bueno cuando te consume algún tipo de objeto raro. Así podéis limitar la cantidad que el jugador puede batallar una y otra ves.
También podría ser al reintentar la batalla, los enemigos se vuelvan mas "fáciles", pero también su nivel de drop y exp disminuyan.
Bien hecho.
avatar
Mukadelheid
Principiante
Principiante

0/3

Créditos 335

Gracias : 28

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

Mensaje por Wecoc el 2017-05-12, 19:16

AsFzKakarotto: Uf, al menos funciona, ya era hora xD
Hay distintos modos de usar ese script para adaptarlo a lo que se necesite, lo que pasa es que convendrían los ojos de un experto. Para que absolutamente todo vuelva al inicio (como una máquina del tiempo "general" por así decirlo) en la línea 24 en vez de usar el método reset_battle_all usa el reset_battle_complete. Para resetear todos los battlers tanto vivos como muertos pero que existan de buenas a primeras parece que sería cuestión de usar reset_battle_target para cada uno de ellos, por lo cual antes se tendrá que obtener cuales había y tal. Otra opción es usar reset_battle_allies y de algún modo reiniciar la escena de batalla a partir de ahí, dando el mismo efecto que si reempezaras la batalla. Digamos que no es un script plug & play, más bien es un script de pelearse un rato con él.

Mukadelheid: Tengo pendientes para pronto dos add-ons a éste sistema.
Uno es el añadir costes de retry de modo similar a lo que has dicho, puede costarte items, dinero... y también otros requisitos como que haya cierto interruptor o cosas más complejas, quizá. Además saldría bien puesto lo que se requiere y si lo tienes disponible o no.

El segundo add-on sería permitir ir a escenas como Objetos, Habilidades o Equipo (o directamente al menú) desde la escena de Retry, justo antes de iniciar la batalla.

Sobre lo de hacer los enemigos más fáciles no me lo había planteado, y creo que sería bastante más complicado que lo demás.
avatar
Wecoc
Administrador
Administrador



Créditos 12087

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

Mensaje por Mukadelheid el 2017-05-12, 19:46

@Wecoc Para que los enemigos se vuelvan mas fáciles simplemente reduces sus stats 5%,10%,15% . Lo que tu pienses. Ademas de reducir su probabilidad de "drop" y su exp.

O bien podrías agregarle un estado al enemigo que haga todo eso. Dicho estado sera automático y no se podrá remover.
avatar
Mukadelheid
Principiante
Principiante

0/3

Créditos 335

Gracias : 28

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

Mensaje por Wecoc el 2017-11-12, 18:05

UPDATE ¡Nueva Versión 1.2!

Ahora podéis asignar costes para reintentar batalla.
Para hacerlo desde llamada de script (o en otra parte) podéis usar:

$game_system.set_battle_cost(:gold, NUMBER)

Cambiad NUMBER por el número de dinero que costará reintentar batalla

Lo mismo con coste de items, armas o armamento.

$game_system.set_battle_cost(:item, ITEM ID, NUMBER)
$game_system.set_battle_cost(:weapon, WEAPON ID, NUMBER)
$game_system.set_battle_cost(:armor, ARMOR ID, NUMBER)

Podríais definiros otros tipos de coste o restricción, incluso con eval, pero eso ya lo dejo solo a expertos xD

Por último otra llamada de script interesante es la de vaciar todos los costes:

$game_system.clear_battle_costs

Espero que os sirva.

Notas:
Tenía previsto para hace tiempo hacer más añadidos a la ventana de comandos, para tener otras opciones antes de reintentar batalla como poder ir a Equipo, Formación o alguna cosa similar, pero lo he descartado. Todo eso lo dejo en vuestras manos si realmente lo veis interesante para vuestro proyecto ;)
avatar
Wecoc
Administrador
Administrador



Créditos 12087

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

Mensaje por xXIsrael0499Xx el 2017-11-12, 22:57

Oh genial y mega útil, enserio molesta cuando juegas y te matan y tienes que ir donde lo dejaste guardado, no mola.

Gracias señor montaña.
avatar
xXIsrael0499Xx
Principiante
Principiante

0/3

Créditos 1111

Gracias : 56

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Retry Battle

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.