Jump to content
Rpg²S Forum

*Creare personaggio nel gioco: In-Game Character Creation


Rap1em
 Share

Recommended Posts

In Game Character Creation

Descrizione:

Questo script ha due funzioni: consente di creare eroi che utilizzano la grafica in composito che possono avere grafiche differenti (sia per il viso che per la camminata) a seconda delle voci selezionate, e di chiamare a schermo in-game la creazione del personaggio che permetterà al giocatore di cambiare grafica. Questo script non è "user friendly", ma è abbastanza semplice. Ha una terribile quantità di impostazioni da configurare e ottimizzare per ottenere i materiali compositi e permettere che la schermata di creazione funzioni correttamente. Se si desidera utilizzare questo script solo per i personaggi compositi, è un po 'più facile da configurare e utilizzare.

 

Autore:

Neon Black.

 

Istruzioni per l'uso:

Inserisci lo script in una nuova finestra nella sezione "Materiali".

Script:

 

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

## Composite Character v2.1
## Created by Neon Black
##
## Only for non-commercial use. See full terms of use and contact info at:
## http://cphouseset.wordpress.com/liscense-and-terms-of-use/
##----------------------------------------------------------------------------##
##
##----------------------------------------------------------------------------##
## Revision Info:
## V2.1 - 2.12.2013
## Added new script calls
## V2.0 - 1.24.2013
## Rewrote entire script from scratch
## V1.0 - 10.17.2012
## Wrote and debugged main script
##----------------------------------------------------------------------------##
##
$imported = {} if $imported.nil? ##
$imported["COMPOSITE"] = 2.1 ##
##
##----------------------------------------------------------------------------##
## Instructions:
## Place this script in the "Materials" section of the scripts above "Main".
## To use this script you must have additional composite graphics in a folder
## for characters and a folder for faces. Charactersets will use composites
## based on their names in the NAMES setting. Some layers of the composite
## may also change based on the equipped items on the actor associated with
## file name. There are several tags that work with both actors and equips.
##
## Tags:
## tag init[Handler, hue]
## - Can only be tagged in actors. Changes composite layer :tag to handler
## "Handler" with the defined hue. Do not use colons for layer names or
## quotes for file handler names.
## gender[male]
## - Sets the character's initial gender to "male" or "female" depending on
## which you place in the brackets. This can only tag actors.
## alt name[Christopher]
## - Sets the character's name for the opposite gender. If the player changes
## the gender in the GUI and has not changed the name, the new name will be
## displayed. The name "Christopher" here can be any name you desire.
## tag image[Handler, hue]
## - Changes the default images for layer :tag to file handler "Handler".
##
## Script Calls:
## The character creation screen can be called with either of these two script
## calls from an event. Other script calls also exist.
##
## creation(id) -or- creation(id, array)
## - The value "id" can be either the actor's ID or the name of the character
## set to modify. The "array" value does not need to be used ever. This is
## the array of handlers from "GUI_LISTS" to use. If no array is defined,
## "BASE_GUI" is used instead.
## composite_custom(id, handler, name, hue)
## - Changes composite "id"'s layer "handler" into file "name" with a hue of
## "hue". This occurs on the same priority level as the character creation
## screen, so it is covered by armour and can be modified by the player.
## "id" must be a value from NAMES, "handler" a layer from COMPOSITE, "name"
## a file from FILE_HANDLERS, and "hue" a number from 0 to 255.
## composite_force(id, handler, name, hue)
## - Similar to the command above, but this takes the highest priority when
## being drawn and cannot be changed by the player.
## composite_reset(id)
## - Removes all layers added using the "composite_force" script call.
##
## Special Layers:
## In order to allow a slight bit more customization, there are 3 types of
## special layers that link directly to other layers. These layers end with
## "Back", "Hueless", and "All".
##
## Back Layers
## - These layers do not actually need to be behind the normal layer. They
## are simply a second layer with all the same properties of the parent
## layer. An example would be :hairRear which would be a rear layer of
## :hair.
## Hueless Layers
## - These layers ignore the changed hue values. The main use of these would
## be objects with skin tone or perhaps objects that you only want to change
## part of the colour on. The only object that uses this in the example
## is :eyesHueless which is a hueless layer of :eyes.
## All Layers
## - These are special layers on the character. They are a layer that appears
## on the character no matter what the player does. The file that appears
## is still linked to the file part it is attatched to for the sake of hue.
## The file that appears for one of these layers is defined in the hash
## GUI_OPTIONS.
##----------------------------------------------------------------------------##
##
module CP # Do not touch ##
module COMPOSITE # these lines. ##
##
##----------------------------------------------------------------------------##
## Config:
## The config options are below. You can set these depending on the flavour of
## your game. Each option is explained in a bit more detail above it.
##
##------

# The folders containing the composite parts for characters and for facesets.
CHAR_FOLDER = "Graphics/Composite/Charas/"
FACE_FOLDER = "Graphics/Composite/Faces/"

