mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2026-07-22 07:37:00 +00:00
Update 6.8
This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
OVERWORLD_POKEMON_EVENT_NAME = "OverworldPokemon"
|
||||
LEGENDARY_EVENT_NAME = "Legendary"
|
||||
# For adding wild overworld Pokemon as static events.
|
||||
#
|
||||
# The event needs to have the name OverworldPokemon and be have a first comment at the top setup like this
|
||||
# species = :SPECIES -> :SPECIES is the symbol of the Pokemon this event should be
|
||||
# min_level = 11 -> A number for the minimum level
|
||||
# max_level = 20 -> A number for the maximum level
|
||||
# behavior_roaming -> (Optional) The roaming behavior if it needs to be different from the default for that pokemon
|
||||
# behavior_noticed -> (Optional) The noticed behavior if it needs to be different from the default for that pokemon
|
||||
# spawn_chance ->(Optional) Random % chance for the event to actually spawn every time you enter the map
|
||||
#
|
||||
# Exemple:
|
||||
# OverworldPokemon
|
||||
# species= :SHARPEDO
|
||||
# level= 99
|
||||
# behavior_roaming=:still_teleport
|
||||
# behavior_noticed=:skittish
|
||||
#
|
||||
# This will automatically set the events graphic to the Pokemon. The event should be a parrallel process with a script call to overworldPokemonBehavior
|
||||
# See the EVENT_TEMPLATES map for an example (should be event #10 in there)
|
||||
#
|
||||
class Game_Event < Game_Character
|
||||
# Returns an array of lines in the first comment block at the top of the event.
|
||||
# Returns nil if the first command isn't a comment.
|
||||
def first_comment_block
|
||||
return nil if !@page || !@page.list || @page.list.empty?
|
||||
list = @page.list
|
||||
first_cmd = list[0]
|
||||
# Only proceed if the first line is a comment (code 108)
|
||||
return nil if first_cmd.code != 108
|
||||
|
||||
# Collect first line + continuation lines
|
||||
lines = [first_cmd.parameters[0]]
|
||||
i = 1
|
||||
while i < list.length && list[i].code == 408
|
||||
lines << list[i].parameters[0]
|
||||
i += 1
|
||||
end
|
||||
return lines # Array of strings
|
||||
end
|
||||
end
|
||||
|
||||
class Game_Map
|
||||
alias ow_game_map_create_new_event create_new_game_event
|
||||
|
||||
def create_new_game_event(event)
|
||||
# Only process events that actually belong to this map
|
||||
unless @map.events[event.id] == event
|
||||
return ow_game_map_create_new_event(event)
|
||||
end
|
||||
|
||||
if Settings::HOENN && event.name == OVERWORLD_POKEMON_EVENT_NAME
|
||||
begin
|
||||
game_event = StaticOverworldPokemonEvent.new(@map_id, event, self)
|
||||
setup_overworld_pokemon_from_comments(game_event)
|
||||
return game_event if game_event
|
||||
rescue
|
||||
return ow_game_map_create_new_event(event)
|
||||
end
|
||||
elsif event.name.start_with?(LEGENDARY_EVENT_NAME)
|
||||
species = extract_legendary_species_from_event_name(event.name)
|
||||
unless is_legendary_active?(species)
|
||||
event = ow_game_map_create_new_event(event)
|
||||
event.erase
|
||||
return event
|
||||
end
|
||||
end
|
||||
|
||||
return ow_game_map_create_new_event(event)
|
||||
end
|
||||
|
||||
def extract_legendary_species_from_event_name(eventName)
|
||||
match = eventName.match(/#{Regexp.escape(LEGENDARY_EVENT_NAME)}\(([^)]+)\)/) # Capture anything inside parentheses
|
||||
species = match[1] if match && match.length > 0
|
||||
return species.to_sym if species
|
||||
end
|
||||
|
||||
def setup_overworld_pokemon(event, pokemon, terrain = :Land, behavior_roaming = nil, behavior_noticed = nil)
|
||||
event.setup_pokemon(pokemon.species, pokemon.level, terrain, behavior_roaming, behavior_noticed)
|
||||
event.set_shiny if pokemon.isShiny?
|
||||
event.manual_ow_pokemon = true
|
||||
end
|
||||
|
||||
def setup_overworld_pokemon_from_comments(event)
|
||||
params = extract_parameters_from_comments(event)
|
||||
unless params && params.is_a?(Hash)
|
||||
raise "Error: Couldn't setup overworld Pokemon for event #{event.id} in map #{@map_id}"
|
||||
end
|
||||
spawn_chance = params[:spawn_chance]
|
||||
spawn_chance = 100 unless spawn_chance && spawn_chance.is_a?(Integer)
|
||||
should_spawn = spawn_chance >= rand(0..100)
|
||||
if should_spawn
|
||||
species = params[:species]
|
||||
min_level = params[:min_level]
|
||||
max_level = params[:max_level]
|
||||
terrain = params[:terrain] || :Land
|
||||
level = choose_level(min_level, max_level)
|
||||
ability = params[:ability]
|
||||
behavior_roaming = params[:behavior_roaming]
|
||||
behavior_noticed = params[:behavior_noticed]
|
||||
|
||||
always_on_top = event.always_on_top
|
||||
event.setup_pokemon(species, level, terrain, behavior_roaming, behavior_noticed)
|
||||
event.pokemon.ability= ability if ability
|
||||
event.set_swimming if params[:swimming]
|
||||
event.set_shiny if params[:shiny]
|
||||
event.always_on_top = always_on_top
|
||||
event.manual_ow_pokemon = true
|
||||
event.set_post_battle_switch(params[:post_battle_switch]) if params[:post_battle_switch]
|
||||
else
|
||||
event.erase
|
||||
end
|
||||
end
|
||||
|
||||
def extract_parameters_from_comments(event)
|
||||
comments = event.first_comment_block
|
||||
return nil if !comments || comments.empty?
|
||||
result = {}
|
||||
comments.each do |line|
|
||||
# Matches species = :PIKACHU (all caps after :)
|
||||
if line =~ /species\s*=\s*:(\b[A-Z0-9_]+\b)/
|
||||
result[:species] = $1.to_sym
|
||||
# Matches level = 25 (any integer)
|
||||
elsif line =~ /min_level\s*=\s*(\d+)/
|
||||
result[:min_level] = $1.to_i
|
||||
elsif line =~ /max_level\s*=\s*(\d+)/
|
||||
result[:max_level] = $1.to_i
|
||||
# Matches behavior_roaming = :random (any ruby symbol)
|
||||
elsif line =~ /behavior_roaming\s*=\s*:(\w+)/
|
||||
result[:behavior_roaming] = $1.to_sym
|
||||
# Matches behavior_noticed = :random (any ruby symbol)
|
||||
elsif line =~ /behavior_noticed\s*=\s*:(\w+)/
|
||||
result[:behavior_noticed] = $1.to_sym
|
||||
elsif line =~ /terrain\s*=\s*:(\w+)/
|
||||
result[:terrain] = $1.to_sym
|
||||
elsif line =~ /spawn_chance\s*=\s*(\d+)/
|
||||
result[:spawn_chance] = $1.to_i
|
||||
elsif line =~ /swimming/
|
||||
result[:swimming] = true
|
||||
elsif line =~ /flying/
|
||||
result[:flying] = true
|
||||
elsif line =~ /shiny/
|
||||
result[:shiny] = true
|
||||
elsif line =~ /ability\s*=\s*:(\w+)/
|
||||
result[:ability] = $1.to_sym
|
||||
elsif line =~ /switch\s*=\s*(\d+)/ # A switch that will be turned on after the pokemon is battled
|
||||
result[:post_battle_switch] = $1.to_i
|
||||
end
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
def choose_level(min_level, max_level)
|
||||
# raise "No level defined" if min_level.nil? && max_level.nil?
|
||||
return min_level if max_level.nil?
|
||||
return max_level if min_level.nil?
|
||||
return max_level if min_level > max_level
|
||||
rand(min_level..max_level)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user