# frozen_string_literal: true
class PokemonGlobalMetadata
#Map that keeps track of all the npc trainers the player has battled
# [map_id,event_id] =>BattledTrainer
attr_accessor :battledTrainers
end
TIME_FOR_RANDOM_EVENTS = 60#3600 #1 hour
## Extend pbTrainerBattle to call postTrainerBattleAction at the end of every trainer battle
alias original_pbTrainerBattle pbTrainerBattle
def pbTrainerBattle(trainerID, trainerName,endSpeech=nil,
doubleBattle=false, trainerPartyID=0,
canLose=false, outcomeVar=1,
name_override = nil, trainer_type_overide = nil,
event_id = nil, map_id = nil)
trainer_data = GameData::Trainer.get(trainerID,trainerName,trainerPartyID)
displayPreBattleText(trainer_data)
map_id = $game_map.map_id
result = original_pbTrainerBattle(trainerID, trainerName, endSpeech,doubleBattle,trainerPartyID,
canLose, outcomeVar,name_override,trainer_type_overide,event_id,map_id)
updateRematchableTrainer(trainerID, trainerName, trainerPartyID, event_id, nil, map_id) if Settings::GAME_ID == :IF_HOENN
return result
end
def displayPreBattleText(trainer_data)
if trainer_data.battleText && !trainer_data.battleText.empty? && @event_id
messages = trainer_data.battle_text.split("
")
messages.each do |msg|
msg = msg.gsub("", $Trainer.name)
pbCallBub(2,@event_id)
pbMessage(msg)
end
end
end
# Important: Use this instead of pbDoubleBattle and pbTripleBattle so that the trainers are rematchable!
# trainers_array is an array of 2 or 3 arrays defining a trainer like such
# [:TRAINER_CLASS, "Name", eventId]
# e.g.
# [[:TWIN_1,"Gina",12],[:TWIN_2, "Mia", 13]]
def pbMultiTrainerBattle(trainers_array,canLose=false, outcomeVar=1)
battle_size = trainers_array.size
if $Trainer.party.size < battle_size
battle_size = $Trainer.party.size
end
case battle_size
when 1
trainer_id = trainers_array[0][0]
trainer_name = trainers_array[0][1]
return pbTrainerBattle(trainer_id,trainer_name)
when 2
trainer_1 = trainers_array[0]
trainer_1_id = trainer_1[0]
trainer_1_name = trainer_1[1]
trainer_1_event = trainer_1[2]
trainer_2 = trainers_array[1]
trainer_2_id = trainer_2[0]
trainer_2_name = trainer_2[1]
trainer_2_event = trainer_2[2]
trainer1_data = GameData::Trainer.get(trainer_1_id,trainer_1_name,0)
displayPreBattleText(trainer1_data)
result= pbDoubleTrainerBattle(trainer_1_id,trainer_1_name,0,nil,
trainer_2_id,trainer_2_name,0,nil,
canLose,outcomeVar)
if Settings::GAME_ID == :IF_HOENN
updateRematchableTrainer(trainer_1_id, trainer_1_name, 0, trainer_1_event, trainer_2_event)
updateRematchableTrainer(trainer_2_id, trainer_2_name, 0, trainer_2_event, trainer_1_event)
end
return result
when 3
trainer_1 = trainers_array[0]
trainer_1_id = trainer_1[0]
trainer_1_name = trainer_1[1]
trainer_1_event = trainer_1[2]
trainer_2 = trainers_array[1]
trainer_2_id = trainer_2[0]
trainer_2_name = trainer_2[1]
trainer_2_event = trainer_2[2]
trainer_3 = trainers_array[2]
trainer_3_id = trainer_3[0]
trainer_3_name = trainer_3[1]
trainer_3_event = trainer_3[2]
result= pbTripleTrainerBattle(trainer_1_id,trainer_1_name,0,nil,
trainer_2_id,trainer_2_name,0,nil,
trainer_3_id,trainer_3_name,0,nil,
canLose,outcomeVar)
if Settings::GAME_ID == :IF_HOENN
updateRematchableTrainer(trainer_1_id, trainer_1_name, 0, trainer_1_event)
updateRematchableTrainer(trainer_2_id, trainer_2_name, 0, trainer_2_event)
updateRematchableTrainer(trainer_3_id, trainer_3_name, 0, trainer_3_event)
end
return result
end
end
def updateRematchableTrainer(trainerID, trainerName, trainerVersion, event_id=nil, linked_event=nil, map_id = nil)
event_id = @event_id unless event_id
map_id = $game_map.map_id unless map_id
trainer = registerBattledTrainer(event_id,map_id,trainerID,trainerName,trainerVersion,linked_event)
makeRebattledTrainerTeamGainExp(trainer)
end
#Do NOT call this alone. Rebattlable trainers are always intialized after
# defeating them.
# Having a rematchable trainer that is not registered will cause crashes.
def registerBattledTrainer(event_id, mapId, trainerType, trainerName, trainerVersion=0, linked_event=nil)
key = [event_id,mapId]
$PokemonGlobal.battledTrainers = {} unless $PokemonGlobal.battledTrainers
return if $PokemonGlobal.battledTrainers.has_key?(key)
trainer = BattledTrainer.new(trainerType, trainerName, trainerVersion,key)
trainer.setLinkedTrainer(linked_event) if linked_event
trainer.setOverworldSprite(getOverworldSprite(event_id,mapId))
trainer.setLocation(getMapName(mapId))
$PokemonGlobal.battledTrainers[key] = trainer
echoln "Registered rematchable trainer #{key}"
return trainer
end
def getOverworldSprite(event_id,mapId)
current_map = $game_map.map_id
if mapId == current_map
event = $game_map.events[event_id]
else
map = $MapFactory.getMap(mapId,false)
event = map&.events[event_id]
end
if event
return event.character_name
end
return ""
end
def unregisterBattledTrainer(event_id, mapId)
key = [event_id,mapId]
$PokemonGlobal.battledTrainers = {} unless $PokemonGlobal.battledTrainers
if $PokemonGlobal.battledTrainers.has_key?(key)
$PokemonGlobal.battledTrainers[key] =nil
echoln "Unregistered Battled Trainer #{key}"
else
echoln "Could not unregister Battled Trainer #{key}"
end
end
def resetTrainerRebattle(event_id, map_id)
trainer = getRebattledTrainer(event_id,map_id)
trainerType = trainer.trainerType
trainerName = trainer.trainerName
unregisterBattledTrainer(event_id,map_id)
registerBattledTrainer(event_id,map_id,trainerType,trainerName)
end
def updateRebattledTrainer(updated_trainer)
key = updated_trainer.trainerKey
updateRebattledTrainerWithKey(key,updated_trainer)
end
def updateRebattledTrainerWithKey(key,updated_trainer)
$PokemonGlobal.battledTrainers = {} if !$PokemonGlobal.battledTrainers
$PokemonGlobal.battledTrainers[key] = updated_trainer
end
def getRebattledTrainerKey(event_id, map_id)
return [event_id,map_id]
end
def getRebattledTrainerFromKey(key)
$PokemonGlobal.battledTrainers = {} if !$PokemonGlobal.battledTrainers
return $PokemonGlobal.battledTrainers[key]
end
def getRebattledTrainer(event_id,map_id)
key = getRebattledTrainerKey(event_id, map_id)
return getRebattledTrainerFromKey(key)
end