# Determines if the creation screen uses face sets are not. Set to false if
# you do not want a faceset displayed.
	USE_FACESETS = true
	
	# The width and height of the character window in the creation screen. The
	# character in the screen is zoomed in to 200%.
	WINDOW_WIDTH = 90
	WINDOW_HEIGHT = 112
	
	# The text options for the character selection GUI. EMPTY_TEXT refers to an
	# option which is blank for some reason.
	GUI_CLOSE = "Finish Editing"
	EMPTY_TEXT = "None"
	
	# The number of allowed character spaces for names when input from the editor.
	CHARACTERS = 6
	
	# Names for the male and female genders.
	GENDER_NAMES = ["Male", "Female"]
	
	# Determines if male undefined characters start out as male characters.
	MALE_DEFAULT = true
	
	##------
	
	# Determine the files that are recognized as composite images and the actor
	# they are linked to, for the sake of armour, storage, etc.
	NAMES ={
	"$Hero1" => 11,
	"$Hero2" => 12,
	}
	
	# The switches related to characters. A switch is turned ON when the character
	# is male and OFF when the character is female.
	SWITCHES ={
	11 => 72,
	12 => 73,
	}
	
	# The order for composite layers. The first layer is the lowest layer.
	COMPOSITE =[
	:hairRear,
	:cape,
	:armorRear,
	:headAll,
	:head,
	:eyes,
	:eyesAll,
	:eyesHueless,
	:armor,
	:hair,
	:glasses,
	:helmet,
	]
	
	# These are the handlers for all files in the composite folders. Actor and
	# equip tags as well as GUI options point to a handler and the handler
	# determines the male and female files to look up. Make sure every handler
	# has a different name.
	FILE_HANDLERS ={
	# "Handler" => ["Male_File", "Female_File"],
	"Shaggy" => ["Hair1M", nil],
	"Slick" => ["Hair2M", nil],
	"Spiked" => ["Hair3M", nil],
	"Fancy" => ["Hair4M", nil],
	"Stylish" => [nil, "Hair1F"],
	"Waist Length" => [nil, "Hair2F"],
	"Curled" => [nil, "Hair3F"],
	"Pigtails" => [nil, "Hair4F"],
	"Short" => ["Hair1U", "Hair1U"],
	"Long" => ["Hair2U", "Hair2U"],
	"Observant" => ["Eye1M", "Eye1F"],
	"Closed" => ["Eye2M", "Eye2F"],
	"Intent" => ["Eye3M", "Eye3F"],
	
	"HeadBase" => ["HeadAll", "HeadAll"],
	"FaceBase" => ["FaceM", "FaceF"],
	"BodyBase" => ["BaseM", "BaseF"],
	
	"Clothes" => ["ClothesM", "ClothesF"],
	"Cloth" => ["ClothM", "ClothF"],
	"Armor" => ["ArmourM", "ArmourF"],
	"Glasses" => ["Glasses", "Glasses"],
	"Sunglasses" => ["Sunglasses", "Sunglasses"],
	"Goggles" => ["Goggles", "Goggles"],
	}
	
	# Standard handlers. These are default handlers of certain layers.
	STANDARD ={
	:headAll => "HeadBase",
	:head => "FaceBase",
	:armor => "BodyBase",
	}
	
	# The GUI options that may be called from an array. If the "Name" field is set
	# to a :symbol like the :barber example, it will point back to another option
	# and use that option's name and layer. The point is simply to link different
	# handlers to it as well as giving it different colour options. The colorize?
	# option can be set to a value of 0, 1, or 2 depending on the style of hue bar
	# you would like displayed. If it is set to 0, no bar will be displayed.
	GUI_OPTIONS ={
	# :handler => ["Name", colorize?, "AllFile"],
	:Name => ["Name", 0, nil],
	:Gender => ["Gender", 0, nil],
	:hair => ["Hair", 1, nil],
	:eyes => ["Eyes", 1, "EyeAll"],
	
	:barber => [:hair, true, nil],
	}
	
	# These are the basic options to use in the GUI if no array is defined.
	BASE_GUI = [:Name, :Gender, :hair, :eyes]
	
	# These are the lists that refer to the options. Male and Female only options
	# are automatically filtered depending on the character's gender.
	GUI_LISTS ={
	:hair => ["Shaggy", "Slick", "Spiked", "Fancy", "Stylish", "Waist Length",
	"Curled", "Pigtails"],
	:eyes => ["Observant", "Intent", "Closed"],
	
	
	:barber => ["Shaggy", "Slick", "Spiked", "Fancy", "Stylish", "Waist Length",
	"Curled", "Pigtails", "Short", "Long"],
	}
	
	##----------------------------------------------------------------------------##
	##
	##
	##----------------------------------------------------------------------------##
	## The following lines are the actual core code of the script. While you are
	## certainly invited to look, modifying it may result in undesirable results.
	## Modify at your own risk!
	###----------------------------------------------------------------------------
	
	
end
nd
odule Cache
class << self ## Alias for the used methods in this module.
	alias cp_cm_character character
	alias cp_cm_face face
	alias cp_cm_clear clear
end

def self.character(*args) ## Checks if the file is a composite.
	return cp_cm_character(*args) unless Composites.include?(args[0])
	create_composite(args[0], "Graphics/Characters/")
	hue = args[1] ? args[1] : 0
	load_bitmap("Graphics/Characters/", args[0], hue)
end

def self.face(*args) ## Checks if the face is a composite.
	return cp_cm_face(*args) unless Composites.include?(args[0])
	create_composite(args[0], "Graphics/Faces/")
	hue = args[1] ? args[1] : 0
	load_bitmap("Graphics/Faces/", args[0], hue)
end

def self.need_comp_ref?(file, path) ## Checks refresh status.
	return true if Composites.refresh?(file)
	return true if @cache[path].nil? || @cache[path].disposed?
	return false
end

def self.create_composite(file, folder) ## Find and create the composite.
	path = "#{folder}#{file}"
	return unless need_comp_ref?(file, path)
	foldrs = ["Graphics/Characters/", "Graphics/Faces/"]
	Composites.constants.each_with_index do |fld, i|
		paths = "#{foldrs[i]}#{file}"
		array = Composites.images(file)
		Composites.layers do |i|
			image = array[i]
			unless @temp
				@temp = Bitmap.new("#{fld}#{image}") rescue next
				@temp.hue_change(Composites.hues(file)[i]) unless Composites.hues(file)[i].nil?
			else
				t = Bitmap.new("#{fld}#{image}") rescue next
				t.hue_change(Composites.hues(file)[i]) unless Composites.hues(file)[i].nil?
				@temp.blt(0, 0, t, t.rect)
				t.dispose; t = nil
			end
		end
		@temp = Bitmap.new unless @temp
		Composites.refreshed(file)
		@cache[paths] = Bitmap.new(@temp.width, @temp.height)
		@cache[paths].blt(0, 0, @temp, @temp.rect)
		@temp.dispose; @temp = nil
	end
	Composites.remove_temp_layers(file)
end

def self.clear ## Reset the composite cache.
	cp_cm_clear
	Composites.clear
end
nd
odule Composites
def self.include?(file) ## Checks if a file is a composite.
	return CP::COMPOSITE::NAMES.include?(file)
end

def self.options ## Easy access of the options hash.
	return CP::COMPOSITE::GUI_OPTIONS
end

def self.lists ## Easy access of the gui lists hash.
	return CP::COMPOSITE::GUI_LISTS
end

def self.list_by_block(handler, block) ## Returns a list based on gender.
	return [] unless [0, 1].include?(block) && lists.include?(handler)
	return lists[handler].select {|a| !files[a][block].nil?}
end

def self.layers ## Gets each layer key one at a time.
	CP::COMPOSITE::COMPOSITE.each do |key|
		yield key
	end
end

def self.constants ## Gets the folder constants.
	if CP::COMPOSITE::USE_FACESETS
		return [CP::COMPOSITE::CHAR_FOLDER, CP::COMPOSITE::FACE_FOLDER]
	else
		return [CP::COMPOSITE::CHAR_FOLDER]
	end
end

def self.files ## Gets the file handler hash.
	return CP::COMPOSITE::FILE_HANDLERS
end

def self.include_block?(block, handler) ## Checks gender blocks to handlers.
	return false unless files.include?(handler)
	return !files[handler][block].nil?
end

def self.standard ## Gets the standard GUI display.
	return CP::COMPOSITE::STANDARD
end

def self.get_first_handler(block, key) ## Gets the init files based on block.
	return nil if ![0, 1].include?(block) || !lists.include?(key)
	lists[key].each do |handler|
		next unless files.include?(handler)
		return handler unless files[handler][block].nil?
	end
	return nil
end

def self.n(file) ## Returns a number from a file.
	return CP::COMPOSITE::NAMES[file]
end

def self.refreshed(file) ## Resets a file's refresh status.
	return unless n(file)
	actor(file).composite_refresh = false
end

def self.images(file) ## Get all images of a file.
	return @temp_images[file] if @temp_images && @temp_images[file]
	return actor(file).composite_images
end

def self.hues(file) ## Get all hues of a file.
	return @temp_hues[file] if @temp_hues && @temp_hues[file]
	return actor(file).composite_hues
end

def self.remove_temp_layers(file) ## Removes temporary (save) layers.
	@temp_images.delete(file) if @temp_images
	@temp_hues.delete(file) if @temp_hues
end

def self.make_temp_file(file, handlers) ## Create a new temp of a file.
	@temp_images = {} if @temp_images.nil?; @temp_hues = {} if @temp_hues.nil?
	@temp_images[file] = {}; @temp_hues[file] = {}
	handlers.each do |key, array|
		@temp_images[file][key] = array[0]
		@temp_hues[file][key] = array[1]
	end
end

def self.refresh?(file) ## Check if a file needs refreshing.
	return false unless n(file) ## Includes temp file checking.
	return true if @temp_images && @temp_images.include?(file)
	return actor(file).composite_refresh
end

def self.actor(file) ## Gets a game actor from a file name.
	return $game_actors[n(file)]
end

def self.clear ## Allows forced reset of each file.
	CP::COMPOSITE::NAMES.keys.each do |file|
		actor(file).composite_refresh = true
	end
end
nd
lass Game_Actor < Game_Battler
attr_accessor :composite_refresh

alias cp_cmpst_init initialize
def initialize(*args) ## Sets the initial values for composites.
	cp_cmpst_init(*args)
	@composite_refresh = true
	@editor_changes = {}
	@editor_hues = {}
	@forced_composites = {}
end

def composite_images ## Returns the composite images for an actor.
	make_composite_lists if @composite_refresh
	return @composite_images
end

def composite_hues ## Returns the composite hues.
	make_composite_lists if @composite_refresh
	return @composite_hues
end

def edd_additions(hueless, rear) ## Make a new filename based on layers.
	a = ""
	b = hueless ? "#{a}Hueless" : a
	c = rear ? "#{b}Rear" : b
	return c
end

def get_composite_lists ## Gets a composite list for save files.
	return {} unless Composites.include?(character_name)
	make_composite_lists
	r = {}
	@composite_images.each {|k, v| r[k] = [v, @composite_hues[k]]}
	return r
end

def make_composite_lists ## Makes the list of composites and hues.
	@composite_images = {}
	@composite_hues = {}
	@composite_male = get_base_gender ## Sets gender.
	if CP::COMPOSITE::SWITCHES.include?(@actor_id) ## Sets a gender switch.
		$game_switches[CP::COMPOSITE::SWITCHES[@actor_id]] = @composite_male
	end
	block = @composite_male ? 0 : 1
	make_equip_hashes(block) ## Ensures equips are set up.
	Composites.layers do |key| ## Check each layer.
		@composite_hues[key] = 0 ## Gets init values for variables.
		name = nil
		string = key.to_s
		hueless = string.include?("Hueless")
		rear = string.include?("Rear")
		all = string.include?("All")
		string.gsub!(/(Hueless|All|Rear)/, '')
		edd = edd_additions(hueless, rear)
		line = CP::COMPOSITE::GUI_OPTIONS[string.to_sym]
		handler = get_composite_handler(key)
		parent = get_composite_handler(string.to_sym)
		hues = get_composite_hue(key)
		if all && !line.nil? ## Determines the needed value.
			name = line[2]
		elsif handler && Composites.files.include?(handler) &&
			Composites.files[handler][block]
			name = "#{Composites.files[handler][block]}#{edd}"
		elsif parent && Composites.files.include?(parent) &&
			Composites.files[parent][block] && (rear || hueless)
			name = "#{Composites.files[parent][block]}#{edd}"
		elsif Composites.standard.include?(key)
			name = Composites.files[Composites.standard[key]][block]
		end
		next unless name ## Skips if there is no name.
		@composite_images[key] = name ## Creates the hashes.
		@composite_hues[key] = hueless ? 0 : hues
	end
end

def get_base_gender ## Gets the gender.
	return @editor_changes[:Gender] if @editor_changes.include?(:Gender)
	return actor.gender_base
end

def get_composite_handler(key) ## Complex method to find the file handler.
	block = @composite_male ? 0 : 1
	if @forced_composites.include?(key) && Composites.include_block?(block,
		@forced_composites[key][0])
		hues = @forced_composites[key][0]
	elsif @equip_hashes.include?(key) && Composites.include_block?(block,
		@equip_hashes[key][0])
		handler = @equip_hashes[key][0]
	elsif @editor_changes.include?(key) && Composites.include_block?(block,
		@editor_changes[key])
		handler = @editor_changes[key]
	elsif actor.composite_init.include?(key) && Composites.include_block?(block,
		actor.composite_init[key][0])
		handler = actor.composite_init[key][0]
	elsif Composites.get_first_handler(block, key)
		handler = Composites.get_first_handler(block, key)
	else
		handler = nil
	end
	return handler
end

def get_composite_hue(key) ## Same as above but for hues.
	block = @composite_male ? 0 : 1
	if @forced_composites.include?(key) && Composites.include_block?(block,
		@forced_composites[key][0])
		hues = @forced_composites[key][1]
	elsif @equip_hashes.include?(key) && Composites.include_block?(block,
		@equip_hashes[key][0])
		hues = @equip_hashes[key][1]
	elsif @editor_changes.include?(key) && Composites.include_block?(block,
		@editor_changes[key])
		hues = @editor_hues[key]
	elsif actor.composite_init.include?(key) && Composites.include_block?(block,
		actor.composite_init[key][0])
		hues = actor.composite_init[key][1]
	else
		hues = 0
	end
	return hues
end

def make_equip_hashes(block) ## Makes the handler hash for equips.
	@equip_hashes = {}
	equips.each do |eq|
		next unless eq
		eq.composite_hash.each do |key, array|
			next if Composites.files[array[0]][male? ? 0 : 1].nil?
			@equip_hashes[key] = array
		end
	end
end

alias cp_composite_change_eq change_equip
def change_equip(*args) ## Ensures refreshing on equip change.
	cp_composite_change_eq(*args)
	@composite_refresh = true
end

def change_composite(hand, value = nil, hue = nil)
	array = ["#{hand}".to_sym, "#{hand}Rear".to_sym, "#{hand}Hueless".to_sym,
	"#{hand}All".to_sym]
	array.each do |handler| ## Changes values for a layer and sublayers.
		unless value.nil?
			@editor_changes[handler] = value
			@editor_hues[handler] = hue if hue
		else
			@editor_changes.delete(handler)
			@editor_hues.delete(handler)
		end
	end
	@composite_refresh = true
end

def force_composite(hand, value = nil, hue = nil)
	array = ["#{hand}".to_sym, "#{hand}Rear".to_sym, "#{hand}Hueless".to_sym,
	"#{hand}All".to_sym]
	array.each do |handler| ## Changes values for a layer and sublayers.
		unless value.nil?
			@forced_composites[handler] = []
			@forced_composites[handler][0] = value
			@forced_composites[handler][1] = hue if hue
		else
			@forced_composites.delete(handler)
		end
	end
	@composite_refresh = true
end

def reset_composite
	@forced_composites = {}
	@composite_refresh = true
end

def reset_name ## Changes the name to a default name.
	return if actor.alt_name.empty?
	@composite_male = get_base_gender
	if @composite_male == actor.gender_base
		@name = actor.name if @name == actor.alt_name
	else
		@name = actor.alt_name if @name == actor.name
	end
end

def male? ## Check if the actor is male.
	return @composite_male
end
nd
lass Window_SaveFile < Window_Base
def draw_party_characters(x, y) ## Creates a temp array for the save file.
	header = DataManager.load_header(@file_index)
	return unless header
	header[:characters].each_with_index do |data, i|
		Composites.make_temp_file(data[0], data[2])
		draw_character(data[0], data[1], x + i * 48, y)
	end
end
nd
lass Game_Party < Game_Unit
def characters_for_savefile ## Adds the composite arrays to a save file.
	battle_members.collect do |actor|
		[actor.character_name, actor.character_index, actor.get_composite_lists]
	end
end
nd
lass Scene_Load < Scene_File ## Clears the composites on a load.
alias cp_comp_load_succ on_load_success
def on_load_success
	Composites.clear
	cp_comp_load_succ
end
nd
lass Scene_Save < Scene_File ## Clears the composites on save.
alias cp_comp_save_ok on_savefile_ok
def on_savefile_ok
	Composites.clear
	cp_comp_save_ok
end
nd
lass Bitmap
def draw_rainbow(*args) ## Draws a rainbow rectangle.
	case args.size
	when 1
		rect = args[0].clone
	when 4
		rect = Rect.new(args[0], args[1], args[2], args[3])
	end
	ca = rainbow_colours
	6.times do |i|
		wv = rect.width / (6 - i)
		n = i == 5 ? 0 : 1
		r2 = Rect.new(rect.x, rect.y, wv + n, rect.height)
		self.gradient_fill_rect(r2, ca[i], ca[(i + 1) % 6])
		rect.width -= wv
		rect.x += wv
	end
end

def rainbow_colours ## Colours for the rectangle.
	c1 = Color.new(255, 0, 0); c2 = Color.new(255, 255, 0)
	c3 = Color.new( 0, 255, 0); c4 = Color.new( 0, 255, 255)
	c5 = Color.new( 0, 0, 255); c6 = Color.new(255, 0, 255)
	return [c1, c2, c3, c4, c5, c6]
end

@@wheel = Bitmap.new(360, 1)
@@wheel.draw_rainbow(0, 0, 360, 1)

def self.hue_colour_wheel(hue) ## Show the new hue colour.
	if @@wheel.disposed?
		@@wheel = Bitmap.new(360, 1)
		@@wheel.draw_rainbow(0, 0, 360, 1)
	end
	return @@wheel.get_pixel(hue % 360, 0)
end
nd
# The core bits of the script scene are below.
lass Window_CCFace < Window_Base
def initialize(actor, input)
	super(0, 0, 120, 120)
	self.visible = CP::COMPOSITE::USE_FACESETS
	@input_window = input
	self.y = @input_window.y
	self.x = @input_window.x - (self.width + 8)
	@actor = $data_actors[actor]
	refresh
end

def refresh
	contents.clear
	draw_face(@actor.face_name, @actor.face_index, 0, 0)
end
nd
lass Window_CCCharacter < Window_Base
def initialize(actor, input)
	super(0, 0, CP::COMPOSITE::WINDOW_WIDTH, CP::COMPOSITE::WINDOW_HEIGHT)
	@input_window = input
	self.y = @input_window.y
	self.x = @input_window.x + @input_window.width + 8
	@actor = $data_actors[actor]
	@ticker = 10
	@last_frame = 1
	@frame = 1
	refresh
end

def update
	@ticker += 1
	@frame = (@ticker % 40) / 10; @frame = 1 if @frame == 3
	return if @frame == @last_frame
	@last_frame = @frame
	refresh
end

def refresh
	contents.clear
	x = contents.width / 2
	y = contents.height - 6
	draw_character(@actor.character_name, @actor.character_index, x, y, @frame)
end

def draw_character(character_name, character_index, x, y, frame = 1)
	return unless character_name
	bitmap = Cache.character(character_name)
	sign = character_name[/^[\!\$]./]
	if sign && sign.include?('$')
		cw = bitmap.width / 3
		ch = bitmap.height / 4
	else
		cw = bitmap.width / 12
		ch = bitmap.height / 8
	end
	n = character_index
	src_rect = Rect.new((n%4*3+frame)*cw, (n/4*4)*ch, cw, ch)
	ret_rect = Rect.new(x - cw, y - cw * 2, cw * 2, ch * 2)
	contents.stretch_blt(ret_rect, bitmap, src_rect)
end
nd
lass Window_CCGui < Window_Selectable
def initialize(file, list)
	@list = list
	extra_width = CP::COMPOSITE::WINDOW_WIDTH + 8
	extra_width += 128 if CP::COMPOSITE::USE_FACESETS
	x = (Graphics.width - (180 + extra_width)) / 2
	x += 128 if CP::COMPOSITE::USE_FACESETS
	y = (Graphics.height - window_height) / 2
	h = window_height
	super(x, y, 180, h)
	@file = file
	refresh
end

def window_height
	[fitting_height(item_max * 2), Graphics.height].min
end

def item_max
	@list.size + 1
end

def contents_height
	(item_max * 2) * line_height
end

def item_height
	line_height * 2
end

def refresh
	contents.clear
	draw_all_items
end

def data
	@list[@index]
end

def adj_data
	if Composites.options[data][0].is_a?(Symbol)
		return Composites.options[data][0]
	else
		return data
	end
end

def draw_item(index)
	rect = item_rect(index)
	lh = line_height
	if index == @list.size
		text = CP::COMPOSITE::GUI_CLOSE
		change_color(normal_color)
		draw_text(rect.x + 2, rect.y + lh / 2, rect.width - 4, lh, text, 1)
	else
		block = Composites.options[@list[index]]
		if block[0].is_a?(Symbol)
			title = Composites.options[block[0]][0]
		else
			title = block[0]
		end
		value = (CP::COMPOSITE::COMPOSITE.include?(@list[index]) ||
		@list[index] == :Gender || @list[index] == :Name)
		sym = value ? @list[index] : block[0]
		change_color(system_color)
		draw_text(rect.x + 2, rect.y, rect.width - 4, lh, title)
		case sym
		when :Gender
			na = CP::COMPOSITE::GENDER_NAMES
			name = Composites.actor(@file).male? ? na[0] : na[1]
		when :Name
			name = Composites.actor(@file).name
		else
			name = Composites.actor(@file).get_composite_handler(sym)
			name = CP::COMPOSITE::EMPTY_TEXT if name.nil?
			hue = Composites.actor(@file).get_composite_hue(sym)
			if block[1]
				c1 = Bitmap.hue_colour_wheel(hue)
				c2 = Color.new(c1.red, c1.green, c1.blue, 0)
				r2 = contents.text_size(name).width
				hr = Rect.new(contents.width - (r2 + 6), rect.y + lh + 3, r2 + 1, lh - 6)
				contents.gradient_fill_rect(hr, c2, c1)
			end
		end
		change_color(normal_color)
		draw_text(rect.x + 2, rect.y + lh, rect.width - 6, lh, name, 2)
	end
end
nd
lass Window_CCSelect < Window_Selectable
attr_reader :hue

def initialize(file, input)
	super(0, 0, 160, 0)
	@input_window = input
	@file = file
	@data = nil
	@hue = 0
end

def item_max
	return 1 if @data.nil? || @data.empty?
	return @data.size
end

def refresh
	contents.clear
	draw_all_items
	draw_hue_wheel
