#include #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 #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: return 1; /* D309 candidate fix: PRINT is a 1-byte no-op record */ 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