Advertisement
Guest User

Slightly Edited Character Creator [Moonpearl/Redd]

a guest
Apr 7th, 2014
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 37.76 KB | None | 0 0
  1.  
  2.  
  3. #==============================================================================
  4. # FULL SCRIPT
  5. #
  6. # If you don't want to bother copying script entries one by one, this is the
  7. # full script in a single entry. Don't forget to remove the 'begin' and 'end'
  8. # tags to uncomment the whole script. Otherwise, just erase this entry.
  9. #==============================================================================
  10.  
  11. FEATURES = [:race, :hair, :eyes, :mustache, :beard, :head, :clothing, :neck,
  12.   :armorf, :armorb, :chest, :arms, :waist, :legs, :feet, :capef,
  13.   :capeb]
  14. OPTIONS = [:picture, :hue, :brightness, :x_offset, :y_offset]
  15. DEFAULT_LIBRARY = "Male"
  16. DEFAULT_PICTURES = {
  17.   "Male" => ["Human.png", nil, nil, nil,
  18.     nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil],
  19. }
  20. NAME_NO_PICTURE = "None"
  21. DIR_DATA = "Data/Charsets"
  22. FILENAME_SAVE = "Selection"
  23. FILENAME_RENDER = "Render"
  24. COLOR1 = Color.new(255, 0, 255, 128)
  25. COLOR2 = Color.new(192, 0, 192, 128)
  26. HELP_MESSAGE = {
  27.     "Edit" => "Edit the current selection",
  28.     "Load..." => "Load previously saved data to the maker",
  29.     "Save" => "Save current selection for future use",
  30.     "Library..." => "Select a different graphic library to build charset with",
  31.     "Default" => "Revert to default selection",
  32.     "Randomize" => "Randomize each feature for which a selection has been made",
  33.     "Use as hero" => "Replace the player's graphic with the current render",
  34.     "To image file" => "Save current render as a .PNG file",
  35.     "Credits" => "Find out who's behind this great program"
  36.   }
  37.  
  38. module RPG
  39.   module Cache
  40.     class << self
  41.       def replace(key, bitmap)
  42.         unless @cache[key].nil?
  43.           @cache[key].dispose
  44.         end
  45.         @cache[key] = bitmap
  46.       end
  47.      
  48.       def part(type, filename, hue = 0, brightness = 0)
  49.         self.load_bitmap("Graphics/Characters/#{Charset.library}/#{type.display}/", filename, hue, brightness)
  50.       end
  51.      
  52.       alias mp_charset_load_bitmap load_bitmap
  53.       def load_bitmap(folder_name, filename, hue = 0, brightness = 0)
  54.         if brightness == 0
  55.           return mp_charset_load_bitmap(folder_name, filename, hue)
  56.         else
  57.           path = folder_name + filename
  58.           key = [path, 0, brightness]
  59.           if not @cache.include?(key) or @cache[key].disposed?
  60.             @cache[key] = self.load_bitmap(folder_name, filename).clone
  61.             if brightness > 0
  62.               @cache[key].lighten(brightness.to_f / 10)
  63.             else
  64.               @cache[key].darken(brightness.abs.to_f / 10)
  65.             end
  66.           end
  67.          
  68.           if hue == 0
  69.             return @cache[key]
  70.           else
  71.             key = [path, hue, brightness]
  72.             if not @cache.include?(key) or @cache[key].disposed?
  73.               @cache[key] = @cache[ [path, 0, brightness] ].clone
  74.               @cache[key].hue_change(hue)
  75.             end
  76.             return @cache[key]
  77.           end
  78.         end
  79.       end
  80.     end
  81.   end
  82.  
  83.   def self.warn(message)
  84.     $game_system.se_play($data_system.decision_se)
  85.     Graphics.freeze
  86.     window = Window_Base.new(32, 192, 576, 96)
  87.     window.contents = Bitmap.new(window.width - 32, window.height - 32)
  88.     window.contents.draw_text(0, 0, window.width - 32, 32, message, 1)
  89.     window.contents.draw_text(0, 32, 544, 32, "OK", 1)
  90.     window.cursor_rect.set(208, 32, 128, 32)
  91.     window.active = true
  92.     window.z = 5000
  93.     Graphics.transition
  94.     loop do
  95.       Input.update
  96.       Graphics.update
  97.       window.update
  98.       if Input.trigger?(Input::C) or Input.trigger?(Input::B)
  99.         $game_system.se_play($data_system.cancel_se)
  100.         break
  101.       end
  102.     end
  103.     Graphics.freeze
  104.     window.dispose
  105.     Graphics.transition
  106.     return
  107.   end
  108.  
  109.   def self.confirm(message)
  110.     $game_system.se_play($data_system.buzzer_se)
  111.     Graphics.freeze
  112.     window = Window_Base.new(32, 192, 576, 96)
  113.     window.contents = Bitmap.new(window.width - 32, window.height - 32)
  114.     window.contents.draw_text(0, 0, window.width - 32, 32, message, 1)
  115.     window.contents.draw_text(0, 32, 272, 32, "OK", 1)
  116.     window.contents.draw_text(272, 32, 272, 32, "Cancel", 1)
  117.     window.cursor_rect.set(72, 32, 128, 32)
  118.     window.active = true
  119.     window.z = 5000
  120.     Graphics.transition
  121.     index = 0
  122.     result = nil
  123.     while result.nil?
  124.       Input.update
  125.       Graphics.update
  126.       window.update
  127.       if Input.repeat?(Input::LEFT) or Input.repeat?(Input::RIGHT)
  128.         $game_system.se_play($data_system.cursor_se)
  129.         index += 1
  130.         index %= 2
  131.         window.cursor_rect.set(72 + 272 * index, 32, 128, 32)
  132.       end
  133.       if Input.trigger?(Input::C)
  134.         $game_system.se_play($data_system.decision_se)
  135.         result = index == 0
  136.       end
  137.       if Input.trigger?(Input::B)
  138.         $game_system.se_play($data_system.cancel_se)
  139.         result = false
  140.       end
  141.     end
  142.     Graphics.freeze
  143.     window.dispose
  144.     Graphics.transition
  145.     return result
  146.   end
  147. end
  148.  
  149. class Bitmap  
  150.   def darken(factor)
  151.     factor = 1 - factor
  152.     for y in 0...self.height
  153.       for x in 0...self.width
  154.         color = self.get_pixel(x, y)
  155.         next if color.alpha == 0
  156.         self.set_pixel(x, y, Color.new(color.red * factor, color.green * factor,
  157.           color.blue * factor, color.alpha) )
  158.       end
  159.     end
  160.     GC.start
  161.   end
  162.  
  163.   def lighten(factor)
  164.     p = 255 * factor
  165.     factor = 1 - factor
  166.     for y in 0...self.height
  167.       for x in 0...self.width
  168.         color = self.get_pixel(x, y)
  169.         next if color.alpha == 0
  170.         self.set_pixel(x, y, Color.new(color.red * factor + p, color.green * factor + p,
  171.           color.blue * factor + p, color.alpha) )
  172.       end
  173.     end
  174.     GC.start
  175.   end
  176. end
  177.  
  178. class Bitmask
  179.   def initialize(size = 1)
  180.     @data = [0]
  181.     resize(size)
  182.   end
  183.  
  184.   def [](i)
  185.     if i >= @size
  186.       raise RangeError, "Bit ##{i} not defined (max = #{@size - 1}) in Bitmask#[]"
  187.     end
  188.     return @data[i >> 5][i & 31] == 1
  189.   end
  190.  
  191.   def []=(i, b)
  192.     case b
  193.     when TrueClass, FalseClass
  194.       if self[i] == b
  195.         return nil
  196.       else
  197.         @data[i >> 5] ^= 2 ** i
  198.         return b
  199.       end
  200.     else
  201.       raise TypeError, "TrueClass or FalseClass expected as parameters in Bitmask#[]="
  202.     end
  203.   end
  204.  
  205.   def resize(size)
  206.     while (size >> 5) >= @data.size
  207.       @data << 0
  208.     end
  209.     @size = size
  210.   end
  211.  
  212.   def to_s
  213.     str = String.new
  214.     for i in 0...@size
  215.       if i & 7 == 0
  216.         str << " "
  217.       end
  218.       str << @data[i >> 5][i & 31].to_s
  219.     end
  220.     return str
  221.   end
  222. end
  223.  
  224. class Dir
  225.   def self.files(directory = self.pwd, *filters)
  226.     ary = []
  227.     for filename in self.entries(directory)
  228.       next if File.directory?(filename) or filename == "." or filename == ".."
  229.       if filters.empty? or filters.include?(File.extname(filename))
  230.         ary << filename
  231.       end
  232.     end
  233.     return ary
  234.   end
  235.  
  236.   def self.subdirectories(directory = self.pwd)
  237.     ary = []
  238.     for filename in self.entries(directory)
  239.       if File.directory?(filename)
  240.         ary << filename
  241.       end
  242.     end
  243.     return ary
  244.   end
  245. end
  246.  
  247. class File
  248.   def self.directory?(filename)
  249.     return false if filename == "."
  250.     return true if self.extname(filename) == ""
  251.     return false
  252.   end
  253. end
  254.  
  255. module Charset
  256.   VIEWPORT = Viewport.new(0, 0, 640, 480)
  257.   VIEWPORT.z = 1000
  258.  
  259.   class << self
  260.     attr_reader :data
  261.     attr_accessor :library
  262.  
  263.     def init(library = DEFAULT_LIBRARY)
  264.       @library = library
  265.       @data = []
  266.       for i in 0...FEATURES.size
  267.         feature = Feature.new(FEATURES[i])
  268.         feature.picture = DEFAULT_PICTURES[@library][i] unless DEFAULT_PICTURES[@library].nil?
  269.         @data << feature
  270.       end
  271.     end
  272.  
  273.     def render
  274.       bitmap = Bitmap.new(128, 192)
  275.       for feature in @data
  276.         next if feature.picture == NAME_NO_PICTURE
  277.         src_bitmap = RPG::Cache.part(feature.type, feature.picture, feature.hue,
  278.           feature.brightness)
  279.         start_x = feature.x_offset >= 0 ? 0 : feature.x_offset.abs
  280.         start_y = feature.y_offset >= 0 ? 0 : feature.y_offset.abs
  281.         rect = Rect.new(start_x, start_y, 128 - feature.x_offset.abs,
  282.           192 - feature.y_offset.abs)
  283.         start_x = feature.x_offset >= 0 ? feature.x_offset : 0
  284.         start_y = feature.y_offset >= 0 ? feature.y_offset : 0
  285.         bitmap.blt(start_x, start_y, src_bitmap, rect)
  286.       end
  287.       return bitmap
  288.     end
  289.    
  290.     def cache(name)
  291.       RPG::Cache.replace("Graphics/Characters/#{name}", self.render)      
  292.     end
  293.   end
  294.  
  295.   class Feature
  296.     attr_reader :type
  297.     attr_accessor :hue
  298.     attr_accessor :brightness
  299.     attr_accessor :x_offset
  300.     attr_accessor :y_offset
  301.    
  302.     def initialize(type)
  303.       @type = type
  304.       @picture = nil
  305.       @hue = 0
  306.       @brightness = 0
  307.       @x_offset = 0
  308.       @y_offset = 0
  309.     end
  310.    
  311.     def picture
  312.       if @picture == nil
  313.         return NAME_NO_PICTURE
  314.       else
  315.         return @picture
  316.       end
  317.     end
  318.  
  319.     def picture=(name)
  320.       if name == NAME_NO_PICTURE
  321.         @picture = nil
  322.       else
  323.         @picture = name
  324.       end
  325.     end
  326.   end
  327. end
  328.  
  329. class Game_Temp
  330.   alias mp_charset_initialize initialize
  331.   def initialize
  332.     mp_charset_initialize
  333.     Charset.init
  334.   end
  335. end
  336.  
  337. class Sprite_Part < RPG::Sprite
  338.   def initialize(id, x, y)
  339.     super(Charset::VIEWPORT)
  340.     @id = id
  341.     @_x = x
  342.     @_y = y
  343.     self.z = id
  344.   end
  345.  
  346.   def feature
  347.     return Charset.data[@id]
  348.   end
  349.  
  350.   def refresh
  351.     if self.feature.picture == NAME_NO_PICTURE
  352.       self.bitmap = nil
  353.       return
  354.     end
  355.     self.x = @_x + self.feature.x_offset
  356.     self.y = @_y + self.feature.y_offset
  357.     self.bitmap = RPG::Cache.part(self.feature.type, self.feature.picture,
  358.       self.feature.hue, self.feature.brightness)
  359.     @_whiten_duration = 1
  360.   end
  361. end
  362.  
  363. class Window_Menu < Window_Selectable
  364.   attr_reader :options
  365.   attr_reader :disabled
  366.  
  367.   def initialize(x, y, width, max_height, options)
  368.     @options = options
  369.     super(x, y, width, [max_height, (@options.size + 1) * 32].min)
  370.     self.contents = Bitmap.new(width - 32, @options.size * 32)
  371.     @item_max = @options.size
  372.     @disabled = Bitmask.new(@item_max)
  373.     self.index = 0
  374.     refresh
  375.   end
  376.  
  377.   def refresh
  378.     self.contents.clear
  379.     for i in 0...@options.size
  380.       self.contents.font.color = @disabled[i] ? disabled_color : normal_color
  381.       self.contents.draw_text(4, i * 32, width - 32, 32, @options[i])
  382.     end
  383.   end
  384.  
  385.   def disable_option(i)
  386.     return false if @disabled[i]
  387.     @disabled[i] = true
  388.     refresh
  389.     return true
  390.   end
  391.  
  392.   def enable_option(i)
  393.     return false unless @disabled[i]
  394.     @disabled[i] = false
  395.     refresh
  396.     return true
  397.   end
  398.  
  399.   def update_help
  400.     @help_window.set_text(HELP_MESSAGE[@options[self.index]], 1)
  401.   end
  402. end
  403.  
  404. class Window_Charset < Window_Base
  405.   attr_reader :menu_windows
  406.   attr_accessor :index
  407.  
  408.   def initialize
  409.     super(0,0,640,64)
  410.     self.contents = Bitmap.new(self.width - 32, self.height - 32)
  411.     @item_max = 3
  412.     x = self.contents.width / @item_max
  413.     for i in 0...@item_max
  414.       self.contents.draw_text(x * i + 4, 0, x, 32, case i
  415.         when 0
  416.           "Selection"
  417.         when 1
  418.           "Render"
  419.         when 2
  420.           "?"
  421.         end
  422.       )
  423.     end
  424.     @menu_windows = []
  425.     for i in 0...@item_max
  426.       window = Window_Menu.new(16 + x * i, 64, x, 160, case i
  427.         # Selection Menu
  428.         when 0
  429.           ["Edit", "Load...", "Save", "Library...", "Default", "Randomize"]
  430.         # Export Menu
  431.         when 1
  432.           ["Use as hero", "To image file"]
  433.         # ? Menu
  434.         when 2
  435.           ["Credits"]
  436.         end
  437.       )
  438.       window.visible = false
  439.       window.active = false
  440.       window.z = 4000
  441.       @menu_windows << window
  442.     end
  443.   end
  444.  
  445.   def help_window=(help_window)
  446.     for window in @menu_windows
  447.       window.help_window = help_window
  448.     end
  449.   end
  450.  
  451.   def index=(i)
  452.     unless @index.nil?
  453.       menu_window.visible = false
  454.       menu_window.active = false
  455.     end
  456.     if i == -1
  457.       @index = nil
  458.       self.cursor_rect.empty
  459.       return
  460.     end
  461.     @index = i
  462.     x = self.contents.width / @item_max
  463.     self.cursor_rect.set(x * @index, 0, x, 32)
  464.     menu_window.visible = true
  465.     menu_window.active = true
  466.   end
  467.  
  468.   def update
  469.     return unless self.active
  470.     super
  471.     menu_window.update
  472.     if Input.repeat?(Input::LEFT)
  473.       $game_system.se_play($data_system.cursor_se)
  474.       self.index = (self.index - 1) % @item_max
  475.     end
  476.     if Input.repeat?(Input::RIGHT)
  477.       $game_system.se_play($data_system.cursor_se)
  478.       self.index = (self.index + 1) % @item_max
  479.     end
  480.   end
  481.  
  482.   def activate
  483.     self.active = true
  484.     self.index = 0
  485.   end
  486.  
  487.   def deactivate
  488.     self.active = false
  489.     self.index = -1
  490.   end
  491.  
  492.   def menu_window
  493.     return @menu_windows[self.index]
  494.   end
  495.  
  496.   def option
  497.     return menu_window.options[menu_window.index]
  498.   end
  499.  
  500.   def dispose
  501.     for window in @menu_windows
  502.       window.dispose
  503.     end
  504.     super
  505.   end
  506. end
  507.  
  508. class Window_Feature < Window_Selectable
  509.   def initialize
  510.     super(0, 64, 96, 352)
  511.     @item_max = Charset.data.size
  512.     self.index = -1
  513.     self.active = false
  514.     self.contents = Bitmap.new(width - 32, @item_max * 32)
  515.     refresh
  516.   end
  517.  
  518.   def feature(i = self.index)
  519.     return Charset.data[i].type
  520.   end
  521.  
  522.   def refresh
  523.     self.contents.clear
  524.     for i in 0...@item_max
  525.       self.contents.draw_text(4, i * 32, 64, 32, self.feature(i).display )
  526.     end
  527.   end
  528.  
  529.   def update
  530.     return unless self.active
  531.     super
  532.   end
  533.  
  534.   def activate
  535.     self.active = true
  536.   end
  537.  
  538.   def deactivate
  539.     self.active = false
  540.   end
  541.  
  542.   def update_help
  543.     @help_window.set_text("SP: Edit feature   ESC: Return to top menu   SHIFT: Edit all   Q/W: Change order", 1)
  544.   end
  545. end
  546.  
  547. class Window_FeatureOption < Window_Selectable
  548.   attr_accessor :feature_window
  549.   attr_accessor :edit_all
  550.  
  551.   def initialize
  552.     super(96, 64, 224, 352)
  553.     self.contents = Bitmap.new(self.width - 32, self.height - 32)
  554.     @item_max = OPTIONS.size
  555.     self.index = -1
  556.     self.active = false
  557.     self.visible = true
  558.     @edit_all = false
  559.     @need_refresh = false
  560.   end
  561.  
  562.   def feature(i = @feature_window.index)
  563.     return Charset.data[i]
  564.   end
  565.  
  566.   def option
  567.     return OPTIONS[self.index]
  568.   end
  569.  
  570.   def refresh
  571.     @need_refresh = true
  572.     @pictures = Dir.files("Graphics/Characters/#{Charset.library}/#{feature.type.display}", ".bmp", ".png", ".jpg")
  573.     @pictures.unshift(NAME_NO_PICTURE)
  574.     @picture_index = @pictures.index(self.feature.picture)
  575.     self.contents.clear
  576.     for i in 0...@item_max
  577.       if i == 0 and @edit_all
  578.         self.contents.font.color = disabled_color
  579.       else
  580.         self.contents.font.color = system_color
  581.       end
  582.       self.contents.draw_text(4, i * 32, 64, 32, OPTIONS[i].display)
  583.     end
  584.     for i in 0...@item_max
  585.       if self.feature.send(OPTIONS[i]).is_a?(Numeric)
  586.         text = sprintf("%+d", self.feature.send(OPTIONS[i]))
  587.       else
  588.         text = self.feature.send(OPTIONS[i]).to_s
  589.       end
  590.       if i == 0 and @edit_all
  591.         self.contents.font.color = disabled_color
  592.         self.contents.draw_text(64, i * 32, 124, 32, "---", 2)
  593.       else
  594.         self.contents.font.color = normal_color
  595.         self.contents.draw_text(64, i * 32, 124, 32, text, 2)
  596.       end
  597.     end
  598.   end
  599.  
  600.   def update
  601.     return unless self.active
  602.     super
  603.     if @edit_all
  604.       return if option == :picture
  605.       for i in 0...Charset.data.size
  606.         update_feature(i)
  607.       end
  608.     else
  609.       update_feature
  610.     end
  611.     if option == :picture and feature.picture != NAME_NO_PICTURE
  612.       if Input.repeat?(Input::Z)
  613.         picture_index = @picture_index
  614.         regexp = Regexp.new(feature.picture[0, feature.picture.size - 6] + "\\d{2}.\\w{3}")
  615.         while @pictures[picture_index] =~ regexp
  616.           picture_index += 1
  617.           if picture_index == @pictures.size
  618.             $game_system.se_play($data_system.buzzer_se)
  619.             return
  620.           end
  621.         end
  622.         $game_system.se_play($data_system.cursor_se)
  623.         @picture_index = picture_index
  624.         self.feature.picture = @pictures[@picture_index]
  625.         self.refresh
  626.       end
  627.       if Input.repeat?(Input::Y)
  628.         picture_index = @picture_index
  629.         regexp = Regexp.new(feature.picture[0, feature.picture.size - 6] + "\\d{2}.\\w{3}")
  630.         while @pictures[picture_index] =~ regexp
  631.           picture_index -= 1
  632.           if picture_index == 0
  633.             $game_system.se_play($data_system.buzzer_se)
  634.             return
  635.           end
  636.         end
  637.         $game_system.se_play($data_system.cursor_se)
  638.         @picture_index = picture_index
  639.         self.feature.picture = @pictures[@picture_index]
  640.         self.refresh
  641.       end
  642.     end
  643.   end
  644.  
  645.   def update_feature(i = @feature_window.index)
  646.     if Input.repeat?(Input::LEFT)
  647.       $game_system.se_play($data_system.cursor_se)
  648.       case option
  649.       when :picture
  650.         @picture_index -= 1
  651.         @picture_index %= @pictures.size
  652.         self.feature(i).picture = @pictures[@picture_index]
  653.       when :hue
  654.         feature(i).hue -= 10
  655.         feature(i).hue %= 360
  656.       else
  657.         eval("feature(i).#{option} -= 1")
  658.       end
  659.       self.refresh
  660.       return true
  661.     end
  662.     if Input.repeat?(Input::RIGHT)
  663.       $game_system.se_play($data_system.cursor_se)
  664.       case option
  665.       when :picture
  666.         @picture_index += 1
  667.         @picture_index %= @pictures.size
  668.         self.feature(i).picture = @pictures[@picture_index]
  669.       when :hue
  670.         feature(i).hue += 10
  671.         feature(i).hue %= 360
  672.       else
  673.         eval("feature(i).#{option} += 1")
  674.       end
  675.       self.refresh
  676.       return true
  677.     end
  678.     return false
  679.   end
  680.  
  681.   def activate
  682.     self.active = true
  683.     self.index = 0
  684.   end
  685.  
  686.   def deactivate
  687.     self.active = false
  688.     self.index = -1
  689.   end
  690.  
  691.   def update_help
  692.     @help_window.set_text("<-/->: Adjust parameter   SP: Apply changes   ESC: Cancel changes   Q/W: Change order", 1)
  693.   end
  694.  
  695.   def need_refresh
  696.     if @need_refresh
  697.       @need_refresh = false
  698.       return true
  699.     end
  700.     return false
  701.   end
  702. end
  703.  
  704. class Window_LoadSelection < Window_Selectable
  705.   def initialize
  706.     super(0, 64, 320, 352)
  707.     self.contents = Bitmap.new(width - 32, height - 32)
  708.     self.active = false
  709.     self.visible = false
  710.     self.z = 1000
  711.     @need_refresh = false
  712.   end
  713.  
  714.   def refresh
  715.     @data = Dir.files(DIR_DATA)#, "*.rxdata")
  716.     return false if @data.empty?
  717.     @item_max = @data.size
  718.     for i in 0...@item_max
  719.       self.contents.draw_text(4, i * 32, self.width - 32, 32, @data[i])
  720.     end
  721.   end
  722.  
  723.   def filename
  724.     return "#{DIR_DATA}/#{@data[self.index]}"
  725.   end
  726.  
  727.   def update
  728.     return unless self.active
  729.     super
  730.     if Input.repeat?(Input::DOWN) or Input.repeat?(Input::UP) or
  731.       Input.repeat?(Input::L) or Input.repeat?(Input::R)
  732.       update_selection
  733.     end
  734.   end
  735.  
  736.   def update_selection
  737.     @need_refresh = true
  738.     file = File.open(self.filename, "r")
  739.     Charset.library = Marshal.load(file)
  740.     Charset.data.replace(Marshal.load(file))
  741.     file.close
  742.   end
  743.  
  744.   def activate
  745.     self.active = true
  746.     self.visible = true
  747.     self.index = 0
  748.     self.update_selection
  749.   end
  750.  
  751.   def deactivate
  752.     self.active = false
  753.     self.visible = false
  754.   end
  755.  
  756.   def update_help
  757.     @help_window.set_text("SP: Load current selection   ESC: Cancel selection load", 1)
  758.   end
  759.  
  760.   def need_refresh
  761.     if @need_refresh
  762.       @need_refresh = false
  763.       return true
  764.     end
  765.     return false
  766.   end
  767. end
  768.  
  769. class Window_LoadSelection < Window_Selectable
  770.   def initialize
  771.     super(0, 64, 320, 352)
  772.     self.contents = Bitmap.new(width - 32, height - 32)
  773.     self.active = false
  774.     self.visible = false
  775.     self.z = 1000
  776.     @need_refresh = false
  777.   end
  778.  
  779.   def refresh
  780.     @data = Dir.files(DIR_DATA)#, "*.rxdata")
  781.     return false if @data.empty?
  782.     @item_max = @data.size
  783.     for i in 0...@item_max
  784.       self.contents.draw_text(4, i * 32, self.width - 32, 32, @data[i])
  785.     end
  786.   end
  787.  
  788.   def filename
  789.     return "#{DIR_DATA}/#{@data[self.index]}"
  790.   end
  791.  
  792.   def update
  793.     return unless self.active
  794.     super
  795.     if Input.repeat?(Input::DOWN) or Input.repeat?(Input::UP) or
  796.       Input.repeat?(Input::L) or Input.repeat?(Input::R)
  797.       update_selection
  798.     end
  799.   end
  800.  
  801.   def update_selection
  802.     @need_refresh = true
  803.     file = File.open(self.filename, "r")
  804.     Charset.library = Marshal.load(file)
  805.     Charset.data.replace(Marshal.load(file))
  806.     file.close
  807.   end
  808.  
  809.   def activate
  810.     self.active = true
  811.     self.visible = true
  812.     self.index = 0
  813.     self.update_selection
  814.   end
  815.  
  816.   def deactivate
  817.     self.active = false
  818.     self.visible = false
  819.   end
  820.  
  821.   def update_help
  822.     @help_window.set_text("SP: Load current selection   ESC: Cancel selection load", 1)
  823.   end
  824.  
  825.   def need_refresh
  826.     if @need_refresh
  827.       @need_refresh = false
  828.       return true
  829.     end
  830.     return false
  831.   end
  832. end
  833.  
  834. class Window_LibrarySelection < Window_Selectable
  835.   def initialize
  836.     super(0, 64, 320, 352)
  837.     self.contents = Bitmap.new(width - 32, height - 32)
  838.     self.active = false
  839.     self.visible = false
  840.     self.z = 1000
  841.     @need_refresh = false
  842.   end
  843.  
  844.   def refresh
  845.     @data = Dir.subdirectories("Graphics/Characters")
  846.     return false if @data.empty?
  847.     @item_max = @data.size
  848.     for i in 0...@item_max
  849.       self.contents.draw_text(4, i * 32, self.width - 32, 32, @data[i])
  850.     end
  851.   end
  852.  
  853.   def library
  854.     return @data[self.index]
  855.   end
  856.  
  857.   def update
  858.     return unless self.active
  859.     super
  860.     if Input.repeat?(Input::DOWN) or Input.repeat?(Input::UP) or
  861.       Input.repeat?(Input::L) or Input.repeat?(Input::R)
  862.       update_selection
  863.     end
  864.   end
  865.  
  866.   def update_selection
  867.     @need_refresh = true
  868.     Charset.init(library)
  869.   end
  870.  
  871.   def activate
  872.     self.active = true
  873.     self.visible = true
  874.     self.index = 0
  875.     self.update_selection
  876.   end
  877.  
  878.   def deactivate
  879.     self.active = false
  880.     self.visible = false
  881.   end
  882.  
  883.   def update_help
  884.     @help_window.set_text("SP: Load current library   ESC: Cancel library selection", 1)
  885.   end
  886.  
  887.   def need_refresh
  888.     if @need_refresh
  889.       @need_refresh = false
  890.       return true
  891.     end
  892.     return false
  893.   end
  894. end
  895.  
  896. class Scene_Charset < Scene_Base
  897.   def setup
  898.     super
  899.     @sprites << @charset_window = Window_Charset.new
  900.     @sprites << @feature_window = Window_Feature.new
  901.     @sprites << @option_window = Window_FeatureOption.new
  902.     @option_window.feature_window = @feature_window    
  903.     @sprites << @preview_window = Window_Base.new(320, 64, 320, 352)
  904.     @sprites << @load_window = Window_LoadSelection.new
  905.     @sprites << @library_window = Window_LibrarySelection.new
  906.     @sprites << @help_window = Window_Help.new
  907.     @help_window.y = 416
  908.     @charset_window.help_window =
  909.     @feature_window.help_window =
  910.     @option_window.help_window =
  911.     @load_window.help_window =
  912.     @library_window.help_window = @help_window
  913.     @charset_window.activate
  914.     @preview_window.contents = Bitmap.new(@preview_window.width - 32,
  915.       @preview_window.height - 32)
  916.       @preview_window.active = false
  917.     def @preview_window.refresh
  918.       self.contents.clear
  919.       self.contents.draw_text(0, 0, 144, 32, "Selected", 1)
  920.       if self.active
  921.         self.contents.draw_text(160, 0, 144, 32, "Preview", 1)
  922.       end
  923.     end
  924.     def @preview_window.activate
  925.       self.active = true
  926.       self.refresh
  927.     end
  928.     def @preview_window.deactivate
  929.       self.active = false
  930.       self.refresh
  931.     end
  932.     @preview_window.refresh
  933.     @option_windows = []
  934.     @preview_sprites = []
  935.     @selected_sprites = []
  936.     bitmap = Bitmap.new(128, 192)
  937.     for y in 0...4
  938.       for x in 0...4
  939.         bitmap.fill_rect(x * 32, y * 48, 32, 48, (x + y) % 2 == 0 ? COLOR1 : COLOR2)
  940.       end
  941.     end
  942.     sprite = Sprite.new(Charset::VIEWPORT)
  943.     sprite.bitmap = bitmap
  944.     sprite.x = 496
  945.     sprite.y = 128
  946.     sprite.visible = false
  947.     def sprite.refresh; return; end
  948.     @sprites << sprite
  949.     @preview_sprites << sprite
  950.     sprite = Sprite.new(Charset::VIEWPORT)
  951.     sprite.bitmap = bitmap
  952.     sprite.x = 336
  953.     sprite.y = 128
  954.     def sprite.refresh; return; end
  955.     @sprites << sprite
  956.     for i in 0...FEATURES.size
  957.       sprite = Sprite_Part.new(i, 496, 128)
  958.       sprite.visible = false
  959.       @sprites << sprite
  960.       @preview_sprites << sprite
  961.       sprite = Sprite_Part.new(i, 336, 128)
  962.       @sprites << sprite
  963.       @selected_sprites << sprite
  964.     end
  965.     @selected_animated = []
  966.     @preview_animated = []
  967.     for i in 0..3
  968.       rect = Rect.new(0, i * 48, 32, 48)
  969.       sprite = RPG::Sprite.new(Charset::VIEWPORT)
  970.       sprite.x = 336 + i * 32
  971.       sprite.y = 344
  972.       sprite.src_rect = rect
  973.       @selected_animated << sprite
  974.       @sprites << sprite
  975.       sprite = RPG::Sprite.new(Charset::VIEWPORT)
  976.       sprite.x = 496 + i * 32
  977.       sprite.y = 344
  978.       sprite.src_rect = rect
  979.       sprite.visible = false
  980.       @preview_animated << sprite
  981.       @sprites << sprite
  982.     end
  983.     refresh_selected
  984.     refresh_preview
  985.     if Dir.files(DIR_DATA, ".rxdata").empty?
  986.       i = @charset_window.menu_windows[0].options.index("Load...")
  987.       @charset_window.menu_windows[0].disable_option(i)
  988.     end
  989.     @blink_count = 0
  990.     @frame_count = 0
  991.     @frame = 0
  992.     @animation_rect = []
  993.     for i in 0..15
  994.       @animation_rect << Rect.new(i % 4 * 32, i / 4 * 48, 32, 48)
  995.     end
  996.     update_animation
  997.   end
  998.  
  999.   def terminate
  1000.     super
  1001.     for sprite in @selected_sprites
  1002.       sprite.dispose
  1003.     end
  1004.   end
  1005.  
  1006.   def refresh_selected
  1007.     for sprite in @selected_sprites
  1008.       sprite.refresh
  1009.     end
  1010.     bitmap = Charset.cache("Render")
  1011.     for sprite in @selected_animated
  1012.       sprite.bitmap = bitmap
  1013.     end
  1014.   end
  1015.  
  1016.   def refresh_preview
  1017.     for sprite in @preview_sprites
  1018.       sprite.refresh
  1019.     end
  1020.     bitmap = Charset.cache("Preview")
  1021.     for sprite in @preview_animated
  1022.       sprite.bitmap = bitmap
  1023.     end
  1024.   end
  1025.  
  1026.   def show_preview
  1027.     for sprite in @preview_sprites + @preview_animated
  1028.       sprite.visible = true
  1029.     end
  1030.   end
  1031.  
  1032.   def hide_preview
  1033.     for sprite in @preview_sprites + @preview_animated
  1034.       sprite.visible = false
  1035.     end
  1036.   end
  1037.  
  1038.   def enable_save
  1039.     enable_export
  1040.     i = @charset_window.menu_windows[0].options.index("Save")
  1041.     @charset_window.menu_windows[0].enable_option(i)
  1042.   end
  1043.  
  1044.   def disable_save
  1045.     i = @charset_window.menu_windows[0].options.index("Save")
  1046.     @charset_window.menu_windows[0].disable_option(i)
  1047.   end
  1048.  
  1049.   def enable_export
  1050.     i = @charset_window.menu_windows[1].options.index("To image file")
  1051.     @charset_window.menu_windows[1].enable_option(i)
  1052.   end
  1053.  
  1054.   def disable_export
  1055.     i = @charset_window.menu_windows[1].options.index("To image file")
  1056.     @charset_window.menu_windows[1].disable_option(i)
  1057.   end
  1058.  
  1059.   def export_disabled?
  1060.     i = @charset_window.menu_windows[1].options.index("To image file")
  1061.     return @charset_window.menu_windows[1].disabled[i]
  1062.   end
  1063.  
  1064.   def save_disabled?
  1065.     i = @charset_window.menu_windows[0].options.index("Save")
  1066.     return @charset_window.menu_windows[0].disabled[i]
  1067.   end
  1068.  
  1069.   def update_animation
  1070.     if @frame_count == 0
  1071.       @frame_count = 8
  1072.       @frame += 1
  1073.       @frame %= 4
  1074.     end
  1075.     @frame_count -= 1
  1076.     for i in 0..3
  1077.       @selected_animated[i].src_rect =
  1078.       @preview_animated[i].src_rect = @animation_rect[i * 4 + @frame]
  1079.     end
  1080.   end
  1081.  
  1082.   def update
  1083.     super
  1084.     if @option_window.need_refresh or @load_window.need_refresh or
  1085.       @library_window.need_refresh
  1086.       refresh_preview
  1087.     end
  1088.     # Confirm Selection
  1089.     if Input.trigger?(Input::C)
  1090.       # If in command window
  1091.       if @charset_window.active
  1092.         case @charset_window.option
  1093.         # Edit sprite
  1094.         when "Edit"
  1095.           $game_system.se_play($data_system.decision_se)
  1096.           @charset_window.deactivate
  1097.           @feature_window.activate
  1098.           @blink_count = 0
  1099.           @feature_window.index = 0
  1100.           @option_window.refresh
  1101.         # Default
  1102.         when "Default"
  1103.           return unless RPG.confirm("Lose all changes and revert to default?")
  1104.           Charset.init
  1105.           @feature_window.refresh
  1106.           for window in @option_windows
  1107.             window.refresh
  1108.           end
  1109.           refresh_selected
  1110.           enable_save
  1111.         when "Load..."
  1112.           unless @load_window.refresh
  1113.             return RPG.warn("No saved data found in Data/Charsets!")
  1114.           end
  1115.           $game_system.se_play($data_system.decision_se)
  1116.           @backup_charset = Charset.data.clone
  1117.           @charset_window.deactivate
  1118.           @preview_window.activate
  1119.           @load_window.activate
  1120.           show_preview
  1121.           refresh_preview
  1122.         when "Save"
  1123.           if save_disabled?
  1124.             $game_system.se_play($data_system.buzzer_se)
  1125.             return
  1126.           end
  1127.           i = 0
  1128.           while File.exist?(filename = sprintf("Data/Charsets/#{FILENAME_SAVE}%03d.rxdata", i))
  1129.             i += 1
  1130.           end
  1131.           file = File.open(filename, "wb")
  1132.           Marshal.dump(Charset.library, file)
  1133.           Marshal.dump(Charset.data, file)
  1134.           file.close
  1135.           disable_save
  1136.           i = @charset_window.menu_windows[0].options.index("Load...")
  1137.           @charset_window.menu_windows[0].enable_option(i)
  1138.           return RPG.warn("Current selection saved as #{filename}!")
  1139.         when "Library..."
  1140.           unless @library_window.refresh
  1141.             return RPG.warn("No libraries found in Graphics/Characters!")
  1142.           end
  1143.           $game_system.se_play($data_system.decision_se)
  1144.           @backup_charset = Charset.data.clone
  1145.           @charset_window.deactivate
  1146.           @preview_window.activate
  1147.           @library_window.activate
  1148.           show_preview
  1149.           refresh_preview
  1150.         when "Randomize"
  1151.           $game_system.se_play($data_system.decision_se)
  1152.           @backup_charset = []
  1153.           for feature in Charset.data
  1154.             @backup_charset << feature.clone
  1155.             next if feature.picture == NAME_NO_PICTURE
  1156.             # Randomize picture
  1157.             feature.picture = Dir.files("Graphics/Characters/#{Charset.library}/#{feature.type.display}").sample
  1158.           end
  1159.           @preview_window.activate
  1160.           show_preview
  1161.           refresh_preview
  1162.           @help_window.set_text("SP: Apply changes   ESC: Cancel changes", 1)
  1163.           loop do
  1164.             Input.update
  1165.             Graphics.update
  1166.             update_animation
  1167.             if Input.trigger?(Input::C)
  1168.               $game_system.se_play($data_system.decision_se)
  1169.               enable_save
  1170.               refresh_selected
  1171.               break
  1172.             end
  1173.             if Input.trigger?(Input::B)
  1174.               $game_system.se_play($data_system.cancel_se)
  1175.               Charset.data.replace(@backup_charset)
  1176.               break
  1177.             end
  1178.           end
  1179.           @preview_window.deactivate
  1180.           hide_preview
  1181.           update_animation
  1182.           return
  1183.         # Use charset
  1184.         when "Use as hero"
  1185.           Charset.cache($game_actors[1].character_name)
  1186.           return RPG.warn("Player's character changed to current selection!")
  1187.         when "To image file"
  1188.           if export_disabled?
  1189.             $game_system.se_play($data_system.buzzer_se)
  1190.             return
  1191.           end
  1192.           i = 0
  1193.           while File.exist?(filename = sprintf("Graphics/Characters/#{FILENAME_RENDER}%03d.png", i))
  1194.             i += 1
  1195.           end
  1196.           Charset.render.export(filename)
  1197.           disable_export
  1198.           return RPG.warn("Current selection rendered as #{filename}!")
  1199.         when "Credits"
  1200.           RPG.warn("Charset Maker v1.00 written by Moonpearl")
  1201.           RPG.warn("Using Bitmap Export written by Zeus81")
  1202.           RPG.warn("Graphic library provided by Looseleaf")
  1203.           return
  1204.         end
  1205.       # If selecting feature to edit
  1206.       elsif @feature_window.active
  1207.         $game_system.se_play($data_system.decision_se)
  1208.         @backup_feature = Charset.data[@feature_window.index].clone
  1209.         @preview_window.activate
  1210.         @feature_window.deactivate
  1211.         @option_window.activate
  1212.         show_preview
  1213.       # If editing selected feature
  1214.       elsif @option_window.active
  1215.         $game_system.se_play($data_system.decision_se)
  1216.         @preview_window.deactivate
  1217.         @option_window.deactivate
  1218.         @feature_window.activate
  1219.         @option_window.edit_all = false
  1220.         @blink_count = 0
  1221.         refresh_selected
  1222.         hide_preview
  1223.         enable_save
  1224.       # If browsing list of possible selections
  1225.       elsif @load_window.active
  1226.         $game_system.se_play($data_system.decision_se)
  1227.         @load_window.deactivate
  1228.         @preview_window.deactivate
  1229.         @charset_window.activate
  1230.         refresh_selected
  1231.         hide_preview
  1232.         disable_save
  1233.       # If browsing list of libraries
  1234.       elsif @library_window.active
  1235.         $game_system.se_play($data_system.decision_se)
  1236.         @library_window.deactivate
  1237.         @preview_window.deactivate
  1238.         @charset_window.activate
  1239.         refresh_selected
  1240.         hide_preview
  1241.         disable_save
  1242.       end
  1243.     end
  1244.     # Cancel selection
  1245.     if Input.trigger?(Input::B)
  1246.       # If in command window
  1247.       if @charset_window.active
  1248.         $game_system.se_play($data_system.cancel_se)
  1249.         $scene = Scene_Map.new
  1250.       # If selecting feature to edit
  1251.       elsif @feature_window.active
  1252.         $game_system.se_play($data_system.cancel_se)
  1253.         @feature_window.deactivate
  1254.         @feature_window.index = -1
  1255.         @charset_window.activate
  1256.         @option_window.contents.clear
  1257.       # If editing selected feature
  1258.       elsif @option_window.active
  1259.         $game_system.se_play($data_system.cancel_se)
  1260.         @preview_window.deactivate
  1261.         @option_window.deactivate
  1262.         @feature_window.activate
  1263.         # Cancel changes and revert to backup
  1264.         if @option_window.edit_all
  1265.           Charset.data.replace(@backup_charset)
  1266.         else
  1267.           Charset.data[@feature_window.index] = @backup_feature
  1268.         end
  1269.         @option_window.refresh
  1270.         @option_window.edit_all = false
  1271.         hide_preview
  1272.       # If browsing list of possible selections
  1273.       elsif @load_window.active
  1274.         $game_system.se_play($data_system.cancel_se)
  1275.         @load_window.deactivate
  1276.         @preview_window.activate
  1277.         @charset_window.activate
  1278.         Charset.data.replace(@backup_charset)
  1279.         hide_preview
  1280.       # If browsing list of libraries
  1281.       elsif @library_window.active
  1282.         $game_system.se_play($data_system.cancel_se)
  1283.         @library_window.deactivate
  1284.         @preview_window.deactivate
  1285.         @charset_window.activate
  1286.         Charset.data.replace(@backup_charset)
  1287.         hide_preview
  1288.       end
  1289.     end
  1290.     if Input.repeat?(Input::L)
  1291.       return if @feature_window.index == - 1
  1292.       if @feature_window.index == 0 or @option_window.edit_all
  1293.         $game_system.se_play($data_system.buzzer_se)
  1294.         return
  1295.       end
  1296.       $game_system.se_play($data_system.cursor_se)
  1297.       Charset.data.insert( @feature_window.index - 1,
  1298.         Charset.data.delete_at(@feature_window.index) )
  1299.       index = @option_window.index
  1300.       @option_window.index = -1
  1301.       @option_window.refresh
  1302.       @option_window.active = false
  1303.       @feature_window.index -= 1
  1304.       @feature_window.refresh
  1305.       @option_window.refresh
  1306.       @option_window.index = index
  1307.       if @feature_window.active
  1308.         refresh_selected
  1309.       else
  1310.         feature = Charset.data[@feature_window.index]
  1311.         Charset.data[@feature_window.index] = @backup_feature
  1312.         refresh_selected
  1313.         Charset.data[@feature_window.index] = feature
  1314.         @option_window.active = true
  1315.       end
  1316.       enable_save
  1317.     end
  1318.     if Input.repeat?(Input::R)
  1319.       return if @feature_window.index == - 1
  1320.       if @feature_window.index == Charset.data.size - 1  or @option_window.edit_all
  1321.         $game_system.se_play($data_system.buzzer_se)
  1322.         return
  1323.       end
  1324.       $game_system.se_play($data_system.cursor_se)
  1325.       Charset.data.insert( @feature_window.index + 1,
  1326.         Charset.data.delete_at(@feature_window.index) )
  1327.       index = @option_window.index
  1328.       @option_window.index = -1
  1329.       @option_window.refresh
  1330.       @option_window.active = false
  1331.       @feature_window.index += 1
  1332.       @feature_window.refresh
  1333.       @option_window.refresh
  1334.       @option_window.index = index
  1335.       @option_window.active = true unless @feature_window.active
  1336.       if @feature_window.active
  1337.         refresh_selected
  1338.       else
  1339.         feature = Charset.data[@feature_window.index]
  1340.         Charset.data[@feature_window.index] = @backup_feature
  1341.         refresh_selected
  1342.         Charset.data[@feature_window.index] = feature
  1343.         @option_window.active = true
  1344.       end
  1345.       enable_save
  1346.     end
  1347.     update_animation    
  1348.     if @feature_window.active
  1349.       if @blink_count == 0
  1350.         @blink_count = 16
  1351.         @selected_sprites[@feature_window.index].whiten
  1352.       end
  1353.       @blink_count -= 1
  1354.       if Input.trigger?(Input::A)
  1355.         $game_system.se_play($data_system.decision_se)
  1356.         @backup_charset = []
  1357.         for feature in Charset.data
  1358.           @backup_charset << feature.clone
  1359.         end
  1360.         @option_window.edit_all = true
  1361.         @feature_window.deactivate
  1362.         @feature_window.cursor_rect.set(0, 0, @feature_window.width - 32,
  1363.           Charset.data.size * 32)
  1364.         @preview_window.activate
  1365.         @option_window.activate
  1366.         @option_window.refresh
  1367.         show_preview
  1368.       end
  1369.       if Input.repeat?(Input::UP) or Input.repeat?(Input::DOWN)
  1370.         @blink_count = 0
  1371.         @option_window.refresh
  1372.       end
  1373.     end
  1374.   end
  1375. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement