Files
infinitefusion-e18/Data/Scripts/053_PIF_Hoenn/TrainerRematches/02_battled_trainer.rb
2025-06-07 08:16:50 -04:00

217 lines
7.7 KiB
Ruby

class BattledTrainer
DELAY_BETWEEN_NPC_TRADES = 180 #In seconds (3 minutes)
MAX_FRIENDSHIP = 100
attr_accessor :trainerType
attr_accessor :trainerName
attr_accessor :currentTeam #list of Pokemon. The game selects in this list for trade offers. They can increase levels & involve as you rebattle them.
#trainers will randomly find items and add them to this list. When they have the :ITEM status, they will
# give one of them at random.
#Items equipped to the Pokemon traded by the player will end up in that list.
#
# If there is an evolution that the trainer can use on one of their Pokemon in that list, they will
# instead use it to evolve their Pokemon.
#
#DNA Splicers/reversers can be used on their Pokemon if they have at least 2 unfused/1 fused
#
#Healing items that are in that list can be used by the trainer in rematches
#
attr_accessor :foundItems
attr_accessor :nb_rematches
#What the trainer currently wants to do
# :IDLE -> Nothing. Normal postbattle dialogue
# Should prompt the player to register the trainer in their phone.
# Or maybe done automatically at the end of the battle?
# :TRADE -> Trainer wants to trade one of its Pokémon with the player
# :BATTLE -> Trainer wants to rebattle the player
# :ITEM -> Trainer has an item they want to give the player
attr_accessor :current_status
attr_accessor :previous_status
attr_accessor :previous_trade_timestamp
attr_accessor :favorite_type
attr_accessor :favorite_pokemon #Used for generating trade offers. Should be set from trainer.txt (todo)
#If empty, then trade offers ask for a Pokemon of a type depending on the trainer's class
attr_accessor :previous_random_events
attr_accessor :has_pending_action
attr_accessor :custom_appearance
attr_accessor :friendship #increases the more you interact with them, unlocks more interact options
attr_accessor :friendship_level
def initialize(trainerType,trainerName,trainerVersion)
@trainerType = trainerType
@trainerName = trainerName
@currentTeam = loadOriginalTrainerTeam(trainerVersion)
@foundItems = []
@nb_rematches = 0
@currentStatus = :IDLE
@previous_status = :IDLE
@previous_trade_timestamp = Time.now-DELAY_BETWEEN_NPC_TRADES
@previous_random_events =[]
@has_pending_action=false
@favorite_type = pick_favorite_type(trainerType)
@friendship = 0
@friendship_level = 0
end
def friendship_level
@friendship_level =0 if !@friendship_level
return @friendship_level
end
def increase_friendship(amount)
@friendship=0 if !@friendship
@friendship_level=0 if !@friendship_level
gain = amount / ((@friendship + 1) ** 0.4)
@friendship += gain
@friendship = MAX_FRIENDSHIP if @friendship > MAX_FRIENDSHIP
echoln "Friendship with #{@trainerName} increased by #{gain.round(2)} (total: #{@friendship.round(2)})"
thresholds = FRIENDSHIP_LEVELS[@trainerType] || []
echoln thresholds
while @friendship_level < thresholds.length && @friendship >= thresholds[@friendship_level]
@friendship_level += 1
trainerClassName = GameData::TrainerType.get(@trainerType).real_name
pbMessage(_INTL("\\C[3]Friendship increased with #{trainerClassName} #{@trainerName}!"))
case @friendship_level
when 1
pbMessage(_INTL("You can now trade with each other!"))
when 2
pbMessage(_INTL("They will now give you items from time to time!"))
when 3
pbMessage(_INTL("You can now partner up with them!"))
end
echoln "🎉 #{@trainerName}'s friendship level increased to #{@friendship_level}!"
end
end
def set_custom_appearance(trainer_appearance)
@custom_appearance = trainer_appearance
end
def pick_favorite_type(trainer_type)
if TRAINER_CLASS_FAVORITE_TYPES.has_key?(trainer_type)
return TRAINER_CLASS_FAVORITE_TYPES[trainer_type].sample
else
return :NORMAL
end
end
def set_pending_action(value)
@has_pending_action=value
end
def log_evolution_event(unevolved_pokemon_species, evolved_pokemon_species)
echoln "NPC Trainer #{@trainerName} evolved their #{get_species_readable_internal_name(unevolved_pokemon_species)} to #{get_species_readable_internal_name(evolved_pokemon_species)}!"
event = BattledTrainerRandomEvent.new(:EVOLVE)
event.unevolved_pokemon = unevolved_pokemon_species
event.evolved_pokemon = evolved_pokemon_species
@previous_random_events = [] unless @previous_random_events
@previous_random_events << event
end
def log_fusion_event(body_pokemon_species, head_pokemon_species, fused_pokemon_species)
echoln "NPC trainer #{@trainerName} fused #{body_pokemon_species} and #{head_pokemon_species}!"
event = BattledTrainerRandomEvent.new(:FUSE)
event.fusion_body_pokemon =body_pokemon_species
event.fusion_head_pokemon =head_pokemon_species
event.fusion_fused_pokemon =fused_pokemon_species
@previous_random_events = [] unless @previous_random_events
@previous_random_events << event
end
def log_unfusion_event(original_fused_pokemon_species, unfused_body_species, unfused_body_head)
echoln "NPC trainer #{@trainerName} unfused #{get_species_readable_internal_name(original_fused_pokemon_species)}!"
event = BattledTrainerRandomEvent.new(:UNFUSE)
event.unfused_pokemon = original_fused_pokemon_species
event.fusion_body_pokemon = unfused_body_species
event.fusion_head_pokemon = unfused_body_head
@previous_random_events = [] unless @previous_random_events
@previous_random_events << event
end
def log_reverse_event(original_fused_pokemon_species, reversed_fusion_species)
echoln "NPC trainer #{@trainerName} reversed #{get_species_readable_internal_name(original_fused_pokemon_species)}!"
event = BattledTrainerRandomEvent.new(:REVERSE)
event.unreversed_pokemon = original_fused_pokemon_species
event.reversed_pokemon = reversed_fusion_species
@previous_random_events = [] unless @previous_random_events
@previous_random_events << event
end
def log_catch_event(new_pokemon_species)
echoln "NPC Trainer #{@trainerName} caught a #{new_pokemon_species}!"
event = BattledTrainerRandomEvent.new(:CATCH)
event.caught_pokemon = new_pokemon_species
@previous_random_events = [] unless @previous_random_events
@previous_random_events << event
end
def clear_previous_random_events()
@previous_random_events = []
end
def loadOriginalTrainer(trainerVersion=0)
return pbLoadTrainer(@trainerType,@trainerName,trainerVersion)
end
def loadOriginalTrainerTeam(trainerVersion=0)
original_trainer = pbLoadTrainer(@trainerType,@trainerName,trainerVersion)
return if !original_trainer
echoln "Loading Trainer #{@trainerType}"
current_party = []
original_trainer.party.each do |partyMember|
echoln "PartyMember: #{partyMember}"
if partyMember.is_a?(Pokemon)
current_party << partyMember
elsif partyMember.is_a?(Array) #normally always gonna be this
pokemon_species = partyMember[0]
pokemon_level = partyMember[1]
current_party << Pokemon.new(pokemon_species,pokemon_level)
else
echoln "Could not add Pokemon #{partyMember} to rematchable trainer's party."
end
end
return current_party
end
def getTimeSinceLastTrade()
@previous_trade_timestamp ||= Time.now - DELAY_BETWEEN_NPC_TRADES
return Time.now - @previous_trade_timestamp
end
def isNextTradeReady?()
return getTimeSinceLastTrade < DELAY_BETWEEN_NPC_TRADES
end
def list_team_unfused_pokemon
list = []
@currentTeam.each do |pokemon|
list << pokemon if !pokemon.isFusion?
end
return list
end
def list_team_fused_pokemon
list = []
@currentTeam.each do |pokemon|
list << pokemon if pokemon.isFusion?
end
return list
end
end