Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

[XP] Simple Character Selector

Character Selector V. 1.1

Introduction
I originally made this for a friend, but then I thought that I might as well share it with you guys.
It's basically just a simple character selector, nothing big really.

Features
Version 1.1
- You can now choose what actor's that shouldn't be included.
- You can now go back from character selection to "New Game", "Continue", "Shutdown"

Version 1.0
- Simple scrolling character selection window.

Screenshots

Download
Wont be needed.
Just take the script and insert it above Main.

Script
Code:
#==============================================================================

# ** Character selector

#------------------------------------------------------------------------------

# Author    S.S Muu

# Version   1.1

# Date      23-01-09 (dd-mm-yy)

#==============================================================================

 

#--[  Config  ]----------------------------------------------------------------

DO_NOT_INCLUDE = [] # The actors who shouldn't be included. For example [1, 4, 6]

 

#--[  IMPORTANT  ]-------------------------------------------------------------

#-- Don't Edit Below if you don't know what you're doing!

#------------------------------------------------------------------------------

 

#==============================================================================

# ** Game_Party

#------------------------------------------------------------------------------

#  This class handles the party. It includes information on amount of gold 

#  and items. Refer to "$game_party" for the instance of this class.

#==============================================================================

class Game_Party

  attr_accessor :actors # Actors

end

 

#==============================================================================

# ** Window_Command

#------------------------------------------------------------------------------

#  This window deals with general command choices.

#==============================================================================

class Window_Command < Window_Selectable

  attr_reader :commands

  #--------------------------------------------------------------------------

  # * New Commands

  #--------------------------------------------------------------------------

  def new_commands(commands)

    @item_max = commands.size

    @commands = commands

    self.contents = Bitmap.new(self.width - 32, @item_max * 32)

    refresh

    self.index = 0

  end

end

 

#==============================================================================

# ** Scene_Title

#------------------------------------------------------------------------------

#  This class performs title screen processing.

#==============================================================================

 

class Scene_Title

  #--------------------------------------------------------------------------

  # * Main Processing

  #--------------------------------------------------------------------------

  def main

    # If battle test

    if $BTEST

      battle_test

      return

    end

    # Load database

    $data_actors        = load_data("Data/Actors.rxdata")

    $data_classes       = load_data("Data/Classes.rxdata")

    $data_skills        = load_data("Data/Skills.rxdata")

    $data_items         = load_data("Data/Items.rxdata")

    $data_weapons       = load_data("Data/Weapons.rxdata")

    $data_armors        = load_data("Data/Armors.rxdata")

    $data_enemies       = load_data("Data/Enemies.rxdata")

    $data_troops        = load_data("Data/Troops.rxdata")

    $data_states        = load_data("Data/States.rxdata")

    $data_animations    = load_data("Data/Animations.rxdata")

    $data_tilesets      = load_data("Data/Tilesets.rxdata")

    $data_common_events = load_data("Data/CommonEvents.rxdata")

    $data_system        = load_data("Data/System.rxdata")

    # Make system object

    $game_system = Game_System.new

    # Make title graphic

    @sprite = Sprite.new

    @sprite.bitmap = RPG::Cache.title($data_system.title_name)

    # Make characters

    @characters = []

    for i in 1...$data_actors.size

      @characters.push($data_actors[i].name) if !DO_NOT_INCLUDE.include?(i)

    end

    @characters_height = @characters.size * 32 + 32

    # Make command window

    s1 = "New Game"

    s2 = "Continue"

    s3 = "Shutdown"

    @command_window = Window_Command.new(192, [s1, s2, s3])

    @command_window.back_opacity = 160

    @command_window.x = 320 - @command_window.width / 2

    @command_window.y = 288

    # Make default commands

    @default = [s1, s2, s3]

    # Continue enabled determinant

    # Check if at least one save file exists

    # If enabled, make @continue_enabled true; if disabled, make it false

    @continue_enabled = false

    for i in 0..3

      if FileTest.exist?("Save#{i+1}.rxdata")

        @continue_enabled = true

      end

    end

    # If continue is enabled, move cursor to "Continue"

    # If disabled, display "Continue" text in gray

    if @continue_enabled

      @command_window.index = 1

    else

      @command_window.disable_item(1)

    end

    # Play title BGM

    $game_system.bgm_play($data_system.title_bgm)

    # Stop playing ME and BGS

    Audio.me_stop

    Audio.bgs_stop

    # Execute transition

    Graphics.transition

    # Main loop

    loop do

      # Update game screen

      Graphics.update

      # Update input information

      Input.update

      # Frame update

      update

      # Abort loop if screen is changed

      if $scene != self

        break

      end

    end

    # Prepare for transition

    Graphics.freeze

    # Dispose of command window

    @command_window.dispose

    # Dispose of title graphic

    @sprite.bitmap.dispose

    @sprite.dispose

  end

  #--------------------------------------------------------------------------

  # * Frame Update

  #--------------------------------------------------------------------------

  def update

    # Update command window

    @command_window.update

    if @command_window.commands == @characters and @command_window.height < @characters_height and @command_window.y > 32

      @command_window.y -= 5

      @command_window.height += 5

    elsif @command_window.commands == @default and @command_window.height > 128

      @command_window.y += 5

      @command_window.height -= 5

    elsif @command_window.commands == @default and @command_window.height < 128

      @command_window.y -= 1

      @command_window.height += 1

    end

    # If B button was pressed

    if Input.trigger?(Input::B)

      # Play cancel SE

      $game_system.se_play($data_system.cancel_se)

      # Switch to Default commands

      @command_window.new_commands(@default)

      if @continue_enabled

        @command_window.index = 1

      else

        @command_window.disable_item(1)

      end

    end

    # If C button was pressed

    if Input.trigger?(Input::C)

      # Branch by command window cursor position

      if @command_window.commands == @characters

        command_new_game

      else

        case @command_window.index

        when 0  # New game

          # Play decision SE

          $game_system.se_play($data_system.decision_se)

          # Switch to Character commands

          @command_window.new_commands(@characters)

        when 1  # Continue

          command_continue

        when 2  # Shutdown

          command_shutdown

        end

      end

    end

  end

  #--------------------------------------------------------------------------

  # * Command: New Game

  #--------------------------------------------------------------------------

  def command_new_game

    # Play decision SE

    $game_system.se_play($data_system.decision_se)

    # Stop BGM

    Audio.bgm_stop

    # Reset frame count for measuring play time

    Graphics.frame_count = 0

    # Make each type of game object

    $game_temp          = Game_Temp.new

    $game_system        = Game_System.new

    $game_switches      = Game_Switches.new

    $game_variables     = Game_Variables.new

    $game_self_switches = Game_SelfSwitches.new

    $game_screen        = Game_Screen.new

    $game_actors        = Game_Actors.new

    $game_party         = Game_Party.new

    $game_troop         = Game_Troop.new

    $game_map           = Game_Map.new

    $game_player        = Game_Player.new

    # Set up initial party

    $game_party.setup_starting_members

    $game_party.actors[0] = $game_actors[@command_window.index + 1]

    # Set up initial map position

    $game_map.setup($data_system.start_map_id)

    # Move player to initial position

    $game_player.moveto($data_system.start_x, $data_system.start_y)

    # Refresh player

    $game_player.refresh

    # Run automatic change for BGM and BGS set with map

    $game_map.autoplay

    # Update map (run parallel process event)

    $game_map.update

    # Switch to map screen

    $scene = Scene_Map.new

  end

