====== Sistema de Batalla de Kotfire ======
===== Ficha Técnica =====
* **Nombre original:** Kotfire Custom Battle System
* **Nombre del autor:** Kotfire
* **Utilidad:** Sistema de batalla lateral
* **Dependencia de otros Scripts:** No
* **Incompatibilidad:** Desconocida
===== Instalación =====
Crea un script encima de "Main" para cada uno de los siguientes códigos.
==== Script principal ====
#==============================================================================
# Kotfire Custom Battle System
#==============================================================================
# Script por: Kotfire
# Versión 1.0
#-----------------------------------------------------------------------------
# -Instrucciones-
# Pegar encima de main y de todos los add-on para este script
# Leer el archivo de texto adjunto donde están todas las instrucciones ampliadas
# Editar las opciones a tu gusto
# Disfrutar
#==============================================================================
# ■ Options
#------------------------------------------------------------------------------
module Options
module Cbs
Animations = ["Stand", "Move_to", "Move_back", "Attack", "Skill", "Hit",
"Guard", "Miss", "Dead", "Item", "Victory"]
# Posiciones de las poses en la plantilla
Stand = 0
Move_to = 1
Move_back = 2
Attack = 3
Skill = 4
Hit = 5
Guard = 6
Miss = 7
Dead = 8
Item = 9
Victory = 10
Default_frames = [84, 84]
Move_speed = 10
Weapon = { 21 => [Attack, false] }
Skill_Anim = { 57 => [11, false] }
Actor_Frame = {}
Enemy_Frame = {}
Pose_Frames = { 0 => 3, 3 => 5, 4 => 5, 5 => 1, 6 => 1, 7 => 1, 8 => 1,
9 => 4, 10 => 6, 11 => 6 }
Pose_Delay = {}
end
end
#------------------------------------------------------------------------------
# - ATENCIÓN -
#------------------------------------------------------------------------------
# NO EDITES NADA A PARTIR DE AQUÍ SI NO TIENES CONOCIMIENTOS DE RGSS
#------------------------------------------------------------------------------
#==============================================================================
# ■ Add-on Manager
#------------------------------------------------------------------------------
# Basado en el SDK log system
#------------------------------------------------------------------------------
module Add_on
#---------------------------------------------------------------------------
@add_ons = []
@state = {}
#---------------------------------------------------------------------------
def self.insert(name)
@add_ons.push(name)
@state[name] = true
end
#---------------------------------------------------------------------------
def self.enable(name)
@state[name] = true
end
#---------------------------------------------------------------------------
def self.disable(name)
@state[name] = false
return
end
#---------------------------------------------------------------------------
def self.state(name)
return @state[name]
end
#---------------------------------------------------------------------------
def self.scripts
return @add_ons
end
end
#==============================================================================
# ■ Game_Battle
#------------------------------------------------------------------------------
class Game_Battle
#--------------------------------------------------------------------------
attr_accessor :animated_battlers
attr_accessor :animated_enemies
attr_accessor :move_battlers
attr_accessor :move_enemies
attr_accessor :mirror
#--------------------------------------------------------------------------
def initialize
@animated_battlers = true
@animated_enemies = true
@move_battlers = true
@move_enemies = true
@mirror = false
end
end
#==============================================================================
# ■ Scene_Title
#------------------------------------------------------------------------------
class Scene_Title
#--------------------------------------------------------------------------
alias kot_cbs_scenetitle_commandnewgame command_new_game
def command_new_game
$game_battle = Game_Battle.new
kot_cbs_scenetitle_commandnewgame
end
#--------------------------------------------------------------------------
alias kot_cbs_scenetitle_battletest battle_test
def battle_test
$game_battle = Game_Battle.new
kot_cbs_scenetitle_battletest
end
end
#==============================================================================
# ■ Scene_Load
#------------------------------------------------------------------------------
class Scene_Load < Scene_File
#------------------------------------
alias kot_cbs_sceneload_readsavedata read_save_data
def read_save_data(file)
kot_cbs_sceneload_readsavedata(file)
$game_battle = Marshal.load(file)
end
end
#==============================================================================
# ■ Scene_Save
#------------------------------------------------------------------------------
class Scene_Save < Scene_File
#------------------------------------
alias kot_cbs_scenesave_writesavedata write_save_data
def write_save_data(file)
kot_cbs_scenesave_writesavedata(file)
Marshal.dump($game_battle, file)
end
end
#==============================================================================
# ■ Spriteset_Battle
#------------------------------------------------------------------------------
class Spriteset_Battle
#--------------------------------------------------------------------------
attr_reader :viewport1
attr_reader :viewport2
#--------------------------------------------------------------------------
def initialize
@viewport1 = Viewport.new(0, 0, 640, 320)
@viewport2 = Viewport.new(0, 0, 640, 480)
@viewport3 = Viewport.new(0, 0, 640, 480)
@viewport4 = Viewport.new(0, 0, 640, 480)
@viewport2.z = 101
@viewport3.z = 200
@viewport4.z = 5000
@battleback_sprite = Sprite.new(@viewport1)
@enemy_sprites = []
for enemy in $game_troop.enemies.reverse
@enemy_sprites.push(Sprite_Battler.new(@viewport2, enemy))
end
@actor_sprites = []
@actor_sprites.push(Sprite_Battler.new(@viewport1))
@actor_sprites.push(Sprite_Battler.new(@viewport1))
@actor_sprites.push(Sprite_Battler.new(@viewport1))
@actor_sprites.push(Sprite_Battler.new(@viewport1))
@weather = RPG::Weather.new(@viewport1)
@picture_sprites = []
for i in 51..100
@picture_sprites.push(Sprite_Picture.new(@viewport3,
$game_screen.pictures[i]))
end
@timer_sprite = Sprite_Timer.new
update
end
end
#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
class Game_Battler
#--------------------------------------------------------------------------
attr_accessor :sprite_delay
attr_accessor :sprite_index
attr_accessor :sprite_frames
attr_accessor :frame_width
attr_accessor :frame_height
attr_accessor :real_dead
attr_accessor :pose
attr_accessor :repeat
attr_accessor :moving
attr_accessor :x
attr_accessor :y
attr_accessor :target_x
attr_accessor :target_y
attr_accessor :animate
attr_accessor :anim_wait
attr_reader :victory
attr_reader :start_x
attr_reader :start_y
attr_reader :move_speed
#--------------------------------------------------------------------------
alias kot_cbs_gamebattler_initialize initialize
def initialize
@sprite_delay = 8
@sprite_index = -1
@sprite_frames = 4
@frame_width = Options::Cbs::Default_frames[0]
@frame_height = Options::Cbs::Default_frames[1]
@real_dead = false
@pose = Options::Cbs::Stand
@sprite_frames = Options::Cbs::Pose_Frames[@pose] if Options::Cbs::Pose_Frames[@pose] != nil
@repeat = true
@target_x = 0
@target_y = 0
@start_x = 0
@start_y = 0
@x = nil
@y = nil
@moving = false
@move_speed = Options::Cbs::Move_speed
@animate = false
@anim_wait = 0
@victory = false
kot_cbs_gamebattler_initialize
end
#------------------------------------
def set_pose(number, loop = true, delay = 8)
@pose = number
@repeat = loop
@sprite_frames = 4
frames = Options::Cbs::Pose_Frames[number]
@sprite_frames = frames if frames != nil
@sprite_delay = delay
delay_pose = Options::Cbs::Pose_Delay[number]
@sprite_delay = delay_pose if delay_pose != nil
end
#------------------------------------
def move_to(target_x, target_y, speed = Options::Cbs::Move_speed)
if self.is_a?(Game_Actor)
return unless $game_battle.move_battlers
elsif self.is_a?(Game_Enemy)
return unless $game_battle.move_enemies
end
return if target_x == @x && target_y == @y
@target_x = target_x
@target_y = target_y
@move_speed = speed
@moving = true
end
#------------------------------------
def anim(pose, repeat = false, wait = nil)
return if @animate
@sprite_index = -1
set_pose(pose, repeat)
wait = @sprite_frames if Options::Cbs::Pose_Delay[pose] == nil
wait = [@sprite_frames * Options::Cbs::Pose_Delay[pose] - (Options::Cbs::Pose_Delay[pose] * 2), 8].max if wait == nil
@anim_wait = wait
@animate = true
@victory = true if pose == Options::Cbs::Victory
end
#------------------------------------
def set_frame(id)
if self.is_a?(Game_Actor) && Options::Cbs::Actor_Frame[id] != nil
@frame_width = Options::Cbs::Actor_Frame[id][0] if Options::Cbs::Actor_Frame[id][0] != nil
@frame_height = Options::Cbs::Actor_Frame[id][1] if Options::Cbs::Actor_Frame[id][1] != nil
elsif self.is_a?(Game_Enemy) && Options::Cbs::Enemy_Frame[id] != nil
@frame_width = Options::Cbs::Enemy_Frame[id][0] if Options::Cbs::Enemy_Frame[id][0] != nil
@frame_height = Options::Cbs::Enemy_Frame[id][1] if Options::Cbs::Enemy_Frame[id][1] != nil
end
end
#------------------------------------
def reset
set_pose(Options::Cbs::Stand)
@victory = false
@target_x = 0
@target_y = 0
@start_x = 0
@start_y = 0
@x = nil
@y = nil
end
end
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
def screen_x
if $game_battle.mirror
@start_x = 40 + ($game_party.actors.size * 20) - self.index * 40 if self.index != nil
@start_x += (self.frame_width - 64) / 2
else
@start_x = 530 - ($game_party.actors.size * 20) + self.index * 40 if self.index != nil
@start_x -= (self.frame_width - 64) / 2
end
return @start_x
end
#--------------------------------------------------------------------------
def screen_y
@start_y = 210 - ($game_party.actors.size * 17.5) + self.index * 20 if self.index != nil
@start_y -= (self.frame_height - 64)
return @start_y
end
#--------------------------------------------------------------------------
def screen_z
return self.index if self.index != nil
end
end
#==============================================================================
# ■ Game_Enemy
#------------------------------------------------------------------------------
class Game_Enemy < Game_Battler
#------------------------------------
def screen_x
if $game_battle.mirror
@start_x = 640 - $data_troops[@troop_id].members[@member_index].x
else
@start_x = $data_troops[@troop_id].members[@member_index].x
end
return @start_x
end
#------------------------------------
def screen_y
@start_y = $data_troops[@troop_id].members[@member_index].y
return @start_y
end
end
#==============================================================================
# ■ Sprite_Battler
#------------------------------------------------------------------------------
class Sprite_Battler < RPG::Sprite
#--------------------------------------------------------------------------
attr_accessor :battler
#--------------------------------------------------------------------------
def initialize(viewport, battler = nil)
super(viewport)
@battler = battler
@battler_visible = false
@start = false
end
#--------------------------------------------------------------------------
def dispose
if self.bitmap != nil
self.bitmap.dispose
end
super
end
#--------------------------------------------------------------------------
def update
super
if @battler == nil
self.bitmap = nil
loop_animation(nil)
return
end
unless @start
@battler.set_frame(@battler.id)
@battler.reset
self.mirror = 1 if $game_battle.mirror
@start = true
end
if Graphics.frame_count % @battler.sprite_delay == 0
@battler.sprite_index += 1 unless @battler.sprite_index >= @battler.sprite_frames - 1
@battler.sprite_index = 0 if @battler.sprite_index >= @battler.sprite_frames - 1 && @battler.repeat
if @battler.is_a?(Game_Actor)
@battler.sprite_index = 0 unless $game_battle.animated_battlers
elsif @battler.is_a?(Game_Enemy)
@battler.sprite_index = 0 unless $game_battle.animated_enemies
end
x = @battler.frame_width * @battler.sprite_index
y = @battler.frame_height * @battler.pose
self.bitmap = nil
self.bitmap = RPG::Cache.battler(@battler.battler_name, @battler.battler_hue)
self.src_rect.set(x, y, @battler.frame_width, @battler.frame_height)
end
if @battler.animate
if @battler.anim_wait <= 0
@battler.animate = false
@battler.set_pose(Options::Cbs::Stand) unless @battler.victory
return
end
if Graphics.frame_count % @battler.sprite_delay == 0
@battler.anim_wait -= 1
end
end
if @battler.moving
if @battler.is_a?(Game_Actor)
if @battler.target_x == @battler.start_x
@battler.set_pose(Options::Cbs::Move_back)
elsif @battler.target_x != @battler.start_x
@battler.set_pose(Options::Cbs::Move_to)
end
end
if @battler.is_a?(Game_Enemy)
if @battler.target_x == @battler.start_x
@battler.set_pose(Options::Cbs::Move_back)
elsif @battler.target_x != @battler.start_x
@battler.set_pose(Options::Cbs::Move_to)
end
end
if @battler.x < @battler.target_x
@battler.x += @battler.move_speed
@battler.x = @battler.target_x if @battler.x > @battler.target_x
else
@battler.x -= @battler.move_speed
@battler.x = @battler.target_x if @battler.x < @battler.target_x
end
if @battler.y < @battler.target_y
@battler.y += @battler.move_speed
@battler.y = @battler.target_y if @battler.y > @battler.target_y
else
@battler.y -= @battler.move_speed
@battler.y = @battler.target_y if @battler.y < @battler.target_y
end
@battler.moving = false if @battler.x == @battler.target_x &&
@battler.y == @battler.target_y
else
@battler.set_pose(Options::Cbs::Stand) if (@battler.pose == Options::Cbs::Move_to or
@battler.pose == Options::Cbs::Move_back) && !@battler.animate && !@battler.victory
if @battler.x == nil && @battler.y == nil
@battler.x = @battler.target_x = @battler.screen_x
@battler.y = @battler.target_y = @battler.screen_y
end
end
if @battler.damage == nil and
@battler.state_animation_id != @state_animation_id
@state_animation_id = @battler.state_animation_id
loop_animation($data_animations[@state_animation_id])
end
if @battler.is_a?(Game_Actor) and @battler_visible
if $game_temp.battle_main_phase
self.opacity += 3 if self.opacity < 255
else
self.opacity -= 3 if self.opacity > 207
end
end
if @battler.blink
blink_on
else
blink_off
end
if @battler.dead? && @battler.real_dead
@battler.set_pose(Options::Cbs::Dead)
else
@battler.real_dead = false
end
unless @battler_visible
if not @battler.hidden and not @battler.dead? and
(@battler.damage == nil or @battler.damage_pop)
appear
@battler_visible = true
end
else
if @battler.hidden
$game_system.se_play($data_system.escape_se)
escape
@battler_visible = false
end
if @battler.white_flash
whiten
@battler.white_flash = false
end
if @battler.animation_id != 0
animation = $data_animations[@battler.animation_id]
animation(animation, @battler.animation_hit)
@battler.animation_id = 0
end
if @battler.damage_pop
damage(@battler.damage, @battler.critical)
@battler.damage = nil
@battler.critical = false
@battler.damage_pop = false
end
if @battler.damage == nil and @battler.dead?
if @battler.is_a?(Game_Enemy)
$game_system.se_play($data_system.enemy_collapse_se) unless @battler.real_dead
else
$game_system.se_play($data_system.actor_collapse_se) unless @battler.real_dead
end
@battler.set_pose(Options::Cbs::Dead)
@battler.real_dead = true
end
end
self.x = @battler.x
self.y = @battler.y
self.z = @battler.y + @battler.frame_height
end
end
#==============================================================================
# ■ Arrow_Enemy
#------------------------------------------------------------------------------
class Arrow_Enemy < Arrow_Base
#--------------------------------------------------------------------------
# - Uso del Personaje que el cursor ha señalado
#--------------------------------------------------------------------------
def enemy
return $game_troop.enemies[@index]
end
#--------------------------------------------------------------------------
# - Renovacion del Frame
#--------------------------------------------------------------------------
def update
super
# Estara en el aire, si el enemigo no es señalado
$game_troop.enemies.size.times do
break if self.enemy.exist?
@index += 1
@index %= $game_troop.enemies.size
end
# Cursor derecho
if Input.repeat?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
$game_troop.enemies.size.times do
@index += 1
@index %= $game_troop.enemies.size
break if self.enemy.exist?
end
end
# Cursor izquierdo
if Input.repeat?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
$game_troop.enemies.size.times do
@index += $game_troop.enemies.size - 1
@index %= $game_troop.enemies.size
break if self.enemy.exist?
end
end
# Opciones de coordenadas del sprite
if self.enemy != nil
self.x = self.enemy.x + self.enemy.frame_width / 2
self.y = self.enemy.y + self.enemy.frame_height / 2
end
end
end
#==============================================================================
# ■ Arrow_Actor
#------------------------------------------------------------------------------
class Arrow_Actor < Arrow_Base
#--------------------------------------------------------------------------
# - Uso del Personaje que el cursor ha señalado
#--------------------------------------------------------------------------
def actor
return $game_party.actors[@index]
end
#--------------------------------------------------------------------------
# - Renovacion del Frame
#--------------------------------------------------------------------------
def update
super
# Cursor derecho
if Input.repeat?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
@index += 1
@index %= $game_party.actors.size
end
# Cursor izquierdo
if Input.repeat?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
@index += $game_party.actors.size - 1
@index %= $game_party.actors.size
end
# Opciones de coordenadas del sprite
if self.actor != nil
self.x = self.actor.x + self.actor.frame_width / 2
self.y = self.actor.y + self.actor.frame_height / 2
end
end
end
#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
class Scene_Battle
#--------------------------------------------------------------------------
#alias kot_cbs_scenebattle_main main
def main
$game_temp.in_battle = true
$game_temp.battle_turn = 0
$game_temp.battle_event_flags.clear
$game_temp.battle_abort = false
$game_temp.battle_main_phase = false
$game_temp.battleback_name = $game_map.battleback_name
$game_temp.forcing_battler = nil
$game_system.battle_interpreter.setup(nil, 0)
@troop_id = $game_temp.battle_troop_id
$game_troop.setup(@troop_id)
s1 = $data_system.words.attack
s2 = $data_system.words.skill
s3 = $data_system.words.guard
s4 = $data_system.words.item
@actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
@actor_command_window.y = 160
@actor_command_window.z = 999
@actor_command_window.back_opacity = 160
@actor_command_window.active = false
@actor_command_window.visible = false
@party_command_window = Window_PartyCommand.new
@help_window = Window_Help.new
@help_window.back_opacity = 160
@help_window.visible = false
@status_window = Window_BattleStatus.new
@message_window = Window_Message.new
@spriteset = Spriteset_Battle.new
@wait_count = 0
if $data_system.battle_transition == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" +
$data_system.battle_transition)
end
start_phase1
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
$game_map.refresh
Graphics.freeze
@actor_command_window.dispose
@party_command_window.dispose
@help_window.dispose
@status_window.dispose
@message_window.dispose
if @skill_window != nil
@skill_window.dispose
end
if @item_window != nil
@item_window.dispose
end
if @result_window != nil
@result_window.dispose
end
@spriteset.dispose
if $scene.is_a?(Scene_Title)
Graphics.transition
Graphics.freeze
end
if $BTEST and not $scene.is_a?(Scene_Gameover)
$scene = nil
end
end
#--------------------------------------------------------------------------
def update_phase4
case @phase4_step
when 1
update_phase4_step1
when 2
update_phase4_step2
when 3
update_phase4_step3
when 4
update_phase4_step4
when 5
update_phase4_step5
when 6
update_phase4_step6
when 7
update_phase4_step7
when 8
update_phase4_step8
end
end
#--------------------------------------------------------------------------
def update_phase4_step2
# If not a forcing action
unless @active_battler.current_action.forcing
# If restriction is [normal attack enemy] or [normal attack ally]
if @active_battler.restriction == 2 or @active_battler.restriction == 3
# Set attack as an action
@active_battler.current_action.kind = 0
@active_battler.current_action.basic = 0
end
# If restriction is [cannot perform action]
if @active_battler.restriction == 4
# Clear battler being forced into action
$game_temp.forcing_battler = nil
# Shift to step 1
@phase4_step = 1
return
end
end
# Clear target battlers
@target_battlers = []
case @active_battler.current_action.kind
when 0
if @active_battler.current_action.basic == 0
if @active_battler.is_a?(Game_Actor)
weapon_id = @active_battler.weapon_id
if weapon_id != 0 && Options::Cbs::Weapon.include?(weapon_id) &&
!Options::Cbs::Weapon[weapon_id][1]
make_basic_action_result
else
@phase4_step = 7
return
end
else
@phase4_step = 7
return
end
else
make_basic_action_result
end
when 1
skill_id = @active_battler.current_action.skill_id
if Options::Cbs::Skill_Anim.include?(skill_id) &&
Options::Cbs::Skill_Anim[skill_id][1]
@phase4_step = 7
return
else
make_skill_action_result
end
when 2
make_item_action_result
end
# Shift to step 3
if @phase4_step == 2
@phase4_step = 3
end
end
#--------------------------------------------------------------------------
def update_phase4_step3
# Animation for action performer (if ID is 0, then white flash)
if @animation1_id == 0
@active_battler.white_flash = true
else
@active_battler.animation_id = @animation1_id
@active_battler.animation_hit = true
end
case @active_battler.current_action.kind
when 0
if @active_battler.current_action.basic == 0
weapon_id = @active_battler.weapon_id
if Options::Cbs::Weapon.include?(weapon_id)
@active_battler.anim(Options::Cbs::Weapon[weapon_id][0]) if Options::Cbs::Animations.include?("Attack")
else
@active_battler.anim(Options::Cbs::Attack) if Options::Cbs::Animations.include?("Attack")
end
elsif @active_battler.current_action.basic == 1
@active_battler.anim(Options::Cbs::Guard) if Options::Cbs::Animations.include?("Guard")
end
when 1
skill_id = @active_battler.current_action.skill_id
if Options::Cbs::Skill_Anim.include?(skill_id)
@active_battler.anim(Options::Cbs::Skill_Anim[skill_id][0]) if Options::Cbs::Animations.include?("Skill")
else
@active_battler.anim(Options::Cbs::Skill) if Options::Cbs::Animations.include?("Skill")
end
when 2
@active_battler.anim(Options::Cbs::Item) if Options::Cbs::Animations.include?("Item")
end
@wait_count = @active_battler.anim_wait
# Shift to step 4
@phase4_step = 4
end
#--------------------------------------------------------------------------
def update_phase4_step4
# Animation for target
for target in @target_battlers
target.animation_id = @animation2_id
target.animation_hit = (target.damage != "Miss")
if target.damage.is_a?(Numeric) && target.damage > 0
if target.guarding?
target.anim(Options::Cbs::Guard) if Options::Cbs::Animations.include?("Guard")
else
target.anim(Options::Cbs::Hit) if Options::Cbs::Animations.include?("Hit")
end
else
if target.damage.is_a?(String)
target.anim(Options::Cbs::Miss) if Options::Cbs::Animations.include?("Miss")
end
end
end
@wait_count = 8
# Shift to step 5
@phase4_step = 5
end
#--------------------------------------------------------------------------
def update_phase4_step6
# Clear battler being forced into action
$game_temp.forcing_battler = nil
# If common event ID is valid
if @common_event_id > 0
# Set up event
common_event = $data_common_events[@common_event_id]
$game_system.battle_interpreter.setup(common_event.list, 0)
end
# Shift to step 1
if (@active_battler.current_action.kind == 0 &&
@active_battler.current_action.basic == 0) or
@active_battler.current_action.kind == 1
@phase4_step = 8
else
@phase4_step = 1
end
end
#--------------------------------------------------------------------------
# * Frame Update (main phase step 7 : move to)
#--------------------------------------------------------------------------
def update_phase4_step7
if @active_battler.is_a?(Game_Actor)
target = $game_troop.smooth_target_enemy(@active_battler.current_action.target_index)
x = target.x + ($game_battle.mirror ? -(target.frame_width / 1.5): (target.frame_width / 1.5))
y = target.y - (@active_battler.frame_height - target.frame_height)
@active_battler.move_to(x, y) if Options::Cbs::Animations.include?("Move_to")
else
target = $game_party.smooth_target_actor(@active_battler.current_action.target_index)
x = target.x + ($game_battle.mirror ? (target.frame_width / 1.5): -(target.frame_width / 1.5))
y = target.y - (@active_battler.frame_height - target.frame_height)
@active_battler.move_to(x, y) if Options::Cbs::Animations.include?("Move_to")
end
if @active_battler.x == @active_battler.target_x &&
@active_battler.y == @active_battler.target_y
if @active_battler.current_action.basic == 0
make_basic_action_result
else
make_skill_action_result
end
@phase4_step = 3
end
end
#--------------------------------------------------------------------------
# * Frame Update (main phase step 8 : move back)
#--------------------------------------------------------------------------
def update_phase4_step8
@active_battler.move_to(@active_battler.start_x, @active_battler.start_y, 5) if Options::Cbs::Animations.include?("Move_back")
if @active_battler.x == @active_battler.target_x &&
@active_battler.y == @active_battler.target_y
@phase4_step = 1
end
end
#--------------------------------------------------------------------------
# * Start After Battle Phase
#--------------------------------------------------------------------------
alias kot_cbs_scenebattle_start_phase5 start_phase5
def start_phase5
for actor in $game_party.actors
actor.anim(Options::Cbs::Victory) if Options::Cbs::Animations.include?("Victory")
end
kot_cbs_scenebattle_start_phase5
end
end
#==============================================================================
# ■ Sprite (Damage)
#------------------------------------------------------------------------------
module RPG
class Sprite < ::Sprite
#--------------------------------------------------------------------------
def damage(value, critical)
dispose_damage
if value.is_a?(Numeric)
damage_string = value.abs.to_s
else
damage_string = value.to_s
end
bitmap = Bitmap.new(160, 48)
bitmap.font.name = "Arial Black"
bitmap.font.size = 32
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
if value.is_a?(Numeric) and value < 0
bitmap.font.color.set(176, 255, 144)
else
bitmap.font.color.set(255, 255, 255)
end
bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
if critical
bitmap.font.size = 20
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
bitmap.font.color.set(255, 255, 255)
bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
end
@_damage_sprite = ::Sprite.new(self.viewport)
@_damage_sprite.bitmap = bitmap
@_damage_sprite.ox = 80
@_damage_sprite.oy = 20
@_damage_sprite.x = self.x + Options::Cbs::Default_frames[0] / 2
@_damage_sprite.y = self.y - self.oy / 2
@_damage_sprite.z = 3000
@_damage_duration = 40
end
end
end
==== Comando individuales ====
**Este script solo es comaptible con éste sistema de batalla**
Colocar encima de "Main" y debajo del script principal.
#==============================================================================
# Commandos Individuales
#==============================================================================
# Script por: Kotfire
# Versión 2.0
# Versión especial para mi script de combate: "Kotfire Custom Battle"
#------------------------------------------------------------------------------
# Instrucciones
# - Copiar en un script encima de main
# - Elegir el modo(por id o por clase)
# - Cambiar los comandos para cada personaje
# - Disfrutar
#==============================================================================
# ■ Add-on Manager
#------------------------------------------------------------------------------
Add_on.insert("Actor_Commands")
if Add_on.state("Actor_Commands") == true
#==============================================================================
# ■ Options
#------------------------------------------------------------------------------
module Options
module Actor_Commands
MODE = 0 # 0 : Id / 1 : Clase
end
end
#==============================================================================
# Scene_Battle
#==============================================================================
class Scene_Battle
alias kot_commands phase3_setup_command_window
def phase3_setup_command_window
case Options::Actor_Commands::MODE
when 0 # Id del personaje en la base de datos
actor = $game_party.actors[@actor_index].id
when 1 # Id de la clase del personaje
actor = $game_party.actors[@actor_index].class_id
end
# Para cada personaje o clase sus propios comandos
case actor
when 1
commands = ["Zarpazo", "Furia", "Defensa", "Objeto"]
when 2
commands = ["Ataque", "Habilidad", "Defensa", "Objeto"]
when 3
commands = ["Disparo", "Tiro", "Defensa", "Objeto"]
when 4
commands = ["Ataque", "Hechizo", "Defensa", "Objeto"]
#when 3
#commands = [Comando1, Comando2, Comando3, Comando4]
#ect..
end
@actor_command_window.change(commands)
kot_commands
end
end
#==============================================================================
# Window_Command
#==============================================================================
class Window_Command < Window_Selectable
def change(commands = @original)
@original = @commands unless @original
@commands = commands ? commands : @original
refresh
end
end
#------------------------------------------------------------------------------
end
==== Fondo de batalla animado ====
**Éste script solo es compatible con éste sistema de batala.**
Colocar encima de "Main" y debajo del script principal.
#==============================================================================
# Fondo de Batalla Animado
#==============================================================================
# Script por: Kotfire
# Versión 1.0
# Versión especial para mi script de combate: "Kotfire Custom Battle"
#-----------------------------------------------------------------------------
# -Instrucciones-
# Pegar encima de main y disfrutar
# Editar la opción Template, true si el fondo animado es una sola imagen y
# false si son varias. En el segundo caso las imagenes tendrán que llamarse
# Nombredelfondo-1, Nombredelfondo-2 etc.
# Ejemplo: Pradera-1, Pradera-2, Pradera-3 ...
#==============================================================================
# ■ Add-on Manager
#------------------------------------------------------------------------------
Add_on.insert("Anim_BattleBack")
if Add_on.state("Anim_BattleBack") == true
#==============================================================================
# ■ Options
#------------------------------------------------------------------------------
module Options
module Animated_Back
Template = true
end
end
#==============================================================================
# ■ Game_Battle
#------------------------------------------------------------------------------
class Game_Battle
#--------------------------------------------------------------------------
attr_accessor :back_delay # Retraso entre frames
attr_accessor :back_frames # Número de frames
attr_accessor :back_animated # fondo animado?
#--------------------------------------------------------------------------
alias kot_animatedbattleback_gamebattle_initialize initialize
def initialize
@back_delay = 5
@back_frames = 8
@back_animated = true
kot_animatedbattleback_gamebattle_initialize
end
end
#==============================================================================
# ■ Spriteset_Battle
#------------------------------------------------------------------------------
class Spriteset_Battle
#--------------------------------------------------------------------------
alias kot_animatedbattleback_spritesetbattle_initialize initialize
def initialize
@back_index = 0
@back_delay = $game_battle.back_delay
@back_frames = $game_battle.back_frames
@animated = $game_battle.back_animated
kot_animatedbattleback_spritesetbattle_initialize
end
#--------------------------------------------------------------------------
def update_backsprite
return unless @animated
return unless Graphics.frame_count % @back_delay == 0
@back_index += 1
if @back_index > @back_frames
@back_index = 0
update_backsprite
end
if Options::Animated_Back::Template
x = 640 * (@back_index - 1)
else
x = 0
@battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name + "-#{@back_index}")
end
width = @battleback_sprite.bitmap.width / @back_frames
height = @battleback_sprite.bitmap.height
@battleback_sprite.src_rect.set(x, 0, width, height)
end
end
#==============================================================================
# ■ Scene_Battle (1)
#------------------------------------------------------------------------------
class Scene_Battle
#--------------------------------------------------------------------------
alias kot_animatedbattleback_scenebattle_update update
def update
@spriteset.update_backsprite
kot_animatedbattleback_scenebattle_update
end
end
#------------------------------------------------------------------------------
end
==== Posición de batalla ====
**Este script sólo es compatible con éste sistema de batalla**
Colocar encima de "Main" y debajo del script principal.
#==============================================================================
# Posición De Batalla
#==============================================================================
# Script por: Kotfire
# Versión 1
# Versión especial para mi script de combate: "Kotfire Custom Battle"
#-----------------------------------------------------------------------------
# -Instrucciones-
# Pegar encima de main y disfrutar
#==============================================================================
# ■ Add-on Manager
#------------------------------------------------------------------------------
Add_on.insert("Battle_Position")
if Add_on.state("Battle_Position") == true
#==============================================================================
# ** Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :position # position
#--------------------------------------------------------------------------
# * Setup
# actor_id : actor ID
#--------------------------------------------------------------------------
alias setup_kot setup
def setup(actor_id)
actor = $data_actors[actor_id]
@class_id = actor.class_id
@position = $data_classes[@class_id].position
setup_kot(actor_id)
end
#--------------------------------------------------------------------------
def screen_x
if $game_battle.mirror
@start_x = 40 + ((-10 * @position) + ($game_party.actors.size * 20)) - self.index * 40 if self.index != nil
@start_x += (self.frame_width - 64) / 2
else
@start_x = 530 - ((-10 * @position) + ($game_party.actors.size * 20)) + self.index * 40 if self.index != nil
@start_x -= (self.frame_width - 64) / 2
end
return @start_x
end
end
#==============================================================================
# ** Game_Party
#==============================================================================
class Game_Party
#--------------------------------------------------------------------------
# * Random Selection of Target Actor
# hp0 : limited to actors with 0 HP
#--------------------------------------------------------------------------
def random_target_actor(hp0 = false)
# Initialize roulette
roulette = []
# Loop
for actor in @actors
# If it fits the conditions
if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)
# Get actor class [position]
position = actor.position
# Front guard: n = 4; Mid guard: n = 3; Rear guard: n = 2
n = 4 - position
# Add actor to roulette n times
n.times do
roulette.push(actor)
end
end
end
# If roulette size is 0
if roulette.size == 0
return nil
end
# Spin the roulette, choose an actor
return roulette[rand(roulette.size)]
end
end
#==============================================================================
# ** Window_MenuStatus
#------------------------------------------------------------------------------
# This window displays party member status on the menu screen.
#==============================================================================
class Window_MenuStatus < Window_Selectable
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 0, 480, 480)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = $fontface
self.contents.font.size = $fontsize
refresh
self.active = false
self.index = -1
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@item_max = $game_party.actors.size
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
position = actor.position
x = 64 + 24 * position
y = i * 116
draw_actor_graphic(actor, x - 40, y + 80)
draw_actor_name(actor, x, y)
draw_actor_class(actor, x + 90, y)
draw_actor_hp(actor, x, y + 32)
draw_actor_sp(actor, x, y + 64)
draw_actor_level(actor, x + 184, y)
draw_actor_exp(actor, x + 184, y + 32)
end
end
#--------------------------------------------------------------------------
# * Cursor Rectangle Update
#--------------------------------------------------------------------------
def update_cursor_rect
if @index < 0
self.cursor_rect.empty
else
self.cursor_rect.set(0, @index * 116, self.width - 32, 96)
end
end
end
#==============================================================================
# ** Window_Steps
#------------------------------------------------------------------------------
# This window displays step count on the menu screen.
#==============================================================================
class Window_Steps < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 0, 160, 64)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = $fontface
self.contents.font.size = $fontsize
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = system_color
self.contents.draw_text(4, 0, 120, 32, "Pasos")
self.contents.font.color = normal_color
self.contents.draw_text(4, 0, 120, 32, $game_party.steps.to_s, 2)
end
end
#==============================================================================
# ** Scene_Save
#==============================================================================
class Scene_Save < Scene_File
#--------------------------------------------------------------------------
# * Decision Processing
#--------------------------------------------------------------------------
def on_decision(filename)
# Play save SE
$game_system.se_play($data_system.save_se)
# Write save data
file = File.open(filename, "wb")
write_save_data(file)
file.close
# If called from event
if $game_temp.save_calling
# Clear save call flag
$game_temp.save_calling = false
# Switch to map screen
$scene = Scene_Map.new
return
end
# Switch to menu screen
$scene = Scene_Menu.new(5)
end
#--------------------------------------------------------------------------
# * Cancel Processing
#--------------------------------------------------------------------------
def on_cancel
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# If called from event
if $game_temp.save_calling
# Clear save call flag
$game_temp.save_calling = false
# Switch to map screen
$scene = Scene_Map.new
return
end
# Switch to menu screen
$scene = Scene_Menu.new(5)
end
end
#==============================================================================
# ** Scene_End
#==============================================================================
class Scene_End
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Update command window
@command_window.update
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Switch to menu screen
$scene = Scene_Menu.new(6)
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Branch by command window cursor position
case @command_window.index
when 0 # to title
command_to_title
when 1 # shutdown
command_shutdown
when 2 # quit
command_cancel
end
return
end
end
#--------------------------------------------------------------------------
# * Process When Choosing [Cancel] Command
#--------------------------------------------------------------------------
def command_cancel
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to menu screen
$scene = Scene_Menu.new(6)
end
end
#==============================================================================
# ** Scene_Menu
#------------------------------------------------------------------------------
# This class performs menu screen processing.
#==============================================================================
class Scene_Menu
#--------------------------------------------------------------------------
# * Object Initialization
# menu_index : command cursor's initial position
#--------------------------------------------------------------------------
def initialize(menu_index = 0)
@menu_index = menu_index
end
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
# Make command window
s1 = $data_system.words.item
s2 = $data_system.words.skill
s3 = $data_system.words.equip
s4 = "Estado"
s5 = "Posición"
s6 = "Guardar"
s7 = "Salir"
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6, s7])
@command_window.index = @menu_index
# If number of party members is 0
if $game_party.actors.size == 0
# Disable items, skills, equipment, and status
@command_window.disable_item(0)
@command_window.disable_item(1)
@command_window.disable_item(2)
@command_window.disable_item(3)
@command_window.disable_item(4)
end
# If save is forbidden
if $game_system.save_disabled
# Disable save
@command_window.disable_item(5)
end
# Make play time window
@playtime_window = Window_PlayTime.new
@playtime_window.x = 0
@playtime_window.y = 256
# Make steps window
@steps_window = Window_Steps.new
@steps_window.x = 0
@steps_window.y = 352
# Make gold window
@gold_window = Window_Gold.new
@gold_window.x = 0
@gold_window.y = 416
# Make status window
@status_window = Window_MenuStatus.new
@status_window.x = 160
@status_window.y = 0
# Execute transition
Graphics.transition
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose of windows
@command_window.dispose
@playtime_window.dispose
@steps_window.dispose
@gold_window.dispose
@status_window.dispose
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Update windows
@command_window.update
@playtime_window.update
@steps_window.update
@gold_window.update
@status_window.update
# If command window is active: call update_command
if @command_window.active
update_command
return
end
# If status window is active: call update_status
if @status_window.active
update_status
return
end
end
#--------------------------------------------------------------------------
# * Frame Update (when command window is active)
#--------------------------------------------------------------------------
def update_command
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Switch to map screen
$scene = Scene_Map.new
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# If command other than save or end game, and party members = 0
if $game_party.actors.size == 0 and @command_window.index < 4
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Branch by command window cursor position
case @command_window.index
when 0 # item
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to item screen
$scene = Scene_Item.new
when 1 # skill
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Make status window active
@command_window.active = false
@status_window.active = true
@status_window.index = 0
when 2 # equipment
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Make status window active
@command_window.active = false
@status_window.active = true
@status_window.index = 0
when 3 # status
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Make status window active
@command_window.active = false
@status_window.active = true
@status_window.index = 0
when 4
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Make status window active
@command_window.active = false
@status_window.active = true
@status_window.index = 0
when 5 # save
# If saving is forbidden
if $game_system.save_disabled
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to save screen
$scene = Scene_Save.new
when 6 # end game
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to end game screen
$scene = Scene_End.new
end
return
end
end
#--------------------------------------------------------------------------
# * Frame Update (when status window is active)
#--------------------------------------------------------------------------
def update_status
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Make command window active
@command_window.active = true
@status_window.active = false
@status_window.index = -1
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Branch by command window cursor position
case @command_window.index
when 1 # skill
# If this actor's action limit is 2 or more
if $game_party.actors[@status_window.index].restriction >= 2
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to skill screen
$scene = Scene_Skill.new(@status_window.index)
when 2 # equipment
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to equipment screen
$scene = Scene_Equip.new(@status_window.index)
when 3 # status
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to status screen
$scene = Scene_Status.new(@status_window.index)
when 4
# Play decision SE
$game_system.se_play($data_system.decision_se)
unless $game_party.actors[@status_window.index].position >= 2
$game_party.actors[@status_window.index].position += 1
else
$game_party.actors[@status_window.index].position = 0
end
@status_window.refresh
end
return
end
end
end
#------------------------------------------------------------------------------
end
===== Recursos necesarios =====
Para éste sistema de batalla hace falta unos battlers especiales, con una "pose" por acción del combatiente y con 6 frames por "pose". Cada pose puede ser modificada en el script principal y el tamaño total del battler no es fijo.