Save-Point
KA-terpillar + Settings - Printable Version

+- Save-Point (https://www.save-point.org)
+-- Forum: Material Development (https://www.save-point.org/forum-8.html)
+--- Forum: Scripts Database (https://www.save-point.org/forum-39.html)
+---- Forum: RPGMaker XP (RGSS) Engine (https://www.save-point.org/forum-116.html)
+---- Thread: KA-terpillar + Settings (/thread-5150.html)



KA-terpillar + Settings - kyonides - 05-21-2014

KA-terpillar v 1.1.1
+ Settings Menu + Save/End Menu Mod

by Kyonides-Arkanthos



Features

This plug and play script lets you see the other 3 party members on screen like other scripts do but also lets you change the current party formation by shifting the first member to the last position or the last one to the first position or it shifts them semi-randomly for you. You can check its simple menu to change the settings at any time, it even includes dummy characters so you can check out what are the changes that you want to apply to your team.

You may also pick one of its current 3 formations or characters' alignments (Caterpillar, T-Formation, X or Cross Formation).

Instructions

Paste these scripts below the second to last default script in the same order as found here and pay close attention to the Constants just in case you really want to change any settings.

Since version 1.1.1 there are 2 new script calls you may want to use during gameplay. If you need to separate the leader from his or her team during gameplay the way Breath of Fire 1 did every single time you visited a Dragon Shrine. Do not fear, fellow adventurers, there is another script call to reunite them after the leader passed or failed the test. Check out the comments included on my script.

Scripts

KA-terpillar
Code:
#  KA-terpillar
#  v 1.1.1 - 2014-06-04
#  Scripter : Kyonides-Arkanthos

#  Optional Script Calls - Inspired by Breath of Fire 1

#  $game_player.go_alone
#  Makes the leader leave the party behind

#  $game_player.team_up
#  All party members are included in your team once again

module KAterpillar
  # ALL PARTY MEMBERS VISIBLE
  VISIBLE = true
  FORMATION_BUTTON = Input::L
  # PARTY FORMATION CYCLE MODES - 0 : 4 to 1,  1 : 1 to 4,  2 : random mode
  FORMATION_CYCLE = 0
  # MODES - 0 : Straight Line, 1 : T-Formation, 2 : X-Formation
  FORMATION_MODE = 0
  # DO NOT EDIT ANY OF THE FOLLOWING TWO HASHES
  T_POSITIONS = { 2 => {}, 4 => {}, 6 => {}, 8 => {} }
  X_POSITIONS = { 2 => {}, 4 => {}, 6 => {}, 8 => {} }
  # T-Formation Coordinates
  T_POSITIONS[2][:x] = [0, 1, 0, -1]
  T_POSITIONS[2][:y] = [0, -1, -1, -1]
  T_POSITIONS[4][:x] = [0, 1, 1, 1]
  T_POSITIONS[4][:y] = [0, -1, 0, 1]
  T_POSITIONS[6][:x] = [0, -1, -1, -1]
  T_POSITIONS[6][:y] = [0, -1, 0, 1]
  T_POSITIONS[8][:x] = [0, 1, 0, -1]
  T_POSITIONS[8][:y] = [0, 1, 1, 1]
  # X or Cross Formation Coordinates
  X_POSITIONS[2][:x] = [0, 1, 0, -1]
  X_POSITIONS[2][:y] = [0, -1, -2, -1]
  X_POSITIONS[4][:x] = [0, 1, 2, 1]
  X_POSITIONS[4][:y] = [0, -1, 0, 1]
  X_POSITIONS[6][:x] = [0, -1, -2, -1]
  X_POSITIONS[6][:y] = [0, -1, 0, 1]
  X_POSITIONS[8][:x] = [0, 1, 0, -1]
  X_POSITIONS[8][:y] = [0, 1, 2, 1]
end

class Game_Party
  attr_accessor :actors_visible, :default_cycle, :formation_mode
  alias kyon_katerpillar_gm_party_init initialize
  def initialize
    @actors_visible = KAterpillar::VISIBLE
    @default_cycle = KAterpillar::FORMATION_CYCLE
    @formation_mode = KAterpillar::FORMATION_MODE
    kyon_katerpillar_gm_party_init
  end

  def update_current_team
    case @default_cycle
    when 0
      @actors.unshift @actors.pop
    when 1
      @actors << @actors.shift
    when 2
      max = @actors.size - 1
      max.times { @actors.insert(rand(max + 1), @actors.shift) }
    end
    $game_player.refresh
  end

  def leader_only
    return if @actors.size < 2
    @other_actors = @actors[1..-1].clone
    @actors = [@actors[0]]
  end

  def whole_group
    return if @other_actors.nil?
    @actors = @actors + @other_actors.clone
    @other_actors = nil
  end
end

class Game_Teammate < Game_Character
  @@center_x = 304 * 4
  @@center_y = 224 * 4
  attr_writer :character_name, :character_hue, :opacity, :blend_type
  attr_writer :pos, :through, :step_anime, :dummy_mode
  alias kyon_katerpillar_gm_teammate_init initialize
  def initialize
    kyon_katerpillar_gm_teammate_init
    @transparent = !$game_party.actors_visible
    @dummy_mode = false
  end

  def next_position_t_formation(coord, index)
    return KAterpillar::T_POSITIONS[@direction][coord][index]
  end

  def next_position_x_formation(coord, index)
    return KAterpillar::X_POSITIONS[@direction][coord][index]
  end

  def show(bool, actor=nil)
    @transparent = !bool
    refresh(actor)
  end

  def refresh(actor=nil)
    actor = $game_party.actors[@pos] if !actor
    invisible = (actor.nil? or @transparent)
    @character_name = invisible ? '' : actor.character_name
    @character_hue = invisible ? 0 : actor.character_hue
    return if invisible
    @opacity = 255
    @blend_type = 0
  end

  def moveto(x, y)
    if $game_party.formation_mode > 0
      @pos = 0 if @pos.nil?
      pos = @pos
    end
    if $game_party.formation_mode == 1
      temp_x = x + next_position_t_formation(:x, pos)
      temp_y = y + next_position_t_formation(:y, pos)
      pos = 2 if !passable?(temp_x, temp_y, @direction)
      x += next_position_t_formation(:x, pos)
      y += next_position_t_formation(:y, pos)
    elsif $game_party.formation_mode == 2
      temp_x = x + next_position_x_formation(:x, pos)
      temp_y = y + next_position_x_formation(:y, pos)
      if !passable?(temp_x, temp_y, @direction)
        pos = 2
        x += next_position_t_formation(:x, pos)
        y += next_position_t_formation(:y, pos)
      else
        x += next_position_x_formation(:x, pos)
        y += next_position_x_formation(:y, pos)
      end
    end
    @x = x % $game_map.width
    @y = y % $game_map.height
    @real_x = @x * 128
    @real_y = @y * 128
    @prelock_direction = 0
    center(x, y)
  end

  def center(x, y)
    max_x = ($game_map.width - 20) * 128
    max_y = ($game_map.height - 15) * 128
    $game_map.display_x = [0, [x * 128 - @@center_x, max_x].min].max
    $game_map.display_y = [0, [y * 128 - @@center_y, max_y].min].max
  end

  def update
    unless @dummy_mode
      last_moving = moving?
      unless moving? or $game_system.map_interpreter.running? or
           @move_route_forcing or $game_temp.message_window_showing
        if $game_party.formation_mode == 0
        # If player's last direction exists, move teammate to his previous
        # coordinates - straight line formation
          update_first_formation if $game_player.last_dir[@pos]
        elsif $game_party.formation_mode == 1
          update_second_formation
        elsif $game_party.formation_mode == 2
          update_third_formation
        end
        @stop_count = 0
      end if $game_player.moving?
      if $game_party.formation_mode == 0
        update_first_formation
        @stop_count = 0
      elsif $game_party.formation_mode == 1
        update_second_formation
        @stop_count = 0
      elsif $game_party.formation_mode == 2
        update_third_formation
        @stop_count = 0
      end
      last_real_x = @real_x
      last_real_y = @real_y
    end
    super
  end
  # Update Straight Line Formation
  def update_first_formation
    return if $game_player.last_dir[@pos].nil?
    @direction = $game_player.last_dir[@pos]
    @x = $game_player.last_x[@pos]
    @y = $game_player.last_y[@pos]
  end
  # Update T-Formation
  def update_second_formation
    @direction = $game_player.last_dir[0]
    pos = @pos
    x, x2 = $game_player.last_x[0..1]
    y, y2 = $game_player.last_y[0..1]
    x2 = x if $game_player.last_x[1].nil?
    y2 = y if $game_player.last_y[1].nil?
    temp_x = x + next_position_t_formation(:x, pos)
    temp_y = y + next_position_t_formation(:y, pos)
    temp_x2 = x2 + next_position_t_formation(:x, pos)
    temp_y2 = y2 + next_position_t_formation(:y, pos)
    if !passable?(temp_x, temp_y, @direction) or
        !passable?(temp_x2, temp_y2, @direction)
      pos = 2
    end
    @x = x + next_position_t_formation(:x, pos)
    @y = y + next_position_t_formation(:y, pos)
  end
  # Update X-Formation
  def update_third_formation
    @direction = $game_player.last_dir[0]
    pos = @pos
    x, x2 = $game_player.last_x[0..1]
    y, y2 = $game_player.last_y[0..1]
    x2 = x if $game_player.last_x[1].nil?
    y2 = y if $game_player.last_y[1].nil?
    temp_x = x + next_position_x_formation(:x, pos)
    temp_y = y + next_position_x_formation(:y, pos)
    temp_x2 = x2 + next_position_x_formation(:x, pos)
    temp_y2 = y2 + next_position_x_formation(:y, pos)
    if !passable?(temp_x, temp_y, @direction) or
        !passable?(temp_x2, temp_y2, @direction)
      pos = 2
      x += next_position_t_formation(:x, pos)
      y += next_position_t_formation(:y, pos)
    else
      x += next_position_x_formation(:x, pos)
      y += next_position_x_formation(:y, pos)
    end
    @x = x
    @y = y
  end
end

class Game_Event
  attr_writer :list
end

class Game_Player
  attr_reader :teammates, :last_dir, :last_x, :last_y
  alias kyon_katerpillar_gm_player_init initialize
  alias kyon_katerpillar_gm_player_refresh refresh
  alias kyon_katerpillar_gm_player_moveto moveto
  def initialize
    kyon_katerpillar_gm_player_init
    @last_dir = []
    @last_x = []
    @last_y = []
    @teammates = [Game_Teammate.new, Game_Teammate.new, Game_Teammate.new]
    3.times {|n| @teammates[n].pos = n + 1 }
  end

  def clear_previous_movements
    @last_dir.clear
    @last_x.clear
    @last_y.clear
  end

  def go_alone
    clear_previous_movements
    size = $game_party.actors.size - 1
    size.times {|n| mate = @teammates[n].dummy_mode = true }
    $game_party.leader_only
  end

  def team_up
    clear_previous_movements
    $game_party.whole_group
    size = $game_party.actors.size - 1
    size.times {|n| mate = @teammates[n].dummy_mode = false }
  end

  def refresh
    kyon_katerpillar_gm_player_refresh
    return if $game_party.actors.size < 2
    size = $game_party.actors.size - 1
    size.times {|n| mate = @teammates[n].refresh }
  end

  def moveto(x, y)
    kyon_katerpillar_gm_player_moveto(x, y)
    update_last_xy(x, y)
    return if $game_party.actors.size < 2
    size = $game_party.actors.size - 1
    size.times{|n| @teammates[n].moveto(x, y) }
  end

  def update_last_xy(x, y)
    return if @last_x[0] == x and @last_y[0] == y
    @last_dir.unshift @direction
    @last_dir.delete_at 4
    @last_x.unshift x
    @last_x.delete_at 4
    @last_y.unshift y
    @last_y.delete_at 4
  end

  def update
    last_moving = moving?
    unless moving? or $game_system.map_interpreter.running? or
           @move_route_forcing or $game_temp.message_window_showing
      case Input.dir4
      when 2
        move_down
      when 4
        move_left
      when 6
        move_right
      when 8
        move_up
      end
      # Store future teammates's x and y coordinates
      update_last_xy(@x, @y)
    end
    last_real_x = @real_x
    last_real_y = @real_y
    super
    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
      $game_map.scroll_down(@real_y - last_real_y)
    end
    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
      $game_map.scroll_left(last_real_x - @real_x)
    end
    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
      $game_map.scroll_right(@real_x - last_real_x)
    end
    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
      $game_map.scroll_up(last_real_y - @real_y)
    end
    return if moving?
    if last_moving
      result = check_event_trigger_here([1,2])
      if !result
        unless $DEBUG and Input.press?(Input::CTRL)
          @encounter_count -= 1 if @encounter_count > 0
        end
      end
    end
    if Input.trigger?(Input::C)
      check_event_trigger_here([0])
      check_event_trigger_there([0,1,2])
    elsif Input.trigger?(KAterpillar::FORMATION_BUTTON)
      $game_party.update_current_team
    end
  end
end

class Spriteset_Map
  def initialize
    @viewport1 = Viewport.new(0, 0, 640, 480)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport3 = Viewport.new(0, 0, 640, 480)
    @viewport2.z = 200
    @viewport3.z = 5000
    @tilemap = Tilemap.new(@viewport1)
    @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
    for i in 0..6
      autotile_name = $game_map.autotile_names[i]
      @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
    end
    @tilemap.map_data = $game_map.data
    @tilemap.priorities = $game_map.priorities
    @panorama = Plane.new(@viewport1)
    @panorama.z = -1000
    @fog = Plane.new(@viewport1)
    @fog.z = 3000
    @character_sprites = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites << sprite
    end
    for teammate in $game_player.teammates.reverse
      @character_sprites << Sprite_Character.new(@viewport1, teammate)
    end
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
    @weather = RPG::Weather.new(@viewport1)
    @picture_sprites = []
    for i in 1..50
      @picture_sprites.push(Sprite_Picture.new(@viewport2,
        $game_screen.pictures[i]))
    end
    @timer_sprite = Sprite_Timer.new
    update
  end
end

class Scene_Map
  def update
    loop do
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      $game_player.teammates[0].update
      $game_player.teammates[1].update
      $game_player.teammates[2].update
      $game_system.update
      $game_screen.update
      break unless $game_temp.player_transferring
      transfer_player
      break if $game_temp.transition_processing
    end
    @spriteset.update
    @message_window.update
    if $game_temp.gameover
      $scene = Scene_Gameover.new
      return
    end
    if $game_temp.to_title
      $scene = Scene_Title.new
      return
    end
    if $game_temp.transition_processing
      $game_temp.transition_processing = false
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    return if $game_temp.message_window_showing
    if $game_player.encounter_count == 0 and $game_map.encounter_list != []
      unless $game_system.map_interpreter.running? or
             $game_system.encounter_disabled
        n = rand($game_map.encounter_list.size)
        troop_id = $game_map.encounter_list[n]
        if $data_troops[troop_id] != nil
          $game_temp.battle_calling = true
          $game_temp.battle_troop_id = troop_id
          $game_temp.battle_can_escape = true
          $game_temp.battle_can_lose = false
          $game_temp.battle_proc = nil
        end
      end
    end
    if Input.trigger?(Input::B)
      unless $game_system.map_interpreter.running? or
             $game_system.menu_disabled
        $game_temp.menu_calling = true
        $game_temp.menu_beep = true
      end
    end
    if $DEBUG and Input.press?(Input::F9)
      $game_temp.debug_calling = true
    end
    return if $game_player.moving?
    if $game_temp.battle_calling
      call_battle
    elsif $game_temp.shop_calling
      call_shop
    elsif $game_temp.name_calling
      call_name
    elsif $game_temp.menu_calling
      call_menu
    elsif $game_temp.save_calling
      call_save
    elsif $game_temp.debug_calling
      call_debug
    end
  end

  def transfer_player
    $game_temp.player_transferring = false
    if $game_map.map_id != $game_temp.player_new_map_id
      $game_map.setup($game_temp.player_new_map_id)
    end
    x = $game_temp.player_new_x
    y = $game_temp.player_new_y
    dir = $game_temp.player_new_direction
    dir = $game_player.direction if dir == 0
    formation_1 = $game_party.actors_visible and $game_party.formation_mode == 1
    if formation_1
      x += (dir == 4 ? -1 : dir == 6 ? 1 : 0)
      y += (dir == 2 ? -1 : dir == 8 ? 1 : 0)
    end
    $game_player.clear_previous_movements
    $game_player.moveto(x, y)
    $game_player.teammates.each {|mate| mate.moveto(x, y) }
    case $game_temp.player_new_direction
    when 2  # down
      $game_player.turn_down
      $game_player.teammates.each {|mate| mate.turn_down }
    when 4  # left
      $game_player.turn_left
      $game_player.teammates.each {|mate| mate.turn_left }
    when 6  # right
      $game_player.turn_right
      $game_player.teammates.each {|mate| mate.turn_right }
    when 8  # up
      $game_player.turn_up
      $game_player.teammates.each {|mate| mate.turn_up }
    end
    $game_player.straighten
    $game_player.teammates.each {|mate| mate.straighten }
    $game_map.update
    @spriteset.dispose
    @spriteset = Spriteset_Map.new
    if $game_temp.transition_processing
      $game_temp.transition_processing = false
      Graphics.transition(20)
    end
    $game_map.autoplay
    Graphics.frame_reset
    Input.update
  end
end

Settings Menu
Code:
#  KA-terpillar Settings Menu
#  + Save / End Game Menu
#  v 1.1 - 2014-05-22
#  Scripter : Kyonides-Arkanthos

module KAterpillar
  # SETTINGS WINDOWS STRINGS
  # HEROES VISIBLE? STRING
  STRINGS = ['All Heroes Visible?']
  # FORMATION CYCLE MODES STRING
  STRINGS[1] = 'Formation Cycle Mode'
  # FORMATION MODES STRING
  STRINGS[2] = 'Formation Mode'
  # HEROES VISIBLE? OPTIONS STRING
  STRINGS[3] = ['YES','NO']
  # FORMATION CYCLE MODES OPTIONS STRING
  STRINGS[4] = ['4 >> 1','1 >> 4','RANDOM']
  # FORMATION MODES OPTIONS STRING
  STRINGS[5] = ['S. Line','T-Form','X-Form']
end

class Window_SaveFile
  def check_savefile
    @file_exist = FileTest.exist?(@filename)
    return unless @file_exist
    file = File.open(@filename, "r")
    @time_stamp = file.mtime
    @characters = Marshal.load(file)
    @frame_count = Marshal.load(file)
    @game_system = Marshal.load(file)
    @game_switches = Marshal.load(file)
    @game_variables = Marshal.load(file)
    @total_sec = @frame_count / Graphics.frame_rate
    file.close
    refresh
  end
end

class Window_SetupCommand < Window_Selectable
  def initialize(commands)
    super(0, 0, 480, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.back_opacity = 0
    @commands = commands
    @item_max = commands.size
    @column_max = @item_max
    @item_max.times {|n| draw_item(n) }
    self.active = true
    self.visible = true
    self.index = 0
  end

  def draw_item(index)
    self.contents.font.size = 18
    self.contents.font.color = normal_color
    rect = Rect.new(index * 112, 0, 112, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    self.contents.draw_text(rect, @commands[index], 1)
  end

  def update_cursor_rect
    self.cursor_rect.set(0 + index * 118, 0, 92, 32)
  end
end

class Spriteset_Settings
  def initialize
    @wait_count = 20
    @default_cycle = $game_party.default_cycle
    @actors = $game_party.actors.dup
    @teammates = []
    @visible = $game_party.actors_visible
    size = $game_party.actors.size
    size.times {|n| @teammates << Game_Teammate.new
      @teammates[n].show(n == 0 ? true : @visible, @actors[n])
      @teammates[n].dummy_mode = true
      @teammates[n].step_anime = true }
    @teammates[0].moveto(2, 8)
    update_formation_mode($game_party.formation_mode)
    @viewport1 = Viewport.new(0, 0, 160, 480)
    @character_sprites = []
    for char in @teammates.reverse
      @character_sprites << Sprite_Character.new(@viewport1, char)
    end
    update
  end

  def update
    @character_sprites.each {|sprite| sprite.character.update; sprite.update }
    @viewport1.update
    if @wait_count > 0
      @wait_count -= 1
      return
    elsif @wait_count == 0
      @wait_count = 80
      update_formation_cycle
    end
  end

  def update_visible(visible)
    @visible = visible
    1.upto(@actors.size - 1) {|n| @teammates[n].show(@visible, @actors[n]) }
  end

  def update_default_cycle(cycle)
    @default_cycle = cycle
    @wait_count = 80
    update_formation_cycle
  end

  def update_formation_cycle
    return unless @visible
    case @default_cycle
    when 0
      @actors.unshift @actors.pop
    when 1
      @actors << @actors.shift
    when 2
      max = @actors.size - 1
      max.times { @actors.insert(rand(max + 1), @actors.shift) }
    end
    @actors.size.times {|n| @teammates[n].refresh(@actors[n]) }
  end

  def update_formation_mode(mode)
    @formation_mode = mode
    if mode == 0
      1.upto(@actors.size - 1) {|n| @teammates[n].moveto(2, 8 - (n * 1.5)) }
    else
      ox = @teammates[0].x
      oy = @teammates[0].y
      if mode == 1
        x = KAterpillar::T_POSITIONS[2][:x]
        y = KAterpillar::T_POSITIONS[2][:y]
      elsif mode == 2
        x = KAterpillar::X_POSITIONS[2][:x]
        y = KAterpillar::X_POSITIONS[2][:y]
      end
      1.upto(@actors.size - 1) {|n| @teammates[n].moveto(ox + x[n], oy + y[n]) }
    end
  end

  def dispose
    @character_sprites.each {|sprite| sprite.bitmap.dispose; sprite.dispose }
    @character_sprites.clear
    @teammates.clear
    @actors.clear
    @character_sprites = @teammates = @actors = nil
    @viewport1.dispose
    @wait_count = @visible = @default_cycle = @formation_mode = nil
  end
end

class Scene_KAterpillarSettings
  def main
    @spriteset = Spriteset_Settings.new
    @label_window = Window_Base.new(160, 0, 480, 480)
    contents = @label_window.contents = Bitmap.new(448, 448)
    contents.draw_text(0, 0, 448, 28, KAterpillar::STRINGS[0])
    contents.draw_text(0, 0, 448, 174, KAterpillar::STRINGS[1])
    contents.draw_text(0, 0, 448, 320, KAterpillar::STRINGS[2])
    @command_windows = []
    @command_windows << Window_SetupCommand.new(KAterpillar::STRINGS[3])
    @command_windows[-1].x = 160
    @command_windows[-1].y = 34
    @command_windows[-1].z = @label_window.z - 1
    @command_windows[-1].index = $game_party.actors_visible ? 0 : 1
    @command_windows << Window_SetupCommand.new(KAterpillar::STRINGS[4])
    @command_windows[-1].x = 160
    @command_windows[-1].y = 108
    @command_windows[-1].z = @label_window.z - 1
    @command_windows[-1].active = nil
    @command_windows[-1].index = $game_party.default_cycle
    @command_windows << Window_SetupCommand.new(KAterpillar::STRINGS[5])
    @command_windows[-1].x = 160
    @command_windows[-1].y = 182
    @command_windows[-1].z = @label_window.z - 1
    @command_windows[-1].active = nil
    @command_windows[-1].index = $game_party.formation_mode
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      break if $scene != self
    end
    Graphics.freeze
    @command_windows.each {|cw| cw.dispose }
    @command_windows.clear
    @command_windows = nil
    @label_window.dispose
    @spriteset.dispose
  end

  def update
    @spriteset.update
    @command_windows.each {|cw| cw.update }
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      update_settings
      $scene = Scene_Menu.new(4)
      return
    elsif Input.trigger?(Input::C)
      $game_system.se_play($data_system.decision_se)
      update_settings    
      return
    end
    if @command_windows[0].active
      update_visible
      return
    elsif @command_windows[1].active
      update_cycle_mode
      return
    elsif @command_windows[2].active
      update_formation_mode
      return
    end
  end

  def update_visible
    if Input.trigger?(Input::LEFT) or Input.trigger?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @spriteset.update_visible(@command_windows[0].index == 0)
      return
    elsif Input.trigger?(Input::UP)
      $game_system.se_play($data_system.cursor_se)
      @command_windows[0].active = nil
      @command_windows[2].active = true
    elsif Input.trigger?(Input::DOWN)
      $game_system.se_play($data_system.cursor_se)
      @command_windows[0].active = nil
      @command_windows[1].active = true
    end
  end

  def update_cycle_mode
    if Input.trigger?(Input::LEFT) or Input.trigger?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @spriteset.update_default_cycle(@command_windows[1].index)
      return
    elsif Input.trigger?(Input::UP)
      $game_system.se_play($data_system.cursor_se)
      @command_windows[1].active = nil
      @command_windows[0].active = true
      return
    elsif Input.trigger?(Input::DOWN)
      $game_system.se_play($data_system.cursor_se)
      @command_windows[1].active = nil
      @command_windows[2].active = true
    end
  end

  def update_formation_mode
    if Input.trigger?(Input::LEFT) or Input.trigger?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @spriteset.update_formation_mode(@command_windows[2].index)
      return
    elsif Input.trigger?(Input::UP)
      $game_system.se_play($data_system.cursor_se)
      @command_windows[2].active = nil
      @command_windows[1].active = true
    elsif Input.trigger?(Input::DOWN)
      $game_system.se_play($data_system.cursor_se)
      @command_windows[2].active = nil
      @command_windows[0].active = true
    end
  end

  def update_settings
    $game_party.actors_visible = @command_windows[0].index == 0
    $game_party.default_cycle = @command_windows[1].index
    $game_party.formation_mode = mode = @command_windows[2].index
    visible = $game_party.actors_visible
    $game_player.teammates.each {|tm| tm.show(visible)
      tm.moveto($game_player.x, $game_player.y) if mode == 0 }
  end
end

class Scene_Menu
  def main
    # Make command window and add different option strings
    s1 = $data_system.words.item
    s2 = $data_system.words.skill
    s3 = $data_system.words.equip
    s4 = "Status"
    s5 = "Settings"
    s6 = "End & Save"
    @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])
    @command_window.index = @menu_index
    if $game_party.actors.size == 0
      @command_window.disable_item(0)
      @command_window.disable_item(1)
      @command_window.disable_item(2)
      @command_window.disable_item(3)
    end
    @command_window.disable_item(4) if $game_system.save_disabled
    @playtime_window = Window_PlayTime.new
    @playtime_window.x = 0
    @playtime_window.y = 224
    @steps_window = Window_Steps.new
    @steps_window.x = 0
    @steps_window.y = 320
    @gold_window = Window_Gold.new
    @gold_window.x = 0
    @gold_window.y = 416
    @status_window = Window_MenuStatus.new
    @status_window.x = 160
    @status_window.y = 0
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @command_window.dispose
    @playtime_window.dispose
    @steps_window.dispose
    @gold_window.dispose
    @status_window.dispose
  end

  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    elsif Input.trigger?(Input::C)
      if $game_party.actors.size == 0 and @command_window.index < 4
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      case @command_window.index
      when 0  # item
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Item.new
      when 1  # skill
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 2  # equipment
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 3  # status
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 4  # settings
        $game_system.se_play($data_system.decision_se)
        # Switch to settings screen
        $scene = Scene_KAterpillarSettings.new
      when 5  # save
        if $game_system.save_disabled
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Save.new
      end
      return
    end
  end
end

class Scene_Save
  alias kyon_save_end_mod_scn_save_main main
  alias kyon_save_end_mod_scn_save_up update
  def main
    @wait_count = 0
    commands = ["To Main Menu", "To Title", "Shutdown"]
    @command_window = Window_Command.new(192, commands)
    @command_window.active = @command_window.visible = nil
    @command_window.x = 320 - @command_window.width / 2
    @command_window.y = 240 - @command_window.height / 2
    @command_window.z = 2000
    commands.clear
    kyon_save_end_mod_scn_save_main
    @command_window.dispose
  end

  def on_decision(filename)
    $game_system.se_play($data_system.save_se)
    file = File.open(filename, "wb")
    write_save_data(file)
    file.close
    if $game_temp.save_calling
      $game_temp.save_calling = false
      $scene = Scene_Map.new
      return
    end
    @savefile_windows[@file_index].check_savefile
    @command_window.active = @command_window.visible = true
  end

  def on_cancel
    $game_system.se_play($data_system.cancel_se)
    if $game_temp.save_calling
      $game_temp.save_calling = false
      $scene = Scene_Map.new
      return
    end
    @command_window.active = @command_window.visible = true
  end

  def update
    if @command_window.active
      update_command
      return
    end
    kyon_save_end_mod_scn_save_up
  end

  def update_command
    @command_window.update
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Menu.new(5)
      return
    elsif Input.trigger?(Input::C)
      $game_system.se_play($data_system.decision_se)
      case @command_window.index
      when 0 # Main Menu
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Menu.new(5)
        return
      when 1 # Title
        $game_system.se_play($data_system.decision_se)
        Audio.bgm_fade(800)
        Audio.bgs_fade(800)
        Audio.me_fade(800)
        $scene = Scene_Title.new
        return
      when 2 # Shutdown
        $game_system.se_play($data_system.decision_se)
        Audio.bgm_fade(800)
        Audio.bgs_fade(800)
        Audio.me_fade(800)
        $scene = nil
      end
    end
  end
end

Credits

Don't forget to mention my name! Remember these scripts are not available for commercial games.


RE: KA-terpillar + Settings - kyonides - 05-23-2014

BUMP!

Version 1.1.0 is now available for all board members. Now the caterpillar character alignment is just one of 3 possible modes available on this version of my scripts.


RE: KA-terpillar + Settings - kyonides - 06-08-2014

BUMP!

Version 1.1.1 is now available for all board members. Now the script allows you to separate the leader from his or her team at any time and make him come back just like it happened in Breath of Fire 1 while being at a Dragon Shrine. Obviously you would need to make sure you created an event that would block the pass. Sadly it doesn't check who is the one entitle to become a dragon or anything like that but that can be easily done with the good use of a few event commands.