Advertisement
DrDhoom

[RGSS3] Scan Enemy

Oct 15th, 2014
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 12.98 KB | None | 0 0
  1. #==============================================================================
  2. #
  3. # • Dhoom Enemy Scan v.1.3
  4. #   drd-workshop.blogspot.com
  5. # -- Last Updated: 29.05.2015
  6. # -- Requires: None
  7. #
  8. #==============================================================================
  9. #==============================================================================
  10. # • HOW TO USE
  11. #==============================================================================
  12. #
  13. # Use this notetag for the skills:
  14. #   <scan_enemy>
  15. #
  16. #==============================================================================
  17. module Dhoom
  18.   module EnemyScanWindow
  19.     #Window x, y, width, height
  20.     XYWH = [0,0,544,416]
  21.     #0 : Normal Window, 1 : Dim Background, 2 : Transparent
  22.     WindowMode = 1
  23.     Enemy_Name_Color = 6
  24.     Start_Y = 24
  25.     HP_Icon = 122
  26.     Element_Icon = []
  27.     #Element_Icon[Element ID] = Icon Index
  28.     Element_Icon[1] = 143
  29.     Element_Icon[2] = 130
  30.     Element_Icon[3] = 96
  31.     Element_Icon[4] = 97
  32.     Element_Icon[5] = 98
  33.     Element_Icon[6] = 99
  34.     Element_Icon[7] = 100
  35.     Element_Icon[8] = 101
  36.     Element_Icon[9] = 102
  37.     Element_Icon[10] = 103
  38.     Element_Resist_Icon = [187,188,184,189,185]
  39.     Element_Info = ["<x1.5>","<1/2>","< - >","< + >"]
  40.     #States = [State id, state id, ... ]
  41.     States = [1,2,3,4,5]
  42.     Drop_IconText = [261, "< Drops >"]
  43.     Steal_IconText = [482, "< Steal >"]
  44.     Gold_Icon = 361
  45.     Scan_Window_Wait = 60
  46.   end
  47.  
  48.   module REGEXP
  49.     module Skill
  50.       Enemy_Scan = /<(?:scan_enemy|SCAN_ENEMY)>/i
  51.     end
  52.   end
  53. end
  54.  
  55. $imported = {} if $imported.nil?
  56. $imported["DhoomEnemyScanWindow"] = true
  57.  
  58. class RPG::Skill < RPG::UsableItem
  59.  
  60.   attr_reader :scan_enemy
  61.  
  62.   def load_notetags_denemy_scan
  63.     @scan_enemy = false
  64.     self.note.split(/[\r\n]+/).each { |line|    
  65.       case line
  66.       when Dhoom::REGEXP::Skill::Enemy_Scan
  67.         @scan_enemy = true    
  68.       end
  69.     }
  70.   end  
  71. end
  72.  
  73. module DataManager
  74.  
  75.   class <<self; alias load_database_denemy_scan load_database; end
  76.   def self.load_database
  77.     load_database_denemy_scan
  78.     load_notetags_denemy_scan
  79.   end
  80.  
  81.  
  82.   def self.load_notetags_denemy_scan
  83.     for obj in $data_skills
  84.       next if obj.nil?
  85.       obj.load_notetags_denemy_scan
  86.     end
  87.   end
  88. end
  89.  
  90. class Window_EnemyScan < Window_Base
  91.   include Dhoom::EnemyScanWindow
  92.   attr_accessor :enemy
  93.   def initialize(enemy=nil)
  94.     super(*XYWH)
  95.     self.opacity = 0 if WindowMode != 0
  96.     @enemy = enemy
  97.     @temp_enemy = @enemy
  98.     create_back_bitmap
  99.     create_back_sprite
  100.     refresh if enemy != nil
  101.   end
  102.  
  103.   def create_back_bitmap
  104.     @back_bitmap = Bitmap.new(width, height)
  105.     rect1 = Rect.new(0, 0, width, 12)
  106.     rect2 = Rect.new(0, 12, width, height - 24)
  107.     rect3 = Rect.new(0, height - 12, width, 12)
  108.     @back_bitmap.gradient_fill_rect(rect1, back_color2, back_color1, true)
  109.     @back_bitmap.fill_rect(rect2, back_color1)
  110.     @back_bitmap.gradient_fill_rect(rect3, back_color1, back_color2, true)
  111.   end
  112.  
  113.   def back_color1
  114.     Color.new(0, 0, 0, 160)
  115.   end
  116.  
  117.   def back_color2
  118.     Color.new(0, 0, 0, 0)
  119.   end
  120.  
  121.   def create_back_sprite
  122.     @back_sprite = Sprite.new
  123.     @back_sprite.bitmap = @back_bitmap
  124.     @back_sprite.visible = false
  125.     @back_sprite.z = z - 1
  126.   end
  127.  
  128.   def refresh
  129.     contents.clear
  130.     reset_font_settings
  131.     @line = 0
  132.     draw_enemy_name
  133.     draw_enemy_hp
  134.     draw_enemy_element_icon
  135.     draw_enemy_element_rate
  136.     draw_enemy_state_icon
  137.     draw_enemy_state_rate
  138.     draw_enemy_element_info
  139.     draw_enemy_parameter
  140.     draw_enemy_drop_items
  141.     draw_enemy_steal_items
  142.     draw_enemy_exp_ap_gold
  143.   end
  144.  
  145.   def draw_enemy_name
  146.     change_color(text_color(Enemy_Name_Color))
  147.     draw_text(0,text_y,contents.width,line_height,@enemy.name,1)
  148.     change_color(normal_color)
  149.     @line += 2
  150.   end
  151.  
  152.   def draw_enemy_hp    
  153.     size1 = text_size(@enemy.hp).width
  154.     contents.font.size = 16
  155.     size2 = text_size(@enemy.mhp).width
  156.     total_size = size1+size2+24
  157.     contents.font.size = 24
  158.     basex = contents.width/2.0-total_size/2.0-4
  159.     draw_icon(HP_Icon,basex,text_y)
  160.     draw_text(basex+24,text_y,size1+8,line_height,@enemy.hp)
  161.     contents.font.size = 16
  162.     draw_text(basex+24+size1,text_y,size2+8,line_height,@enemy.mhp)
  163.     contents.font.size = 24
  164.     @line += 1
  165.   end
  166.  
  167.   def draw_enemy_element_icon
  168.     size = Element_Icon.compact.size*26+12
  169.     basex = mid_x(size)
  170.     Element_Icon.compact.each_with_index do |icon,index|
  171.       next if icon.nil?
  172.       draw_icon(icon,index*24+basex,text_y)
  173.     end
  174.     @line += 1  
  175.   end
  176.  
  177.   def draw_enemy_element_rate
  178.     size = Element_Icon.compact.size*26+12
  179.     basex = mid_x(size)
  180.     l = 0
  181.     Element_Icon.each_with_index do |ind,i|
  182.       next if ind.nil?
  183.       icon = 4
  184.       if $imported["YEA-Element Absorb"] and @enemy.enemy.element_absorb.include?(i)
  185.         icon = 3
  186.       elsif @enemy.element_rate(i) > 1.0
  187.         icon = 0
  188.       elsif @enemy.element_rate(i) == 0
  189.         icon = 2
  190.       elsif @enemy.element_rate(i) < 1.0
  191.         icon = 1
  192.       end
  193.       draw_icon(Element_Resist_Icon[icon],l*24+basex,text_y)
  194.       l += 1
  195.     end    
  196.     @line += 1
  197.   end
  198.  
  199.   def draw_enemy_state_icon
  200.     size = States.size*26+12
  201.     basex = mid_x(size)
  202.     States.each_with_index do |i,index|
  203.       state = $data_states[i]
  204.       draw_icon(state.icon_index,index*24+basex,text_y)
  205.     end
  206.     @line += 1
  207.   end
  208.  
  209.   def draw_enemy_state_rate
  210.     size = States.size*26+12
  211.     basex = mid_x(size)
  212.     for i in 0...States.size
  213.       icon = 4
  214.       if @enemy.state_rate(i+1) > 1.0
  215.         icon = 0
  216.       elsif @enemy.state_rate(i+1) == 0
  217.         icon = 2
  218.       elsif @enemy.state_rate(i+1) < 1.0
  219.         icon = 1
  220.       end
  221.       draw_icon(Element_Resist_Icon[icon],i*24+basex,text_y)
  222.     end
  223.     @line += 1
  224.   end
  225.  
  226.   def draw_enemy_element_info    
  227.     size = 5*26
  228.     Element_Info.each do |string|
  229.       size += text_size(string).width
  230.     end    
  231.     basex = mid_x(size)
  232.     xx = 0
  233.     for i in 0...4
  234.       draw_icon(Element_Resist_Icon[i],24*i+basex+xx,text_y)
  235.       draw_text(24*i+basex+xx+26,text_y,200,line_height,Element_Info[i])
  236.       xx += text_size(Element_Info[i]).width
  237.     end
  238.     @line += 1
  239.   end
  240.  
  241.   def draw_enemy_parameter
  242.     contents.font.out_color = text_color(1)
  243.     atk = @enemy.atk_elements
  244.     t = "< ATK >"
  245.     tsize = text_size("< ATK >").width
  246.     size = tsize+@enemy.atk_elements.size*24
  247.     basex = mid_x(size)
  248.     draw_text(basex,text_y,tsize+8,line_height,t)
  249.     atk.each_with_index do |icon,index|
  250.       draw_icon(Element_Icon[icon],basex+tsize+(index*24)+8,text_y)
  251.     end
  252.     @line += 1
  253.   end
  254.  
  255.   def draw_enemy_drop_items
  256.     kind = 0
  257.     @enemy.enemy.drop_items.each do |item|
  258.       kind += 1 if item.kind == 0
  259.     end
  260.     return if kind == @enemy.enemy.drop_items.size    
  261.     contents.font.size = 16
  262.     drops = []
  263.     size = []
  264.     denom = []
  265.     i = 0
  266.     @enemy.enemy.drop_items.each do |item|  
  267.       next if item.kind == 0
  268.       drops[i] = [] if drops[i].nil?
  269.       denom[i] = [] if denom[i].nil?
  270.       size[i] = 0 if size[i].nil?      
  271.       case item.kind
  272.       when 1
  273.         drop = $data_items[item.data_id]
  274.       when 2
  275.         drop = $data_weapons[item.data_id]
  276.       when 3
  277.         drop = $data_armors[item.data_id]
  278.       end
  279.       size[i] += 24+text_size(drop.name).width+text_size(" #{(100*1.0/item.denominator).to_i}%").width
  280.       denom[i].push(" #{(100*1.0/item.denominator).to_i}%")
  281.       drops[i].push(drop)
  282.       i += 1 if drops[i].size == 4
  283.     end
  284.    
  285.     contents.font.size = 24
  286.     s = 24+text_size(Drop_IconText[1]).width
  287.     basex = mid_x(s+size[0])
  288.     draw_icon(Drop_IconText[0],basex,text_y)
  289.     draw_text(basex+24,text_y,s,line_height,Drop_IconText[1])
  290.     contents.font.size = 16
  291.    
  292.     l = 0
  293.     drops.each_with_index do |drop,index|
  294.       if l == 0
  295.         basex = contents.width/2.0-(size[index]+s)/2.0
  296.       else
  297.         basex = contents.width/2.0-size[index]/2.0    
  298.       end
  299.       xx = 0
  300.       drop.each_with_index do |item,ii|
  301.         if l == 0
  302.           draw_icon(item.icon_index,24*ii+basex+xx+s,text_y)
  303.           draw_text(24*ii+basex+xx+24+s,text_y,200,line_height,item.name+denom[index][ii])
  304.         else
  305.           draw_icon(item.icon_index,24*ii+basex+xx,text_y)
  306.           draw_text(24*ii+basex+xx+24,text_y,200,line_height,item.name+denom[index][ii])          
  307.         end
  308.         xx += text_size(item.name).width+text_size(denom[index][ii]).width
  309.       end
  310.       l += 1
  311.       @line += 1
  312.     end
  313.   end
  314.  
  315.   def draw_enemy_steal_items
  316.     return if !$imported["YEA-StealItems"]
  317.     return if @enemy.stealable_items.empty?    
  318.     contents.font.size = 16
  319.     drops = []
  320.     size = []
  321.     denom = []
  322.     i = 0
  323.     @enemy.stealable_items.each do |item|  
  324.       next if item.kind == 0
  325.       drops[i] = [] if drops[i].nil?
  326.       size[i] = 0 if size[i].nil?      
  327.       denom[i] = [] if denom[i].nil?
  328.       case item.kind
  329.       when 1
  330.         drop = $data_items[item.data_id]
  331.       when 2
  332.         drop = $data_weapons[item.data_id]
  333.       when 3
  334.         drop = $data_armors[item.data_id]
  335.       end
  336.       size[i] += 24+text_size(drop.name).width+text_size(" #{(item.rate*100).to_i}%").width
  337.       denom[i].push(" #{(item.rate*100).to_i}%")
  338.       drops[i].push(drop)
  339.       i += 1 if drops[i].size == 4
  340.     end
  341.    
  342.     contents.font.size = 24
  343.     s = 24+text_size(Steal_IconText[1]).width
  344.     basex = mid_x(s+size[0])
  345.     draw_icon(Steal_IconText[0],basex,text_y)
  346.     draw_text(basex+24,text_y,s,line_height,Steal_IconText[1])
  347.     contents.font.size = 16
  348.    
  349.     l = 0
  350.     drops.each_with_index do |drop,index|
  351.       basex = contents.width/2.0-size[index]/2.0
  352.       basex = contents.width/2.0-(s+size[index])/2.0 if l == 0
  353.       xx = 0
  354.       drop.each_with_index do |item,ii|
  355.         if l == 0
  356.           draw_icon(item.icon_index,24*ii+basex+xx+s,text_y)
  357.           draw_text(24*ii+basex+xx+24+s,text_y,200,line_height,item.name+denom[index][ii])
  358.         else
  359.           draw_icon(item.icon_index,24*ii+basex+xx,text_y)
  360.           draw_text(24*ii+basex+xx+24,text_y,200,line_height,item.name)
  361.         end
  362.         xx += text_size(item.name).width+text_size(denom[index][ii]).width
  363.       end
  364.       l += 1
  365.       @line += 1
  366.     end
  367.   end
  368.  
  369.   def draw_enemy_exp_ap_gold
  370.     contents.font.size = 24
  371.     if defined?(@enemy.jp)
  372.       text = "#{@enemy.enemy.exp}EXP - #{@enemy.jp}AP - #{@enemy.enemy.gold}#{Vocab::currency_unit}"
  373.     else
  374.       text = "#{@enemy.enemy.exp}EXP - #{@enemy.enemy.gold}#{Vocab::currency_unit}"
  375.     end
  376.     size = text_size(text).width+24
  377.     basex = mid_x(size)
  378.     draw_text(basex,text_y,size,line_height,text)
  379.     draw_icon(Gold_Icon,basex+size-24,text_y)
  380.     @line += 1
  381.   end
  382.  
  383.   def text_y
  384.     @line*line_height+Start_Y
  385.   end
  386.  
  387.   def mid_x(size)
  388.     return contents.width/2.0-size/2.0
  389.   end
  390.  
  391.  
  392.   def update
  393.     if @temp_enemy != @enemy
  394.       refresh
  395.       @temp_enemy = @enemy
  396.     end
  397.     update_back_sprite
  398.   end
  399.  
  400.   def update_back_sprite
  401.     @back_sprite.visible = (WindowMode == 1 && self.visible)
  402.     @back_sprite.y = y
  403.     @back_sprite.opacity = openness
  404.     @back_sprite.update
  405.   end  
  406.  
  407.   def dispose
  408.     super
  409.     @back_bitmap.dispose
  410.     @back_sprite.dispose
  411.   end
  412. end
  413.  
  414. class Scene_Battle < Scene_Base
  415.   alias dhoom_enemyscan_scbat_create_all_windows create_all_windows
  416.   def create_all_windows
  417.     dhoom_enemyscan_scbat_create_all_windows
  418.     create_enemyscan_window
  419.   end
  420.  
  421.   def create_enemyscan_window
  422.     @enemyscan_window = Window_EnemyScan.new
  423.     @enemyscan_window.visible = false
  424.     @enemyscan_wait = false
  425.   end
  426.  
  427.   if $imported[:TSBS]
  428.   alias dhoom_enemyscan_scbat_tsbs_apply_item tsbs_apply_item
  429.   def tsbs_apply_item(target, item, subj = @subject)    
  430.     dhoom_enemyscan_scbat_tsbs_apply_item(target, item, subj)
  431.     if item.is_a?(RPG::Skill) and item.scan_enemy and target.result.used and !@enemyscan_wait
  432.       @enemyscan_window.enemy = target
  433.       @enemyscan_window.show
  434.       @status_window.hide
  435.       @actor_command_window.hide
  436.       @log_window.clear
  437.       @enemyscan_wait = Dhoom::EnemyScanWindow::Scan_Window_Wait
  438.       wait_for_scan_enemy
  439.     end    
  440.   end
  441.   end
  442.  
  443.   alias dhoom_enemyscan_scbat_apply_item_effects apply_item_effects
  444.   def apply_item_effects(target, item)
  445.     dhoom_enemyscan_scbat_apply_item_effects(target, item)
  446.     if item.is_a?(RPG::Skill) and item.scan_enemy and target.result.used
  447.       @enemyscan_window.enemy = target
  448.       @enemyscan_window.visible = true
  449.       @status_window.visible = false
  450.       @log_window.clear
  451.       @enemyscan_wait = Dhoom::EnemyScanWindow::Scan_Window_Wait
  452.       wait_for_scan_enemy
  453.     end
  454.   end
  455.  
  456.   def wait_for_scan_enemy
  457.     while @enemyscan_wait > 0
  458.       @enemyscan_wait -= 1  
  459.       Graphics.update
  460.       Input.update
  461.       update_all_windows
  462.       break if Input.trigger?(:B)
  463.     end
  464.     @enemyscan_wait = false
  465.     @actor_command_window.show
  466.     @status_window.show
  467.     @enemyscan_window.hide
  468.   end
  469. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement