marlosgama

Untitled

Jul 2nd, 2020
1,263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 8.64 KB | None | 0 0
  1. #==============================================================================
  2. # ** Game_Event
  3. #------------------------------------------------------------------------------
  4. #  Esta classe lida com o evento.
  5. #------------------------------------------------------------------------------
  6. #  Autor: Valentine
  7. #==============================================================================
  8.  
  9. class Game_Event
  10.  
  11.     include Game_Character, Game_Battler, Game_Enemy
  12.  
  13.     attr_reader   :id
  14.     attr_reader   :hp
  15.     # Permite a alteração de self.mp, nos casos em que seu valor seja acrescido ou
  16.     #diminuído, a partir da leitura do valor original de mp
  17.     attr_reader   :mp
  18.     attr_reader   :target
  19.     attr_reader   :tile_id
  20.     attr_reader   :direction
  21.     attr_writer   :parallel_process_waiting
  22.     attr_accessor :x
  23.     attr_accessor :y
  24.     attr_accessor :map_id
  25.    
  26.     def initialize(id, pages)
  27.         @id = id
  28.         @pages = pages
  29.         @target = Target.new
  30.         @move_succeed = true
  31.         @move_route_forcing = false
  32.         @parallel_process_waiting = nil
  33.         clear_enemy
  34.         clear_target
  35.         clear_states
  36.         clear_buffs
  37.         refresh
  38.     end
  39.  
  40.     def enemy?
  41.         @enemy_id > 0
  42.     end
  43.  
  44.     def in_battle?
  45.         @target.id >= 0
  46.     end
  47.    
  48.     def erased?
  49.         enemy? && dead?
  50.     end
  51.  
  52.     def enemy
  53.         $data_enemies[@enemy_id]
  54.     end
  55.  
  56.     def clear_enemy
  57.         @action_time = Time.now + Configs::ATTACK_TIME
  58.         @respawn_time = Time.now
  59.         @escape = false
  60.         @hp = 0
  61.         @sight = 10
  62.     end
  63.  
  64.     def refresh
  65.         new_page = find_global_proper_page
  66.         # Executa o clear_page_settings se não tiver página e a atualização
  67.         #estiver ocorrendo ao instânciar a classe
  68.         setup_page(new_page) if !new_page || new_page != @page
  69.         @stop_count = Time.now + rand(@stop_count_threshold)
  70.     end
  71.  
  72.     def setup_page(new_page)
  73.         @page = new_page
  74.         if @page
  75.             setup_page_settings
  76.         else
  77.             clear_page_settings
  78.         end
  79.     end
  80.  
  81.     def clear_page_settings
  82.         @character_index = 0
  83.         @tile_id = 0
  84.         @direction = Constants::DIR_DOWN
  85.         @move_type = 0
  86.         @move_frequency = 3
  87.         @through = true
  88.         @trigger = nil
  89.         @list = nil
  90.         @interpreter = nil
  91.         @enemy_id = 0
  92.         @stop_count_threshold = 1
  93.         @battle_stop_count_threshold = 1
  94.         clear_enemy
  95.         clear_target
  96.     end
  97.  
  98.     def setup_page_settings
  99.         @character_index = @page.graphic.character_index
  100.         @tile_id = @page.graphic.tile_id
  101.         @direction = @page.graphic.direction
  102.         @move_type = @page.move_type
  103.         @move_frequency = @page.move_frequency
  104.         @through = @page.through
  105.         @priority_type = @page.priority_type
  106.         @trigger = @page.trigger
  107.         @list = @page.list
  108.         @interpreter = @trigger == 4 ? Game_Interpreter.new : nil
  109.         enemy_id, frequency = battle_parameters
  110.         @enemy_id = enemy_id
  111.         @frequency_battle = frequency
  112.         @stop_count_threshold = stop_count_threshold / 40
  113.         @battle_stop_count_threshold = battle_stop_count_threshold / 40
  114.         if enemy?
  115.             setup_enemy_settings
  116.         # Se o inimigo agora é um evento
  117.         else
  118.             clear_enemy
  119.             clear_target
  120.         end
  121.     end
  122.  
  123.     def setup_enemy_settings
  124.         @param_base = $data_enemies[@enemy_id].params
  125.         @sight = $data_enemies[@enemy_id].sight
  126.         @escape = $data_enemies[@enemy_id].escape
  127.         @hp = mhp
  128.         @mp = mmp
  129.     end
  130.  
  131.     def battle_parameters
  132.         if @list[0].code == 108 && @list[0].parameters[0].start_with?('Enemy')
  133.             enemy_id = @list[0].parameters[0].split('=')[1].to_i
  134.             frequency = @list[1].code == 108 ? @list[1].parameters[0].split('=')[1].to_i : @move_frequency
  135.             return enemy_id, frequency
  136.         end
  137.         return 0, 0
  138.     end
  139.  
  140.     def collide_with_characters?(x, y)
  141.         super || collide_with_players?(x, y)
  142.     end
  143.    
  144.     def stop_count_threshold
  145.         30 * (5 - @move_frequency)
  146.     end
  147.  
  148.     def battle_stop_count_threshold
  149.         30 * (5 - @frequency_battle)
  150.     end
  151.    
  152.     def find_proper_page(client)
  153.         @pages.reverse.find { |page| conditions_met?(client, page) }
  154.     end
  155.  
  156.     def conditions_met?(client, page)
  157.         c = page.condition
  158.         if c.switch1_valid
  159.             return false unless client.switches[c.switch1_id] || $server.switches[c.switch1_id - Configs::MAX_PLAYER_SWITCHES] && c.switch1_id >= Configs::MAX_PLAYER_SWITCHES
  160.         end
  161.         if c.switch2_valid
  162.             return false unless client.switches[c.switch2_id] || $server.switches[c.switch2_id - Configs::MAX_PLAYER_SWITCHES] && c.switch2_id >= Configs::MAX_PLAYER_SWITCHES
  163.         end
  164.         if c.variable_valid
  165.             return false if client.variables[c.variable_id] < c.variable_value
  166.         end
  167.         if c.self_switch_valid
  168.             key = [client.map_id, @id, c.self_switch_ch]
  169.             return false unless client.self_switches[key]
  170.         end
  171.         if c.item_valid
  172.             return false unless client.actor.items[c.item_id]
  173.         end
  174.         return page
  175.     end
  176.  
  177.     def find_global_proper_page
  178.         @pages.reverse.find { |page| global_conditions_met?(page) }
  179.     end
  180.  
  181.     def global_conditions_met?(page)
  182.         c = page.condition
  183.         if c.switch1_valid
  184.             return false unless $server.switches[c.switch1_id - Configs::MAX_PLAYER_SWITCHES] && c.switch1_id >= Configs::MAX_PLAYER_SWITCHES
  185.         end
  186.         if c.switch2_valid
  187.             return false unless $server.switches[c.switch2_id - Configs::MAX_PLAYER_SWITCHES] && c.switch2_id >= Configs::MAX_PLAYER_SWITCHES
  188.         end
  189.         return true
  190.     end
  191.  
  192.     def check_event_trigger_touch(x, y)
  193.         return unless @trigger == 2
  194.         $server.clients.each do |client|
  195.             next unless client&.in_game? || client.map_id == @map_id || client.pos?(x, y) || normal_priority? || !client.interpreter_running?
  196.             start(client)
  197.             break
  198.         end
  199.     end
  200.  
  201.     def update
  202.         update_self_movement
  203.         update_enemy if enemy?
  204.         update_parallel_process
  205.     end
  206.  
  207.     def update_self_movement
  208.         return if erased?
  209.         return if @stop_count > Time.now
  210.         @stop_count = Time.now + (in_battle? ? @battle_stop_count_threshold : @stop_count_threshold)
  211.         if @move_type == Constants::MOVE_FIXED
  212.             select_target
  213.         elsif @move_type == Constants::MOVE_RANDOM && !in_battle?
  214.             move_random
  215.         elsif in_battle? && @escape && @hp < mhp / 3 && near_the_player?(get_target)
  216.             move_away_from_player(get_target)
  217.         elsif @move_type == Constants::MOVE_TOWARD_PLAYER || in_battle?
  218.             move_type_toward_player
  219.         end
  220.     end
  221.  
  222.     def move_random
  223.         move_straight(rand(4) * 2 + 2, false)
  224.     end
  225.  
  226.     def select_target
  227.         return if $server.maps[@map_id].zero_players?
  228.         target = get_target
  229.         target = find_target unless near_the_player?(target)
  230.         if target
  231.             @target.id = target.id
  232.         else
  233.             clear_target
  234.         end
  235.     end
  236.  
  237.     def move_type_toward_player
  238.         if $server.maps[@map_id].zero_players?
  239.             move_random
  240.             return
  241.         end
  242.         target = get_target
  243.         target = find_target unless near_the_player?(target)
  244.         if target
  245.             @target.id = target.id
  246.             move_toward_player(target)
  247.         else
  248.             clear_target
  249.             move_random
  250.         end
  251.     end
  252.  
  253.     def near_the_player?(target)
  254.         # Aumenta o alcance para seguir jogadores que atacam com armas de longa distância
  255.         target && valid_target?(target) && in_range?(target, @sight + 5)
  256.     end
  257.  
  258.     def move_toward_player(target)
  259.         return if in_front?(target)
  260.         sx = distance_x_from(target.x)
  261.         sy = distance_y_from(target.y)
  262.         if sx.abs > sy.abs
  263.             move_straight(sx > 0 ? Constants::DIR_LEFT : Constants::DIR_RIGHT)
  264.             move_straight(sy > 0 ? Constants::DIR_UP : Constants::DIR_DOWN) if !@move_succeed && sy != 0
  265.         else
  266.             move_straight(sy > 0 ? Constants::DIR_UP : Constants::DIR_DOWN)
  267.             move_straight(sx > 0 ? Constants::DIR_LEFT : Constants::DIR_RIGHT) if !@move_succeed && sx != 0
  268.         end
  269.     end
  270.  
  271.     def move_away_from_player(target)
  272.         sx = distance_x_from(target.x)
  273.         sy = distance_y_from(target.y)
  274.         if sx.abs > sy.abs
  275.             move_straight(sx > 0 ? Constants::DIR_RIGHT : Constants::DIR_LEFT)
  276.             move_straight(sy > 0 ? Constants::DIR_DOWN : Constants::DIR_UP) if !@move_succeed && sy != 0
  277.         else
  278.             move_straight(sy > 0 ? Constants::DIR_DOWN : Constants::DIR_UP)
  279.             move_straight(sx > 0 ? Constants::DIR_RIGHT : Constants::DIR_LEFT) if !@move_succeed && sx != 0
  280.         end
  281.     end
  282.  
  283.     def send_movement
  284.         $server.send_event_movement(self)
  285.     end
  286.  
  287.     def find_target
  288.         $server.clients.find { |client| client&.in_game? && client.map_id == @map_id && in_range?(client, @sight) }
  289.     end
  290.  
  291.     def update_parallel_process
  292.         return unless @interpreter
  293.         if @parallel_process_waiting && Time.now >= @parallel_process_waiting.time
  294.             index = @parallel_process_waiting.index
  295.             # Limpa o processo paralelo de espera, o qual poderá ser eventualmente preenchido,
  296.             #após a execução do interpreter.setup, se houver outro Esperar no restante da lista
  297.             @parallel_process_waiting = nil
  298.             @interpreter.setup(nil, @list, @id, index, self)
  299.         elsif !@parallel_process_waiting
  300.             @interpreter.setup(nil, @list, @id, 0, self)
  301.         end
  302.     end
  303.  
  304.     def empty?(list)
  305.         !list || list.size <= 1
  306.     end
  307.  
  308.     def trigger_in?(triggers)
  309.         triggers.include?(@trigger)
  310.     end
  311.  
  312.     def start(client)
  313.         page = find_proper_page(client)
  314.         return if !page || empty?(page.list)
  315.         client.event_interpreter.setup(client, page.list, @id)
  316.     end
  317.  
  318. end
Advertisement
Add Comment
Please, Sign In to add comment