end

def draw_item(index)
	rect = item_rect(index); rect.x += 2; rect.width -= 4
	change_color(normal_color)
	draw_text(rect, @data[index])
end

def draw_hue_wheel
	rect = item_rect(item_max); contents.clear_rect(rect)
	rect.y += 4; rect.height -= 8; rect.x += 8; rect.width -= 16
	ind = Composites.options[@input_window.data]
	return if !ind || ind[1] == 0
	if ind[1] == 2
		value = @hue >= 180 ? @hue - 360 : @hue
		rect.height /= 2; rect.height -= 1; rect.x -= 60
		contents.draw_rainbow(rect)
		rect.y += (rect.height + 1); rect.x -= value / 3
		contents.draw_rainbow(rect)
		rect.x += 119
		contents.draw_rainbow(rect)
		rect.y -= (rect.height + 1); rect.x += value / 3
		contents.draw_rainbow(rect)
		bitmap2 = Bitmap.new(10, 19)
		bitmap2.fill_rect(0, 0, 10, 19, Color.new(255, 255, 255))
		c1 = Bitmap.hue_colour_wheel(0)
		c2 = Bitmap.hue_colour_wheel(@hue)
		bitmap2.gradient_fill_rect(1, 1, 8, 17, c1, c2, true)
		rect = item_rect(item_max)
		contents.blt((rect.width - 10) / 2, rect.y + 2, bitmap2, bitmap2.rect)
		rect.width = 10
		contents.clear_rect(rect)
		rect.x = contents.width - rect.width
		contents.clear_rect(rect)
	elsif ind[1] == 1
		contents.draw_rainbow(rect)
		bitmap2 = Bitmap.new(7, 20)
		bitmap2.fill_rect(0, 0, 7, 20, Color.new(255, 255, 255))
		bitmap2.fill_rect(1, 2, 5, 16, Bitmap.hue_colour_wheel(@hue))
		off = @hue / 3
		contents.blt(rect.x - 3 + off, rect.y - 2, bitmap2, bitmap2.rect)
	end
end

def show
	val = @input_window.adj_data
	ind = @input_window.data
	actor = Composites.actor(@file)
	block = Composites.actor(@file).male? ? 0 : 1
	@name = Composites.list_by_block(ind, block).index(actor.get_composite_handler(val))
	@index = val != :Gender ? @name : Composites.actor(@file).male? ? 0 : 1
	@index = 0 if @index.nil?
	@hue = actor.get_composite_hue(val) unless val == :Gender
	cont = Composites.options[ind]
	if val == :Gender
		@data = CP::COMPOSITE::GENDER_NAMES
	else
		@data = Composites.list_by_block(ind, block)
	end
	add = Composites.options[ind][1] ? 1 : 0
	add = 0 if val == :Gender
	self.height = fitting_height(@data.size + add)
	create_contents
	refresh
	self.x = @input_window.x + 16
	iw = @input_window
	self.y = iw.y + iw.standard_padding + (iw.index * (iw.line_height * 2)) - iw.oy + 28
	self.y = Graphics.height - self.height if y + height > Graphics.height
	super
	activate
end

def cursor_right(wrap)
	return if Composites.options.include?(@input_window.data) &&
	!Composites.options[@input_window.data][1]
	@hue /= 12; @hue *= 12
	@hue += 12; @hue -= 360 if @hue >= 360
	draw_hue_wheel
end

def cursor_left(wrap)
	return if Composites.options.include?(@input_window.data) &&
	!Composites.options[@input_window.data][1]
	@hue /= 12; @hue *= 12
	@hue -= 12; @hue += 360 if @hue < 0
	draw_hue_wheel
end
nd
lass Game_Interpreter
def creation(char, list = nil) ## Allows for easy calling of the scene.
	return if $game_party.in_battle
	if char.is_a?(Integer)
		return unless CP::COMPOSITE::NAMES.has_value?(char)
		char = CP::COMPOSITE::NAMES.index(char)
	else
		return unless Composites.include?(char)
	end
	list = CP::COMPOSITE::BASE_GUI if list.nil?
	return unless list.is_a?(Array)
	SceneManager.call(Scene_CharacterCreation)
	SceneManager.scene.prepare(char, list)
	Fiber.yield
end

def composite_force(char, handler, name, hue = 0)
	if char.is_a?(Integer)
		return unless CP::COMPOSITE::NAMES.has_value?(char)
	else
		return unless Composites.include?(char)
		char = CP::COMPOSITE::NAMES[char]
	end
	$game_actors[char].force_composite(handler, name, hue)
end

def composite_custom(char, handler, name, hue = 0)
	if char.is_a?(Integer)
		return unless CP::COMPOSITE::NAMES.has_value?(char)
	else
		return unless Composites.include?(char)
		char = CP::COMPOSITE::NAMES[char]
	end
	$game_actors[char].change_composite(handler, name, hue)
end

def composite_reset(char)
	if char.is_a?(Integer)
		return unless CP::COMPOSITE::NAMES.has_value?(char)
	else
		return unless Composites.include?(char)
		char = CP::COMPOSITE::NAMES[char]
	end
	$game_actors[char].reset_composite
end
nd
lass Scene_CharacterCreation < Scene_MenuBase
def prepare(file, list)
	@file = file
	@list = list
end

def start
	super
	@actor = Composites.actor(@file)
	create_windows
end

def create_windows
	@input_window = Window_CCGui.new(@file, @list)
	@input_window.set_handler(:ok, method(:gui_ok))
	@input_window.set_handler(:cancel, method(:gui_cancel))
	@select_window = Window_CCSelect.new(@file, @input_window)
	@select_window.set_handler(:ok, method(:select_ok))
	@select_window.set_handler(:cancel, method(:select_cancel))
	@chara_window = Window_CCCharacter.new(@actor.id, @input_window)
	@face_window = Window_CCFace.new(@actor.id, @input_window)
	@input_window.activate.select(0)
	@select_window.hide
end

def gui_ok
	val = @input_window.data
	if val == :Name
		SceneManager.call(Scene_Name)
		SceneManager.scene.prepare(Composites.actor(@file).id, CP::COMPOSITE::CHARACTERS)
		@input_window.refresh
	elsif val == nil
		return_scene
	else
		@select_window.show
	end
end

def gui_cancel
	@input_window.activate.select(@input_window.item_max - 1)
end

def select_ok
	val = @input_window.data
	adj = @input_window.adj_data
	id = @select_window.index
	if adj == :Gender
		if id == 0
			Composites.actor(@file).change_composite(:Gender, true)
			Composites.actor(@file).reset_name
		elsif id == 1
			Composites.actor(@file).change_composite(:Gender, false)
			Composites.actor(@file).reset_name
		end
	else
		block = Composites.actor(@file).male? ? 0 : 1
		handler = Composites.list_by_block(val, block)[@select_window.index]
		hue = @select_window.hue
		Composites.actor(@file).change_composite(adj, handler, hue)
	end
	@select_window.hide
	@chara_window.refresh
	@face_window.refresh
	@input_window.activate.refresh
end

def select_cancel
	@select_window.hide
	@input_window.activate
end
nd
lass RPG::BaseItem
def composite_hash
	add_composite_data if @composite_hash.nil?
	return @composite_hash
end

def composite_init
	add_composite_data if @composite_init.nil?
	return @composite_init
end

def gender_base
	add_composite_data if @gender_base.nil?
	return @gender_base
end

def alt_name
	add_composite_data if @alt_name.nil?
	return @alt_name
end

INITI_RE = /(.+) init\[(.+)[,]\s*(\d+)\]/i
IMAGE_RE = /(.+) image\[(.+)[,]\s*(\d+)\]/i
GENDER_RE = /gender\[(male|female)\]/i
ALT_NAME = /alt name\[(.+)\]/i

def add_composite_data
	@gender_base = CP::COMPOSITE::MALE_DEFAULT
	@composite_hash = {}; @composite_init = {}; @alt_name = ""
	self.note.split(/[\r\n]+/).each do |line|
		case line
		when INITI_RE
			@composite_init[$1.to_sym] = [$2.to_s, $3.to_i]
			@composite_init["#{$1.to_s}Rear".to_sym] = [$2.to_s, $3.to_i]
			@composite_init["#{$1.to_s}Hueless".to_sym] = [$2.to_s, 0]
			@composite_init["#{$1.to_s}All".to_sym] = [$2.to_s, $3.to_i]
		when IMAGE_RE
			@composite_hash[$1.to_sym] = [$2.to_s, $3.to_i]
			@composite_hash["#{$1.to_s}Rear".to_sym] = [$2.to_s, $3.to_i]
			@composite_hash["#{$1.to_s}Hueless".to_sym] = [$2.to_s, 0]
			@composite_hash["#{$1.to_s}All".to_sym] = [$2.to_s, $3.to_i]
		when GENDER_RE
			@gender_base = true if $1.to_s.downcase == "male"
			@gender_base = false if $1.to_s.downcase == "female"
		when ALT_NAME
			@alt_name = $1.to_s
		end
	end
end
nd
##--------------------------------------------------------------------------###
 End of script. #
##--------------------------------------------------------------------------###

 

Screenshot:

http://i.imgur.com/8nsTH.png

 

 

Bugs e conflitti noti:

Questo script non funziona con gli script che modificano l'aspetto di una sprite o l'aspetto di un volto in gioco. Non ci dovrebbe essere alcun motivo per cui non dovrebbe funzionare con script che basta scegliere diverse "emozioni" da un foglio sprite (a patto di creare un composito per un foglio sprite).
Inoltre questo script modifica il metodo "characters_for_savefile" per visualizzare correttamente compositi in savefile e come tale non funzionerà con altri script che modificano questo metodo.
Altri dettagli:
Se volete ulteriori permessi chiedeteli qui: http://cphouseset.wordpress.com/license-and-terms-of-use/
Link to comment
Share on other sites

Ottimo script, spesso ricercato per progetti che vogliono un paper doll system come sandbox o simili! ^ ^

Hai già testato se lagga? Script vecchi avevano un po' questo problema ^ ^

(\_/)
(^ ^) <----coniglietto rosso, me!
(> <)


Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^

http://i.imgur.com/KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^

http://i.imgur.com/FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^

REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

 

SUWOnzB.jpg 🖤
http://www.rpg2s.net/dax_games/r2s_regali2s.png E:3 http://www.rpg2s.net/dax_games/xmas/gifnatale123.gif
http://i.imgur.com/FfvHCGG.png by Testament (notare dettaglio in basso a destra)! E:3
http://i.imgur.com/MpaUphY.jpg by Idriu E:3

Membro Onorario, Ambasciatore dei Coniglietti (Membro n.44)

http://i.imgur.com/PgUqHPm.png
Ufficiale
"Ad opera della sua onestà e del suo completo appoggio alla causa dei Panda, Guardian Of Irael viene ufficialmente considerato un Membro portante del Partito, e Ambasciatore del suo Popolo presso di noi"


http://i.imgur.com/TbRr4iS.png<- Grazie Testament E:3
Ricorda...se rivolgi il tuo sguardo ^ ^ a Guardian anche Guardian volge il suo sguardo ^ ^ a te ^ ^
http://i.imgur.com/u8UJ4Vm.gifby Flame ^ ^
http://i.imgur.com/VbggEKS.gifhttp://i.imgur.com/2tJmjFJ.gifhttp://projectste.altervista.org/Our_Hero_adotta/ado2.png
Grazie Testament XD Fan n°1 ufficiale di PQ! :D

