TheoAllen

[WIP] Theo - Smithing

Aug 15th, 2013
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 10.51 KB | None | 0 0
  1. ($imported ||= {})[:Theo_Smithing] = true
  2.  
  3. module THEO
  4.   module Smith
  5.    
  6.     MenuActor_Size  = 140
  7.     GoldWindow_Size = 120
  8.    
  9.     PriceBase     = 10
  10.     PriceFormula  = ""
  11.    
  12.     module Colour
  13.       Level       = 6
  14.       Maxout      = 21
  15.       Upgradable  = 24
  16.     end
  17.    
  18.     module SVocab
  19.       Cost        = "Cost: "
  20.       Level       = "Lv.%d"
  21.       Upgradable  = "Upgradable"
  22.       Maxout      = "Maxed Out"
  23.       Yes_Confirm = "Yes"
  24.       No_Confirm  = "No"
  25.      
  26.       Select_Weapon   = "Whose weapon will be upgraded?"
  27.       Decide_Weapon   = "Upgrade this weapon?"
  28.       Upgraded_Quote  = "Upgrade complete"
  29.       Refuse_Upgrade  = "Not enough money"
  30.      
  31.       NotifNameChange = "Weapon changed to %s"
  32.       NotifNormal     = "Weapon Improved"
  33.     end
  34.    
  35.   # --------------------------------------------------------------------------  
  36.   # Weapon Upgrade Table
  37.   # --------------------------------------------------------------------------
  38.     W_Upgrade_Table = {
  39.    
  40.       1 =>  [
  41.             [{:atk => 2,:def => 2, :mat => 2,
  42.               :mdf => 2,:agi => 2, :luk => 2},1,"Wodden Ax",""],
  43.             [{:atk => 2},0,"Iron Ax",""],
  44.             [{:atk => 2},0,"Silver Ax",""],
  45.             ],
  46.    
  47.     }
  48.    
  49. # ============================================================================
  50. # Do not ever touch anything pass this line. Or nightmare will come to u
  51. # ============================================================================
  52.  
  53.     Key = {
  54.       :mhp => 0,
  55.       :mmp => 1,
  56.       :atk => 2,
  57.       :def => 3,
  58.       :mat => 4,
  59.       :mdf => 5,
  60.       :agi => 6,
  61.       :luk => 7,
  62.     }
  63.    
  64.   end
  65. end
  66.  
  67. class RPG::EquipItem < RPG::BaseItem
  68.   attr_accessor :level
  69.  
  70.   alias theo_smith_upgrade_init initialize
  71.   def initialize
  72.     theo_smith_upgrade_init
  73.     @level = 1
  74.   end
  75.  
  76.   def clone_data
  77.     original = self
  78.     cloned = RPG::UpgradedWeapon.new
  79.     self.instance_variables.each do |varsym|
  80.       ivar_name = varsym.to_s.gsub(/@/) {""}
  81.       eval("
  82.        begin
  83.          cloned.#{ivar_name} = original.#{ivar_name}.clone
  84.        rescue
  85.          cloned.#{ivar_name} = original.#{ivar_name}
  86.        end")
  87.     end
  88.     return cloned
  89.   end
  90.  
  91.   def next_weapon
  92.     next_weapon_exist? ? $upgraded_weapons[upgrade_key] : nil
  93.   end
  94.  
  95.   def next_weapon_exist?
  96.     !$upgraded_weapons[upgrade_key].nil?
  97.   end
  98.  
  99.  
  100.   def upgrade_key
  101.     self.id * 100 + (level+1)
  102.   end
  103.  
  104.   def level
  105.     @level ||= 1
  106.   end
  107.  
  108. end
  109.  
  110. class RPG::UpgradedWeapon < RPG::Weapon
  111.   attr_accessor :ori_id
  112.  
  113.   def upgrade_key
  114.     self.ori_id * 100 + (level+1)
  115.   end
  116.  
  117. end
  118.  
  119. class << DataManager
  120.  
  121.   alias theo_upgrade_smith_game_obj create_game_objects
  122.   def create_game_objects
  123.     theo_upgrade_smith_game_obj
  124.     init_upgraded_weapons
  125.   end
  126.  
  127.   def init_upgraded_weapons
  128.     $upgraded_weapons = {}
  129.     THEO::Smith::W_Upgrade_Table.each do |id, table|
  130.       table.each_with_index do |data,level|
  131.         gen_id = (id*100) + (level+1)
  132.         weapon_check = $upgraded_weapons[gen_id]
  133.         result = nil
  134.         if (level + 1) != 1 && !weapon_check.nil?
  135.           result = weapon_check.clone_data
  136.         else
  137.           result = $data_weapons[id].clone_data
  138.         end
  139.         result.level = level+2
  140.         data[0].each do |param,value|
  141.           param_id = THEO::Smith::Key[param]
  142.           result.params[param_id] += value
  143.         end
  144.         if data[1] > -1
  145.           result.icon_index = data[1]
  146.         end
  147.         result.name = data[2].empty? ? result.name : data[2]
  148.         result.description = data[3].empty? ? result.description : data[3]
  149.         result.ori_id = id
  150.         gen_id = (id*100) + (level+2)
  151.         result.id = gen_id
  152.         $upgraded_weapons[gen_id] = result
  153.       end
  154.     end
  155.   end
  156.  
  157. end
  158.  
  159. class Game_BaseItem
  160.  
  161.   def upgraded_weapon?
  162.     @class == RPG::UpgradedWeapon
  163.   end
  164.  
  165.   alias theo_smt_upgrade_object object
  166.   def object
  167.     return $upgraded_weapons[@item_id] if upgraded_weapon?
  168.     return theo_smt_upgrade_object
  169.   end
  170.  
  171. end
  172.  
  173. class Game_Party < Game_Unit
  174.  
  175.   alias theo_smith_init_item init_all_items
  176.   def init_all_items
  177.     theo_smith_init_item
  178.     @upgraded_weapons = {}
  179.   end
  180.  
  181.   alias theo_smith_item_container item_container
  182.   def item_container(item_class)
  183.     return @upgraded_weapons if item_class == RPG::UpgradedWeapon
  184.     return theo_smith_item_container(item_class)
  185.   end
  186.  
  187.   alias theo_smith_weapon weapons
  188.   def weapons
  189.     theo_smith_weapon + upgraded_weapons
  190.   end
  191.  
  192.   def upgraded_weapons
  193.     @upgraded_weapons.keys.sort.collect {|id| $upgraded_weapons[id]}
  194.   end
  195.  
  196. end
  197.  
  198. class Window_Base < Window
  199.   SText_Format = "\\C[16]%s\\C[0] : %d → \\C[24]%d\\C[0]"
  200.   def obtain_params_change
  201.     result = []
  202.     @weapon.params.each_with_index do |param,id|
  203.       next_param = @weapon.next_weapon.params[id]
  204.       next if param == next_param
  205.       text = sprintf(SText_Format,Vocab.param(id),param,next_param)
  206.       result.push(text)
  207.     end if @weapon
  208.     return result
  209.   end
  210. end
  211.  
  212. class Window_SmithGold < Window_Gold
  213.   def window_width
  214.     return THEO::Smith::GoldWindow_Size
  215.   end
  216. end
  217.  
  218. class Window_SmithMenu < Window_Selectable
  219.  
  220.   def initialize(x,y)
  221.     super(x,y,window_width,window_height)
  222.     refresh
  223.   end
  224.  
  225.   def window_width
  226.     THEO::Smith::MenuActor_Size
  227.   end
  228.  
  229.   def window_height
  230.     fitting_height(item_max)
  231.   end
  232.  
  233.   def item_max
  234.     $game_party.members.size
  235.   end
  236.  
  237.   def draw_item(index)
  238.     actor = $game_party.members[index]
  239.     draw_text(item_rect(index),actor.name,alignment)
  240.   end
  241.  
  242.   def alignment
  243.     return 0
  244.   end
  245.  
  246.   def weapon
  247.     $game_party.members[index].equips[0]
  248.   end
  249.  
  250.   def update_help
  251.     @help_window.refresh(weapon)
  252.   end
  253.  
  254.   def current_item_enable?
  255.     actor = $game_party.members[index]
  256.     return false if actor.equips[0].nil?
  257.     return actor.equips[0].next_weapon_exist?
  258.   end
  259.  
  260. end
  261.  
  262. class Window_SmithResult < Window_Base
  263.   include THEO::Smith
  264.  
  265.   def next_weapon
  266.     @weapon.next_weapon
  267.   end
  268.  
  269.   def refresh(weapon)
  270.     contents.clear
  271.     @weapon = weapon
  272.     return unless @weapon
  273.     reset_font_settings
  274.     draw_weapon_name
  275.     if @weapon.next_weapon_exist?
  276.       draw_next_weapon
  277.     else
  278.       draw_maxed_out
  279.     end
  280.   end
  281.  
  282.   def draw_weapon_name
  283.     draw_item_name(@weapon,0,0)
  284.     level = sprintf(SVocab::Level,@weapon.level)
  285.     change_color(text_color(Colour::Level))
  286.     draw_text(0,0,contents.width,line_height,level,2)
  287.     contents.fill_rect(0,24,contents.width,1,Color.new(255,255,255,128))
  288.   end
  289.  
  290.   def draw_next_weapon
  291.     ypos = 28
  292.     rect = Rect.new(0,ypos,contents.width,line_height)
  293.     contents.font.size -= 4
  294.     change_color(system_color)
  295.     draw_text(rect,SVocab::Cost)
  296.     change_color(text_color(Colour::Upgradable))
  297.     draw_text(rect,SVocab::Upgradable,2)
  298.     texts = obtain_params_change
  299.     ypos += line_height
  300.     texts.each do |txt|
  301.       draw_text_ex(0,ypos,txt)
  302.       ypos += line_height
  303.     end
  304.   end
  305.  
  306.   def draw_maxed_out
  307.     ypos = 28
  308.     rect = Rect.new(0,ypos,contents.width,line_height)
  309.     contents.font.size -= 4
  310.     change_color(text_color(Colour::Maxout))
  311.     draw_text(rect,SVocab::Maxout,2)
  312.   end
  313.  
  314. end
  315.  
  316. class Window_SmithNotif < Window_Base
  317.  
  318.   def initialize(width)
  319.     super(0,0,width,0)
  320.     self.openness = 0
  321.     update_placement
  322.     @show_count = 0
  323.   end
  324.  
  325.   def update_placement
  326.     self.x = Graphics.width/2 - self.width/2
  327.     self.y = Graphics.height/2 - self.height/2
  328.   end
  329.  
  330.   def height=(height)
  331.     super
  332.     update_placement
  333.     create_contents
  334.   end
  335.  
  336.   def show_weapon(weapon)
  337.     @weapon = weapon
  338.     @texts = obtain_params_change
  339.     update_height
  340.     refresh
  341.     @show_count = 120
  342.   end
  343.  
  344.   def update_height
  345.     self.height = fitting_height(@texts.size + 1)
  346.   end
  347.  
  348.   def refresh
  349.     contents.clear
  350.     rect = Rect.new(0,0,contents.width,line_height)
  351.     next_name = @weapon.next_weapon.name
  352.     if next_name != @weapon.name
  353.       text = sprintf(THEO::Smith::SVocab::NotifNameChange,next_name)
  354.       draw_text(rect,text)
  355.     else
  356.       text = THEO::Smith::SVocab::NotifNormal
  357.       draw_text(rect,text)
  358.     end
  359.     ypos = line_height
  360.     @texts.each do |txt|
  361.       draw_text_ex(0,ypos,txt)
  362.       ypos += line_height
  363.     end
  364.   end
  365.  
  366.   def update
  367.     super
  368.     update_close_input
  369.     if @show_count > 0
  370.       open
  371.     else
  372.       close
  373.     end
  374.   end
  375.  
  376.   def update_close_input
  377.     @show_count -= 1
  378.     @show_count = 0 if Input.trigger?(:C)
  379.   end
  380.  
  381. end
  382.  
  383. class Window_SmithConfirm < Window_Command
  384.  
  385.   def initialize(x,y)
  386.     super(x,y)
  387.     self.openness = 0
  388.   end
  389.  
  390.   def make_command_list
  391.     vocab = THEO::Smith::SVocab
  392.     add_command(Yes_Confirm, :yes)
  393.     add_command(No_Confirm, :no)
  394.   end
  395.  
  396.   def window_width
  397.     return 80
  398.   end
  399.  
  400. end
  401.  
  402. class Scene_Smith < Scene_MenuBase
  403.  
  404.   def start
  405.     super
  406.     create_help_window
  407.     create_actor_menu
  408.     create_gold_window
  409.     create_smith_result
  410.     create_notif_smith
  411.   end
  412.  
  413.   def create_help_window
  414.     @help_window = Window_Help.new(1)
  415.   end
  416.  
  417.   def create_actor_menu
  418.     y = @help_window.height
  419.     @menu_actor = Window_SmithMenu.new(0,y)
  420.     @menu_actor.set_handler(:cancel, method(:return_scene))
  421.     @menu_actor.set_handler(:ok, method(:on_actor_ok))
  422.     @menu_actor.activate
  423.     @menu_actor.select(0)
  424.   end
  425.  
  426.   def create_smith_result
  427.     x = @menu_actor.width
  428.     y = @help_window.height
  429.     w = Graphics.width - @menu_actor.width - @gold_window.width
  430.     h = 24 * 9 + 4
  431.     @smith_result = Window_SmithResult.new(x,y,w,h)
  432.     @menu_actor.help_window = @smith_result
  433.   end
  434.  
  435.   def create_gold_window
  436.     @gold_window = Window_SmithGold.new
  437.     @gold_window.x = Graphics.width - @gold_window.width
  438.     @gold_window.y = @help_window.height
  439.   end
  440.  
  441.   def create_notif_smith
  442.     @notif_smith = Window_SmithNotif.new(300)
  443.   end
  444.  
  445.   def on_actor_ok
  446.     if next_weapon.nil?
  447.       Sound.play_buzzer
  448.       @menu_actor.activate
  449.       return
  450.     end
  451.     craft_weapon
  452.   end
  453.  
  454.   def craft_weapon
  455.     $game_party.gain_item(next_weapon,1)
  456.     last_equip = item_to_lose
  457.     @notif_smith.show_weapon(last_equip)
  458.     actor.change_equip(0,next_weapon)
  459.     $game_party.lose_item(last_equip,1)
  460.     @menu_actor.update_help
  461.     @menu_actor.activate
  462.   end
  463.  
  464.   def next_weapon
  465.     @smith_result.next_weapon
  466.   end
  467.  
  468.   def actor
  469.     $game_party.members[@menu_actor.index]
  470.   end
  471.  
  472.   def item_to_lose
  473.     actor.equips[0]
  474.   end
  475.  
  476. end
Advertisement
Add Comment
Please, Sign In to add comment