Ein Stamina Battle System.
# ** SBBS
# Stamina Based Battle System
#------------------------------------------------------------------------------
# Original by Fomar0153
# Conversion to SP by Fomar0153
# Additional Edits by Jirbytaylor
#==============================================================================
#==============================================================================
# ** Fomar Module
#------------------------------------------------------------------------------
# some module thingy
#==============================================================================
module Fomar
Attack_Cost = 1
Defend_Cost = 5
Item_Cost = 1
Flee_Attempt = 10
Refresh_Rate = 5
def self.attack
return Attack_Cost
end
def self.defend
return Defend_Cost
end
def self.item
return Item_Cost
end
def self.critical_value(n)
return (n == Attack_Cost or n == Defend_Cost or n == Item_Cost)
end
end
#==============================================================================
# ** Game_BattleAction
#------------------------------------------------------------------------------
# This class handles actions in battle. It's used within the Game_Battler
# class.
#==============================================================================
class Game_BattleAction
alias cbs_clear clear
def clear
unless (@kind == 0 and @basic == 1)
cbs_clear
return
end
@speed = 0
@skill_id = 0
@item_id = 0
@target_index = -1
@forcing = false
end
end
#==============================================================================
# ** Game_Battler
#------------------------------------------------------------------------------
# This class deals with battlers. It's used as a superclass for the Game_Actor
# and Game_Enemy classes.
#==============================================================================
class Game_Battler
attr_accessor :vitality
alias cbs_initialize initialize
def initialize
cbs_initialize
@vitality = 1
end
def sp_action_cost
if (@current_action.kind == 0 and @current_action.basic == 1) or
((@current_action.kind == 0 and @current_action.basic == 0) and
@current_action.target_index == -1)
return
end
if @current_action.kind == 0 and @current_action.basic == 0
@sp -= Fomar.attack
end
if @current_action.kind == 1
@sp -= Fomar.attack
end
if @current_action.kind == 2
@sp -= Fomar.item
end
end
end
#==============================================================================
# ** Game_Enemy
#------------------------------------------------------------------------------
# This class handles enemies. It's used within the Game_Troop class
# ($game_troop).
#==============================================================================
class Game_Enemy < Game_Battler
alias cbs_make_action make_action
def make_action
return
end
def can_do_action?
if @current_action.kind == 0 and @current_action.basic == 0
return @sp >= Fomar.attack
end
if @current_action.kind == 1
return @sp >= Fomar.attack
end
if @current_action.kind == 0 and @current_action.basic == 1
return @sp >= Fomar.defend
end
if @current_action.kind == 0 and @current_action.basic == 3
return false
end
end
end
#==============================================================================
# ** Scene_Battle
#------------------------------------------------------------------------------
# This class performs battle screen processing.
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
alias cbs_main main
def main
@fleeing = false
@flee_attempt = 0
@refresh_rate = 0
@enemy_decision = 0
for actor in $game_party.actors
actor.current_action.cbs_clear
end
cbs_main
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
alias cbs_update update
def update
if @refresh_rate == Fomar::Refresh_Rate
@refresh_rate = 0
else
@refresh_rate += 1
end
cbs_update
end
#--------------------------------------------------------------------------
# * Frame Update (party command phase: escape)
#--------------------------------------------------------------------------
def update_phase2_escape
@fleeing = true
@flee_attempt = 0
start_phase3
end
#--------------------------------------------------------------------------
# * Start Party Command Phase
#--------------------------------------------------------------------------
def start_phase2
@fleeing = false
start_phase3
end
#--------------------------------------------------------------------------
# * Frame Update (party command phase)
#--------------------------------------------------------------------------
def update_phase2
start_phase3
end
#--------------------------------------------------------------------------
# * Start Party Command Phase
#--------------------------------------------------------------------------
def end_phase2
@party_command_window.active = false
@party_command_window.visible = false
end
def start_phase3
end_phase2
@phase = 3
@actor_index = 0
@active_battler = $game_party.actors[0]
$game_party.clear_actions
unless @fleeing == true
phase3_setup_command_window
end
end
def phase3_setup_command_window
phase3_make_command_window
@party_command_window.active = false
@party_command_window.visible = false
@actor_command_window.active = true
@actor_command_window.visible = true
@actor_command_window.x = @actor_index * 160
end
def phase3_make_command_window
unless @actor_command_window == nil
@actor_command_window.dispose
end
s1 = "Moves"
s2 = "Items"
s3 = "Defend"
s4 = "End Turn"
s5 = "Flee"
@actor_command_window = Window_Command.new(160, [s1, s2, s3, s4, s5])
@actor_command_window.y = 160 - 32
@actor_command_window.back_opacity = 160
unless @active_battler.inputable?
@actor_command_window.disable_item(0)
@actor_command_window.disable_item(1)
@actor_command_window.disable_item(2)
@actor_command_window.disable_item(3)
return
end
unless @active_battler.sp >= Fomar.attack
@actor_command_window.disable_item(0)
end
unless @active_battler.sp >= Fomar.defend
@actor_command_window.disable_item(2)
end
unless @active_battler.sp >= Fomar.item
@actor_command_window.disable_item(3)
end
end
alias cbs_update_phase3 update_phase3
def update_phase3
if judge
return
end
cbs_update_phase3
if @actor_command_window.active == true or @fleeing == true
@enemy_decision += 1
if @enemy_decision == 50
@enemy_decision -= 50
resolve = false
for enemy in $game_troop.enemies
enemy.cbs_make_action
if enemy.can_do_action?
resolve = true
else
enemy.current_action.clear
end
end
if resolve == true
@check_index = @actor_index
start_phase4
return
end
end
end
if @fleeing == true
if Input.trigger?(Input::B)
start_phase2
end
@flee_attempt += 1
if @flee_attempt == Fomar::Flee_Attempt
enemies_agi = 0
enemies_number = 0
for enemy in $game_troop.enemies
if enemy.exist?
enemies_agi += enemy.agi
enemies_number += 1
end
end
if enemies_number > 0
enemies_agi /= enemies_number
end
actors_agi = 0
actors_number = 0
for actor in $game_party.actors
if actor.exist?
actors_agi += actor.agi
actors_number += 1
end
end
if actors_number > 0
actors_agi /= actors_number
end
success = rand(100) < 50 * actors_agi / enemies_agi
if success
$game_system.se_play($data_system.escape_se)
$game_system.bgm_play($game_temp.map_bgm)
battle_end(1)
else
@flee_attempt -= Fomar::Flee_Attempt
end
end
end
if @active_battler != nil
if Fomar.critical_value(@active_battler.sp)
i = @actor_command_window.index
k = @actor_command_window.visible
l = @actor_command_window.active
phase3_make_command_window
@actor_command_window.x = @actor_index * 160
@actor_command_window.index = i
@actor_command_window.visible = k
@actor_command_window.active = l
end
end
if @actor_command_window.active == true or @fleeing == true
phase3_pass_time
end
end
#--------------------------------------------------------------------------
# * Frame Update (increase vitality count)
#--------------------------------------------------------------------------
def phase3_pass_time
for battler in $game_party.actors + $game_troop.enemies
#battler.sp += battler.vitality
#if battler.sp > battler.maxsp
# battler.sp = battler.maxsp
#end
end
end
#--------------------------------------------------------------------------
# * Frame Update (main phase step 1 : action preparation)
#--------------------------------------------------------------------------
alias cbs_update_phase4_step1 update_phase4_step1
def update_phase4_step1
if @action_battlers.size == 0
@phase = 3
for battler in $game_party.actors + $game_troop.enemies
battler.sp_action_cost
end
i = @actor_command_window.index
phase3_make_command_window
@actor_command_window.index = 1
@actor_command_window.visible = true
@actor_command_window.active = true
@actor_index = @check_index
@actor_command_window.x = 160 * @actor_index
@active_battler = $game_party.actors[@actor_index]
$game_party.clear_actions
for enemy in $game_troop.enemies
enemy.current_action.clear
end
return
end
cbs_update_phase4_step1
end
#--------------------------------------------------------------------------
# * Go to Command Input for Next Actor
#--------------------------------------------------------------------------
def phase3_next_actor
@check_index = @actor_index
start_phase4
return
end
#--------------------------------------------------------------------------
# * Go to Command Input of Previous Actor
#--------------------------------------------------------------------------
def phase3_prior_actor
start_phase2
return
end
#--------------------------------------------------------------------------
# * Frame Update (actor command phase : basic command)
#--------------------------------------------------------------------------
def update_phase3_basic_command
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
phase3_prior_actor
return
end
if Input.trigger?(Input::C)
case @actor_command_window.index
when 0 #skill
if @active_battler.sp < Fomar.attack
$game_system.se_play($data_system.buzzer_se)
return
end
$game_system.se_play($data_system.decision_se)
@active_battler.current_action.kind = 1
start_skill_select
when 1 #item
if @active_battler.sp < Fomar.item
$game_system.se_play($data_system.buzzer_se)
return
end
$game_system.se_play($data_system.decision_se)
@active_battler.current_action.kind = 2
start_item_select
when 2 #guard
if @active_battler.sp < Fomar.defend
$game_system.se_play($data_system.buzzer_se)
return
end
$game_system.se_play($data_system.decision_se)
@active_battler.current_action.kind = 0
@active_battler.current_action.basic = 1
@active_battler.sp -= Fomar.defend
phase3_next_actor
when 3 #end
$game_system.se_play($data_system.decision_se)
@actor_index += 1
if @actor_index == $game_party.actors.size
@actor_index = 0
end
@active_battler = $game_party.actors[@actor_index]
phase3_make_command_window
@actor_command_window.x = @actor_index * 160
when 4 #flee
if $game_temp.battle_can_escape == false
$game_system.se_play($data_system.buzzer_se)
return
end
$game_system.se_play($data_system.decision_se)
update_phase2_escape
end
return
end
end
#--------------------------------------------------------------------------
# * Make Skill Action Results
#--------------------------------------------------------------------------
def make_skill_action_result
# Get skill
@skill = $data_skills[@active_battler.current_action.skill_id]
# If not a forcing action
unless @active_battler.current_action.forcing
# If unable to use due to SP running out
unless @active_battler.skill_can_use?(@skill.id)
# Clear battler being forced into action
$game_temp.forcing_battler = nil
# Shift to step 1
@phase4_step = 1
return
end
end
# Use up SP
@active_battler.sp -= @skill.sp_cost
# Refresh status window
@status_window.refresh
# Show skill name on help window
@help_window.set_text(@skill.name, 1)
# Set animation ID
@animation1_id = @skill.animation1_id
@animation2_id = @skill.animation2_id
# Set command event ID
@common_event_id = @skill.common_event_id
# Set target battlers
set_target_battlers(@skill.scope)
# Apply skill effect
for target in @target_battlers
target.skill_effect(@active_battler, @skill)
end
end
#--------------------------------------------------------------------------
# * Make Basic Action Results
#--------------------------------------------------------------------------
def make_basic_action_result
# If attack
if @active_battler.current_action.basic == 0
# Set anaimation ID
@animation1_id = @active_battler.animation1_id
@animation2_id = @active_battler.animation2_id
# If action battler is enemy
if @active_battler.is_a?(Game_Enemy)
if @active_battler.restriction == 3
target = $game_troop.random_target_enemy
elsif @active_battler.restriction == 2
target = $game_party.random_target_actor
else
index = @active_battler.current_action.target_index
target = $game_party.smooth_target_actor(index)
end
end
# If action battler is actor
if @active_battler.is_a?(Game_Actor)
if @active_battler.restriction == 3
target = $game_party.random_target_actor
elsif @active_battler.restriction == 2
target = $game_troop.random_target_enemy
else
index = @active_battler.current_action.target_index
target = $game_troop.smooth_target_enemy(index)
end
end
# Set array of targeted battlers
@target_battlers = [target]
# Apply normal attack results
for target in @target_battlers
target.attack_effect(@active_battler)
end
return
end
# If guard
if @active_battler.current_action.basic == 1
# Display "Guard" in help window
@active_battler.sp += 10 # Only time the active battler recovers SP
@help_window.set_text($data_system.words.guard, 1)
@status_window.refresh
return
end
# If escape
if @active_battler.is_a?(Game_Enemy) and
@active_battler.current_action.basic == 2
# Display "Escape" in help window
@help_window.set_text("Escape", 1)
# Escape
@active_battler.escape
return
end
# If doing nothing
if @active_battler.current_action.basic == 3
# Clear battler being forced into action
$game_temp.forcing_battler = nil
# Shift to step 1
@phase4_step = 1
return
end
end
#--------------------------------------------------------------------------
# * Frame Update (main phase step 1 : action preparation)
#--------------------------------------------------------------------------
def update_phase4_step1
# Hide help window
@help_window.contents.clear
@help_window.visible = false
# Determine win/loss
if judge
# If won, or if lost : end method
return
end
# If an action forcing battler doesn't exist
if $game_temp.forcing_battler == nil
# Set up battle event
setup_battle_event
# If battle event is running
if $game_system.battle_interpreter.running?
return
end
end
# If an action forcing battler exists
if $game_temp.forcing_battler != nil
# Add to head, or move
@action_battlers.delete($game_temp.forcing_battler)
@action_battlers.unshift($game_temp.forcing_battler)
end
# If no actionless battlers exist (all have performed an action)
if @action_battlers.size == 0
# Start party command phase
start_phase2
return
end
# Initialize animation ID and common event ID
@animation1_id = 0
@animation2_id = 0
@common_event_id = 0
# Shift from head of actionless battlers
@active_battler = @action_battlers.shift
# If already removed from battle
if @active_battler.index == nil
return
end
# Slip damage
if @active_battler.hp > 0 and @active_battler.slip_damage?
@active_battler.slip_damage_effect
@active_battler.damage_pop = true
end
# Natural removal of states
@active_battler.remove_states_auto
# Refresh status window
@status_window.refresh
# Shift to step 2
@phase4_step = 2
end
###
$game_troop = Game_Troop.new # These were added because there would
$game_party = Game_Party.new # be an error without it. (Which Trick was confused about.)
($game_troop.enemies + $game_party.actors).each do |battler|
if battler == @active_battler or not battler.exist?
battler.sp += 1
@status_window.refresh
end
###
end
#--------------------------------------------------------------------------
# * Start Skill Selection
#--------------------------------------------------------------------------
def start_skill_select
# Make skill window
@skill_window = Window_Skill.new(@active_battler)
@skill_window.y = 320
@skill_window.z = 900
@skill_window.height = 160
# Associate help window
@skill_window.help_window = @help_window
# Disable actor command window
@actor_command_window.active = false
@actor_command_window.visible = false
end
#--------------------------------------------------------------------------
# * Start Item Selection
#--------------------------------------------------------------------------
def start_item_select
# Make item window
@item_window = Window_Item.new
@item_window.y = 320
@item_window.z = 900
@item_window.height = 160
# Associate help window
@item_window.help_window = @help_window
# Disable actor command window
@actor_command_window.active = false
@actor_command_window.visible = false
end
end
=begin
#==============================================================================
Okay this script covers a little more of what I want to do. There are
however three things I can't figure out.
- Enemy skill name may not display in the help window after a hero attacks.
- Remember selected hero. After the enemy attacks hero 1 is selected.
Thanks for this head start. If there is anything you think I did wrong tell me.
~ Jirby
($game_troop.enemies + $game_party.actors).each do |battler|
if battler == @active_battler or not battler.exist?
battler.sp += 1
@status_window.refresh
end
Trickster wrote this for me to make it so inactive battlers (heroes and enemies)
recover 1 SP a turn. But not the active hero/enemy.
This was with the turn based system, yet I never found it to work.
Placed at the end of def update_phase4_step1
The text goes screwy in the battle status window. Was that why you shrunk it?
Couldn't seem to fix it?
#==============================================================================
=end