Rap1em Posted January 29, 2014 Share Posted January 29, 2014 In Game Character CreationDescrizione: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:Questo lavoro è sotto una licenza http://creativecommons.org/licenses/by-nc/3.0/deed.en_USSe volete ulteriori permessi chiedeteli qui: http://cphouseset.wordpress.com/license-and-terms-of-use/ Link to comment Share on other sites More sharing options...
Guardian of Irael Posted January 30, 2014 Share Posted January 30, 2014 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) ^ ^ 🖤http://www.rpg2s.net/dax_games/r2s_regali2s.png E:3 http://www.rpg2s.net/dax_games/xmas/gifnatale123.gifhttp://i.imgur.com/FfvHCGG.png by Testament (notare dettaglio in basso a destra)! E:3http://i.imgur.com/MpaUphY.jpg by Idriu E:3Membro Onorario, Ambasciatore dei Coniglietti (Membro n.44) http://i.imgur.com/PgUqHPm.pngUfficiale"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:3Ricorda...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.pngGrazie Testament XD Fan n°1 ufficiale di PQ! :DVivail Rhaxen! <- Folletto te lo avevo detto (fa pure rima) che nonavevo programmi di grafica per fare un banner su questo pc XD (ora ho dinuovo il mio PC veramente :D) Rosso Guardiano dellahttp://i.imgur.com/Os5rvhx.pngRpg2s RPG BY FORUM:Nome: Darth Reveal PV totali 2PA totali 16Descrizione: 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 interneLevaitanSpada a due mani elsa lungaGuanti 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)CordaBottiglia di idromeleForma di formaggioTorcia (serve ad illuminare, dura tre settori)Fiasca di ceramica con Giglio Amaro (Dona +1PN e Velocità all'utilizzatore)Ampolla BiancaSemi di Balissa CAVALLO NORMALE + SELLA (30 +2 armi) contentente:66$Benda di pronto soccorso x3Spada a due maniFagotto per Adara (fazzoletto ricamato) Link to comment Share on other sites More sharing options...
siengried Posted January 30, 2014 Share Posted January 30, 2014 Ma ho visto questo script in un altro topic se non erro O.o pensavo fossero diversi T.T Link to comment Share on other sites More sharing options...
Guardian of Irael Posted January 30, 2014 Share Posted January 30, 2014 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) ^ ^ 🖤http://www.rpg2s.net/dax_games/r2s_regali2s.png E:3 http://www.rpg2s.net/dax_games/xmas/gifnatale123.gifhttp://i.imgur.com/FfvHCGG.png by Testament (notare dettaglio in basso a destra)! E:3http://i.imgur.com/MpaUphY.jpg by Idriu E:3Membro Onorario, Ambasciatore dei Coniglietti (Membro n.44) http://i.imgur.com/PgUqHPm.pngUfficiale"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:3Ricorda...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.pngGrazie Testament XD Fan n°1 ufficiale di PQ! :DVivail Rhaxen! <- Folletto te lo avevo detto (fa pure rima) che nonavevo programmi di grafica per fare un banner su questo pc XD (ora ho dinuovo il mio PC veramente :D) Rosso Guardiano dellahttp://i.imgur.com/Os5rvhx.pngRpg2s RPG BY FORUM:Nome: Darth Reveal PV totali 2PA totali 16Descrizione: 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 interneLevaitanSpada a due mani elsa lungaGuanti 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)CordaBottiglia di idromeleForma di formaggioTorcia (serve ad illuminare, dura tre settori)Fiasca di ceramica con Giglio Amaro (Dona +1PN e Velocità all'utilizzatore)Ampolla BiancaSemi di Balissa CAVALLO NORMALE + SELLA (30 +2 armi) contentente:66$Benda di pronto soccorso x3Spada a due maniFagotto per Adara (fazzoletto ricamato) Link to comment Share on other sites More sharing options...
Rap1em Posted January 30, 2014 Author Share Posted January 30, 2014 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 ^ ^Si ho già testato, ed è perfetto Link to comment Share on other sites More sharing options...
Campo92 Posted February 17, 2014 Share Posted February 17, 2014 Chiedo molto se ti chiedo una demo che sfrutti lo script? Dopo aver caricato le cartelle e settato la chiamata allo script, non mi segnala alcun errore ma l'editorn non si avvia. Link to comment Share on other sites More sharing options...
Dragonjunior98 Posted March 17, 2014 Share Posted March 17, 2014 Script Geniale! Neon black ha fatto davvero un ottimo Script :3 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now