Viva
il Rhaxen! <- Folletto te lo avevo detto (fa pure rima) che non
avevo programmi di grafica per fare un banner su questo pc XD (ora ho di
nuovo il mio PC veramente :D)

Rosso Guardiano della
http://i.imgur.com/Os5rvhx.png

Rpg2s RPG BY FORUM:

Nome: Darth Reveal

 

PV totali 2
PA totali 16

Descrizione: ragazzo dai lunghi capelli rossi ed occhi dello stesso colore. Indossa una elegante giacca rossa sopra ad una maglietta nera. Porta pantaloni rossi larghi, una cintura nera e degli stivali dello stesso colore. E' solito trasportare lo spadone dietro la schiena in un fodero apposito. Ha un pendente al collo e tiene ben legato un pezzo di stoffa (che gli sta particolarmente a cuore) intorno al braccio sinistro sotto la giacca, copre una cicatrice.
Bozze vesti non definitive qui.

Equipaggiamento:
Indossa:
60$ e 59$ divisi in due tasche interne
Levaitan

Spada a due mani elsa lunga

Guanti del Defender (2PA)
Anello del linguaggio animale (diventato del Richiamo)

Scrinieri da lanciere (2 PA)

Elmo del Leone (5 PA)

Corazza del Leone in Ferro Corrazzato (7 PA)

ZAINO (20) contenente:
Portamonete in pelle di cinghiale contenente: 100$
Scatola Sanitaria Sigillata (può contenere e tenere al sicuro fino a 4 oggetti curativi) (contiene Benda di pronto soccorso x3, Pozione di cura)
Corda
Bottiglia di idromele
Forma di formaggio
Torcia (serve ad illuminare, dura tre settori)

Fiasca di ceramica con Giglio Amaro (Dona +1PN e Velocità all'utilizzatore)
Ampolla Bianca

Semi di Balissa

 

CAVALLO NORMALE + SELLA (30 +2 armi) contentente:
66$
Benda di pronto soccorso x3
Spada a due mani

Fagotto per Adara (fazzoletto ricamato)


 

Link to comment
Share on other sites

Invece non lo sono o cosa? XD Linkaci quel topic XD

^ ^

(\_/)
(^ ^) <----coniglietto rosso, me!
(> <)


Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^

http://i.imgur.com/KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^

http://i.imgur.com/FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^

REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

 

SUWOnzB.jpg 🖤
http://www.rpg2s.net/dax_games/r2s_regali2s.png E:3 http://www.rpg2s.net/dax_games/xmas/gifnatale123.gif
http://i.imgur.com/FfvHCGG.png by Testament (notare dettaglio in basso a destra)! E:3
http://i.imgur.com/MpaUphY.jpg by Idriu E:3

Membro Onorario, Ambasciatore dei Coniglietti (Membro n.44)

http://i.imgur.com/PgUqHPm.png
Ufficiale
"Ad opera della sua onestà e del suo completo appoggio alla causa dei Panda, Guardian Of Irael viene ufficialmente considerato un Membro portante del Partito, e Ambasciatore del suo Popolo presso di noi"


http://i.imgur.com/TbRr4iS.png<- Grazie Testament E:3
Ricorda...se rivolgi il tuo sguardo ^ ^ a Guardian anche Guardian volge il suo sguardo ^ ^ a te ^ ^
http://i.imgur.com/u8UJ4Vm.gifby Flame ^ ^
http://i.imgur.com/VbggEKS.gifhttp://i.imgur.com/2tJmjFJ.gifhttp://projectste.altervista.org/Our_Hero_adotta/ado2.png
Grazie Testament XD Fan n°1 ufficiale di PQ! :D

Viva
il Rhaxen! <- Folletto te lo avevo detto (fa pure rima) che non
avevo programmi di grafica per fare un banner su questo pc XD (ora ho di
nuovo il mio PC veramente :D)

Rosso Guardiano della
http://i.imgur.com/Os5rvhx.png

Rpg2s RPG BY FORUM:

Nome: Darth Reveal

 

PV totali 2
PA totali 16

Descrizione: ragazzo dai lunghi capelli rossi ed occhi dello stesso colore. Indossa una elegante giacca rossa sopra ad una maglietta nera. Porta pantaloni rossi larghi, una cintura nera e degli stivali dello stesso colore. E' solito trasportare lo spadone dietro la schiena in un fodero apposito. Ha un pendente al collo e tiene ben legato un pezzo di stoffa (che gli sta particolarmente a cuore) intorno al braccio sinistro sotto la giacca, copre una cicatrice.
Bozze vesti non definitive qui.

Equipaggiamento:
Indossa:
60$ e 59$ divisi in due tasche interne
Levaitan

Spada a due mani elsa lunga

Guanti del Defender (2PA)
Anello del linguaggio animale (diventato del Richiamo)

Scrinieri da lanciere (2 PA)

Elmo del Leone (5 PA)

Corazza del Leone in Ferro Corrazzato (7 PA)

ZAINO (20) contenente:
Portamonete in pelle di cinghiale contenente: 100$
Scatola Sanitaria Sigillata (può contenere e tenere al sicuro fino a 4 oggetti curativi) (contiene Benda di pronto soccorso x3, Pozione di cura)
Corda
Bottiglia di idromele
Forma di formaggio
Torcia (serve ad illuminare, dura tre settori)

Fiasca di ceramica con Giglio Amaro (Dona +1PN e Velocità all'utilizzatore)
Ampolla Bianca

Semi di Balissa

 

CAVALLO NORMALE + SELLA (30 +2 armi) contentente:
66$
Benda di pronto soccorso x3
Spada a due mani

Fagotto per Adara (fazzoletto ricamato)


 

Link to comment
Share on other sites

  • 3 weeks later...
  • 4 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...