end

 

Instructions
You don't have to do anything else then insert it above Main, it will then automatically take every character from the "Actors" tab in the database.

If you on the other hand don't want all the actors to show up, edit line 10 in the script,
for example, if you don't want actor 1, 4, and 5 to be playable, then edit it like so,
Code:
DO_NOT_INCLUDE = [1, 4, 5]

Bug Report?
- None so far.
- Please report all bugs that you can find.

Author's Notes
You are free to use the this scripts in your commercial or non-commercial projects without credits, but it would be greatly appreciated if you do give credits.

Please do not redistribute this script without permission. If you want to post it on any forum, please link to this topic.

Credit
S.S Muu - For creating the script.
 
Thanks :]

Well, the main reason I made it so simple is because everyone else keeps making their's so big and whatnot, I just wanted a little change from that. :smile:
 

e

Sponsor

What this needs (and would make it really cool) is a strategy pattern for specifying how the characters are selected; you basically provide a simple selector skeleton like the current one, but in addition to taking in an array of characters (or is an hash? idk) you also give it a callback, that is, a Proc or Method object. When it's time to draw the "commands" (which are now names), you can simply call the Proc or Method object and pass it the current character (or command) to be drawn at such and such coordinates (the Proc would return the next set of coordinates). It's slightly more complex, but much more flexible.

Just a thought. :thumb:
 
From what I understand you want it have a method that specifies what should be listed? (instead of the characters)

Sorry, but I don't really understand what you mean.
Care to try to explain again? :]
 
Good idea, I'll add that, but I'll make the opposite, instead of an array of the actors who should be on, I'll make an array of those who shouldn't be on the list.
That way you can still use it without editing anything. :biggrin:
 

e

Sponsor

It's the strategy pattern; you pass it a method which will dictate how it behaves. In this instance, I suggested that the method itself (the Proc object) should take care of the DISPLAY of the characters; that way one could have faces instead of names, or full body graphics, etc.
 
@etheon
Yeah, I guess I could add that, but it would remove the "Simple" part of the script, which is really the base of the script.
Sorry ~

@the_FATE
You're welcome :thumb:


I was gonna update the first post with a new version of the script, but for some reason I can't edit my post. ("You cannot edit your posts in this forum")
 
I can't get it working... Just my skills in this lol.
I add it above "Main" scripts but it doesn't change a thing... Help? =]
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top