Advertisement
nio_kasgami

STABS reorganization & upgrade

Dec 17th, 2014
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 51.20 KB | None | 0 0
  1. #===============================================================================
  2. # Z3 Simple TActical Battle System (S.T.A.B.S.)
  3. # By Zetu
  4. # Permission required for commercial games
  5. #===============================================================================
  6. # Overwritten Methods:
  7. # None
  8. #-------------------------------------------------------------------------------
  9. # Aliased methods:
  10. # None
  11. #===============================================================================
  12. # Introduction :
  13. #   STABS is a simple tactical battle system for VXAce.
  14. #===============================================================================
  15.  
  16. $imported ||= {}
  17. $imported["Z3S-STABS"] = true
  18.  
  19. module Z3S
  20.   module STABS
  21.    
  22. #==============================================================================
  23. # Battle Setting
  24. #------------------------------------------------------------------------------
  25.     RecoverAfterBattle   = true
  26.     ShowStatesForEnemies = false
  27.     MaxParty             = 3
  28.    
  29. #==============================================================================
  30. # Vocab Setting
  31. #------------------------------------------------------------------------------
  32.  
  33.     MoveCmd  = "Move to location!"
  34.     ItemCmd  = "Use an Item from your Inventory!"
  35.     SkillCmd = "Use a %s skill!"
  36.  
  37.    
  38. #==============================================================================
  39. # Color Setting
  40. #------------------------------------------------------------------------------
  41.     ColorMove      = Color.new(102, 204, 0)
  42.     ColorPhysical  = Color.new(255, 51, 51)
  43.     ColorMagic     = Color.new(51, 153, 0)
  44.     ColorPlacement = Color.new(255, 51, 51)
  45.     ColorSelected  = Color.new(255, 255, 102)
  46.  
  47. #===============================================================================
  48. # END CUZTOMIZATION
  49. #===============================================================================
  50.   end
  51. end
  52.  
  53. #==============================================================================
  54. # ■ BattleManagerII
  55. #==============================================================================
  56. module BattleManagerII
  57.  
  58.   #----------------------------------------------------------------------------
  59.   # ○ new method: battle_start
  60.   #----------------------------------------------------------------------------  
  61.    def self.battle_start(map_id, enable_continue)
  62.       @old_game_map = $game_map
  63.       @x = $game_player.x
  64.       @y = $game_player.y
  65.       $game_map = Game_BattleMap.new
  66.       $game_map.setup(map_id, enable_continue)
  67.       $game_player.refresh
  68.       SceneManager.scene.start_stabs_scene
  69.       $game_party.on_battle_start
  70.     end
  71.    
  72.   #----------------------------------------------------------------------------
  73.   # ○ new method: battle_end
  74.   #----------------------------------------------------------------------------  
  75.     def self.battle_end(win)
  76.       @last_result = win
  77.       $game_map = @old_game_map
  78.       $game_player.moveto(@x, @y)
  79.       SceneManager.scene.spriteset.remove_stabs
  80.       $game_party.on_battle_end
  81.       $game_player.refresh
  82.     end
  83.    
  84.    def self.play_victory_me
  85.      $game_system.battle_end_me.play
  86.    end
  87.    
  88. end
  89. #==============================================================================
  90. # ■ DataManager
  91. #==============================================================================
  92. module DataManager
  93.  
  94.   #----------------------------------------------------------------------------
  95.   # ● alias method:
  96.   #----------------------------------------------------------------------------
  97.   class << self
  98.    alias :stabs_loadnd :load_normal_database
  99.   end
  100.  
  101.  
  102.   #----------------------------------------------------------------------------
  103.   # ● alias method: load_normal_database
  104.   #----------------------------------------------------------------------------
  105.   def self.load_normal_database
  106.     stabs_loadnd
  107.     extract_stabs_data.each do |obj|
  108.       if obj
  109.         obj.add_stabs
  110.       end
  111.     end
  112.    
  113.   end
  114.  
  115.  
  116.   #----------------------------------------------------------------------------
  117.   # ○ new method: extract_stabs_data
  118.   #----------------------------------------------------------------------------  
  119.   def self.extract_stabs_data
  120.     @actors   = $data_actors  # actor_id in the database
  121.     @classes  = $data_classes # classes_id in the database
  122.     @skills   = $data_skills  # skill_id in the database
  123.     @items    = $data_items   # item_id in the database
  124.     @weapons  = $data_weapons # weapon_id in the database
  125.     @armors   = $data_armors  # armor_id in the database
  126.     @enemies  = $data_enemies # enemy_id in the database
  127.     @states   = $data_states  # state_id in the database
  128.    
  129.   #(BAD WAY!  # $data_actors + $data_classes + $data_skills + $data_items +
  130.     #$data_weapons + $data_armors + $data_enemies + $data_states)
  131.     # Explaination : your way of doing this work, but make all this stuff
  132.     # unreadable and to much compact
  133.   end
  134.  
  135.  
  136. end
  137.  
  138. #==============================================================================
  139. # ■ RPG::BaseItem
  140. #==============================================================================
  141. class RPG::BaseItem
  142.  
  143.   #----------------------------------------------------------------------------
  144.   # ○ new method: add_stabs
  145.   #----------------------------------------------------------------------------
  146.   def add_stabs
  147.  
  148.   end
  149.  
  150.   #----------------------------------------------------------------------------
  151.   # ○ new method: add_int
  152.   #----------------------------------------------------------------------------  
  153.   def add_int(regex, default = 0)
  154.     @note.scan(regex).each do
  155.       return $1.to_i
  156.     end
  157.     return default
  158.   end
  159.  
  160. end
  161. #==============================================================================
  162. # ■ RPG::State
  163. #==============================================================================
  164. class RPG::State < RPG::BaseItem
  165.   attr_reader :_s_sci
  166.  
  167.   #----------------------------------------------------------------------------
  168.   # ○ new method: add_stabs
  169.   #----------------------------------------------------------------------------
  170.   def add_stabs
  171.     super
  172.     @_s_sci = add_int(/<special_index[:\s]*(\d)>/i, -1)
  173.   end
  174.  
  175. end
  176. #==============================================================================
  177. # ■ Game_Interpreter
  178. #==============================================================================
  179. class Game_Interpreter
  180.  
  181.   #----------------------------------------------------------------------------
  182.   # ○ new method: stabs_start
  183.   #----------------------------------------------------------------------------
  184.   def stabs_start(map_id, enable_continue = false)
  185.     BattlerManagerII.battle_start(map_id, enable_continue)
  186.   end
  187.  
  188.   #----------------------------------------------------------------------------
  189.   # ○ new method: add_enemy
  190.   #----------------------------------------------------------------------------
  191.   def add_enemy(enemy_id, x, y)
  192.     @last_event = $game_map.add_enemy(enemy_id, x, y)
  193.   end
  194.  
  195.   #----------------------------------------------------------------------------
  196.   # ○ new method: add_enemy_here
  197.   #----------------------------------------------------------------------------
  198.   def add_enemy_here(enemy_id)
  199.     event = $game_map.events[@event_id]
  200.     @last_event = $game_map.add_enemy_here(enemy_id, event)
  201.   end
  202.  
  203. end
  204. #==============================================================================
  205. # ■ Game_Map
  206. #==============================================================================
  207. class Game_Map
  208.  
  209.   #----------------------------------------------------------------------------
  210.   # ○ new method: in_battle?
  211.   #----------------------------------------------------------------------------
  212.   def in_battle?
  213.     return false
  214.   end
  215.  
  216.   #----------------------------------------------------------------------------
  217.   # ○ new method: mode
  218.   #----------------------------------------------------------------------------
  219.   def mode
  220.    return :null
  221.   end
  222.  
  223.   #----------------------------------------------------------------------------
  224.   # ○ new method: phase
  225.   #----------------------------------------------------------------------------
  226.   def phase
  227.    return :null
  228.   end
  229.  
  230. end
  231. #==============================================================================
  232. # ■ Game_BattleMap
  233. #==============================================================================
  234. class Game_BattleMap < Game_Map
  235.  
  236.   attr_reader   :enable_continue
  237.   attr_reader   :party_events
  238.   attr_reader   :enemy_events
  239.   attr_reader   :animated_target
  240.   attr_reader   :targets
  241.   attr_reader   :user
  242.   attr_reader   :item
  243.   attr_reader   :action_list
  244.   attr_reader   :dummy_event
  245.  
  246.   attr_accessor :mode
  247.   attr_accessor :phase
  248.   attr_accessor :on_ok
  249.   attr_accessor :on_cancel
  250.  
  251.   def setup(map_id, enable_continue)
  252.     super(map_id)
  253.     BattleManager.save_bgm_and_bgs
  254.     BattleManager.play_battle_bgm
  255.     @party_events = []
  256.     @enemy_events = []
  257.     @action_list = Stabs_ActionList.new
  258.     @enable_continue = enable_continue
  259.     $game_player.refresh
  260.   end
  261.  
  262.   def finalize
  263.     @all_party_members = party_members
  264.     @all_enemy_members = enemy_members
  265.     $game_troop.enemies = @all_enemy_members
  266.   end
  267.  
  268.   def set(phase, mode, ok = nil, cancel = nil)
  269.     @phase     = phase
  270.     @mode      = mode
  271.     @on_ok     = ok
  272.     @on_cancel = cancel
  273.   end
  274.  
  275.   def battle_active?
  276.     return false if @phase == :wait_for_placement
  277.     return false if @phase == :wait_for_victory
  278.     return true
  279.   end
  280.  
  281.   def victory?
  282.     enemy_members.each do |enemy|
  283.       return false if !enemy.restriction != 4
  284.     end
  285.     return true
  286.   end
  287.  
  288.   def loss?
  289.     false
  290.   end
  291.  
  292.   def setup_events
  293.     super
  294.     @events.values.each do |event|
  295.       event.reset_self_switches
  296.     end
  297.     for y in 0...$game_map.height
  298.       for x in 0...$game_map.width
  299.         if region_id(x, y) == 61
  300.           e = add_new_event(x, y)
  301.           e.event.name = "Placement"
  302.         end
  303.       end
  304.     end
  305.     @dummy_event = add_new_event(0,0)
  306.   end
  307.  
  308.   def add_new_event(x, y, battler = nil)
  309.     for i in 1..99999
  310.       next if @events[i]
  311.       de = RPG::Event.new(0, 0)
  312.       de.pages[0].priority_type = 1
  313.       de.id = i
  314.       @events[i] = Game_Event.new(@map_id, de)
  315.       @events[i].moveto(x, y)
  316.       @events[i].battler = battler
  317.       SceneManager.scene.spriteset.add_event(@events[i])
  318.       return @events[i]
  319.       return nil
  320.     end
  321.   end
  322.  
  323.   def disable_dash?
  324.     true
  325.   end
  326.  
  327.   def encounter_list
  328.     []
  329.   end
  330.  
  331.   def overworld?
  332.     false
  333.   end
  334.  
  335.   def in_battle?
  336.     true
  337.   end
  338.  
  339.   def add_actor_event(event, actor)
  340.     event.battler = actor
  341.     @party_events.push(event)
  342.     event.set_battler_graphic(actor)
  343.   end
  344.  
  345.   def remove_actor_event(event)
  346.     @party_events.delete(event)
  347.     event.battler = nil
  348.   end
  349.  
  350.   def add_enemy(enemy_id, x, y)
  351.     e = add_new_event(x, y, Game_Enemy.new(@enemy_events.size, enemy_id))
  352.     @enemy_events.push(e)
  353.     e.set_battler_graphic(e.battler)
  354.     return setup_enemy(e)
  355.   end
  356.  
  357.   def add_enemy_here(enemy_id, event)
  358.     event.battler = Game_Enemy.new(@enemy_events.size, enemy_id)
  359.     return setup_enemy(event)
  360.   end
  361.  
  362.   def setup_enemy(event)
  363.     @enemy_events.push(event)
  364.     event.set_battler_graphic(event.battler)
  365.     event.refresh
  366.     return event
  367.   end
  368.  
  369.   def delete_event(event)
  370.     remove_event(event)
  371.     SceneManager.scene.spriteset.delete_event(event)
  372.   end
  373.  
  374.   def remove_event(event)
  375.     @party_events.delete(event)
  376.     @enemy_events.delete(event)
  377.     SceneManager.scene.battler_order.delete(event.battler)
  378.     @events.delete(event.event.id)
  379.   end
  380.  
  381.   def party_members
  382.     @party_events.collect do |event| event.battler end
  383.   end
  384.  
  385.   def enemy_members
  386.     @enemy_events.collect do |event| event.battler end
  387.   end
  388.  
  389.   def battle_members
  390.     party_members | enemy_members
  391.   end
  392.  
  393.   def allow_char_select?
  394.     @mode == :free
  395.   end
  396.  
  397.   def battler_event_xy(x, y)
  398.     events_xy(x, y).each do |event|
  399.       if event.battler
  400.         return event
  401.       end
  402.     end
  403.     return nil
  404.   end
  405.  
  406.   def battler_xy(x, y)
  407.     e = battler_event_xy(x, y)
  408.     e ? e.battler : nil
  409.   end
  410.  
  411.   def in_animation?
  412.     $game_map.battle_members.each do |battler|
  413.       return true if battler.event.animation_id != 0
  414.     end
  415.     return false
  416.   end
  417.  
  418.   def item_apply(user, item, targets, weapon_slot = -1)
  419.     @user    = user
  420.     @item    = item
  421.     @targets = targets
  422.     show_animation(targets, item.animation_id)
  423.     user.event.turn_toward_player# if item.need_selection?
  424.     SceneManager.scene.wait_for_effects
  425.     battle_members.each do |battler|
  426.       if targets.include?(battler)
  427.         battler.item_apply(user, item)
  428.         SceneManager.scene.show_results(battler, item)
  429.       end
  430.     end
  431.     set(:wait_for_collapse, :fixed)
  432.   end
  433.  
  434.  
  435.  
  436.   def show_animation(targets, animation_id)
  437.     if animation_id < 0
  438.       show_attack_animation(targets)
  439.     else
  440.       show_normal_animation(targets, animation_id)
  441.     end
  442.   end
  443.  
  444.   def show_attack_animation(targets)
  445.     if @user.actor?
  446.       show_normal_animation(targets, @user.atk_animation_id1)
  447.     else
  448.       Sound.play_enemy_attack
  449.     end
  450.   end
  451.  
  452.   def show_normal_animation(targets, animation_id)
  453.     animation = $data_animations[animation_id]
  454.     if animation
  455.       targets.each do |target|
  456.         target.event.animation_id = animation_id
  457.       end
  458.     end
  459.   end
  460.  
  461.   def animation_clear?
  462.     return true unless @animated_target
  463.    
  464.   end
  465.  
  466. end
  467. #==============================================================================
  468. # ■ Game_BattlerBase
  469. #==============================================================================
  470. class Game_BattlerBase
  471.   attr_accessor :event
  472.  
  473.   def stabs_move
  474.     4
  475.   end
  476.  
  477.   def tp
  478.     100
  479.   end
  480.  
  481.   def ally(battler)
  482.     $game_map.party_members.include?(self) ==
  483.     $game_map.party_members.include?(battler)
  484.   end
  485.  
  486.   def leave_corpse?
  487.     false
  488.   end
  489.  
  490.   def perform_collapse_effect
  491.     if !leave_corpse?
  492.       @event.set_collapse
  493.       $game_map.remove_event(self.event)
  494.     end
  495.   end
  496.  
  497.   def stabs_battler?
  498.     self.actor?
  499.   end
  500.  
  501.   def make_actions_list
  502.     Stabs_ActionList.generate(self)
  503.   end
  504.  
  505. end
  506. #==============================================================================
  507. # ■ Game_Enemy
  508. #==============================================================================
  509. class Game_Enemy < Game_Battler
  510.  
  511.   def max_tp
  512.     0
  513.   end
  514.  
  515.   alias :stabs_pce :perform_collapse_effect
  516.   def perform_collapse_effect
  517.     $game_map.in_battle? ? super : stabs_pce
  518.   end
  519.  
  520.   def auto_battle?
  521.     true
  522.   end
  523.  
  524. end
  525. #==============================================================================
  526. # ■ Game_Actor
  527. #==============================================================================
  528. class Game_Actor < Game_Battler
  529.  
  530.   def leave_corpse?
  531.     true
  532.   end
  533.  
  534.   alias :stabs_pce :perform_collapse_effect
  535.   def perform_collapse_effect
  536.     $game_map.in_battle? ? super : stabs_pce
  537.   end
  538.  
  539.   def drop_weapon(slot_id)
  540.     if @equips[slot_id].is_weapon?
  541.       @equips[slot_id].set_equip(true, 0)
  542.     end
  543.   end
  544.  
  545. end
  546. #==============================================================================
  547. # ■ Game_Troop
  548. #==============================================================================
  549. class Game_Troop < Game_Unit
  550.   attr_accessor :enemies
  551. end
  552. #==============================================================================
  553. # ■ Scene_Map
  554. #==============================================================================
  555. class Scene_Map < Scene_Base
  556.   attr_reader :spriteset, :selector, :battler_order, :log_window
  557.  
  558.   def start_stabs_scene
  559.     @spriteset.setup_stabs_sprites
  560.     @selector = Stabs_Selector.new
  561.     @spriteset.sprite_field.selector = @selector
  562.     @selector.get_placement
  563.     @spriteset.set_new_rect(:placement)
  564.     moveto_nexthashstarter
  565.     $game_map.set(:wait_for_placement,:fixed,:selection_placement,:selection_cancel)
  566.     create_initial_windows
  567.     disable_all_windows
  568.     @placecommand_window.show.activate
  569.   end
  570.  
  571.   alias :stabs_t :terminate
  572.   def terminate
  573.     stabs_t
  574.     perform_battle_transition if SceneManager.scene_is?(Scene_Map) and
  575.     $game_map.in_battle?
  576.   end
  577.  
  578.   def invoke(symbol)
  579.     return if symbol == nil
  580.     send(symbol)
  581.   end
  582.  
  583.   def xy
  584.     return $game_player.x, $game_player.y
  585.   end
  586.  
  587.   def moveto_nexthashstarter
  588.     px = $game_player.x
  589.     py = $game_player.y
  590.     $game_map.height.times do |y|
  591.       $game_map.width.times do |x|
  592.         next unless @selector.include?(x, y)
  593.         unless @selector.include?(px, py)
  594.           $game_player.moveto(x, y)
  595.           return
  596.         end
  597.         event = $game_map.events_xy(x, y)[0]
  598.         next unless event.name =~ /Placement/
  599.         next if event.battler
  600.         $game_player.moveto(x, y)
  601.         return
  602.       end
  603.     end
  604.   end
  605.  
  606.   def create_initial_windows
  607.     @help_window = Window_Help.new
  608.     @placecommand_window = Window_PlaceCommand.new
  609.     @placecommand_window.set_handler(:actor,   method(:actor_place))
  610.     @placecommand_window.set_handler(:start,   method(:start_battle_confirmation))
  611.     @placecommand_window.set_handler(:cancel,  method(:placement_cancel))
  612.     @confirmation_window = Window_BattleConfirmation.new
  613.     @confirmation_window.set_handler(:start, method(:start_battle))
  614.     @confirmation_window.set_handler(:back,  method(:return_to_placement))
  615.     @confirmation_window.center
  616.     @actorcommand_window = Window_STABSActorCommand.new(@help_window)
  617.     @actorcommand_window.set_handler(:move,    method(:cmd_move))
  618.     @actorcommand_window.set_handler(:use_ext, method(:cmd_use_ext))
  619.     @actorcommand_window.set_handler(:skill,   method(:cmd_skill))
  620.     @actorcommand_window.set_handler(:item,    method(:cmd_item))
  621.     @actorcommand_window.set_handler(:wait,    method(:cmd_wait))
  622.     @log_window = Window_BattleLog.new
  623.     @log_window.method_wait = method(:wait)
  624.     @skill_window = Window_StabsSkill.new(@help_window)
  625.     @skill_window.set_handler(:ok, method(:use_skill_ext))
  626.     @skill_window.set_handler(:cancel, method(:open_battler_commands))
  627.   end
  628.  
  629.   def disable_all_windows
  630.     instance_variables.each do |varname|
  631.       ivar = instance_variable_get(varname)
  632.       next if ivar.is_a?(Window_BattleLog)
  633.       next if ivar.is_a?(Window_Message)
  634.       ivar.hide.deactivate if ivar.is_a?(Window)
  635.     end
  636.   end
  637.  
  638.   def actor_place
  639.     event = Game_Event.get($game_map.events_xy(*xy), /Placement/)
  640.     battler = @placecommand_window.current_ext
  641.     $game_map.add_actor_event(event, battler)
  642.     moveto_nexthashstarter
  643.     @placecommand_window.activate.refresh
  644.     if $game_map.party_members.size >= Z3S::STABS::MaxParty
  645.       start_battle_confirmation
  646.     end
  647.     @placecommand_window.index += 1
  648.   end
  649.  
  650.   def start_battle_confirmation
  651.     disable_all_windows
  652.     @confirmation_window.show.activate
  653.   end
  654.  
  655.   def placement_cancel
  656.     disable_all_windows
  657.     $game_map.mode = :free
  658.   end
  659.  
  660.   def cmd_move
  661.     disable_all_windows
  662.     $game_map.set(:wait_for_move, :free, :move_to_xy, :open_battler_commands)
  663.     @selector.get_move_path(active_battler.event)
  664.     @spriteset.set_new_rect(:move)
  665.   end
  666.  
  667.   def cmd_use_ext
  668.     disable_all_windows
  669.     set_active_skill(@actorcommand_window.current_ext)
  670.   end
  671.  
  672.   def cmd_wait
  673.     disable_all_windows
  674.     next_battler
  675.   end
  676.  
  677.   def use_skill_ext
  678.     disable_all_windows
  679.     set_active_skill(@skill_window.item)
  680.   end
  681.  
  682.   def cmd_item
  683.     @actorcommand_window.activate
  684.   end
  685.  
  686.   def cmd_skill
  687.     disable_all_windows
  688.     @help_window.activate
  689.     @skill_window.actor = active_battler
  690.     @skill_window.stype_id = @actorcommand_window.current_ext
  691.     @skill_window.refresh
  692.     @skill_window.activate.show
  693.   end
  694.  
  695.   def show_results(battler, item)
  696.     $game_player.moveto(battler.event.x, battler.event.y)
  697.     @log_window.display_action_results(battler, item)
  698.     wait_for_effects
  699.   end
  700.  
  701.   def set_active_skill(skill)
  702.     @active_skill = skill
  703.     @selector.set_skill(active_battler.event, skill)
  704.     if skill.need_selection?
  705.       $game_map.set(nil, :free, :skill_selection, :open_battler_commands)
  706.     else
  707.       $game_map.item_apply(active_battler, skill, @selector.targets)
  708.       post_item_apply
  709.     end
  710.   end
  711.  
  712.   def disable_skill
  713.     @active_skill = nil
  714.   end
  715.  
  716.   def start_battle
  717.     disable_all_windows
  718.     $game_map.phase = nil
  719.     $game_map.finalize
  720.     @spriteset.clear_all_rect
  721.     init_battler_order
  722.     get_next_battler
  723.   end
  724.  
  725.   def init_battler_order
  726.     @battler_order = $game_map.battle_members.compact.sort do |b1, b2|
  727.       b2.agi <=> b1.agi
  728.     end
  729.     @active_battler = @battler_order[0]
  730.   end
  731.  
  732.   def start_turn
  733.     active_battler.event.clear_stabs
  734.     @log_window.display_current_state(active_battler)
  735.     @log_window.wait_and_clear
  736.     if active_battler.restriction == 4
  737.       next_battler
  738.     elsif active_battler.auto_battle?
  739.       determine_auto_command
  740.     else
  741.       activate_active_battler
  742.     end
  743.   end
  744.  
  745.   def turn_end
  746.     active_battler.on_turn_end
  747.     active_battler.on_action_end
  748.     @log_window.display_auto_affected_status(active_battler)
  749.     @log_window.wait_and_clear
  750.     alter_turn_base
  751.   end
  752.  
  753.   def active_battler
  754.     @battler_order ? @battler_order[0] : nil
  755.   end
  756.  
  757.   def next_battler
  758.     turn_end
  759.     get_next_battler
  760.   end
  761.  
  762.   def get_next_battler
  763.     @active_battler = @battler_order[0]
  764.     @actorcommand_window.index = 0
  765.     start_turn
  766.   end
  767.  
  768.   def alter_turn_base
  769.     last_active_battler = @battler_order.shift
  770.     @battler_order.push last_active_battler
  771.   end
  772.  
  773.   def move_battler(battler, x, y)
  774.     $game_map.mode = :fixed
  775.     active_battler.event.move_toward_xy(x, y)
  776.     @target_x = x
  777.     @target_y = y
  778.   end
  779.  
  780.   def activate_active_battler
  781.     @spriteset.clear_all_rect
  782.     b = active_battler.event
  783.     $game_player.moveto(b.x, b.y)
  784.     open_battler_commands
  785.   end
  786.  
  787.   def determine_auto_command
  788.     @spriteset.clear_all_rect
  789.     open_battler_commands
  790.   end
  791.  
  792.   def open_battler_commands
  793.     disable_all_windows
  794.     @spriteset.set_new_rect(:clear)
  795.     x = active_battler.event.x
  796.     y = active_battler.event.y
  797.     $game_player.moveto(x, y)
  798.     @actorcommand_window.battler = active_battler
  799.     @actorcommand_window.show.activate
  800.     @help_window.show.activate
  801.     @actorcommand_window.refresh
  802.     $game_map.mode  = :fixed
  803.     $game_map.phase = nil
  804.   end
  805.  
  806.   def return_to_placement
  807.     disable_all_windows
  808.     $game_map.mode = :free
  809.   end
  810.  
  811.   def move_to_xy
  812.     if @selector.include?(*xy)
  813.       active_battler.event.stabs_moves += 1
  814.       move_battler(active_battler, *xy)
  815.     elsif active_battler.event.pos?(*xy)
  816.       activate_active_battler
  817.     else
  818.       Sound.play_buzzer
  819.     end
  820.   end
  821.  
  822.   def skill_selection
  823.     if @selector.include?(*xy) and
  824.       (targets=@selector.get_targets(*xy)).size != 0
  825.       $game_map.item_apply(active_battler, @active_skill, targets)
  826.       post_item_apply
  827.     else
  828.       Sound.play_buzzer
  829.     end
  830.   end
  831.  
  832.   def stabs_confirm
  833.     invoke($game_map.on_ok)
  834.   end
  835.  
  836.   def stabs_cancel
  837.     invoke($game_map.on_cancel)
  838.   end
  839.  
  840.   def post_item_apply
  841.     @selector.last_targets.each do |user|
  842.       next unless rand < user.item_cnt(active_battler, @active_skill)
  843.       attack_skill = $data_skills[user.attack_skill_id]
  844.       t_selector = Stabs_Selector.new
  845.       t_selector.set_skill(user.event, attack_skill)
  846.       next unless t_selector.targets.include?(active_battler)
  847.       @log_window.display_counter(user, attack_skill)
  848.       ts = t_selector.get_targets(*active_battler.event.xy)
  849.       $game_player.moveto(*active_battler.event.xy)
  850.       $game_map.item_apply(user, attack_skill, ts)
  851.     end
  852.   end
  853.  
  854.   def selection_cancel
  855.     moveto_nexthashstarter
  856.     selection_placement
  857.     $game_map.remove_actor_event(Game_Event.get($game_map.events_xy(*xy),
  858.     /Placement/))
  859.   end
  860.  
  861.   def selection_placement
  862.     if @selector.include?(*xy)
  863.       Sound.play_cursor
  864.       $game_map.events_xy(*xy).each do |event|
  865.         $game_map.remove_actor_event(event) if event.name =~ /Placement/
  866.       end
  867.       @placecommand_window.show.activate.refresh
  868.       $game_map.mode = :fixed
  869.     else
  870.       Sound.play_cancel
  871.     end
  872.   end
  873.  
  874.   alias :stabsucm :update_call_menu
  875.   def update_call_menu
  876.     if $game_map.in_battle?
  877.       @menu_calling = false
  878.     else
  879.       stabsucm
  880.     end
  881.   end
  882.  
  883.   def wait(duration)
  884.     duration.times {|i| update_for_wait if i < duration / 2 || !show_fast? }
  885.   end
  886.  
  887.   def pause(duration)
  888.     duration.times do update end
  889.   end
  890.  
  891.   def show_fast?
  892.     Input.press?(:A) || Input.press?(:C)
  893.   end
  894.  
  895.   alias :stabsu :update
  896.   def update
  897.     stabsu
  898.     update_stabs if $game_map.in_battle?
  899.   end
  900.  
  901.   def update_stabs
  902.     invoke($game_map.phase)
  903.     update_win_loss if $game_map.battle_active?
  904.   end
  905.  
  906.   def update_win_loss
  907.     if $game_map.victory?
  908.       $game_map.phase = :wait_for_victory
  909.       BattleManagerII.play_victory_me
  910.       BattleManager.replay_bgm_and_bgs
  911.       disable_all_windows
  912.       $game_message
  913.       $game_message.add(sprintf(Vocab::Victory, $game_party.name))
  914.       $game_message.visible = true
  915.       BattleManager.display_exp
  916.       BattleManager.gain_gold
  917.       BattleManager.gain_drop_items
  918.       BattleManager.gain_exp
  919.       wait_for_message
  920.       BattleManagerII.battle_end(true)
  921.     elsif $game_map.loss?
  922.       SceneManager.goto(Scene_Gameover)
  923.     end
  924.   end
  925.  
  926.   def wait_for_victory
  927.   end
  928.  
  929.   def update_for_wait
  930.     update_basic
  931.     @spriteset.update
  932.   end
  933.  
  934.   def wait_for_message
  935.     update while $game_message.visible
  936.   end
  937.  
  938.   def wait_for_placement
  939.     @selector.ext.each do |event|
  940.       next if event.battler
  941.       if event.pos?(*xy) and @placecommand_window.visible
  942.         event.set_battler_graphic(@placecommand_window.current_ext)
  943.       else
  944.         event.set_graphic("", 0)
  945.       end
  946.     end
  947.   end
  948.  
  949.   def wait_for_move
  950.     event = active_battler.event
  951.     if event.x == @target_x and event.y == @target_y
  952.       @target_x = @target_y = -1
  953.       pause(15)
  954.       @spriteset.set_new_rect(:clear)
  955.       activate_active_battler
  956.     end
  957.   end
  958.  
  959.   def wait_for_effects
  960.     update_for_wait while $game_map.in_animation?
  961.   end
  962.  
  963.   def wait_for_collapse
  964.     return if $game_map.battle_members.any?{ |battler|
  965.       battler.event.collapse?
  966.     }
  967.     next_battler
  968.   end
  969.  
  970. end
  971. #==============================================================================
  972. # ■ Game_Even
  973. #==============================================================================
  974. class Game_Event < Game_Character
  975.   attr_accessor :stabs_moves, :event, :collapse
  976.   attr_reader :battler, :stored_pathing, :special_index
  977.   attr_writer :move_speed
  978.  
  979.   alias :stabsi :initialize
  980.   def initialize(map_id, event)
  981.     stabsi(map_id, event)
  982.     clear_stabs
  983.     @stored_pathing = []
  984.   end
  985.  
  986.   def self.get(array, regex)
  987.     array.each do |item|
  988.       return item if item.name =~ regex
  989.     end
  990.     return nil
  991.   end
  992.  
  993.   def xy
  994.     return @x, @y
  995.   end
  996.  
  997.   def clear_stabs
  998.     @stabs_moves = 0
  999.   end
  1000.  
  1001.   def name
  1002.     @event.name
  1003.   end
  1004.  
  1005.   def reset_self_switches
  1006.     ["A","B","C","D"].each do |letter|
  1007.       key = [@map_id, @id, letter]
  1008.       $game_self_switches[key] = false
  1009.     end
  1010.   end
  1011.    
  1012.  
  1013.   def set_enemy(enemy_id, index)
  1014.     self.battler = Game_Enemy.new(index, enemy_id)
  1015.   end
  1016.  
  1017.   def battler=(new_battler)
  1018.     @battler = new_battler
  1019.     if @battler
  1020.       @battler.event = self
  1021.     end
  1022.   end
  1023.  
  1024.   def set_battler_graphic(battler)
  1025.     if battler.nil?
  1026.       set_graphic("", 0)
  1027.     elsif battler.actor?
  1028.       set_actor_graphic(battler)
  1029.     else
  1030.       set_enemy_graphic(battler)
  1031.     end
  1032.   end
  1033.  
  1034.   def set_actor_graphic(actor)
  1035.     set_graphic(actor.character_name, actor.character_index)
  1036.   end
  1037.  
  1038.   def set_enemy_graphic(enemy)
  1039.     enemy.enemy.note.scan(/<battler:?\s*(\S+)\s+(\d)>/i) do
  1040.       set_graphic($1, $2.to_i)
  1041.       return
  1042.     end
  1043.     set_graphic("", 0)
  1044.   end
  1045.  
  1046.   def all_enemies
  1047.     return [] unless @battler
  1048.     if $game_map.party_members.include?(@battler)
  1049.       return $game_map.enemy_members
  1050.     else
  1051.       return $game_map.party_members
  1052.     end
  1053.   end
  1054.  
  1055.   def all_allies
  1056.     return [] unless @battler
  1057.     if $game_map.party_members.include?(@battler)
  1058.       return $game_map.party_members
  1059.     else
  1060.       return $game_map.enemy_members
  1061.     end
  1062.   end
  1063.  
  1064.   def move_toward_xy(x, y)
  1065.     @target_x = x
  1066.     @target_y = y
  1067.     @stored_pathing = SceneManager.scene.selector.selected[:ext].clone
  1068.     @stored_pathing.delete_at(0)
  1069.   end
  1070.  
  1071.   alias :stabsu :update
  1072.   def update
  1073.     stabsu
  1074.     update_stored_movepath if $game_map.in_battle?
  1075.     update_stabs_info if $game_map.in_battle? and @battler
  1076.     update_balloon if battler
  1077.   end
  1078.  
  1079.   def update_balloon
  1080.     battler.states.each do |state|
  1081.       state.note.scan(/<balloon id[:\s]+(\d+)>/) do
  1082.         return @balloon_id = $1.to_i
  1083.       end
  1084.     end
  1085.     @ballon_id = 0
  1086.   end
  1087.  
  1088.   def update_stabs_info
  1089.     @priority_type   = 1
  1090.     @move_speed      = 4
  1091.     @through         = true
  1092.     @step_anime      = true
  1093.     @special_index   = -1
  1094.     return if !@battler.stabs_battler?
  1095.     @special_index   = get_special_index
  1096.     @step_anime      = !is_special?
  1097.     @direction_fix   = is_special?
  1098.     @character_index = get_stabs_char_i
  1099.     update_specials if is_special?
  1100.   end
  1101.  
  1102.   def is_special?
  1103.     @special_index >= 0
  1104.   end
  1105.  
  1106.   def update_event_data(page)
  1107.   end
  1108.  
  1109.   def update_specials
  1110.     @direction = (@special_index / 3)*2 + 2
  1111.     @pattern   = @special_index % 3
  1112.   end
  1113.  
  1114.   def get_stabs_char_i
  1115.     if is_special?
  1116.       7
  1117.     elsif false #Attack/Spell Animation
  1118.      
  1119.     else
  1120.       1
  1121.     end
  1122.   end
  1123.  
  1124.   def get_special_index
  1125.     @battler.states.each do |state|
  1126.       if state._s_sci != -1
  1127.         return state._s_sci
  1128.       end
  1129.     end
  1130.     return -1
  1131.   end
  1132.  
  1133.   def set_collapse
  1134.     @collapse = true
  1135.     SceneManager.scene.spriteset.apply_collapse(self)
  1136.   end
  1137.  
  1138.   def collapse?
  1139.    
  1140.   end
  1141.  
  1142.   def update_stored_movepath
  1143.     return if moving?
  1144.     return if @stored_pathing == []
  1145.     next_xy = @stored_pathing.delete_at(0)
  1146.     return if next_xy == [@x, @y]
  1147.     set_next_move(*next_xy)
  1148.   end
  1149.  
  1150.   def set_next_move(x, y)
  1151.     @through = true
  1152.     @stabs_moving = true
  1153.     @moving
  1154.     sx = distance_x_from(x)
  1155.     sy = distance_y_from(y)
  1156.     if sx.abs > sy.abs
  1157.       move_straight(sx > 0 ? 4 : 6)
  1158.       move_straight(sy > 0 ? 8 : 2) if !@move_succeed && sy != 0
  1159.     elsif sy != 0
  1160.       move_straight(sy > 0 ? 8 : 2)
  1161.       move_straight(sx > 0 ? 4 : 6) if !@move_succeed && sx != 0
  1162.     end
  1163.     @through = false
  1164.   end
  1165.  
  1166. end
  1167. #==============================================================================
  1168. # ■ Game_Player
  1169. #==============================================================================
  1170. class Game_Player < Game_Character
  1171.  
  1172.   alias :stabsr :refresh
  1173.   def refresh
  1174.     stabsr
  1175.     if $game_map.in_battle?
  1176.       @character_name = ""
  1177.       @followers.refresh
  1178.     end
  1179.   end
  1180.  
  1181.   def update
  1182.     last_real_x = @real_x
  1183.     last_real_y = @real_y
  1184.     last_moving = moving?
  1185.     move_by_input
  1186.     super
  1187.     update_scroll(last_real_x, last_real_y)
  1188.     update_vehicle
  1189.     update_nonmoving(last_moving) unless moving?
  1190.     @followers.update
  1191.   end
  1192.  
  1193.   alias :stabsmbi :move_by_input
  1194.   def move_by_input
  1195.     if $game_map.in_battle?
  1196.       return if !movable?
  1197.       return if $game_map.interpreter.running?
  1198.       return unless $game_map.allow_char_select?
  1199.       stabs_char_input
  1200.     else
  1201.       stabsmbi
  1202.     end
  1203.   end
  1204.  
  1205.   def stabs_char_input
  1206.     if Input.trigger? :UP
  1207.       return if @y == 0
  1208.       moveto @x, @y - 1
  1209.     elsif Input.trigger? :DOWN
  1210.       return if @y == $game_map.height - 1
  1211.       moveto @x, @y + 1
  1212.     elsif Input.trigger? :LEFT
  1213.       return if @x == 0
  1214.       moveto @x - 1, @y
  1215.     elsif Input.trigger? :RIGHT
  1216.       return if @x == $game_map.width - 1
  1217.       moveto @x + 1, @y
  1218.     elsif Input.trigger? :C
  1219.       SceneManager.scene.stabs_confirm
  1220.     elsif Input.trigger? :B
  1221.       SceneManager.scene.stabs_cancel
  1222.     end
  1223.   end
  1224.  
  1225. end
  1226.  
  1227. class Game_Follower < Game_Character
  1228.  
  1229.   alias :stabsv? :visible?
  1230.   def visible?
  1231.     stabsv? and !$game_map.in_battle?
  1232.   end
  1233. end
  1234. #==============================================================================
  1235. # ■ Spriteset_Map
  1236. #==============================================================================
  1237. class Spriteset_Map
  1238.   attr_reader :sprite_field, :viewport1, :viewport2, :viewport3
  1239.  
  1240.   def setup_stabs_sprites
  1241.     @sprite_field = Sprite_Rect.new(@viewport1)
  1242.     @stabs_battlerhud = Sprite_StabsBattlerHUD.new(@viewport3, 0)
  1243.     @stabs_battlerhud2 = Sprite_StabsBattlerHUD.new(@viewport3, 100)
  1244.     @sprites_collapse = []
  1245.   end
  1246.  
  1247.   def remove_stabs
  1248.     all_stabs_sprites.each do |sprite|
  1249.       sprite.dispose
  1250.     end
  1251.   end
  1252.  
  1253.   alias :stabsu :update
  1254.   def update
  1255.     stabsu
  1256.     update_stabs if $game_map.in_battle? and @sprite_field
  1257.   end
  1258.  
  1259.   def all_stabs_sprites
  1260.     [@sprite_field, @stabs_battlerhud, @stabs_battlerhud2] + @sprites_collapse
  1261.   end
  1262.  
  1263.   def update_stabs
  1264.     @sprite_field.update
  1265.     @stabs_battlerhud.battler = SceneManager.scene.active_battler
  1266.     @stabs_battlerhud2.battler = $game_map.battler_xy($game_player.x, $game_player.y)
  1267.     @stabs_battlerhud.update
  1268.     @stabs_battlerhud2.update
  1269.     Sprite_Rect.next_animation_cycle
  1270.     update_sprites_collapse
  1271.   end
  1272.  
  1273.   def update_sprites_collapse
  1274.     @sprites_collapse.each do |sprite|
  1275.       sprite.update
  1276.       if sprite.collapse_finished
  1277.         sprite.dispose
  1278.         @sprites_collapse.delete(sprite)
  1279.         $game_map.delete_event(sprite.character)
  1280.       end
  1281.     end
  1282.   end
  1283.  
  1284.   def clear_all_rect
  1285.     set_new_rect :clear
  1286.   end
  1287.  
  1288.   def set_new_rect(symbol)
  1289.     @sprite_field.symbol = symbol
  1290.   end
  1291.  
  1292.   def delete_event(event)
  1293.     @character_sprites.select! do |sprite|
  1294.       if (sprite.character == event)
  1295.         sprite.dispose
  1296.         false
  1297.       else
  1298.         true
  1299.       end
  1300.     end
  1301.   end
  1302.  
  1303.   def apply_collapse(event)
  1304.     @character_sprites.each do |sprite|
  1305.       if sprite.character == event
  1306.         @sprites_collapse.push(sprite)
  1307.         @character_sprites.delete(sprite)
  1308.         sprite.collapse
  1309.       end
  1310.     end
  1311.   end
  1312.  
  1313.   def add_event(event)
  1314.     return if @character_sprites.any? do |sprite| sprite.character == event end
  1315.     @character_sprites.push(Sprite_Character.new(@viewport1, event))
  1316.   end
  1317.  
  1318. end
  1319. #==============================================================================
  1320. # ■ Sprite_Rect
  1321. #==============================================================================
  1322. class Sprite_Rect < Sprite_Base
  1323.   attr_reader :mode, :symbol
  1324.   attr_accessor :selector
  1325.  
  1326.   @@animation_cycle = 0
  1327.  
  1328.   def self.next_animation_cycle
  1329.     @@animation_cycle += 1
  1330.     @@animation_cycle %= 64
  1331.   end
  1332.  
  1333.   def symbol=(new_symbol)
  1334.     @symbol = new_symbol
  1335.     refresh
  1336.   end
  1337.  
  1338.   def initialize(viewport)
  1339.     super(viewport)
  1340.     self.bitmap = Bitmap.new($game_map.width*32, $game_map.height*32)
  1341.     @symbol     = :clear
  1342.     @x          = $game_player.x
  1343.     @y          = $game_player.y
  1344.     refresh
  1345.   end
  1346.  
  1347.   def update
  1348.     update_selected
  1349.     update_position
  1350.     update_opacity
  1351.   end
  1352.  
  1353.   def refresh
  1354.     self.bitmap.clear
  1355.     add_rect($game_player.x, $game_player.y, :selected)
  1356.     return if @symbol == :clear or @selector.nil?
  1357.     @selector.xy.each do |xy|
  1358.       next if $game_player.pos?(*xy)
  1359.       add_rect(*xy, @symbol)
  1360.     end
  1361.   end
  1362.  
  1363.   def update_selected
  1364.     return if @x == $game_player.x and @y == $game_player.y
  1365.     @x = $game_player.x
  1366.     @y = $game_player.y
  1367.     refresh
  1368.   end
  1369.  
  1370.   def update_position
  1371.     self.x  = $game_map.adjust_x(0) * 32
  1372.     self.oy = $game_map.height * 32
  1373.     self.y  = $game_map.adjust_y($game_map.height) * 32
  1374.   end
  1375.  
  1376.   def update_opacity
  1377.     self.opacity = (32-@@animation_cycle).abs*3.0 + 96
  1378.   end
  1379.  
  1380.   def add_rect(x, y, symbol)
  1381.     self.bitmap.fill_rect(x*32+1, y*32+1, 30, 30, Color.new(0,0,0))
  1382.     self.bitmap.fill_rect(x*32+2, y*32+2, 28, 28, rect_color(symbol))
  1383.   end
  1384.  
  1385.   def rect_color(symbol)
  1386.     case symbol
  1387.     when :move
  1388.       Z3S::STABS::ColorMove
  1389.     when :physical
  1390.       Z3S::STABS::ColorPhysical
  1391.     when :magic
  1392.       Z3S::STABS::ColorMagic
  1393.     when :placement
  1394.       Z3S::STABS::ColorPlacement
  1395.     when :selected
  1396.       Z3S::STABS::ColorSelected
  1397.     else
  1398.       Color.new(255, 255, 255)
  1399.     end
  1400.   end
  1401.  
  1402. end
  1403. #==============================================================================
  1404. # ■ Sprite_Character
  1405. #==============================================================================
  1406. class Sprite_Character < Sprite_Base
  1407.   attr_reader :collapse_finished
  1408.  
  1409.   alias :stabsuo :update_other
  1410.   def update_other
  1411.     if @collapse
  1412.       update_collapse
  1413.     else
  1414.       stabsuo
  1415.     end
  1416.   end
  1417.  
  1418.   def update_collapse
  1419.     self.opacity -= 6
  1420.     if self.opacity <= 128
  1421.       @collapse_finished = true
  1422.       @character.collapse = false
  1423.     end
  1424.   end
  1425.  
  1426.   def collapse
  1427.     @collapse = true
  1428.     self.blend_type = 1
  1429.     self.color.set(255, 128, 128, 128)
  1430.     self.opacity = 256
  1431.     Sound.play_enemy_collapse
  1432.   end
  1433.  
  1434. end
  1435. #==============================================================================
  1436. # ■ Window_StabsSkill
  1437. #==============================================================================
  1438. class Window_StabsSkill < Window_SkillList
  1439.   #--------------------------------------------------------------------------
  1440.   # * Object Initialization
  1441.   #     info_viewport : Viewport for displaying information
  1442.   #--------------------------------------------------------------------------
  1443.   def initialize(help_window)
  1444.     y = help_window.height
  1445.     super(0, y, Graphics.width, Graphics.height - y)
  1446.     @help_window = help_window
  1447.   end
  1448.   #--------------------------------------------------------------------------
  1449.   # * Show Window
  1450.   #--------------------------------------------------------------------------
  1451.   def show
  1452.     select_last
  1453.     @help_window.show
  1454.     super
  1455.   end
  1456.   #--------------------------------------------------------------------------
  1457.   # * Hide Window
  1458.   #--------------------------------------------------------------------------
  1459.   def hide
  1460.     @help_window.hide
  1461.     super
  1462.   end
  1463. end
  1464. #==============================================================================
  1465. # ■ Window_PlaceCommand
  1466. #==============================================================================
  1467. class Window_PlaceCommand < Window_Command
  1468.  
  1469.   def initialize
  1470.     super(0,0)
  1471.   end
  1472.  
  1473.   def make_command_list
  1474.     super
  1475.     $game_party.members.each do |actor|
  1476.       add_command(actor.name, :actor, enable(actor), actor)
  1477.     end
  1478.     add_command("Start!", :start)
  1479.   end
  1480.  
  1481.   def enable(battler)
  1482.     return false if battler.dead?
  1483.     return false if $game_map.party_members.include?(battler) if battler.actor?
  1484.     return false if $game_map.party_members.size >= Z3S::STABS::MaxParty
  1485.     return true
  1486.   end
  1487.  
  1488. end
  1489. #==============================================================================
  1490. # ■ Window_Base
  1491. #==============================================================================
  1492. class Window_Base
  1493.  
  1494.   def center
  1495.     self.x = (Graphics.width-self.width)   / 2
  1496.     self.y = (Graphics.height-self.height) / 2
  1497.   end
  1498.  
  1499. end
  1500. #==============================================================================
  1501. # ■ Window_BattleConfirmation
  1502. #==============================================================================
  1503. class Window_BattleConfirmation < Window_Command
  1504.  
  1505.   def initialize
  1506.     super(0,0)
  1507.   end
  1508.  
  1509.   def make_command_list
  1510.     super
  1511.     add_command("Start Battle", :start)
  1512.     add_command("Back", :back)
  1513.   end
  1514.  
  1515. end
  1516. #==============================================================================
  1517. # ■ Window_STABSActorCommand  # temporary name
  1518. #==============================================================================
  1519. class Window_STABSActorCommand < Window_Command
  1520.   attr_accessor :battler
  1521.   def initialize(help_window)
  1522.     super(0,0)
  1523.     @help_window = help_window
  1524.   end
  1525.  
  1526.   def make_command_list
  1527.     super
  1528.     if @battler
  1529.       add_commands
  1530.       self.height = 2 * standard_padding + @list.size * line_height
  1531.       self.x = Graphics.width  - self.width
  1532.       self.y = Graphics.height - self.height
  1533.     end
  1534.   end
  1535.  
  1536.   def add_commands
  1537.     if @battler.actor?
  1538.       add_actor_commands
  1539.     else
  1540.       add_enemy_commands
  1541.     end
  1542.   end
  1543.  
  1544.   def add_actor_commands
  1545.     atk_skill = $data_skills[@battler.attack_skill_id]
  1546.     gud_skill = $data_skills[@battler.guard_skill_id]
  1547.     add_command("Move",   :move, @battler.event.stabs_moves < 1)
  1548.     add_command(atk_skill.name, :use_ext, @battler.usable?(atk_skill), atk_skill)
  1549.     add_skill_command
  1550.     add_command(gud_skill.name, :use_ext, @battler.usable?(gud_skill), gud_skill)
  1551.     add_command("Item",   :item)
  1552.   end
  1553.  
  1554.   def add_enemy_commands
  1555.     add_command("Move",   :move, @battler.event.stabs_moves < 1)
  1556.     @battler.enemy.actions.each do |action|
  1557.       skill = $data_skills[action.skill_id]
  1558.       add_command(skill.name, :use_ext, @battler.usable?(skill), skill)
  1559.     end
  1560.     add_command("Wait", :wait)
  1561.   end
  1562.  
  1563.   def add_skill_command
  1564.     return unless @battler.actor?
  1565.     @battler.added_skill_types.sort.each do |stype_id|
  1566.       name = $data_system.skill_types[stype_id]
  1567.       enabled = !@battler.skill_type_sealed?(stype_id)
  1568.       add_command(name, :skill, enabled, stype_id)
  1569.     end
  1570.   end
  1571.  
  1572.   def update
  1573.     super
  1574.     if @help_window and self.active
  1575.       case current_symbol
  1576.       when :move
  1577.         @help_window.set_text(Z3S::STABS::MoveCmd)
  1578.       when :use_ext
  1579.         @help_window.set_item(current_ext)
  1580.       when :item
  1581.         @help_window.set_text(Z3S::STABS::ItemCmd)
  1582.       when :skill
  1583.         text = sprintf(Z3S::STABS::SkillCmd, $data_system.skill_types[current_ext])
  1584.         @help_window.set_text(text)
  1585.       end
  1586.     end
  1587.   end
  1588.  
  1589. end
  1590. #==============================================================================
  1591. # ■ Stabs_Selector
  1592. #==============================================================================
  1593. class Stabs_Selector
  1594.   attr_reader :tags, :last_targets
  1595.  
  1596.   def initialize
  1597.     clear
  1598.   end
  1599.  
  1600.   def spriteset
  1601.     SceneManager.scene.spriteset
  1602.   end
  1603.  
  1604.   def clear
  1605.     @selected = []
  1606.     $game_map.width.times do |x|
  1607.       @selected[x] = Array.new($game_map.height).fill do |y|
  1608.         {:mode => :clear, :x => x, :y => y, :ext => nil}
  1609.       end
  1610.     end
  1611.     @tags     = {}
  1612.     @skill    = nil
  1613.   end
  1614.  
  1615.   def selected
  1616.     @selected[$game_player.x][$game_player.y]
  1617.   end
  1618.  
  1619.   def all_selected
  1620.     @selected.flatten.select do |hash|
  1621.       hash[:mode] != :clear
  1622.     end
  1623.   end
  1624.  
  1625.   def get_selected(x, y)
  1626.     @selected[x][y]
  1627.   end
  1628.  
  1629.   def draw_mode(x, y)
  1630.     if $game_player.pos?(x, y)
  1631.       return :selected
  1632.     else
  1633.       return @selected[x][y][:mode]
  1634.     end
  1635.   end
  1636.  
  1637.   def targets
  1638.     r = []
  1639.     xy.each do |xy|
  1640.       r.push($game_map.battler_xy(*xy))
  1641.     end
  1642.     return (@last_targets = r.compact)
  1643.   end
  1644.  
  1645.   def xy
  1646.     all_selected.collect do |hash|
  1647.       [hash[:x], hash[:y]]
  1648.     end
  1649.   end
  1650.  
  1651.   def ext
  1652.     all_selected.collect do |hash|
  1653.       hash[:ext]
  1654.     end
  1655.   end
  1656.  
  1657.   def include?(x, y)
  1658.     @selected[x][y][:mode] != :clear
  1659.   end
  1660.  
  1661.   def get_move_path(event)
  1662.     clear
  1663.     cascade_move(event.x, event.y, event, event.battler.stabs_move, [], 2)
  1664.   end
  1665.  
  1666.   def get_range(event, min, max)
  1667.     clear
  1668.     add_range(event.x, event.y, min, max)
  1669.   end
  1670.  
  1671.   def add_range(x, y, min, max)
  1672.     for d in min..max
  1673.       add_distance(x, y, d)
  1674.     end
  1675.   end
  1676.  
  1677.   def get_distance(event, d)
  1678.     clear
  1679.     add_distance(event.x, event.y, d)
  1680.   end
  1681.  
  1682.   def add_distance(x, y, d)
  1683.     for ox in x-d..x+d
  1684.       d2 = d - (x-ox).abs
  1685.       for oy in [y-d2, y+d2]
  1686.         @selected[ox][oy][:mode] = :targeted
  1687.       end
  1688.     end
  1689.   end
  1690.  
  1691.   def add_ring(x, y)
  1692.     for ox in x-1..x+1
  1693.       for oy in y-1..y+1
  1694.         next if ox == x and oy == y
  1695.         @selected[ox][oy][:mode] = :targeted
  1696.       end
  1697.     end
  1698.   end
  1699.  
  1700.   def get_placement
  1701.     clear
  1702.     $game_map.events.values.each do |event|
  1703.       next unless event.name =~ /Placement/i
  1704.       @selected[event.x][event.y][:mode] = :targeted
  1705.       @selected[event.x][event.y][:ext] = event
  1706.     end
  1707.   end
  1708.  
  1709.   def get_skill_selector(event, skill)
  1710.     skill.note.scan(/<selector\s?weapon>/i).each do
  1711.       get_weapon_selector(event)
  1712.       return
  1713.     end
  1714.     get_all_selector(event, skill.note)
  1715.     if ext.empty?
  1716.       get_default(event)
  1717.     end
  1718.   end
  1719.  
  1720.   def get_weapon_selector(event)
  1721.     return unless event.battler
  1722.     if event.battler.actor?
  1723.       event.battler.weapons.each do |weapon|
  1724.         get_all_selector(event, weapon.note)
  1725.       end
  1726.     end
  1727.     if ext.empty?
  1728.       get_default(event, true)
  1729.     end
  1730.   end
  1731.  
  1732.   def get_all_selector(event, note)
  1733.     x = event.x
  1734.     y = event.y
  1735.     note.scan(/<selector\s?distance[:\s]+(\d+)>/i) do
  1736.       add_distance(x, y, $1.to_i)
  1737.     end
  1738.     note.scan(/<selector\s?range[:\s]+(\d+)\s+(\d+)>/i) do
  1739.       add_range(x, y, $1.to_i, $2.to_i)
  1740.     end
  1741.     note.scan(/<selector\s?range[:\s]+(\d+)>/i) do
  1742.       add_range(x, y, 1, $1.to_i)
  1743.     end
  1744.     note.scan(/<selector\s?ring>/i) do
  1745.       add_ring(x, y)
  1746.     end
  1747.     note.scan(/<selector\s?splash[:\s]+(\d+)>/i) do
  1748.       @tags[:splash] = $1.to_i
  1749.     end
  1750.   end
  1751.  
  1752.   def get_default(event, weapon_selector = false)
  1753.     x = event.x
  1754.     y = event.y
  1755.     case @skill.scope
  1756.     when 1, 7, 9 #Single Target
  1757.       if weapon_selector
  1758.         get_distance(event, 1)
  1759.       else
  1760.         get_weapon_selector(event)
  1761.       end
  1762.     when 2, 3, 4, 5, 6 #All Targets (Includes Randoms)
  1763.       select_from(*event.all_enemies.select{|member| !member.dead?})
  1764.     when 8 #All Allies
  1765.       select_from(*event.all_allies.select{|member| !member.dead?})
  1766.     when 10 #All Dead Allies
  1767.       select_from(*event.all_allies.select{|member| member.dead?})
  1768.     end
  1769.   end
  1770.  
  1771.   def rect_target
  1772.     @targets.each do |target|
  1773.       @selected[target.event.x][target.event.y][:mode] = :targeted
  1774.     end
  1775.   end
  1776.  
  1777.   def set_skill(event, skill)
  1778.     clear
  1779.     @skill = skill
  1780.     case skill.scope
  1781.     when 11
  1782.       select_from(event.battler)
  1783.     else
  1784.       get_skill_selector(event, skill)
  1785.     end
  1786.     spriteset.set_new_rect(skill.physical? ? :physical : :magic)
  1787.   end
  1788.  
  1789.   def select_from(*targets)
  1790.     targets.each do |target|
  1791.       x = target.event.x
  1792.       y = target.event.y
  1793.       @selected[x][y][:mode] = :targeted
  1794.     end
  1795.   end
  1796.  
  1797.   def get_targets(x, y)
  1798.     t = []
  1799.     splash = @tags[:splash] || 0
  1800.     for ox in x-splash..x+splash
  1801.       d2 = splash - (ox-x).abs
  1802.       for oy in y-d2..y+d2
  1803.         t.push $game_map.battler_xy(ox, oy)
  1804.       end
  1805.     end
  1806.     return (@last_targets = t.compact)
  1807.   end
  1808.  
  1809.   def cascade_move(x, y, event, moves, visits, d)
  1810.     return if moves < 0
  1811.     return if visits.include?([x,y])
  1812.     return if x < 0
  1813.     return if y < 0
  1814.     return if x >= $game_map.width
  1815.     return if y >= $game_map.height
  1816.     return unless $game_map.passable?(x, y, d)
  1817.     if (e = $game_map.battler_event_xy(x, y))
  1818.       s1 = $game_map.party_members.include?(event.battler)
  1819.       s2 = $game_map.party_members.include?(e.battler)
  1820.       return if s1 != s2
  1821.     end
  1822.     v2 = visits.clone.push [x,y]
  1823.     if (!include?(x, y)) or @selected[x][y][:ext].size > v2.size
  1824.       unless $game_map.battler_event_xy(x, y)
  1825.         @selected[x][y][:mode] = :targeted
  1826.         @selected[x][y][:ext] = v2
  1827.       end
  1828.     end
  1829.     cascade_move(x, y+1, event, moves-1, v2, 8)
  1830.     cascade_move(x-1, y, event, moves-1, v2, 6)
  1831.     cascade_move(x+1, y, event, moves-1, v2, 4)
  1832.     cascade_move(x, y-1, event, moves-1, v2, 2)
  1833.   end
  1834.  
  1835. end
  1836. #==============================================================================
  1837. # ■ Stabs_ActionList
  1838. #==============================================================================
  1839. class Stabs_ActionList
  1840.  
  1841.   def initalize
  1842.     @battler = nil
  1843.     @actions = []
  1844.   end
  1845.  
  1846.   def self.generate(battler)
  1847.     if $game_map.in_battle?
  1848.       $game_map.actions_list.generate(battler)
  1849.     end
  1850.   end
  1851.  
  1852.   def generate(battler)
  1853.     @battler = battler
  1854.     @actions = create_all_actions
  1855.   end
  1856.  
  1857.   def create_all_actions
  1858.     all_actions
  1859.   end
  1860.  
  1861.   def all_actions
  1862.     if @battler.actor?
  1863.       return [$data_skills[@battler.attack_skill_id] +
  1864.       $data_skills[@battler.guard_skill_id] +
  1865.       @battler.skills]
  1866.     end
  1867.   end
  1868.  
  1869. end
  1870. #==============================================================================
  1871. # ■ Sprite_StabsBattlerHUD
  1872. #==============================================================================
  1873. class Sprite_StabsBattlerHUD < Sprite_Base
  1874.   attr_accessor :battler
  1875.  
  1876.   def initialize(viewport, x)
  1877.     super(viewport)
  1878.     self.bitmap = Bitmap.new(100, 88)
  1879.     @draw_x = x
  1880.   end
  1881.  
  1882.   def update
  1883.     refresh if need_refresh?
  1884.     update_position
  1885.   end
  1886.  
  1887.   def update_position
  1888.     self.x = @draw_x
  1889.     self.y = Graphics.height - self.height
  1890.   end
  1891.  
  1892.   def need_refresh?
  1893.     return true if @battler != @_battler
  1894.     return true unless @battler
  1895.     return true if @sta  != @battler.states
  1896.     return true if @hp   != @battler.hp
  1897.     return true if @mp   != @battler.mp
  1898.     return true if @tp   != @battler.tp.to_i
  1899.     return true if @mhp  != @battler.mhp
  1900.     return true if @mmp  != @battler.mmp
  1901.     return true if @mtp  != @battler.max_tp
  1902.     return true if @name != @battler.name
  1903.     return false
  1904.   end
  1905.  
  1906.   def refresh
  1907.     self.bitmap.clear
  1908.     self.bitmap.font.size = 16
  1909.     @_battler = @battler
  1910.     return unless @_battler
  1911.     @hp   = @battler.hp
  1912.     @mhp  = @battler.mhp
  1913.     @mp   = @battler.mp
  1914.     @mmp  = @battler.mmp
  1915.     @tp   = @battler.tp.to_i
  1916.     @mtp  = @battler.max_tp
  1917.     @name = @battler.name
  1918.     @sta  = @battler.states
  1919.     self.bitmap.draw_text(0, 0, 100, 16, @battler.name)
  1920.     self.bitmap.fill_rect(0, 26, 100, 6, Color.new(0,0,0))
  1921.     self.bitmap.fill_rect(1, 27, @battler.hp_rate * 98, 4, Color.new(255,51,51))
  1922.     self.bitmap.draw_text(0, 16, 100, 16, @mhp, 2)
  1923.     self.bitmap.draw_text(0, 16, 72, 16, "/", 2)
  1924.     self.bitmap.draw_text(0, 16, 65, 16, @hp, 2)
  1925.     if @mmp != 0
  1926.       self.bitmap.fill_rect(0, 42, 100, 6, Color.new(0,0,0))
  1927.       self.bitmap.fill_rect(1, 43, @battler.mp_rate * 98, 4, Color.new(51,153,255))
  1928.       self.bitmap.draw_text(0, 32, 100, 16, @mhp, 2)
  1929.       self.bitmap.draw_text(0, 32, 72, 16, "/", 2)
  1930.       self.bitmap.draw_text(0, 32, 65, 16, @mp, 2)
  1931.     end
  1932.     if $data_system.opt_display_tp and @mtp != 0
  1933.       self.bitmap.fill_rect(0, 58, 100, 6, Color.new(0,0,0))
  1934.       self.bitmap.fill_rect(1, 59, @battler.tp_rate * 98, 4, Color.new(102,204,51))
  1935.       self.bitmap.draw_text(0, 48, 100, 16, @mtp, 2)
  1936.       self.bitmap.draw_text(0, 48, 72, 16, "/", 2)
  1937.       self.bitmap.draw_text(0, 48, 65, 16, @tp, 2)
  1938.     end
  1939.     icons = (@battler.state_icons + @battler.buff_icons)[0, 4]
  1940.     icons.each_with_index do |n, i| draw_icon(n, 24*i, 64) end
  1941.   end
  1942.  
  1943.   def draw_icon(icon_index, x, y, enabled = true)
  1944.     tbitmap = Cache.system("Iconset")
  1945.     rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  1946.     self.bitmap.blt(x, y, tbitmap, rect, enabled ? 255 : translucent_alpha)
  1947.   end
  1948.  
  1949. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement