Introduction
It's been a long time since I opened an RPGmaker, but when I saw Ace had arrived it seemed to fix every single complaint I ever had with VX. So impressed was I with Ace I decided to take up scripting again. So 24 hours later my Character creation script was born.
I tried to keep the Race System as open ended as possible. I achieved this by having the Race simply put in a Game Variable (By Default 25) and nothing else. This means by default all Races do is act as Categories for the Appearances. However as that Game Variable can checked by events, it is not at all difficult for an array to check that Game Variable and, say, change the actors stats accordingly.
Screenshot


Config
The config is quite simple, and most of it is explained in the Script's config section itself.
However it is very important that when you add this script to a project you follow the following intructions:
1)Ensure that the default starting character has no name, and no character or face image
2) Make a new map, which is entirely black and has the player's starting position on it. On this map create an autorun event like so:
a)use the Advanced -> Script action and type:
SceneManager.call(Scene_CharacterCreation)
b)Then change SelfSwitch A to ON
c)Create a new event page, and ensure that that is also set to the AutoRun trigger. On this page you can run the Process Name Input event action
d (Optional)Then using an conditional branch run any other effects you only want to effect certain races, by checking the Variable defined in the main config (By default 25).
e) Transfer the player to the original starting position.
The Script
Codez
CODE
Races = Array.new
RaceAppearanceNames = Array.new
RaceFaceImage = Array.new
RaceFaceIndex = Array.new
RaceChara = Array.new
RaceIndex = Array.new
#############CONFIG######################
#Here list all the names of all races in the game
# Example:
# Races = ["Human","Elf","Dwarf"]
# Creates three races, called Human, Elf and Dwarf
Races = ["Human","Elf","Dwarf"]
#Which race the player chooses will be stored in a variable, which is defined
#below. This can be used later create effects that only affect, say, Dwarves,
#such as giving them the ability to use heavy armour, regardless of class.
#This can be acheived by having an event check that array, then run actions accordingly
RaceVariable = 25
#The default is to store the Race in variable 25. By default this will mean that
#if the player is human that varible will be 1, 2 if an elf, and 3 if a dwarf.
#
#Then for each race create a module for showing the Appearance(s)
#Example:
#RaceAppearanceNames << ["Female","Male"]
#RaceFaceImage << ["Actor1.png","Actor1.png"]
#RaceFaceIndex << [1,2]
#RaceChara << ["Actor1.png","Actor1.png"]
#RaceIndex << [1,2]
#
#The first row shows that the first race we typed in at the start has two
#different Appearances. One called Female, one called Male.
#The second row shows the File name for that appearances face. So both Male and
#Female humans use Actor1.png
#The third row shows which face in the file to use, as each image has 8 faces,
#so female humans use the first face in the Actor1.png Image, and Males use the
#second image.
#
#The fourth and fifth line work like the Faces, appart from for defining the
#Character image that is seen walking around the screen. In the example above
#both Male and Female humans have characters to match their faces.
#
#For each race you defined at the start, copy paste these five lines, and customize
#as you wish.
#Race 1:
RaceAppearanceNames << ["Ginger","Green","Purple","Wings"]
RaceFaceImage << ["Actor1.png","Actor2.png","Actor3.png","Actor4.png"]
RaceFaceIndex << [1,2,3,4]
RaceChara << ["Actor1.png","Actor2.png","Actor3.png","Actor4.png"]
RaceIndex << [1,2,3,4]
#Race 2:
RaceAppearanceNames << ["Female","Male"]
RaceFaceImage << ["Actor3.png","Actor3.png"]
RaceFaceIndex << [6,5]
RaceChara << ["Actor3.png","Actor3.png"]
RaceIndex << [6,5]
#Race 3:
RaceAppearanceNames << ["Male"]
RaceFaceImage << ["Actor3.png"]
RaceFaceIndex << [7]
RaceChara << ["Actor3.png"]
RaceIndex << [7]
############END CONFIG############################
#==============================================================================
# ** Scene_Status
#------------------------------------------------------------------------------
# This class performs the status screen processing.
#==============================================================================
class Scene_CharacterCreation < Scene_MenuBase
#--------------------------------------------------------------------------
# * Start Processing
#--------------------------------------------------------------------------
def start
super
create_status_window
@stage = 1
@finished = false
@class_window = Window_Create.new(@actor)
@race_window = Window_Race.new(@actor)
@look_window = Window_Appearance.new(@actor,1)
@status_window.width = Graphics.width
@class_window.index = (@actor.class.id - 1)
@class_window.width = Graphics.width / 3
@class_window.active = false
@class_window.visible = false
@look_window.active = false
@look_window.visible = false
@race_window.width = Graphics.width / 3
@look_window.width = Graphics.width / 3
@class_window.set_handler(:class,method(:changeActorClass))
@class_window.set_handler(:cancel, method(:back))
@look_window.set_handler(:cancel, method(:back))
@look_window.set_handler(:look, method(:finish))
@race_window.set_handler(:race,method(:changeActorRace))
end
alias oldupdate update
def update()
oldupdate()
if @finished == true
return_scene
end
raceID = @race_window.index
appID = @look_window.index
appIndex = RaceIndex
@actor.set_graphic(RaceChara[raceID][appID],RaceIndex[raceID][appID]-1 ,RaceFaceImage[raceID][appID],RaceFaceIndex[raceID][appID]-1)
#@actor.set_graphic("Animal.png" ,3,RaceFaceImage[raceID][appID],RaceFaceIndex[raceID][appID]-1)
$game_player.refresh
classID = @class_window.index
@actor.change_class(classID+1)
@actor.hp = @actor.mhp
@actor.mp = @actor.mmp
@status_window.refresh
end
def finish()
@finished = true
end
def back()
@class_window.active = false
@race_window.active = false
@look_window.active = false
if @stage == 2
@look_window.index = 0
@race_window.active = true
@stage = 1
elsif @stage == 3
@stage = 2
@class_window.active = true
end
end
def changeActorClass()
classID = @class_window.index
@actor.change_class(classID+1)
@actor.hp = @actor.mhp
@actor.mp = @actor.mmp
@stage = 3
@look_window.active = true
@look_window.visible = true
@status_window.refresh
end
def changeActorRace()
raceID = @race_window.index
@actor.set_graphic(RaceFaceImage[raceID][0],RaceFaceIndex[raceID][0],RaceFaceImage[raceID][0],RaceFaceIndex[raceID][0]-1)
@status_window.refresh
@stage = 2
@class_window.activate
@class_window.visible = true
@look_window.id=raceID
@look_window.index = 0
$game_variables[RaceVariable] = raceID +1
end
def create_status_window
y = 0
@status_window = Window_SkillStatus.new(0,0)
@status_window.viewport = @viewport
@status_window.actor = @actor
end
end
#==============================================================================
# ** Window_Status
#------------------------------------------------------------------------------
# This window displays full status specs on the status screen.
#==============================================================================
class Window_Create < Window_Command
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(actor)
super(Graphics.width / 3, fitting_height(4))
self.height = Graphics.height - fitting_height(4)
# create_help_window
@actor = actor
end
#--------------------------------------------------------------------------
# * Set Actor
#--------------------------------------------------------------------------
def actor=(actor)
return if @actor == actor
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# * Create Command List
#--------------------------------------------------------------------------
def make_command_list
count = 1
for i in $data_classes
count += 1
end
count -= 1
for i in (1...count)
flag = true
add_command($data_classes[i].name, :class)
#add_command(@actor.face_name :class)
end
end
#------------------------------------------------------------------------
#--------------------------------------------------------------------------
# * Get Color of Horizontal Line
#--------------------------------------------------------------------------
def line_color
color = normal_color
color.alpha = 48
color
end
#--------------------------------------------------------------------------
# * Draw Basic Information
#--------------------------------------------------------------------------
def draw_basic_info(x, y)
draw_actor_level(@actor, x, y + line_height * 0)
draw_actor_icons(@actor, x, y + line_height * 1)
draw_actor_hp(@actor, x, y + line_height * 2)
draw_actor_mp(@actor, x, y + line_height * 3)
end
#--------------------------------------------------------------------------
# * Draw Parameters
#--------------------------------------------------------------------------
def draw_parameters(x, y)
6.times {|i| draw_actor_param(@actor, x, y + line_height * i, i + 2) }
end
#--------------------------------------------------------------------------
# * Draw Experience Information
#--------------------------------------------------------------------------
def draw_exp_info(x, y)
s1 = @actor.max_level? ? "-------" : @actor.exp
s2 = @actor.max_level? ? "-------" : @actor.next_level_exp - @actor.exp
s_next = sprintf(Vocab::ExpNext, Vocab::level)
change_color(system_color)
draw_text(x, y + line_height * 0, 180, line_height, Vocab::ExpTotal)
draw_text(x, y + line_height * 2, 180, line_height, s_next)
change_color(normal_color)
draw_text(x, y + line_height * 1, 180, line_height, s1, 2)
draw_text(x, y + line_height * 3, 180, line_height, s2, 2)
end
#--------------------------------------------------------------------------
# * Draw Equipment
#--------------------------------------------------------------------------
def draw_equipments(x, y)
@actor.equips.each_with_index do |item, i|
draw_item_name(item, x, y + line_height * i)
end
end
#--------------------------------------------------------------------------
# * Draw Description
#--------------------------------------------------------------------------
def draw_description(x, y)
draw_text_ex(x, y, @actor.description)
end
end
############################################################
#
#
# RACE MEANU
#####
class Window_Race < Window_Command
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(actor)
super(0, fitting_height(4))
self.height = Graphics.height - fitting_height(4)
# create_help_window
@actor = actor
end
#--------------------------------------------------------------------------
# * Set Actor
#--------------------------------------------------------------------------
def actor=(actor)
return if @actor == actor
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# * Create Command List
#--------------------------------------------------------------------------
def make_command_list
count = 0
for i in Races
add_command(i, :race)
end
end
end
class Window_Appearance < Window_Command
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(actor,id)
super(Graphics.width / 1.5, fitting_height(4))
self.height = Graphics.height - fitting_height(4)
# create_help_window
@actor = actor
@id = id
#item_height = 36
end
#--------------------------------------------------------------------------
# * Set Actor
#--------------------------------------------------------------------------
def actor=(actor)
return if @actor == actor
@actor = actor
refresh
# self.item_height = 36
end
def id=(id)
@id = id
refresh
# self.item_height = 36
count = 0
i_id = @id.to_i
lookArray = RaceAppearanceNames#[@id]
for i in (0...(lookArray[i_id].length))
#add_command(" "+lookArray[i_id][i], :look)
#draw_item(i,RaceChara[i_id][i],RaceIndex[i_id][i])
draw_character(RaceChara[i_id][i], RaceIndex[i_id][i]-1,16,36*(i+1)-2)
end
end
#--------------------------------------------------------------------------
# * Create Command List
#--------------------------------------------------------------------------
alias oldCommand make_command_list
def make_command_list
oldCommand
count = 0
i_id = @id.to_i
lookArray = RaceAppearanceNames#[@id]
for i in (0...(lookArray[i_id].length))
add_command(" "+lookArray[i_id][i], :look)
#draw_item(i,RaceChara[i_id][i],RaceIndex[i_id][i])
#draw_character(RaceChara[i_id][i], RaceIndex[i_id][i],16,36*(i+1)-2)
end
#draw_character(RaceChara[i_id][i], RaceIndex[i_id][i], 0, 0)
end
def draw_item(index,chara="Actor1.png",chaIndex = 1)
change_color(normal_color, command_enabled?(index))
draw_text(item_rect_for_text(index), command_name(index), alignment)
#draw_character(chara,chaIndex,16,36*(index+1)-2)
end
def item_rect(index)
rect = Rect.new
rect.width = item_width
rect.height = 36#item_height
rect.x = index % col_max * (item_width + spacing)
rect.y = index / col_max * 36#item_height
rect
end
def update_cursor
if @cursor_all
cursor_rect.set(0, 0, contents.width, row_max * 36)
self.top_row = 0
elsif @index < 0
cursor_rect.empty
else
ensure_cursor_visible
cursor_rect.set(item_rect(@index))
end
end
def contents_height
[super - super % 36, row_max * 36].max
end
def update_padding_bottom
surplus = (height - standard_padding * 2) % 36
self.padding_bottom = padding + surplus
end
def top_row
oy / 36
end
def page_row_max
(height - padding - padding_bottom) / 36
end
def top_row=(row)
row = 0 if row < 0
row = row_max - 1 if row > row_max - 1
self.oy = row * 36
end
end
RaceAppearanceNames = Array.new
RaceFaceImage = Array.new
RaceFaceIndex = Array.new
RaceChara = Array.new
RaceIndex = Array.new
#############CONFIG######################
#Here list all the names of all races in the game
# Example:
# Races = ["Human","Elf","Dwarf"]
# Creates three races, called Human, Elf and Dwarf
Races = ["Human","Elf","Dwarf"]
#Which race the player chooses will be stored in a variable, which is defined
#below. This can be used later create effects that only affect, say, Dwarves,
#such as giving them the ability to use heavy armour, regardless of class.
#This can be acheived by having an event check that array, then run actions accordingly
RaceVariable = 25
#The default is to store the Race in variable 25. By default this will mean that
#if the player is human that varible will be 1, 2 if an elf, and 3 if a dwarf.
#
#Then for each race create a module for showing the Appearance(s)
#Example:
#RaceAppearanceNames << ["Female","Male"]
#RaceFaceImage << ["Actor1.png","Actor1.png"]
#RaceFaceIndex << [1,2]
#RaceChara << ["Actor1.png","Actor1.png"]
#RaceIndex << [1,2]
#
#The first row shows that the first race we typed in at the start has two
#different Appearances. One called Female, one called Male.
#The second row shows the File name for that appearances face. So both Male and
#Female humans use Actor1.png
#The third row shows which face in the file to use, as each image has 8 faces,
#so female humans use the first face in the Actor1.png Image, and Males use the
#second image.
#
#The fourth and fifth line work like the Faces, appart from for defining the
#Character image that is seen walking around the screen. In the example above
#both Male and Female humans have characters to match their faces.
#
#For each race you defined at the start, copy paste these five lines, and customize
#as you wish.
#Race 1:
RaceAppearanceNames << ["Ginger","Green","Purple","Wings"]
RaceFaceImage << ["Actor1.png","Actor2.png","Actor3.png","Actor4.png"]
RaceFaceIndex << [1,2,3,4]
RaceChara << ["Actor1.png","Actor2.png","Actor3.png","Actor4.png"]
RaceIndex << [1,2,3,4]
#Race 2:
RaceAppearanceNames << ["Female","Male"]
RaceFaceImage << ["Actor3.png","Actor3.png"]
RaceFaceIndex << [6,5]
RaceChara << ["Actor3.png","Actor3.png"]
RaceIndex << [6,5]
#Race 3:
RaceAppearanceNames << ["Male"]
RaceFaceImage << ["Actor3.png"]
RaceFaceIndex << [7]
RaceChara << ["Actor3.png"]
RaceIndex << [7]
############END CONFIG############################
#==============================================================================
# ** Scene_Status
#------------------------------------------------------------------------------
# This class performs the status screen processing.
#==============================================================================
class Scene_CharacterCreation < Scene_MenuBase
#--------------------------------------------------------------------------
# * Start Processing
#--------------------------------------------------------------------------
def start
super
create_status_window
@stage = 1
@finished = false
@class_window = Window_Create.new(@actor)
@race_window = Window_Race.new(@actor)
@look_window = Window_Appearance.new(@actor,1)
@status_window.width = Graphics.width
@class_window.index = (@actor.class.id - 1)
@class_window.width = Graphics.width / 3
@class_window.active = false
@class_window.visible = false
@look_window.active = false
@look_window.visible = false
@race_window.width = Graphics.width / 3
@look_window.width = Graphics.width / 3
@class_window.set_handler(:class,method(:changeActorClass))
@class_window.set_handler(:cancel, method(:back))
@look_window.set_handler(:cancel, method(:back))
@look_window.set_handler(:look, method(:finish))
@race_window.set_handler(:race,method(:changeActorRace))
end
alias oldupdate update
def update()
oldupdate()
if @finished == true
return_scene
end
raceID = @race_window.index
appID = @look_window.index
appIndex = RaceIndex
@actor.set_graphic(RaceChara[raceID][appID],RaceIndex[raceID][appID]-1 ,RaceFaceImage[raceID][appID],RaceFaceIndex[raceID][appID]-1)
#@actor.set_graphic("Animal.png" ,3,RaceFaceImage[raceID][appID],RaceFaceIndex[raceID][appID]-1)
$game_player.refresh
classID = @class_window.index
@actor.change_class(classID+1)
@actor.hp = @actor.mhp
@actor.mp = @actor.mmp
@status_window.refresh
end
def finish()
@finished = true
end
def back()
@class_window.active = false
@race_window.active = false
@look_window.active = false
if @stage == 2
@look_window.index = 0
@race_window.active = true
@stage = 1
elsif @stage == 3
@stage = 2
@class_window.active = true
end
end
def changeActorClass()
classID = @class_window.index
@actor.change_class(classID+1)
@actor.hp = @actor.mhp
@actor.mp = @actor.mmp
@stage = 3
@look_window.active = true
@look_window.visible = true
@status_window.refresh
end
def changeActorRace()
raceID = @race_window.index
@actor.set_graphic(RaceFaceImage[raceID][0],RaceFaceIndex[raceID][0],RaceFaceImage[raceID][0],RaceFaceIndex[raceID][0]-1)
@status_window.refresh
@stage = 2
@class_window.activate
@class_window.visible = true
@look_window.id=raceID
@look_window.index = 0
$game_variables[RaceVariable] = raceID +1
end
def create_status_window
y = 0
@status_window = Window_SkillStatus.new(0,0)
@status_window.viewport = @viewport
@status_window.actor = @actor
end
end
#==============================================================================
# ** Window_Status
#------------------------------------------------------------------------------
# This window displays full status specs on the status screen.
#==============================================================================
class Window_Create < Window_Command
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(actor)
super(Graphics.width / 3, fitting_height(4))
self.height = Graphics.height - fitting_height(4)
# create_help_window
@actor = actor
end
#--------------------------------------------------------------------------
# * Set Actor
#--------------------------------------------------------------------------
def actor=(actor)
return if @actor == actor
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# * Create Command List
#--------------------------------------------------------------------------
def make_command_list
count = 1
for i in $data_classes
count += 1
end
count -= 1
for i in (1...count)
flag = true
add_command($data_classes[i].name, :class)
#add_command(@actor.face_name :class)
end
end
#------------------------------------------------------------------------
#--------------------------------------------------------------------------
# * Get Color of Horizontal Line
#--------------------------------------------------------------------------
def line_color
color = normal_color
color.alpha = 48
color
end
#--------------------------------------------------------------------------
# * Draw Basic Information
#--------------------------------------------------------------------------
def draw_basic_info(x, y)
draw_actor_level(@actor, x, y + line_height * 0)
draw_actor_icons(@actor, x, y + line_height * 1)
draw_actor_hp(@actor, x, y + line_height * 2)
draw_actor_mp(@actor, x, y + line_height * 3)
end
#--------------------------------------------------------------------------
# * Draw Parameters
#--------------------------------------------------------------------------
def draw_parameters(x, y)
6.times {|i| draw_actor_param(@actor, x, y + line_height * i, i + 2) }
end
#--------------------------------------------------------------------------
# * Draw Experience Information
#--------------------------------------------------------------------------
def draw_exp_info(x, y)
s1 = @actor.max_level? ? "-------" : @actor.exp
s2 = @actor.max_level? ? "-------" : @actor.next_level_exp - @actor.exp
s_next = sprintf(Vocab::ExpNext, Vocab::level)
change_color(system_color)
draw_text(x, y + line_height * 0, 180, line_height, Vocab::ExpTotal)
draw_text(x, y + line_height * 2, 180, line_height, s_next)
change_color(normal_color)
draw_text(x, y + line_height * 1, 180, line_height, s1, 2)
draw_text(x, y + line_height * 3, 180, line_height, s2, 2)
end
#--------------------------------------------------------------------------
# * Draw Equipment
#--------------------------------------------------------------------------
def draw_equipments(x, y)
@actor.equips.each_with_index do |item, i|
draw_item_name(item, x, y + line_height * i)
end
end
#--------------------------------------------------------------------------
# * Draw Description
#--------------------------------------------------------------------------
def draw_description(x, y)
draw_text_ex(x, y, @actor.description)
end
end
############################################################
#
#
# RACE MEANU
#####
class Window_Race < Window_Command
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(actor)
super(0, fitting_height(4))
self.height = Graphics.height - fitting_height(4)
# create_help_window
@actor = actor
end
#--------------------------------------------------------------------------
# * Set Actor
#--------------------------------------------------------------------------
def actor=(actor)
return if @actor == actor
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# * Create Command List
#--------------------------------------------------------------------------
def make_command_list
count = 0
for i in Races
add_command(i, :race)
end
end
end
class Window_Appearance < Window_Command
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(actor,id)
super(Graphics.width / 1.5, fitting_height(4))
self.height = Graphics.height - fitting_height(4)
# create_help_window
@actor = actor
@id = id
#item_height = 36
end
#--------------------------------------------------------------------------
# * Set Actor
#--------------------------------------------------------------------------
def actor=(actor)
return if @actor == actor
@actor = actor
refresh
# self.item_height = 36
end
def id=(id)
@id = id
refresh
# self.item_height = 36
count = 0
i_id = @id.to_i
lookArray = RaceAppearanceNames#[@id]
for i in (0...(lookArray[i_id].length))
#add_command(" "+lookArray[i_id][i], :look)
#draw_item(i,RaceChara[i_id][i],RaceIndex[i_id][i])
draw_character(RaceChara[i_id][i], RaceIndex[i_id][i]-1,16,36*(i+1)-2)
end
end
#--------------------------------------------------------------------------
# * Create Command List
#--------------------------------------------------------------------------
alias oldCommand make_command_list
def make_command_list
oldCommand
count = 0
i_id = @id.to_i
lookArray = RaceAppearanceNames#[@id]
for i in (0...(lookArray[i_id].length))
add_command(" "+lookArray[i_id][i], :look)
#draw_item(i,RaceChara[i_id][i],RaceIndex[i_id][i])
#draw_character(RaceChara[i_id][i], RaceIndex[i_id][i],16,36*(i+1)-2)
end
#draw_character(RaceChara[i_id][i], RaceIndex[i_id][i], 0, 0)
end
def draw_item(index,chara="Actor1.png",chaIndex = 1)
change_color(normal_color, command_enabled?(index))
draw_text(item_rect_for_text(index), command_name(index), alignment)
#draw_character(chara,chaIndex,16,36*(index+1)-2)
end
def item_rect(index)
rect = Rect.new
rect.width = item_width
rect.height = 36#item_height
rect.x = index % col_max * (item_width + spacing)
rect.y = index / col_max * 36#item_height
rect
end
def update_cursor
if @cursor_all
cursor_rect.set(0, 0, contents.width, row_max * 36)
self.top_row = 0
elsif @index < 0
cursor_rect.empty
else
ensure_cursor_visible
cursor_rect.set(item_rect(@index))
end
end
def contents_height
[super - super % 36, row_max * 36].max
end
def update_padding_bottom
surplus = (height - standard_padding * 2) % 36
self.padding_bottom = padding + surplus
end
def top_row
oy / 36
end
def page_row_max
(height - padding - padding_bottom) / 36
end
def top_row=(row)
row = 0 if row < 0
row = row_max - 1 if row > row_max - 1
self.oy = row * 36
end
end
Version History
0.9: Initial Release, Races and Classes unlimted, Appearances per class limited to 6
1.0: Lifted Appearance limit.
Finally
Finally please give credit to Kaimonkey if you use this script. This is a basic system, and if more needs to be added just make a suggestion below. Additionally if the config instructions are not that easy to read I will try and rewrite them, but I think they are ok for now.
Thanks, Kaimonkey
