Files
goldeneye-pc-port/scratch/decode_ailist.c
T
James Dansereau ce05ae7187 Park D309/D310/D311 session evidence logs + referenced diagnostics in scratch/
- Probe logs preserved as evidence: pre-fix standing-still guard lines,
  v1 Trevelyan regression (local-list embedded PRINT strings), clean
  post-fix Caverns run (global PRINTs size=1/global=1 hit once each incl.
  the D309 spin record; local PRINTs NUL-scanned with valid landings; zero
  LABEL-NOT-FOUND / D156 / watchdog lines), D311 freeze watchdog+stack dump.
- D309/D310 diagnostic files referenced by findings.md: frozen thread
  stacks, live m_RunToBondPersistent byte dump, AI-list decoders (original
  NUL-scan + fixed global-only sizing), command name table.
2026-09-18 13:22:50 -04:00

557 lines
24 KiB
C

#include <stdio.h>
#include "aicommands2.h"
extern u8 m_RunToBondPersistent[];
s32 chraiitemsize(u8 *AIList, s32 offset)
{
// matches only as u8* despite text evidence of ai->val structs
switch (AIList[offset])
{
// Cant Use CMD Builder due to different order...
#if defined(USECMDBUILDER)
#ifndef _SYNHILITE
#define _AI_CMD(CMD) /* \
*/ \
case CAT(AI_, CMDNAME): /* \
*/ \
return CAT(CAT(AI_, CMDNAME), _LENGTH);
#define _AI_DEBUG()
#define _AI_CMD_POLYMORPH(CMD, A, P, Q, D)
#define DEFINE(x)
#include <aicommands.def>
#endif
#endif
case AI_GotoNext:
return sizeof(AiGotoNextRecord);
case AI_GotoFirst:
return sizeof(AiGotoFirstRecord);
case AI_Label:
return sizeof(AiLabelRecord);
case AI_Yield:
return sizeof(AiYieldRecord);
case AI_EndList:
return sizeof(AiEndListRecord);
case AI_SetChrAiList:
return sizeof(AiSetChrAiListRecord);
case AI_SetReturnAiList:
return sizeof(AiSetReturnAiListRecord);
case AI_Return:
return sizeof(AiReturnRecord);
case AI_Stop:
return sizeof(AiStopRecord);
case AI_Kneel:
return sizeof(AiKneelRecord);
case AI_PlayAnimation:
return sizeof(AiPlayAnimationRecord);
case AI_IFPlayingAnimation:
return sizeof(AiIFPlayingAnimationRecord);
case AI_PointAtBond:
return sizeof(AiPointAtBondRecord);
case AI_LookSurprised:
return sizeof(AiLookSurprisedRecord);
case AI_TRYSidestepping:
return sizeof(AiTRYSidesteppingRecord);
case AI_TRYSideHopping:
return sizeof(AiTRYSideHoppingRecord);
case AI_TRYSideRunning:
return sizeof(AiTRYSideRunningRecord);
case AI_TRYFiringWalk:
return sizeof(AiTRYFiringWalkRecord);
case AI_TRYFiringRun:
return sizeof(AiTRYFiringRunRecord);
case AI_TRYFiringRoll:
return sizeof(AiTRYFiringRollRecord);
case AI_TRYFireOrAimAtTarget:
return sizeof(AiTRYFireOrAimAtTargetRecord);
case AI_TRYFireOrAimAtTargetKneel:
return sizeof(AiTRYFireOrAimAtTargetKneelRecord);
case AI_IFImFiring: /* enum = 232 despite following enum = 21 in the list */
return sizeof(AiIFImFiringRecord);
case AI_IFImFiringAndLockedForward: /* enum = 231 despite being followed by enum = 22 in the list */
return sizeof(AiIFImFiringAndLockedForwardRecord);
case AI_TRYFireOrAimAtTargetUpdate:
return sizeof(AiTRYFireOrAimAtTargetUpdateRecord);
case AI_TRYFacingTarget:
return sizeof(AiTRYFacingTargetRecord);
case AI_HitChrWithItem:
return sizeof(AiHitChrWithItemRecord);
case AI_ChrHitChr:
return sizeof(AiChrHitChrRecord);
case AI_TRYThrowingGrenade:
return sizeof(AiTRYThrowingGrenadeRecord);
case AI_TRYDroppingItem:
return sizeof(AiTRYDroppingItemRecord);
case AI_RunToPad:
return sizeof(AiRunToPadRecord);
case AI_RunToPadPreset:
return sizeof(AiRunToPadPresetRecord);
case AI_WalkToPad:
return sizeof(AiWalkToPadRecord);
case AI_SprintToPad:
return sizeof(AiSprintToPadRecord);
case AI_StartPatrol:
return sizeof(AiStartPatrolRecord);
case AI_Surrender:
return sizeof(AiSurrenderRecord);
case AI_RemoveMe:
return sizeof(AiRemoveMeRecord);
case AI_ChrRemoveInstant:
return sizeof(AiChrRemoveInstantRecord);
case AI_TRYTriggeringAlarmAtPad:
return sizeof(AiTRYTriggeringAlarmAtPadRecord);
case AI_AlarmOn:
return sizeof(AiAlarmOnRecord);
case AI_AlarmOff:
return sizeof(AiAlarmOffRecord);
case AI_TRYRunFromBond:
return sizeof(AiTRYRunFromBondRecord);
case AI_TRYRunToBond:
return sizeof(AiTRYRunToBondRecord);
case AI_TRYWalkToBond:
return sizeof(AiTRYWalkToBondRecord);
case AI_TRYSprintToBond:
return sizeof(AiTRYSprintToBondRecord);
case AI_TRYFindCover:
return sizeof(AiTRYFindCoverRecord);
case AI_TRYRunToChr:
return sizeof(AiTRYRunToChrRecord);
case AI_TRYWalkToChr:
return sizeof(AiTRYWalkToChrRecord);
case AI_TRYSprintToChr:
return sizeof(AiTRYSprintToChrRecord);
case AI_IFImOnPatrolOrStopped:
return sizeof(AiIFImOnPatrolOrStoppedRecord);
case AI_IFChrDyingOrDead:
return sizeof(AiIFChrDyingOrDeadRecord);
case AI_IFChrDoesNotExist:
return sizeof(AiIFChrDoesNotExistRecord);
case AI_IFISeeBond:
return sizeof(AiIFISeeBondRecord);
case AI_SetNewRandom:
return sizeof(AiSetNewRandomRecord);
case AI_IFRandomLessThan:
return sizeof(AiIFRandomLessThanRecord);
case AI_IFRandomGreaterThan:
return sizeof(AiIFRandomGreaterThanRecord);
case AI_IFICanHearAlarm:
return sizeof(AiIFICanHearAlarmRecord);
case AI_IFAlarmIsOn:
return sizeof(AiIFAlarmIsOnRecord);
case AI_IFGasIsLeaking:
return sizeof(AiIFGasIsLeakingRecord);
case AI_IFIHeardBond:
return sizeof(AiIFIHeardBondRecord);
case AI_IFISeeSomeoneShot:
return sizeof(AiIFISeeSomeoneShotRecord);
case AI_IFISeeSomeoneDie:
return sizeof(AiIFISeeSomeoneDieRecord);
case AI_IFICouldSeeBond:
return sizeof(AiIFICouldSeeBondRecord);
case AI_IFICouldSeeBondsStan:
return sizeof(AiIFICouldSeeBondsStanRecord);
case AI_IFIWasShotRecently:
return sizeof(AiIFIWasShotRecentlyRecord);
case AI_IFIHeardBondRecently:
return sizeof(AiIFIHeardBondRecentlyRecord);
case AI_IFImInRoomWithChr:
return sizeof(AiIFImInRoomWithChrRecord);
case AI_IFIveNotBeenSeen:
return sizeof(AiIFIveNotBeenSeenRecord);
case AI_IFImOnScreen:
return sizeof(AiIFImOnScreenRecord);
case AI_IFMyRoomIsOnScreen:
return sizeof(AiIFMyRoomIsOnScreenRecord);
case AI_IFRoomWithPadIsOnScreen:
return sizeof(AiIFRoomWithPadIsOnScreenRecord);
case AI_IFImTargetedByBond:
return sizeof(AiIFImTargetedByBondRecord);
case AI_IFBondMissedMe:
return sizeof(AiIFBondMissedMeRecord);
case AI_IFMyAngleToBondLessThan:
return sizeof(AiIFMyAngleToBondLessThanRecord);
case AI_IFMyAngleToBondGreaterThan:
return sizeof(AiIFMyAngleToBondGreaterThanRecord);
case AI_IFMyAngleFromBondLessThan:
return sizeof(AiIFMyAngleFromBondLessThanRecord);
case AI_IFMyAngleFromBondGreaterThan:
return sizeof(AiIFMyAngleFromBondGreaterThanRecord);
case AI_IFMyDistanceToBondLessThanDecimeter:
return sizeof(AiIFMyDistanceToBondLessThanDecimeterRecord);
case AI_IFMyDistanceToBondGreaterThanDecimeter:
return sizeof(AiIFMyDistanceToBondGreaterThanDecimeterRecord);
case AI_IFChrDistanceToPadLessThanDecimeter:
return sizeof(AiIFChrDistanceToPadLessThanDecimeterRecord);
case AI_IFChrDistanceToPadGreaterThanDecimeter:
return sizeof(AiIFChrDistanceToPadGreaterThanDecimeterRecord);
case AI_IFMyDistanceToChrLessThanDecimeter:
return sizeof(AiIFMyDistanceToChrLessThanDecimeterRecord);
case AI_IFMyDistanceToChrGreaterThanDecimeter:
return sizeof(AiIFMyDistanceToChrGreaterThanDecimeterRecord);
case AI_TRYSettingMyPresetToChrWithinDistanceDecimeter:
return sizeof(AiTRYSettingMyPresetToChrWithinDistanceDecimeterRecord);
case AI_IFBondDistanceToPadLessThanDecimeter:
return sizeof(AiIFBondDistanceToPadLessThanDecimeterRecord);
case AI_IFBondDistanceToPadGreaterThanDecimeter:
return sizeof(AiIFBondDistanceToPadGreaterThanDecimeterRecord);
case AI_IFChrInRoomWithPad:
return sizeof(AiIFChrInRoomWithPadRecord);
case AI_IFBondInRoomWithPad:
return sizeof(AiIFBondInRoomWithPadRecord);
case AI_IFBondCollectedObject:
return sizeof(AiIFBondCollectedObjectRecord);
case AI_IFKeyDropped:
return sizeof(AiIFKeyDroppedRecord);
case AI_IFItemIsAttachedToObject:
return sizeof(AiIFItemIsAttachedToObjectRecord);
case AI_IFBondHasItemEquipped:
return sizeof(AiIFBondHasItemEquippedRecord);
case AI_IFObjectExists:
return sizeof(AiIFObjectExistsRecord);
case AI_IFObjectNotDestroyed:
return sizeof(AiIFObjectNotDestroyedRecord);
case AI_IFObjectWasActivated:
return sizeof(AiIFObjectWasActivatedRecord);
case AI_IFBondUsedGadgetOnObject:
return sizeof(AiIFBondUsedGadgetOnObjectRecord);
case AI_ActivateObject:
return sizeof(AiActivateObjectRecord);
case AI_DestroyObject:
return sizeof(AiDestroyObjectRecord);
case AI_DropObject:
return sizeof(AiDropObjectRecord);
case AI_ChrDropAllConcealedItems:
return sizeof(AiChrDropAllConcealedItemsRecord);
case AI_ChrDropAllHeldItems:
return sizeof(AiChrDropAllHeldItemsRecord);
case AI_BondCollectObject:
return sizeof(AiBondCollectObjectRecord);
case AI_ChrEquipObject:
return sizeof(AiChrEquipObjectRecord);
case AI_MoveObject:
return sizeof(AiMoveObjectRecord);
case AI_DoorOpen:
return sizeof(AiDoorOpenRecord);
case AI_DoorClose:
return sizeof(AiDoorCloseRecord);
case AI_IFDoorStateEqual:
return sizeof(AiIFDoorStateEqualRecord);
case AI_IFDoorHasBeenOpenedBefore:
return sizeof(AiIFDoorHasBeenOpenedBeforeRecord);
case AI_DoorSetLock:
return sizeof(AiDoorSetLockRecord);
case AI_DoorUnsetLock:
return sizeof(AiDoorUnsetLockRecord);
case AI_IFDoorLockEqual:
return sizeof(AiIFDoorLockEqualRecord);
case AI_IFObjectiveNumComplete:
return sizeof(AiIFObjectiveNumCompleteRecord);
case AI_TRYUnknown6e:
return sizeof(AiTRYUnknown6eRecord);
case AI_TRYUnknown6f:
return sizeof(AiTRYUnknown6fRecord);
case AI_IFGameDifficultyLessThan:
return sizeof(AiIFGameDifficultyLessThanRecord);
case AI_IFGameDifficultyGreaterThan:
return sizeof(AiIFGameDifficultyGreaterThanRecord);
case AI_IFMissionTimeLessThan:
return sizeof(AiIFMissionTimeLessThanRecord);
case AI_IFMissionTimeGreaterThan:
return sizeof(AiIFMissionTimeGreaterThanRecord);
case AI_IFSystemPowerTimeLessThan:
return sizeof(AiIFSystemPowerTimeLessThanRecord);
case AI_IFSystemPowerTimeGreaterThan:
return sizeof(AiIFSystemPowerTimeGreaterThanRecord);
case AI_IFLevelIdLessThan:
return sizeof(AiIFLevelIdLessThanRecord);
case AI_IFLevelIdGreaterThan:
return sizeof(AiIFLevelIdGreaterThanRecord);
case AI_IFMyNumArghsLessThan:
return sizeof(AiIFMyNumArghsLessThanRecord);
case AI_IFMyNumArghsGreaterThan:
return sizeof(AiIFMyNumArghsGreaterThanRecord);
case AI_IFMyNumCloseArghsLessThan:
return sizeof(AiIFMyNumCloseArghsLessThanRecord);
case AI_IFMyNumCloseArghsGreaterThan:
return sizeof(AiIFMyNumCloseArghsGreaterThanRecord);
case AI_IFChrHealthLessThan:
return sizeof(AiIFChrHealthLessThanRecord);
case AI_IFChrHealthGreaterThan:
return sizeof(AiIFChrHealthGreaterThanRecord);
case AI_IFChrWasDamagedSinceLastCheck:
return sizeof(AiIFChrWasDamagedSinceLastCheckRecord);
case AI_IFBondHealthLessThan:
return sizeof(AiIFBondHealthLessThanRecord);
case AI_IFBondHealthGreaterThan:
return sizeof(AiIFBondHealthGreaterThanRecord);
case AI_SetMyMorale:
return sizeof(AiSetMyMoraleRecord);
case AI_AddToMyMorale:
return sizeof(AiAddToMyMoraleRecord);
case AI_SubtractFromMyMorale:
return sizeof(AiSubtractFromMyMoraleRecord);
case AI_IFMyMoraleLessThan:
return sizeof(AiIFMyMoraleLessThanRecord);
case AI_IFMyMoraleLessThanRandom:
return sizeof(AiIFMyMoraleLessThanRandomRecord);
case AI_SetMyAlertness:
return sizeof(AiSetMyAlertnessRecord);
case AI_AddToMyAlertness:
return sizeof(AiAddToMyAlertnessRecord);
case AI_SubtractFromMyAlertness:
return sizeof(AiSubtractFromMyAlertnessRecord);
case AI_IFMyAlertnessLessThan:
return sizeof(AiIFMyAlertnessLessThanRecord);
case AI_IFMyAlertnessLessThanRandom:
return sizeof(AiIFMyAlertnessLessThanRandomRecord);
case AI_SetMyHearingScale:
return sizeof(AiSetMyHearingScaleRecord);
case AI_SetMyVisionRange:
return sizeof(AiSetMyVisionRangeRecord);
case AI_SetMyGrenadeProbability:
return sizeof(AiSetMyGrenadeProbabilityRecord);
case AI_SetMyChrNum:
return sizeof(AiSetMyChrNumRecord);
case AI_SetMyHealthTotal:
return sizeof(AiSetMyHealthTotalRecord);
case AI_SetMyArmour:
return sizeof(AiSetMyArmourRecord);
case AI_SetMySpeedRating:
return sizeof(AiSetMySpeedRatingRecord);
case AI_SetMyArghRating:
return sizeof(AiSetMyArghRatingRecord);
case AI_SetMyAccuracyRating:
return sizeof(AiSetMyAccuracyRatingRecord);
case AI_SetMyFlags2:
return sizeof(AiSetMyFlags2Record);
case AI_UnsetMyFlags2:
return sizeof(AiUnsetMyFlags2Record);
case AI_IFMyFlags2Has:
return sizeof(AiIFMyFlags2HasRecord);
case AI_SetChrBitfield:
return sizeof(AiSetChrBitfieldRecord);
case AI_UnsetChrBitfield:
return sizeof(AiUnsetChrBitfieldRecord);
case AI_IFChrBitfieldHas:
return sizeof(AiIFChrBitfieldHasRecord);
case AI_SetObjectiveBitfield:
return sizeof(AiSetObjectiveBitfieldRecord);
case AI_UnsetObjectiveBitfield:
return sizeof(AiUnsetObjectiveBitfieldRecord);
case AI_IFObjectiveBitfieldHas:
return sizeof(AiIFObjectiveBitfieldHasRecord);
case AI_SetMychrflags:
return sizeof(AiSetMychrflagsRecord);
case AI_UnsetMychrflags:
return sizeof(AiUnsetMychrflagsRecord);
case AI_IFMychrflagsHas:
return sizeof(AiIFMychrflagsHasRecord);
case AI_SetChrchrflags:
return sizeof(AiSetChrchrflagsRecord);
case AI_UnsetChrchrflags:
return sizeof(AiUnsetChrchrflagsRecord);
case AI_IFChrchrflagsHas:
return sizeof(AiIFChrchrflagsHasRecord);
case AI_SetObjectFlags:
return sizeof(AiSetObjectFlagsRecord);
case AI_UnsetObjectFlags:
return sizeof(AiUnsetObjectFlagsRecord);
case AI_IFObjectFlagsHas:
return sizeof(AiIFObjectFlagsHasRecord);
case AI_SetObjectFlags2:
return sizeof(AiSetObjectFlags2Record);
case AI_UnsetObjectFlags2:
return sizeof(AiUnsetObjectFlags2Record);
case AI_IFObjectFlags2Has:
return sizeof(AiIFObjectFlags2HasRecord);
case AI_SetMyChrPreset:
return sizeof(AiSetMyChrPresetRecord);
case AI_SetChrChrPreset:
return sizeof(AiSetChrChrPresetRecord);
case AI_SetMyPadPreset:
return sizeof(AiSetMyPadPresetRecord);
case AI_SetChrPadPreset:
return sizeof(AiSetChrPadPresetRecord);
case AI_MyTimerStart:
return sizeof(AiMyTimerStartRecord);
case AI_MyTimerReset:
return sizeof(AiMyTimerResetRecord);
case AI_MyTimerPause:
return sizeof(AiMyTimerPauseRecord);
case AI_MyTimerResume:
return sizeof(AiMyTimerResumeRecord);
case AI_IFMyTimerIsNotRunning:
return sizeof(AiIFMyTimerIsNotRunningRecord);
case AI_IFMyTimerLessThanTicks:
return sizeof(AiIFMyTimerLessThanTicksRecord);
case AI_IFMyTimerGreaterThanTicks:
return sizeof(AiIFMyTimerGreaterThanTicksRecord);
case AI_HudCountdownShow:
return sizeof(AiHudCountdownShowRecord);
case AI_HudCountdownHide:
return sizeof(AiHudCountdownHideRecord);
case AI_HudCountdownSet:
return sizeof(AiHudCountdownSetRecord);
case AI_HudCountdownStop:
return sizeof(AiHudCountdownStopRecord);
case AI_HudCountdownStart:
return sizeof(AiHudCountdownStartRecord);
case AI_IFHudCountdownIsNotRunning:
return sizeof(AiIFHudCountdownIsNotRunningRecord);
case AI_IFHudCountdownLessThan:
return sizeof(AiIFHudCountdownLessThanRecord);
case AI_IFHudCountdownGreaterThan:
return sizeof(AiIFHudCountdownGreaterThanRecord);
case AI_TRYSpawningChrAtPad:
return sizeof(AiTRYSpawningChrAtPadRecord);
case AI_TRYSpawningChrNextToChr:
return sizeof(AiTRYSpawningChrNextToChrRecord);
case AI_TRYGiveMeItem:
return sizeof(AiTRYGiveMeItemRecord);
case AI_TRYGiveMeHat:
return sizeof(AiTRYGiveMeHatRecord);
case AI_TRYCloningChr:
return sizeof(AiTRYCloningChrRecord);
case AI_TextPrintBottom:
return sizeof(AiTextPrintBottomRecord);
case AI_TextPrintTop:
return sizeof(AiTextPrintTopRecord);
case AI_SfxPlay:
return sizeof(AiSfxPlayRecord);
case AI_SfxEmitFromObject:
return sizeof(AiSfxEmitFromObjectRecord);
case AI_SfxEmitFromPad:
return sizeof(AiSfxEmitFromPadRecord);
case AI_SfxSetChannelVolume:
return sizeof(AiSfxSetChannelVolumeRecord);
case AI_SfxFadeChannelVolume:
return sizeof(AiSfxFadeChannelVolumeRecord);
case AI_SfxStopChannel:
return sizeof(AiSfxStopChannelRecord);
case AI_IFSfxChannelVolumeLessThan:
return sizeof(AiIFSfxChannelVolumeLessThanRecord);
case AI_VehicleStartPath:
return sizeof(AiVehicleStartPathRecord);
case AI_VehicleSpeed:
return sizeof(AiVehicleSpeedRecord);
case AI_AircraftRotorSpeed:
return sizeof(AiAircraftRotorSpeedRecord);
case AI_IFCameraIsInIntro:
return sizeof(AiIFCameraIsInIntroRecord);
case AI_IFCameraIsInBondSwirl:
return sizeof(AiIFCameraIsInBondSwirlRecord);
case AI_TvChangeScreenBank:
return sizeof(AiTvChangeScreenBankRecord);
case AI_IFBondInTank:
return sizeof(AiIFBondInTankRecord);
case AI_EndLevel:
return sizeof(AiEndLevelRecord);
case AI_CameraReturnToBond:
return sizeof(AiCameraReturnToBondRecord);
case AI_CameraLookAtBondFromPad:
return sizeof(AiCameraLookAtBondFromPadRecord);
case AI_CameraSwitch:
return sizeof(AiCameraSwitchRecord);
case AI_IFBondYPosLessThan:
return sizeof(AiIFBondYPosLessThanRecord);
case AI_BondDisableControl:
return sizeof(AiBondDisableControlRecord);
case AI_BondEnableControl:
return sizeof(AiBondEnableControlRecord);
case AI_TRYTeleportingChrToPad:
return sizeof(AiTRYTeleportingChrToPadRecord);
case AI_ScreenFadeToBlack:
return sizeof(AiScreenFadeToBlackRecord);
case AI_ScreenFadeFromBlack:
return sizeof(AiScreenFadeFromBlackRecord);
case AI_IFScreenFadeCompleted:
return sizeof(AiIFScreenFadeCompletedRecord);
case AI_HideAllChrs:
return sizeof(AiHideAllChrsRecord);
case AI_ShowAllChrs:
return sizeof(AiShowAllChrsRecord);
case AI_DoorOpenInstant:
return sizeof(AiDoorOpenInstantRecord);
case AI_ChrRemoveItemInHand:
return sizeof(AiChrRemoveItemInHandRecord);
case AI_IfNumberOfActivePlayersLessThan:
return sizeof(AiIfNumberOfActivePlayersLessThanRecord);
case AI_IFBondItemTotalAmmoLessThan:
return sizeof(AiIFBondItemTotalAmmoLessThanRecord);
case AI_BondEquipItem:
return sizeof(AiBondEquipItemRecord);
case AI_BondEquipItemCinema:
return sizeof(AiBondEquipItemCinemaRecord);
case AI_BondSetLockedVelocity:
return sizeof(AiBondSetLockedVelocityRecord);
case AI_IFObjectInRoomWithPad:
return sizeof(AiIFObjectInRoomWithPadRecord);
case AI_SwitchSky:
return sizeof(AiSwitchSkyRecord);
case AI_TriggerFadeAndExitLevelOnButtonPress:
return sizeof(AiTriggerFadeAndExitLevelOnButtonPressRecord);
case AI_IFBondIsDead:
return sizeof(AiIFBondIsDeadRecord);
case AI_BondDisableDamageAndPickups:
return sizeof(AiBondDisableDamageAndPickupsRecord);
case AI_BondHideWeapons:
return sizeof(AiBondHideWeaponsRecord);
case AI_CameraOrbitPad:
return sizeof(AiCameraOrbitPadRecord);
case AI_CreditsRoll:
return sizeof(AiCreditsRollRecord);
case AI_IFCreditsHasCompleted:
return sizeof(AiIFCreditsHasCompletedRecord);
case AI_IFObjectiveAllCompleted:
return sizeof(AiIFObjectiveAllCompletedRecord);
case AI_IFFolderActorIsEqual:
return sizeof(AiIFFolderActorIsEqualRecord);
case AI_IFBondDamageAndPickupsDisabled:
return sizeof(AiIFBondDamageAndPickupsDisabledRecord);
case AI_MusicPlaySlot:
return sizeof(AiMusicPlaySlotRecord);
case AI_MusicStopSlot:
return sizeof(AiMusicStopSlotRecord);
case AI_TriggerExplosionsAroundBond:
return sizeof(AiTriggerExplosionsAroundBondRecord);
case AI_IFKilledCiviliansGreaterThan:
return sizeof(AiIFKilledCiviliansGreaterThanRecord);
case AI_IFChrWasShotSinceLastCheck:
return sizeof(AiIFChrWasShotSinceLastCheckRecord);
case AI_BondKilledInAction:
return sizeof(AiBondKilledInActionRecord);
case AI_RaiseArms:
return sizeof(AiRaiseArmsRecord);
case AI_GasLeakAndFadeFog:
return sizeof(AiGasLeakAndFadeFogRecord);
case AI_ObjectRocketLaunch:
return sizeof(AiObjectRocketLaunchRecord);
case AI_PRINT:
{
s32 pos = offset + 1;
while (AIList[pos] != 0)
{
++pos;
}
return (pos - offset) + 1;
}
default:
#if defined(ENABLE_LOG)
osSyncPrintf("chraiitemsize: unknown type %d!\n", *AIList);
#endif
return 1;
}
}
int main(void){
s32 off = 0;
while (1) {
s32 sz = chraiitemsize(m_RunToBondPersistent, off);
if (sz <= 0 || off + sz > 512) { printf("!! bad size %d at +%d\n", sz, off); break; }
unsigned cmd = m_RunToBondPersistent[off];
if (cmd == AI_EndList) { printf("+%-4d ENDLIST (size %d)\n", off, sz); break; }
printf("+%-4d cmd=%-3u ", off, cmd);
for (int i=1;i<sz;i++) printf("%02x ", m_RunToBondPersistent[off+i]);
printf("\n");
off += sz;
}
return 0;
}