diff --git a/src/trainer_see.c b/src/trainer_see.c index cefb22eef4..2fc033004d 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -360,6 +360,8 @@ static const struct SpriteTemplate sSpriteTemplate_Emote = bool8 CheckForTrainersWantingBattle(void) { u8 i; + u8 trainerObjects[OBJECT_EVENTS_COUNT]; + u8 trainerObjectsCount = 0; if (FlagGet(OW_FLAG_NO_TRAINER_SEE)) return FALSE; @@ -367,17 +369,34 @@ bool8 CheckForTrainersWantingBattle(void) gNoOfApproachingTrainers = 0; gApproachingTrainerId = 0; + // Adds trainers wanting to battle to array for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - u8 numTrainers; - + { if (!gObjectEvents[i].active) continue; if (gObjectEvents[i].trainerType != TRAINER_TYPE_NORMAL && gObjectEvents[i].trainerType != TRAINER_TYPE_BURIED) continue; + trainerObjects[trainerObjectsCount++] = i; + } - numTrainers = CheckTrainer(i); - if (numTrainers == 0xFF) // non-trainerbatle script + // Sorts array by localId + for (i = 1; i <= trainerObjectsCount; i++) + { + u8 x = trainerObjects[i]; + u8 j = i; + while (j > 0 && gObjectEvents[trainerObjects[j-1]].localId > gObjectEvents[x].localId) + { + trainerObjects[j] = trainerObjects[j-1]; + j--; + } + trainerObjects[j] = x; + } + + for (i = 1; i <= trainerObjectsCount; i++) + { + u8 numTrainers; + numTrainers = CheckTrainer(trainerObjects[i]); + if (numTrainers == 0xFF) // non-trainerbattle script { u32 objectEventId = gApproachingTrainers[gNoOfApproachingTrainers - 1].objectEventId; gSelectedObjectEvent = objectEventId;