From c3cd344ad92b90f1de320f6d7a68839fb8514a3a Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Sun, 10 Nov 2024 18:33:47 -0500 Subject: [PATCH] Fix WriteMonster weirdmatch --- src/dungeon_serializer.c | 320 +++++++++++++++------------------------ 1 file changed, 123 insertions(+), 197 deletions(-) diff --git a/src/dungeon_serializer.c b/src/dungeon_serializer.c index c83df6003..384165657 100644 --- a/src/dungeon_serializer.c +++ b/src/dungeon_serializer.c @@ -249,227 +249,153 @@ static void WriteDungeonMonsters(DataSerializer *seri) WriteMonster(seri, gDungeon->wildPokemon[i]); } -// TODO: Rewrite like ReadMonster static void WriteMonster(DataSerializer *seri, Entity *src) { - Position *pos; EntityInfo *info; - s32 counter; - EntityInfo info2; - u32 uStack_ac; - u32 uStack_a8; - HiddenPower *psStack_a4; - u8 *temp1; - u8 *temp2; - AITarget *temp3; - u8 *puStack_a0; - u32 *puStack_9c; - u32 *puStack_98; - u32 *puStack_94; - u8 *puStack_90; - Sleep *puStack_8c; - NonVolatile *puStack_88; - Immobilize *puStack_84; - Volatile *puStack_80; - Charging *puStack_7c; - Protection *puStack_78; - Waiting *puStack_74; - Linked *puStack_70; - MoveStatus *puStack_6c; - ItemStatus *puStack_68; - TransformStatus *puStack_64; - EyesightStatus *puStack_60; - Muzzled *pbStack_5c; - bool8 *pbStack_58; - bool8 *pbStack_54; - bool8 *pbStack_50; - bool8 *puStack_4c; - bool8 *pbStack_48; - bool8 *pbStack_44; - bool8 *pbStack_40; - bool8 *pbStack_3c; - u8 *puStack_38; - u8 *puStack_34; - bool8 *pbStack_30; - u8 *puStack_2c; - u8 *puStack_28; - u8 *puStack_24; + s32 i; + EntityInfo blankInfo; + u32 one; + u32 zero; + zero = 0; + one = 1; + + WriteU8(seri, 0xAA); + WriteU8(seri, 0x55); - uStack_a8 = 0; - uStack_ac = 1; - WriteU8(seri,0xaa); - WriteU8(seri,0x55); if (EntityExists(src)) { info = GetEntInfo(src); - WriteBytes(seri,&uStack_ac,1); - WriteBytes(seri,&src->pos.x,1); - WriteBytes(seri,&src->pos.y,1); - WriteBytes(seri,&src->isVisible,1); - WriteBytes(seri,&src->spawnGenID,2); + WriteBytes(seri, &one, 1); + WriteBytes(seri, &src->pos.x, 1); + WriteBytes(seri, &src->pos.y, 1); + WriteBytes(seri, &src->isVisible, 1); + WriteBytes(seri, &src->spawnGenID, 2); } else { - memset(&info2,0,sizeof(EntityInfo)); - info = &info2; - WriteBytes(seri,&uStack_a8,1); - WriteBytes(seri,&uStack_a8,1); - WriteBytes(seri,&uStack_a8,1); - WriteBytes(seri,&uStack_a8,1); - WriteBytes(seri,&uStack_a8,2); + memset(&blankInfo, 0, sizeof(EntityInfo)); + + info = &blankInfo; + WriteBytes(seri, &zero, 1); + WriteBytes(seri, &zero, 1); + WriteBytes(seri, &zero, 1); + WriteBytes(seri, &zero, 1); + WriteBytes(seri, &zero, 2); } - WriteU16(seri,info->flags); - WriteMonsterID(seri,info->apparentID); - WriteMonsterID(seri,info->id); - WriteBool8(seri,info->isNotTeamMember); - WriteBool8(seri,info->isTeamLeader); - WriteU8(seri,info->shopkeeper); - WriteU8(seri,info->level); - WriteU8(seri,info->teamIndex); - WriteJoinedAt(seri,&info->joinedAt); - WriteS16(seri,info->IQ); - WriteS16(seri,info->HP); - WriteS16(seri,info->maxHPStat); - WriteS16(seri,info->originalHP); - WriteU8(seri,info->atk[0]); - WriteU8(seri,info->atk[1]); - WriteU8(seri,info->def[0]); - WriteU8(seri,info->def[1]); - WriteU32(seri,info->exp); - WriteS16(seri,info->offensiveStages[0]); - WriteS16(seri,info->offensiveStages[1]); - WriteS16(seri,info->defensiveStages[0]); - WriteS16(seri,info->defensiveStages[1]); - WriteS16(seri,info->hitChanceStages[0]); - WriteS16(seri,info->hitChanceStages[1]); - WriteS16(seri,info->flashFireBoost); - WriteS32(seri,info->offensiveMultipliers[0]); - WriteS32(seri,info->offensiveMultipliers[1]); - WriteS32(seri,info->defensiveMultipliers[0]); - WriteS32(seri,info->defensiveMultipliers[1]); - WriteActionContainer(seri,&info->action); - WriteType(seri,info->types[0]); - WriteType(seri,info->types[1]); - WriteAbility(seri,info->abilities[0]); - WriteAbility(seri,info->abilities[1]); - WriteItem(seri,&info->heldItem); + + WriteU16(seri, info->flags); + WriteMonsterID(seri, info->apparentID); + WriteMonsterID(seri, info->id); + WriteBool8(seri, info->isNotTeamMember); + WriteBool8(seri, info->isTeamLeader); + WriteU8(seri, info->shopkeeper); + WriteU8(seri, info->level); + WriteU8(seri, info->teamIndex); + WriteJoinedAt(seri, &info->joinedAt); + WriteS16(seri, info->IQ); + WriteS16(seri, info->HP); + WriteS16(seri, info->maxHPStat); + WriteS16(seri, info->originalHP); + WriteU8(seri, info->atk[0]); + WriteU8(seri, info->atk[1]); + WriteU8(seri, info->def[0]); + WriteU8(seri, info->def[1]); + WriteU32(seri, info->exp); + WriteS16(seri, info->offensiveStages[0]); + WriteS16(seri, info->offensiveStages[1]); + WriteS16(seri, info->defensiveStages[0]); + WriteS16(seri, info->defensiveStages[1]); + WriteS16(seri, info->hitChanceStages[0]); + WriteS16(seri, info->hitChanceStages[1]); + WriteS16(seri, info->flashFireBoost); + WriteS32(seri, info->offensiveMultipliers[0]); + WriteS32(seri, info->offensiveMultipliers[1]); + WriteS32(seri, info->defensiveMultipliers[0]); + WriteS32(seri, info->defensiveMultipliers[1]); + WriteActionContainer(seri, &info->action); + WriteType(seri, info->types[0]); + WriteType(seri, info->types[1]); + WriteAbility(seri, info->abilities[0]); + WriteAbility(seri, info->abilities[1]); + WriteItem(seri, &info->heldItem); WriteMonsterUnk64(seri, info->unk64); - temp3 = &info->aiTarget; - temp2 = info->IQSkillMenuFlags; - temp1 = info->IQSkillFlags; - puStack_a0 = &info->tactic; - psStack_a4 = &info->hiddenPower; - puStack_9c = &info->unk98; - puStack_98 = &info->unk9C; - puStack_94 = &info->unkA0; - puStack_8c = &info->sleep; - puStack_88 = &info->nonVolatile; - puStack_84 = &info->immobilize; - puStack_80 = &info->volatileStatus; - puStack_7c = &info->charging; - puStack_78 = &info->protection; - puStack_74 = &info->waitingStruct; - puStack_70 = &info->linked; - puStack_6c = &info->moveStatus; - puStack_68 = &info->itemStatus; - puStack_64 = &info->transformStatus; - puStack_60 = &info->eyesightStatus; - pbStack_5c = &info->muzzled; - pbStack_58 = &info->powerEars; - pbStack_54 = &info->scanning; - pbStack_50 = &info->stairSpotter; - puStack_4c = &info->unkF3; - pbStack_48 = &info->grudge; - puStack_34 = &info->expMultiplier; - pbStack_44 = &info->exposed; - pbStack_40 = &info->isColorChanged; - pbStack_3c = &info->bossFlag; - puStack_38 = &info->terrifiedTurns; - pbStack_30 = &info->useHeldItem; - puStack_2c = &info->perishSongTurns; - puStack_28 = &info->unkFE; - puStack_24 = &info->unkFF; - puStack_90 = &info->clientType; - pos = info->prevPos; - for (counter = 0; counter < NUM_PREV_POS; counter++) { - WriteTilePos(seri, pos); - pos++; - } + for (i = 0; i < NUM_PREV_POS; i++) + WriteTilePos(seri, &info->prevPos[i]); - WriteAITarget(seri,temp3); - WriteIQSkills(seri,temp2); - WriteIQSkills(seri,temp1); - WriteTactic(seri,*puStack_a0); - WriteHiddenPower(seri,psStack_a4); - WriteU32(seri,*puStack_9c); - WriteU32(seri,*puStack_98); - WriteU32(seri,*puStack_94); - WriteSleep(seri,puStack_8c); - WriteNonVolatile(seri,puStack_88); - WriteImmobilize(seri,puStack_84); - WriteVolatile(seri,puStack_80); - WriteCharging(seri,puStack_7c); - WriteProtection(seri,puStack_78); - WriteWaiting(seri,puStack_74); - WriteLinked(seri,puStack_70); - WriteMoveStatus(seri,puStack_6c); - WriteItemStatus(seri,puStack_68); - WriteTransformStatus(seri,puStack_64); - WriteEyesightStatus(seri,puStack_60); - WriteMuzzled(seri,pbStack_5c); - WriteBool8(seri,*pbStack_58); - WriteBool8(seri,*pbStack_54); - WriteBool8(seri,*pbStack_50); - WriteBool8(seri,*puStack_4c); - WriteBool8(seri,*pbStack_48); - WriteU8(seri,*puStack_34); - WriteBool8(seri,*pbStack_44); - WriteBool8(seri,*pbStack_40); - WriteBool8(seri,*pbStack_3c); - WriteU8(seri,*puStack_38); - WriteBool8(seri,*pbStack_30); - WriteU8(seri,*puStack_2c); - WriteU8(seri,*puStack_28); - WriteMonsterUnkFF(seri,*puStack_24); - WriteTargetingDecoy(seri,info->targetingDecoy); - WriteSpeedStage(seri,info->speedStage); - WriteSpeedCounters(seri,info->speedUpCounters,NUM_SPEED_COUNTERS); - WriteSpeedCounters(seri,info->speedDownCounters,NUM_SPEED_COUNTERS); + WriteAITarget(seri, &info->aiTarget); + WriteIQSkills(seri, info->IQSkillMenuFlags); + WriteIQSkills(seri, info->IQSkillFlags); + WriteTactic(seri, info->tactic); + WriteHiddenPower(seri, &info->hiddenPower); + WriteU32(seri, info->unk98); + WriteU32(seri, info->unk9C); + WriteU32(seri, info->unkA0); + WriteSleep(seri, &info->sleep); + WriteNonVolatile(seri, &info->nonVolatile); + WriteImmobilize(seri, &info->immobilize); + WriteVolatile(seri, &info->volatileStatus); + WriteCharging(seri, &info->charging); + WriteProtection(seri, &info->protection); + WriteWaiting(seri, &info->waitingStruct); + WriteLinked(seri, &info->linked); + WriteMoveStatus(seri, &info->moveStatus); + WriteItemStatus(seri, &info->itemStatus); + WriteTransformStatus(seri, &info->transformStatus); + WriteEyesightStatus(seri, &info->eyesightStatus); + WriteMuzzled(seri, &info->muzzled); + WriteBool8(seri, info->powerEars); + WriteBool8(seri, info->scanning); + WriteBool8(seri, info->stairSpotter); + WriteBool8(seri, info->unkF3); + WriteBool8(seri, info->grudge); + WriteU8(seri, info->expMultiplier); + WriteBool8(seri, info->exposed); + WriteBool8(seri, info->isColorChanged); + WriteBool8(seri, info->bossFlag); + WriteU8(seri, info->terrifiedTurns); + WriteBool8(seri, info->useHeldItem); + WriteU8(seri, info->perishSongTurns); + WriteU8(seri, info->unkFE); + WriteMonsterUnkFF(seri, info->unkFF); + WriteTargetingDecoy(seri, info->targetingDecoy); + WriteSpeedStage(seri, info->speedStage); + WriteSpeedCounters(seri, info->speedUpCounters, NUM_SPEED_COUNTERS); + WriteSpeedCounters(seri, info->speedDownCounters, NUM_SPEED_COUNTERS); WriteU8(seri, info->stockpileStage); WriteU8(seri, info->unk113); WriteU8(seri, info->moveRandomly); WriteMoves(seri, &info->moves); WriteBelly(seri, &info->belly); WriteBelly(seri, &info->maxBelly); - WriteBool8(seri,info->aiNextToTarget); - WriteBool8(seri,info->recalculateFollow); - WriteBool8(seri,info->waiting); - WriteBool8(seri,info->unk146); - WriteBool8(seri,info->attacking); - WriteBool8(seri,info->unk149); - WriteBool8(seri,info->unk14A); - WriteBool8(seri,info->unk14B); - WriteBool8(seri,info->unk14C); - WriteU16(seri,info->visualFlags); - WriteU16(seri,info->previousVisualFlags); - WriteBool8(seri,info->unk152); - WriteU8(seri,info->unk153); - WriteBool8(seri,info->unk154); - WriteBool8(seri,info->unk155); - WriteBool8(seri,info->unk156); - WriteU8(seri,info->unk164); - WriteU8(seri,info->unk165); - WriteU8(seri,info->unk166); - WriteU8(seri,info->unk167); - WriteU8(seri,info->unk168); - WriteU8(seri,info->turnsSinceWarpScarfActivation); - WriteTilePos(seri,&(info->targetPos)); + WriteBool8(seri, info->aiNextToTarget); + WriteBool8(seri, info->recalculateFollow); + WriteBool8(seri, info->waiting); + WriteBool8(seri, info->unk146); + WriteBool8(seri, info->attacking); + WriteBool8(seri, info->unk149); + WriteBool8(seri, info->unk14A); + WriteBool8(seri, info->unk14B); + WriteBool8(seri, info->unk14C); + WriteU16(seri, info->visualFlags); + WriteU16(seri, info->previousVisualFlags); + WriteBool8(seri, info->unk152); + WriteU8(seri, info->unk153); + WriteBool8(seri, info->unk154); + WriteBool8(seri, info->unk155); + WriteBool8(seri, info->unk156); + WriteU8(seri, info->unk164); + WriteU8(seri, info->unk165); + WriteU8(seri, info->unk166); + WriteU8(seri, info->unk167); + WriteU8(seri, info->unk168); + WriteU8(seri, info->turnsSinceWarpScarfActivation); + WriteTilePos(seri, &info->targetPos); WriteS32(seri, info->unk174); WriteU16(seri, info->abilityEffectFlags); WriteS16(seri, info->unk1F8); WriteS16(seri, info->mobileTurnTimer); WriteU32(seri, info->expGainedInTurn); - WriteClientType(seri, *puStack_90); + WriteClientType(seri, info->clientType); } static void WriteDungeonFloor(DataSerializer *seri)