sm64coopdx/data/dynos_bin_behavior.cpp
2024-06-02 15:58:03 -04:00

2698 lines
94 KiB
C++

#include "dynos.cpp.h"
#define OBJECT_FIELDS_INDEX_DIRECTLY
extern "C" {
#include "include/behavior_commands.h"
#include "include/behavior_data.h"
#include "include/behavior_table.h"
#include "include/model_ids.h"
#include "include/object_constants.h"
#include "include/object_fields.h"
#include "game/area.h"
#include "game/object_list_processor.h"
#include "game/interaction.h"
#include "pc/lua/utils/smlua_anim_utils.h"
#include "pc/lua/utils/smlua_collision_utils.h"
// Models and Animations
#include "actors/common0.h"
#include "actors/common1.h"
#include "actors/custom0.h"
#include "actors/group0.h"
#include "actors/group1.h"
#include "actors/group2.h"
#include "actors/group3.h"
#include "actors/group4.h"
#include "actors/group5.h"
#include "actors/group6.h"
#include "actors/group7.h"
#include "actors/group8.h"
#include "actors/group9.h"
#include "actors/group10.h"
#include "actors/group11.h"
#include "actors/group12.h"
#include "actors/group13.h"
#include "actors/group14.h"
#include "actors/group15.h"
#include "actors/group16.h"
#include "actors/group17.h"
#include "actors/zcustom0.h"
#include "levels/castle_grounds/header.h"
}
// Current Behavior Version
#define BEHAVIOR_MAJOR_VER 1
#define BEHAVIOR_MINOR_VER 0
#define BEHAVIOR_PATCH_VER 1
// Minimum Behavior Version (That can be read)
#define BEHAVIOR_MIN_MAJOR_VER 1
#define BEHAVIOR_MIN_MINOR_VER 0
#define BEHAVIOR_MIN_PATCH_VER 0
#undef OBJECT_FIELDS_INDEX_DIRECTLY
// Free data pointers, but keep nodes and tokens intact
// Delete nodes generated from GfxDynCmds
template <typename T>
void ClearBhvDataNodes(DataNodes<T> &aDataNodes) {
for (s32 i = aDataNodes.Count(); i != 0; --i) {
Delete(aDataNodes[i - 1]->mData);
}
}
/////////////
// Parsing //
/////////////
#define BEHAVIOR_SCRIPT_SIZE_PER_TOKEN 4
#define bhv_constant(x) if (_Arg == #x) { return (BehaviorScript) (x); }
#define bhv_legacy_constant(x, y) if (_Arg == #x) { return (BehaviorScript) (y); }
s64 DynOS_Bhv_ParseBehaviorIntegerScriptConstants(const String &_Arg, bool *found) {
*found = true;
// Behavior names
s64 cBhvConstant = DynOS_Common_ParseBhvConstants(_Arg, found);
if (*found) { return cBhvConstant; }
*found = true; // reset found value
// All of these eveluate down into a integer which can be worked with.
// Be it for flags or otherwise.
// Active Flags
bhv_constant(ACTIVE_FLAG_DEACTIVATED);
bhv_constant(ACTIVE_FLAG_ACTIVE);
bhv_constant(ACTIVE_FLAG_FAR_AWAY);
bhv_constant(ACTIVE_FLAG_UNK2);
bhv_constant(ACTIVE_FLAG_IN_DIFFERENT_ROOM);
bhv_constant(ACTIVE_FLAG_UNIMPORTANT);
bhv_constant(ACTIVE_FLAG_INITIATED_TIME_STOP);
bhv_constant(ACTIVE_FLAG_MOVE_THROUGH_GRATE);
bhv_constant(ACTIVE_FLAG_DITHERED_ALPHA);
bhv_constant(ACTIVE_FLAG_UNK8);
bhv_constant(ACTIVE_FLAG_UNK9);
bhv_constant(ACTIVE_FLAG_UNK10);
// Interact Flags
bhv_constant(INTERACT_HOOT);
bhv_constant(INTERACT_GRABBABLE);
bhv_constant(INTERACT_DOOR);
bhv_constant(INTERACT_DAMAGE);
bhv_constant(INTERACT_COIN);
bhv_constant(INTERACT_CAP);
bhv_constant(INTERACT_POLE);
bhv_constant(INTERACT_KOOPA);
bhv_constant(INTERACT_UNKNOWN_08);
bhv_constant(INTERACT_SPINY_WALKING);
bhv_constant(INTERACT_BREAKABLE);
bhv_constant(INTERACT_STRONG_WIND);
bhv_constant(INTERACT_WARP_DOOR);
bhv_constant(INTERACT_STAR_OR_KEY);
bhv_constant(INTERACT_WARP);
bhv_constant(INTERACT_CANNON_BASE);
bhv_constant(INTERACT_BOUNCE_TOP);
bhv_constant(INTERACT_WATER_RING);
bhv_constant(INTERACT_BULLY);
bhv_constant(INTERACT_FLAME);
bhv_constant(INTERACT_KOOPA_SHELL);
bhv_constant(INTERACT_BOUNCE_TOP2);
bhv_constant(INTERACT_MR_BLIZZARD);
bhv_constant(INTERACT_HIT_FROM_BELOW);
bhv_constant(INTERACT_TEXT);
bhv_constant(INTERACT_TORNADO);
bhv_constant(INTERACT_WHIRLPOOL);
bhv_constant(INTERACT_CLAM_OR_BUBBA);
bhv_constant(INTERACT_BBH_ENTRANCE);
bhv_constant(INTERACT_SNUFIT_BULLET);
bhv_constant(INTERACT_SHOCK);
bhv_constant(INTERACT_IGLOO_BARRIER);
bhv_constant(INTERACT_PLAYER);
// Interact Subtype Flags
// INTERACT_WARP
bhv_constant(INT_SUBTYPE_FADING_WARP);
// Damaging interactions
bhv_constant(INT_SUBTYPE_DELAY_INVINCIBILITY);
bhv_constant(INT_SUBTYPE_BIG_KNOCKBACK); /* Used by Bowser, sets Mario's forward velocity to 40 on hit */
// INTERACT_GRABBABLE
bhv_constant(INT_SUBTYPE_GRABS_MARIO); /* Also makes the object heavy */
bhv_constant(INT_SUBTYPE_HOLDABLE_NPC); /* Allows the object to be gently dropped, and sets vertical speed to 0 when dropped with no forwards velocity */
bhv_constant(INT_SUBTYPE_DROP_IMMEDIATELY); /* This gets set by grabbable NPCs that talk to Mario to make him drop them after the dialog is finished */
bhv_constant(INT_SUBTYPE_KICKABLE);
bhv_constant(INT_SUBTYPE_NOT_GRABBABLE); /* Used by Heavy-Ho to allow it to throw Mario, without Mario being able to pick it up */
// INTERACT_DOOR
bhv_constant(INT_SUBTYPE_STAR_DOOR);
//INTERACT_BOUNCE_TOP
bhv_constant(INT_SUBTYPE_TWIRL_BOUNCE);
// INTERACT_STAR_OR_KEY
bhv_constant(INT_SUBTYPE_NO_EXIT);
bhv_constant(INT_SUBTYPE_GRAND_STAR);
// INTERACT_TEXT
bhv_constant(INT_SUBTYPE_SIGN);
bhv_constant(INT_SUBTYPE_NPC);
// INTERACT_CLAM_OR_BUBBA
bhv_constant(INT_SUBTYPE_EATS_MARIO);
// Object List Types
bhv_constant(OBJ_LIST_PLAYER);
bhv_constant(OBJ_LIST_EXT);
bhv_constant(OBJ_LIST_DESTRUCTIVE);
bhv_constant(OBJ_LIST_UNUSED_3);
bhv_constant(OBJ_LIST_GENACTOR);
bhv_constant(OBJ_LIST_PUSHABLE);
bhv_constant(OBJ_LIST_LEVEL);
bhv_constant(OBJ_LIST_UNUSED_7);
bhv_constant(OBJ_LIST_DEFAULT);
bhv_constant(OBJ_LIST_SURFACE);
bhv_constant(OBJ_LIST_POLELIKE);
bhv_constant(OBJ_LIST_SPAWNER);
bhv_constant(OBJ_LIST_UNIMPORTANT);
// Object Flags
bhv_constant(OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE);
bhv_constant(OBJ_FLAG_MOVE_XZ_USING_FVEL);
bhv_constant(OBJ_FLAG_MOVE_Y_WITH_TERMINAL_VEL);
bhv_constant(OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW);
bhv_constant(OBJ_FLAG_SET_FACE_ANGLE_TO_MOVE_ANGLE);
bhv_constant(OBJ_FLAG_0020);
bhv_constant(OBJ_FLAG_COMPUTE_DIST_TO_MARIO);
bhv_constant(OBJ_FLAG_ACTIVE_FROM_AFAR);
bhv_constant(OBJ_FLAG_0100);
bhv_constant(OBJ_FLAG_TRANSFORM_RELATIVE_TO_PARENT);
bhv_constant(OBJ_FLAG_HOLDABLE);
bhv_constant(OBJ_FLAG_SET_THROW_MATRIX_FROM_TRANSFORM);
bhv_constant(OBJ_FLAG_1000);
bhv_constant(OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO);
bhv_constant(OBJ_FLAG_PERSISTENT_RESPAWN);
bhv_constant(OBJ_FLAG_8000);
bhv_constant(OBJ_FLAG_30);
// Particle Flags
bhv_constant(ACTIVE_PARTICLE_DUST);
bhv_constant(ACTIVE_PARTICLE_UNUSED_1);
bhv_constant(ACTIVE_PARTICLE_UNUSED_2);
bhv_constant(ACTIVE_PARTICLE_SPARKLES);
bhv_constant(ACTIVE_PARTICLE_H_STAR);
bhv_constant(ACTIVE_PARTICLE_BUBBLE);
bhv_constant(ACTIVE_PARTICLE_WATER_SPLASH);
bhv_constant(ACTIVE_PARTICLE_IDLE_WATER_WAVE);
bhv_constant(ACTIVE_PARTICLE_SHALLOW_WATER_WAVE);
bhv_constant(ACTIVE_PARTICLE_PLUNGE_BUBBLE);
bhv_constant(ACTIVE_PARTICLE_WAVE_TRAIL);
bhv_constant(ACTIVE_PARTICLE_FIRE);
bhv_constant(ACTIVE_PARTICLE_SHALLOW_WATER_SPLASH);
bhv_constant(ACTIVE_PARTICLE_LEAF);
bhv_constant(ACTIVE_PARTICLE_DIRT);
bhv_constant(ACTIVE_PARTICLE_MIST_CIRCLE);
bhv_constant(ACTIVE_PARTICLE_SNOW);
bhv_constant(ACTIVE_PARTICLE_BREATH);
bhv_constant(ACTIVE_PARTICLE_V_STAR);
bhv_constant(ACTIVE_PARTICLE_TRIANGLE);
// Other constants
bhv_constant(NULL);
bhv_constant(FALSE);
*found = false;
return 0;
}
s64 DynOS_Bhv_ParseBehaviorScriptConstants(const String &_Arg, bool *found) {
*found = true;
// Behavior ids
bhv_constant(id_bhv1Up);
bhv_constant(id_bhv1upJumpOnApproach);
bhv_constant(id_bhv1upRunningAway);
bhv_constant(id_bhv1upSliding);
bhv_constant(id_bhv1upWalking);
bhv_constant(id_bhvActivatedBackAndForthPlatform);
bhv_constant(id_bhvActSelector);
bhv_constant(id_bhvActSelectorStarType);
bhv_constant(id_bhvAirborneDeathWarp);
bhv_constant(id_bhvAirborneStarCollectWarp);
bhv_constant(id_bhvAirborneWarp);
bhv_constant(id_bhvAlphaBooKey);
bhv_constant(id_bhvAmbientSounds);
bhv_constant(id_bhvAnimatedTexture);
bhv_constant(id_bhvAnimatesOnFloorSwitchPress);
bhv_constant(id_bhvAnotherElavator);
bhv_constant(id_bhvAnotherTiltingPlatform);
bhv_constant(id_bhvArrowLift);
bhv_constant(id_bhvBalconyBigBoo);
bhv_constant(id_bhvBbhTiltingTrapPlatform);
bhv_constant(id_bhvBbhTumblingBridge);
bhv_constant(id_bhvBeginningLakitu);
bhv_constant(id_bhvBeginningPeach);
bhv_constant(id_bhvBetaBooKey);
bhv_constant(id_bhvBetaBowserAnchor);
bhv_constant(id_bhvBetaChestBottom);
bhv_constant(id_bhvBetaChestLid);
bhv_constant(id_bhvBetaFishSplashSpawner);
bhv_constant(id_bhvBetaHoldableObject);
bhv_constant(id_bhvBetaMovingFlames);
bhv_constant(id_bhvBetaMovingFlamesSpawn);
bhv_constant(id_bhvBetaTrampolineSpring);
bhv_constant(id_bhvBetaTrampolineTop);
bhv_constant(id_bhvBigBoulder);
bhv_constant(id_bhvBigBoulderGenerator);
bhv_constant(id_bhvBigBully);
bhv_constant(id_bhvBigBullyWithMinions);
bhv_constant(id_bhvBigChillBully);
bhv_constant(id_bhvBigSnowmanWhole);
bhv_constant(id_bhvBird);
bhv_constant(id_bhvBirdsSoundLoop);
bhv_constant(id_bhvBitfsSinkingCagePlatform);
bhv_constant(id_bhvBitfsSinkingPlatforms);
bhv_constant(id_bhvBitfsTiltingInvertedPyramid);
bhv_constant(id_bhvBlackSmokeBowser);
bhv_constant(id_bhvBlackSmokeMario);
bhv_constant(id_bhvBlackSmokeUpward);
bhv_constant(id_bhvBlueBowserFlame);
bhv_constant(id_bhvBlueCoinJumping);
bhv_constant(id_bhvBlueCoinSliding);
bhv_constant(id_bhvBlueCoinNumber);
bhv_constant(id_bhvBlueCoinSwitch);
bhv_constant(id_bhvBlueFish);
bhv_constant(id_bhvBlueFlamesGroup);
bhv_constant(id_bhvBobBowlingBallSpawner);
bhv_constant(id_bhvBobomb);
bhv_constant(id_bhvBobombAnchorMario);
bhv_constant(id_bhvBobombBuddy);
bhv_constant(id_bhvBobombBuddyOpensCannon);
bhv_constant(id_bhvBobombBullyDeathSmoke);
bhv_constant(id_bhvBobombExplosionBubble);
bhv_constant(id_bhvBobombExplosionBubble3600);
bhv_constant(id_bhvBobombFuseSmoke);
bhv_constant(id_bhvBoo);
bhv_constant(id_bhvBooBossSpawnedBridge);
bhv_constant(id_bhvBooCage);
bhv_constant(id_bhvBooInCastle);
bhv_constant(id_bhvBookendSpawn);
bhv_constant(id_bhvBookSwitch);
bhv_constant(id_bhvBooWithCage);
bhv_constant(id_bhvBouncingFireball);
bhv_constant(id_bhvBouncingFireballFlame);
bhv_constant(id_bhvBowlingBall);
bhv_constant(id_bhvBowser);
bhv_constant(id_bhvBowserBodyAnchor);
bhv_constant(id_bhvBowserBomb);
bhv_constant(id_bhvBowserBombExplosion);
bhv_constant(id_bhvBowserBombSmoke);
bhv_constant(id_bhvBowserCourseRedCoinStar);
bhv_constant(id_bhvBowserFlameSpawn);
bhv_constant(id_bhvBowserKey);
bhv_constant(id_bhvBowserKeyCourseExit);
bhv_constant(id_bhvBowserKeyUnlockDoor);
bhv_constant(id_bhvBowserShockWave);
bhv_constant(id_bhvBowsersSub);
bhv_constant(id_bhvBowserSubDoor);
bhv_constant(id_bhvBowserTailAnchor);
bhv_constant(id_bhvBreakableBox);
bhv_constant(id_bhvBreakableBoxSmall);
bhv_constant(id_bhvBreakBoxTriangle);
bhv_constant(id_bhvBreathParticleSpawner);
bhv_constant(id_bhvBub);
bhv_constant(id_bhvBubba);
bhv_constant(id_bhvBubbleMaybe);
bhv_constant(id_bhvBubbleParticleSpawner);
bhv_constant(id_bhvBubblePlayer);
bhv_constant(id_bhvBubbleSplash);
bhv_constant(id_bhvBulletBill);
bhv_constant(id_bhvBulletBillCannon);
bhv_constant(id_bhvButterfly);
bhv_constant(id_bhvCameraLakitu);
bhv_constant(id_bhvCannon);
bhv_constant(id_bhvCannonBarrel);
bhv_constant(id_bhvCannonBarrelBubbles);
bhv_constant(id_bhvCannonBaseUnused);
bhv_constant(id_bhvCannonClosed);
bhv_constant(id_bhvCapSwitch);
bhv_constant(id_bhvCapSwitchBase);
bhv_constant(id_bhvCarrySomething1);
bhv_constant(id_bhvCarrySomething2);
bhv_constant(id_bhvCarrySomething3);
bhv_constant(id_bhvCarrySomething4);
bhv_constant(id_bhvCarrySomething5);
bhv_constant(id_bhvCarrySomething6);
bhv_constant(id_bhvCastleFlagWaving);
bhv_constant(id_bhvCastleFloorTrap);
bhv_constant(id_bhvCcmTouchedStarSpawn);
bhv_constant(id_bhvCelebrationStar);
bhv_constant(id_bhvCelebrationStarSparkle);
bhv_constant(id_bhvChainChomp);
bhv_constant(id_bhvChainChompChainPart);
bhv_constant(id_bhvChainChompGate);
bhv_constant(id_bhvCheckerboardElevatorGroup);
bhv_constant(id_bhvCheckerboardPlatformSub);
bhv_constant(id_bhvChirpChirp);
bhv_constant(id_bhvChirpChirpUnused);
bhv_constant(id_bhvChuckya);
bhv_constant(id_bhvChuckyaAnchorMario);
bhv_constant(id_bhvCirclingAmp);
bhv_constant(id_bhvClamShell);
bhv_constant(id_bhvClockHourHand);
bhv_constant(id_bhvClockMinuteHand);
bhv_constant(id_bhvCloud);
bhv_constant(id_bhvCloudPart);
bhv_constant(id_bhvCoffin);
bhv_constant(id_bhvCoffinSpawner);
bhv_constant(id_bhvCoinFormation);
bhv_constant(id_bhvCoinFormationSpawn);
bhv_constant(id_bhvCoinInsideBoo);
bhv_constant(id_bhvCoinSparkles);
bhv_constant(id_bhvControllablePlatform);
bhv_constant(id_bhvControllablePlatformSub);
bhv_constant(id_bhvCourtyardBooTriplet);
bhv_constant(id_bhvCutOutObject);
bhv_constant(id_bhvDddMovingPole);
bhv_constant(id_bhvDDDPole);
bhv_constant(id_bhvDddWarp);
bhv_constant(id_bhvDeathWarp);
bhv_constant(id_bhvDecorativePendulum);
bhv_constant(id_bhvDirtParticleSpawner);
bhv_constant(id_bhvDonutPlatform);
bhv_constant(id_bhvDonutPlatformSpawner);
bhv_constant(id_bhvDoor);
bhv_constant(id_bhvDoorWarp);
bhv_constant(id_bhvDorrie);
bhv_constant(id_bhvEndBirds1);
bhv_constant(id_bhvEndBirds2);
bhv_constant(id_bhvEndPeach);
bhv_constant(id_bhvEndToad);
bhv_constant(id_bhvEnemyLakitu);
bhv_constant(id_bhvExclamationBox);
bhv_constant(id_bhvExitPodiumWarp);
bhv_constant(id_bhvExplosion);
bhv_constant(id_bhvEyerokBoss);
bhv_constant(id_bhvEyerokHand);
bhv_constant(id_bhvFadingWarp);
bhv_constant(id_bhvFallingBowserPlatform);
bhv_constant(id_bhvFallingPillar);
bhv_constant(id_bhvFallingPillarHitbox);
bhv_constant(id_bhvFerrisWheelAxle);
bhv_constant(id_bhvFerrisWheelPlatform);
bhv_constant(id_bhvFewBlueFishSpawner);
bhv_constant(id_bhvFireParticleSpawner);
bhv_constant(id_bhvFirePiranhaPlant);
bhv_constant(id_bhvFireSpitter);
bhv_constant(id_bhvFish);
bhv_constant(id_bhvFishGroup);
bhv_constant(id_bhvFishSpawner);
bhv_constant(id_bhvFlame);
bhv_constant(id_bhvFlameBouncing);
bhv_constant(id_bhvFlameBowser);
bhv_constant(id_bhvFlameFloatingLanding);
bhv_constant(id_bhvFlameLargeBurningOut);
bhv_constant(id_bhvFlameMovingForwardGrowing);
bhv_constant(id_bhvFlamethrower);
bhv_constant(id_bhvFlamethrowerFlame);
bhv_constant(id_bhvFloorSwitchAnimatesObject);
bhv_constant(id_bhvFloorSwitchGrills);
bhv_constant(id_bhvFloorSwitchHardcodedModel);
bhv_constant(id_bhvFloorSwitchHiddenObjects);
bhv_constant(id_bhvFloorTrapInCastle);
bhv_constant(id_bhvFlyGuy);
bhv_constant(id_bhvFlyguyFlame);
bhv_constant(id_bhvFlyingBookend);
bhv_constant(id_bhvFlyingWarp);
bhv_constant(id_bhvFreeBowlingBall);
bhv_constant(id_bhvGhostHuntBigBoo);
bhv_constant(id_bhvGhostHuntBoo);
bhv_constant(id_bhvGiantPole);
bhv_constant(id_bhvGoldenCoinSparkles);
bhv_constant(id_bhvGoomba);
bhv_constant(id_bhvGoombaTripletSpawner);
bhv_constant(id_bhvGrandStar);
bhv_constant(id_bhvGrindel);
bhv_constant(id_bhvHardAirKnockBackWarp);
bhv_constant(id_bhvHauntedBookshelf);
bhv_constant(id_bhvHauntedBookshelfManager);
bhv_constant(id_bhvHauntedChair);
bhv_constant(id_bhvHeaveHo);
bhv_constant(id_bhvHeaveHoThrowMario);
bhv_constant(id_bhvHidden1up);
bhv_constant(id_bhvHidden1upInPole);
bhv_constant(id_bhvHidden1upInPoleSpawner);
bhv_constant(id_bhvHidden1upInPoleTrigger);
bhv_constant(id_bhvHidden1upTrigger);
bhv_constant(id_bhvHiddenAt120Stars);
bhv_constant(id_bhvHiddenBlueCoin);
bhv_constant(id_bhvHiddenObject);
bhv_constant(id_bhvHiddenRedCoinStar);
bhv_constant(id_bhvHiddenStaircaseStep);
bhv_constant(id_bhvHiddenStar);
bhv_constant(id_bhvHiddenStarTrigger);
bhv_constant(id_bhvHmcElevatorPlatform);
bhv_constant(id_bhvHomingAmp);
bhv_constant(id_bhvHoot);
bhv_constant(id_bhvHorizontalGrindel);
bhv_constant(id_bhvHorStarParticleSpawner);
bhv_constant(id_bhvIdleWaterWave);
bhv_constant(id_bhvIgloo);
bhv_constant(id_bhvInitializeChangingWaterLevel);
bhv_constant(id_bhvInsideCannon);
bhv_constant(id_bhvInstantActiveWarp);
bhv_constant(id_bhvInSunkenShip);
bhv_constant(id_bhvInSunkenShip2);
bhv_constant(id_bhvInSunkenShip3);
bhv_constant(id_bhvIntroScene);
bhv_constant(id_bhvInvisibleObjectsUnderBridge);
bhv_constant(id_bhvJetStream);
bhv_constant(id_bhvJetStreamRingSpawner);
bhv_constant(id_bhvJetStreamWaterRing);
bhv_constant(id_bhvJrbFloatingBox);
bhv_constant(id_bhvJrbFloatingPlatform);
bhv_constant(id_bhvJrbSlidingBox);
bhv_constant(id_bhvJumpingBox);
bhv_constant(id_bhvKickableBoard);
bhv_constant(id_bhvKingBobomb);
bhv_constant(id_bhvKlepto);
bhv_constant(id_bhvKoopa);
bhv_constant(id_bhvKoopaFlag);
bhv_constant(id_bhvKoopaRaceEndpoint);
bhv_constant(id_bhvKoopaShell);
bhv_constant(id_bhvKoopaShellFlame);
bhv_constant(id_bhvKoopaShellUnderwater);
bhv_constant(id_bhvLargeBomp);
bhv_constant(id_bhvLaunchDeathWarp);
bhv_constant(id_bhvLaunchStarCollectWarp);
bhv_constant(id_bhvLeafParticleSpawner);
bhv_constant(id_bhvLllBowserPuzzle);
bhv_constant(id_bhvLllBowserPuzzlePiece);
bhv_constant(id_bhvLllDrawbridge);
bhv_constant(id_bhvLllDrawbridgeSpawner);
bhv_constant(id_bhvLllFloatingWoodBridge);
bhv_constant(id_bhvLllHexagonalMesh);
bhv_constant(id_bhvLllMovingOctagonalMeshPlatform);
bhv_constant(id_bhvLllRollingLog);
bhv_constant(id_bhvLllRotatingBlockWithFireBars);
bhv_constant(id_bhvLllRotatingHexagonalPlatform);
bhv_constant(id_bhvLllRotatingHexagonalRing);
bhv_constant(id_bhvLllRotatingHexFlame);
bhv_constant(id_bhvLllSinkingRectangularPlatform);
bhv_constant(id_bhvLllSinkingRockBlock);
bhv_constant(id_bhvLllSinkingSquarePlatforms);
bhv_constant(id_bhvLllTiltingInvertedPyramid);
bhv_constant(id_bhvLllTumblingBridge);
bhv_constant(id_bhvLllVolcanoFallingTrap);
bhv_constant(id_bhvLllWoodPiece);
bhv_constant(id_bhvMacroUkiki);
bhv_constant(id_bhvMadPiano);
bhv_constant(id_bhvMantaRay);
bhv_constant(id_bhvMantaRayRingManager);
bhv_constant(id_bhvMantaRayWaterRing);
bhv_constant(id_bhvManyBlueFishSpawner);
bhv_constant(id_bhvMario);
bhv_constant(id_bhvMenuButton);
bhv_constant(id_bhvMenuButtonManager);
bhv_constant(id_bhvMerryGoRound);
bhv_constant(id_bhvMerryGoRoundBigBoo);
bhv_constant(id_bhvMerryGoRoundBoo);
bhv_constant(id_bhvMerryGoRoundBooManager);
bhv_constant(id_bhvMeshElevator);
bhv_constant(id_bhvMessagePanel);
bhv_constant(id_bhvMetalCap);
bhv_constant(id_bhvMips);
bhv_constant(id_bhvMistCircParticleSpawner);
bhv_constant(id_bhvMistParticleSpawner);
bhv_constant(id_bhvMoatGrills);
bhv_constant(id_bhvMoneybag);
bhv_constant(id_bhvMoneybagHidden);
bhv_constant(id_bhvMontyMole);
bhv_constant(id_bhvMontyMoleHole);
bhv_constant(id_bhvMontyMoleRock);
bhv_constant(id_bhvMovingBlueCoin);
bhv_constant(id_bhvMovingYellowCoin);
bhv_constant(id_bhvMrBlizzard);
bhv_constant(id_bhvMrBlizzardSnowball);
bhv_constant(id_bhvMrI);
bhv_constant(id_bhvMrIBlueCoin);
bhv_constant(id_bhvMrIBody);
bhv_constant(id_bhvMrIParticle);
bhv_constant(id_bhvNormalCap);
bhv_constant(id_bhvObjectBubble);
bhv_constant(id_bhvObjectWaterSplash);
bhv_constant(id_bhvObjectWaterWave);
bhv_constant(id_bhvObjectWaveTrail);
bhv_constant(id_bhvOctagonalPlatformRotating);
bhv_constant(id_bhvOneCoin);
bhv_constant(id_bhvOpenableCageDoor);
bhv_constant(id_bhvOpenableGrill);
bhv_constant(id_bhvOrangeNumber);
bhv_constant(id_bhvPaintingDeathWarp);
bhv_constant(id_bhvPaintingStarCollectWarp);
bhv_constant(id_bhvPenguinBaby);
bhv_constant(id_bhvPenguinRaceFinishLine);
bhv_constant(id_bhvPenguinRaceShortcutCheck);
bhv_constant(id_bhvPillarBase);
bhv_constant(id_bhvPiranhaPlant);
bhv_constant(id_bhvPiranhaPlantBubble);
bhv_constant(id_bhvPiranhaPlantWakingBubbles);
bhv_constant(id_bhvPitBowlingBall);
bhv_constant(id_bhvPlatformOnTrack);
bhv_constant(id_bhvPlaysMusicTrackWhenTouched);
bhv_constant(id_bhvPlungeBubble);
bhv_constant(id_bhvPokey);
bhv_constant(id_bhvPokeyBodyPart);
bhv_constant(id_bhvPoleGrabbing);
bhv_constant(id_bhvPoundTinyStarParticle);
bhv_constant(id_bhvPunchTinyTriangle);
bhv_constant(id_bhvPurpleParticle);
bhv_constant(id_bhvPurpleSwitchHiddenBoxes);
bhv_constant(id_bhvPushableMetalBox);
bhv_constant(id_bhvPyramidElevator);
bhv_constant(id_bhvPyramidElevatorTrajectoryMarkerBall);
bhv_constant(id_bhvPyramidPillarTouchDetector);
bhv_constant(id_bhvPyramidTop);
bhv_constant(id_bhvPyramidTopFragment);
bhv_constant(id_bhvRacingPenguin);
bhv_constant(id_bhvRandomAnimatedTexture);
bhv_constant(id_bhvRecoveryHeart);
bhv_constant(id_bhvRedCoin);
bhv_constant(id_bhvRedCoinStarMarker);
bhv_constant(id_bhvRespawner);
bhv_constant(id_bhvRockSolid);
bhv_constant(id_bhvRotatingCounterClockwise);
bhv_constant(id_bhvRotatingExclamationMark);
bhv_constant(id_bhvRotatingPlatform);
bhv_constant(id_bhvRrCruiserWing);
bhv_constant(id_bhvRrElevatorPlatform);
bhv_constant(id_bhvRrRotatingBridgePlatform);
bhv_constant(id_bhvSandSoundLoop);
bhv_constant(id_bhvScuttlebug);
bhv_constant(id_bhvScuttlebugSpawn);
bhv_constant(id_bhvSeaweed);
bhv_constant(id_bhvSeaweedBundle);
bhv_constant(id_bhvSeesawPlatform);
bhv_constant(id_bhvShallowWaterSplash);
bhv_constant(id_bhvShallowWaterWave);
bhv_constant(id_bhvShipPart3);
bhv_constant(id_bhvSignOnWall);
bhv_constant(id_bhvSingleCoinGetsSpawned);
bhv_constant(id_bhvSkeeter);
bhv_constant(id_bhvSkeeterWave);
bhv_constant(id_bhvSlidingPlatform2);
bhv_constant(id_bhvSlidingSnowMound);
bhv_constant(id_bhvSLSnowmanWind);
bhv_constant(id_bhvSLWalkingPenguin);
bhv_constant(id_bhvSmallBomp);
bhv_constant(id_bhvSmallBully);
bhv_constant(id_bhvSmallChillBully);
bhv_constant(id_bhvSmallParticle);
bhv_constant(id_bhvSmallParticleBubbles);
bhv_constant(id_bhvSmallParticleSnow);
bhv_constant(id_bhvSmallPenguin);
bhv_constant(id_bhvSmallPiranhaFlame);
bhv_constant(id_bhvSmallWaterWave);
bhv_constant(id_bhvSmallWaterWave398);
bhv_constant(id_bhvSmallWhomp);
bhv_constant(id_bhvSmoke);
bhv_constant(id_bhvSnowBall);
bhv_constant(id_bhvSnowmansBodyCheckpoint);
bhv_constant(id_bhvSnowmansBottom);
bhv_constant(id_bhvSnowmansHead);
bhv_constant(id_bhvSnowMoundSpawn);
bhv_constant(id_bhvSnowParticleSpawner);
bhv_constant(id_bhvSnufit);
bhv_constant(id_bhvSnufitBalls);
bhv_constant(id_bhvSoundSpawner);
bhv_constant(id_bhvSparkle);
bhv_constant(id_bhvSparkleParticleSpawner);
bhv_constant(id_bhvSparkleSpawn);
bhv_constant(id_bhvSpawnedStar);
bhv_constant(id_bhvSpawnedStarNoLevelExit);
bhv_constant(id_bhvSpinAirborneCircleWarp);
bhv_constant(id_bhvSpinAirborneWarp);
bhv_constant(id_bhvSpindel);
bhv_constant(id_bhvSpindrift);
bhv_constant(id_bhvSpiny);
bhv_constant(id_bhvSquarishPathMoving);
bhv_constant(id_bhvSquarishPathParent);
bhv_constant(id_bhvSquishablePlatform);
bhv_constant(id_bhvSslMovingPyramidWall);
bhv_constant(id_bhvStar);
bhv_constant(id_bhvStarDoor);
bhv_constant(id_bhvStarKeyCollectionPuffSpawner);
bhv_constant(id_bhvStarNumber);
bhv_constant(id_bhvStarSpawnCoordinates);
bhv_constant(id_bhvStaticCheckeredPlatform);
bhv_constant(id_bhvStaticObject);
bhv_constant(id_bhvStrongWindParticle);
bhv_constant(id_bhvStub);
bhv_constant(id_bhvStub1D0C);
bhv_constant(id_bhvStub1D70);
bhv_constant(id_bhvSunkenShipPart);
bhv_constant(id_bhvSunkenShipPart2);
bhv_constant(id_bhvSunkenShipSetRotation);
bhv_constant(id_bhvSushiShark);
bhv_constant(id_bhvSushiSharkCollisionChild);
bhv_constant(id_bhvSwimmingWarp);
bhv_constant(id_bhvSwingPlatform);
bhv_constant(id_bhvSwoop);
bhv_constant(id_bhvTankFishGroup);
bhv_constant(id_bhvTemporaryYellowCoin);
bhv_constant(id_bhvTenCoinsSpawn);
bhv_constant(id_bhvThiBowlingBallSpawner);
bhv_constant(id_bhvThiHugeIslandTop);
bhv_constant(id_bhvThiTinyIslandTop);
bhv_constant(id_bhvThreeCoinsSpawn);
bhv_constant(id_bhvThwomp);
bhv_constant(id_bhvThwomp2);
bhv_constant(id_bhvTiltingBowserLavaPlatform);
bhv_constant(id_bhvTinyStrongWindParticle);
bhv_constant(id_bhvToadMessage);
bhv_constant(id_bhvTower);
bhv_constant(id_bhvTowerDoor);
bhv_constant(id_bhvTowerPlatformGroup);
bhv_constant(id_bhvToxBox);
bhv_constant(id_bhvTrackBall);
bhv_constant(id_bhvTreasureChestBottom);
bhv_constant(id_bhvTreasureChests);
bhv_constant(id_bhvTreasureChestsJrb);
bhv_constant(id_bhvTreasureChestsShip);
bhv_constant(id_bhvTreasureChestTop);
bhv_constant(id_bhvTree);
bhv_constant(id_bhvTreeLeaf);
bhv_constant(id_bhvTreeSnow);
bhv_constant(id_bhvTriangleParticleSpawner);
bhv_constant(id_bhvTripletButterfly);
bhv_constant(id_bhvTTC2DRotator);
bhv_constant(id_bhvTTCCog);
bhv_constant(id_bhvTTCElevator);
bhv_constant(id_bhvTTCMovingBar);
bhv_constant(id_bhvTTCPendulum);
bhv_constant(id_bhvTTCPitBlock);
bhv_constant(id_bhvTTCRotatingSolid);
bhv_constant(id_bhvTTCSpinner);
bhv_constant(id_bhvTTCTreadmill);
bhv_constant(id_bhvTtmBowlingBallSpawner);
bhv_constant(id_bhvTtmRollingLog);
bhv_constant(id_bhvTumblingBridgePlatform);
bhv_constant(id_bhvTuxiesMother);
bhv_constant(id_bhvTweester);
bhv_constant(id_bhvTweesterSandParticle);
bhv_constant(id_bhvUkiki);
bhv_constant(id_bhvUkikiCage);
bhv_constant(id_bhvUkikiCageChild);
bhv_constant(id_bhvUkikiCageStar);
bhv_constant(id_bhvUnagi);
bhv_constant(id_bhvUnagiSubobject);
bhv_constant(id_bhvUnlockDoorStar);
bhv_constant(id_bhvUnused05A8);
bhv_constant(id_bhvUnused0DFC);
bhv_constant(id_bhvUnused1820);
bhv_constant(id_bhvUnused1F30);
bhv_constant(id_bhvUnused20E0);
bhv_constant(id_bhvUnused2A10);
bhv_constant(id_bhvUnused2A54);
bhv_constant(id_bhvUnusedFakeStar);
bhv_constant(id_bhvUnusedParticleSpawn);
bhv_constant(id_bhvUnusedPoundablePlatform);
bhv_constant(id_bhvVanishCap);
bhv_constant(id_bhvVertStarParticleSpawner);
bhv_constant(id_bhvVolcanoFlames);
bhv_constant(id_bhvVolcanoSoundLoop);
bhv_constant(id_bhvWallTinyStarParticle);
bhv_constant(id_bhvWarp);
bhv_constant(id_bhvWarpPipe);
bhv_constant(id_bhvWaterAirBubble);
bhv_constant(id_bhvWaterBomb);
bhv_constant(id_bhvWaterBombCannon);
bhv_constant(id_bhvWaterBombShadow);
bhv_constant(id_bhvWaterBombSpawner);
bhv_constant(id_bhvWaterDroplet);
bhv_constant(id_bhvWaterDropletSplash);
bhv_constant(id_bhvWaterfallSoundLoop);
bhv_constant(id_bhvWaterLevelDiamond);
bhv_constant(id_bhvWaterLevelPillar);
bhv_constant(id_bhvWaterMist);
bhv_constant(id_bhvWaterMist2);
bhv_constant(id_bhvWaterSplash);
bhv_constant(id_bhvWaveTrail);
bhv_constant(id_bhvWdwExpressElevator);
bhv_constant(id_bhvWdwExpressElevatorPlatform);
bhv_constant(id_bhvWdwRectangularFloatingPlatform);
bhv_constant(id_bhvWdwSquareFloatingPlatform);
bhv_constant(id_bhvWfBreakableWallLeft);
bhv_constant(id_bhvWfBreakableWallRight);
bhv_constant(id_bhvWfElevatorTowerPlatform);
bhv_constant(id_bhvWfRotatingWoodenPlatform);
bhv_constant(id_bhvWfSlidingPlatform);
bhv_constant(id_bhvWfSlidingTowerPlatform);
bhv_constant(id_bhvWfSolidTowerPlatform);
bhv_constant(id_bhvWfTumblingBridge);
bhv_constant(id_bhvWhirlpool);
bhv_constant(id_bhvWhitePuff1);
bhv_constant(id_bhvWhitePuff2);
bhv_constant(id_bhvWhitePuffExplosion);
bhv_constant(id_bhvWhitePuffSmoke);
bhv_constant(id_bhvWhitePuffSmoke2);
bhv_constant(id_bhvWhompKingBoss);
bhv_constant(id_bhvWigglerBody);
bhv_constant(id_bhvWigglerHead);
bhv_constant(id_bhvWind);
bhv_constant(id_bhvWingCap);
bhv_constant(id_bhvWoodenPost);
bhv_constant(id_bhvYellowBackgroundInMenu);
bhv_constant(id_bhvYellowBall);
bhv_constant(id_bhvYellowCoin);
bhv_constant(id_bhvYoshi);
bhv_constant(id_RM_Scroll_Texture);
bhv_constant(id_editor_Scroll_Texture);
// Define a special type for new ids that don't override.
if (_Arg == "id_bhvNewId") { return (BehaviorScript) (0xFFFF); }
// Legacy behavior ids
bhv_legacy_constant(id_bhvFish2, id_bhvManyBlueFishSpawner);
bhv_legacy_constant(id_bhvFish3, id_bhvFewBlueFishSpawner);
bhv_legacy_constant(id_bhvLargeFishGroup, id_bhvFishSpawner);
// Model constants
s64 cModelConstant = DynOS_Common_ParseModelConstants(_Arg, found);
if (*found) { return cModelConstant; }
*found = true; // reset found value
// Object Fields
bhv_constant(oFlags);
bhv_constant(oDialogResponse);
bhv_constant(oDialogState);
bhv_constant(oUnk94);
bhv_constant(oSyncID);
bhv_constant(oIntangibleTimer);
bhv_constant(oPosX);
bhv_constant(oPosY);
bhv_constant(oPosZ);
bhv_constant(oVelX);
bhv_constant(oVelY);
bhv_constant(oVelZ);
bhv_constant(oForwardVel);
bhv_constant(oForwardVelS32);
bhv_constant(oUnkBC);
bhv_constant(oUnkC0);
bhv_constant(oMoveAnglePitch);
bhv_constant(oMoveAngleYaw);
bhv_constant(oMoveAngleRoll);
bhv_constant(oFaceAnglePitch);
bhv_constant(oFaceAngleYaw);
bhv_constant(oFaceAngleRoll);
bhv_constant(oGraphYOffset);
bhv_constant(oActiveParticleFlags);
bhv_constant(oGravity);
bhv_constant(oFloorHeight);
bhv_constant(oMoveFlags);
bhv_constant(oAnimState);
bhv_constant(oAngleVelPitch);
bhv_constant(oAngleVelYaw);
bhv_constant(oAngleVelRoll);
bhv_constant(oAnimations);
bhv_constant(oHeldState);
bhv_constant(oWallHitboxRadius);
bhv_constant(oDragStrength);
bhv_constant(oInteractType);
bhv_constant(oInteractStatus);
bhv_constant(oParentRelativePosX);
bhv_constant(oParentRelativePosY);
bhv_constant(oParentRelativePosZ);
bhv_constant(oBehParams2ndByte);
bhv_constant(oAction);
bhv_constant(oSubAction);
bhv_constant(oTimer);
bhv_constant(oBounciness);
bhv_constant(oDistanceToMario);
bhv_constant(oAngleToMario);
bhv_constant(oHomeX);
bhv_constant(oHomeY);
bhv_constant(oHomeZ);
bhv_constant(oFriction);
bhv_constant(oBuoyancy);
bhv_constant(oSoundStateID);
bhv_constant(oOpacity);
bhv_constant(oDamageOrCoinValue);
bhv_constant(oHealth);
bhv_constant(oBehParams);
bhv_constant(oPrevAction);
bhv_constant(oInteractionSubtype);
bhv_constant(oCollisionDistance);
bhv_constant(oNumLootCoins);
bhv_constant(oDrawingDistance);
bhv_constant(oRoom);
bhv_constant(oSyncDeath);
bhv_constant(oUnk1A8);
bhv_constant(oWallAngle);
bhv_constant(oFloorType);
bhv_constant(oFloorRoom);
bhv_constant(oAngleToHome);
bhv_constant(oFloor);
bhv_constant(oDeathSound);
bhv_constant(oPathedStartWaypoint);
bhv_constant(oPathedPrevWaypoint);
bhv_constant(oPathedPrevWaypointFlags);
bhv_constant(oPathedTargetPitch);
bhv_constant(oPathedTargetYaw);
bhv_constant(oMacroUnk108);
bhv_constant(oMacroUnk10C);
bhv_constant(oMacroUnk110);
/* 1-UpHidden */
bhv_constant(o1UpHiddenUnkF4);
bhv_constant(o1UpForceSpawn);
/* ActivatedBackandForthPlatform */
bhv_constant(oActivatedBackAndForthPlatformMaxOffset);
bhv_constant(oActivatedBackAndForthPlatformOffset);
bhv_constant(oActivatedBackAndForthPlatformVel);
bhv_constant(oActivatedBackAndForthPlatformCountdown);
bhv_constant(oActivatedBackAndForthPlatformStartYaw);
bhv_constant(oActivatedBackAndForthPlatformVertical);
bhv_constant(oActivatedBackAndForthPlatformFlipRotation);
/* Amp */
bhv_constant(oAmpRadiusOfRotation);
bhv_constant(oAmpYPhase);
/* HomingAmp */
bhv_constant(oHomingAmpLockedOn);
bhv_constant(oHomingAmpAvgY);
/* ArrowLift */
bhv_constant(oArrowLiftDisplacement);
bhv_constant(oArrowLiftUnk100);
/* Back-and-ForthPlatform */
bhv_constant(oBackAndForthPlatformDirection);
bhv_constant(oBackAndForthPlatformPathLength);
bhv_constant(oBackAndForthPlatformDistance);
bhv_constant(oBackAndForthPlatformVel);
/* Bird */
bhv_constant(oBirdSpeed);
bhv_constant(oBirdTargetPitch);
bhv_constant(oBirdTargetYaw);
/* BirdChirpChirp */
bhv_constant(oBirdChirpChirpUnkF4);
/* EndBirds */
bhv_constant(oEndBirdUnk104);
/* HiddenBlueCoin */
bhv_constant(oHiddenBlueCoinSwitch);
/* Bob-omb */
bhv_constant(oBobombBlinkTimer);
bhv_constant(oBobombFuseLit);
bhv_constant(oBobombFuseTimer);
/* Bob-ombBuddy */
bhv_constant(oBobombBuddyBlinkTimer);
bhv_constant(oBobombBuddyHasTalkedToMario);
bhv_constant(oBobombBuddyRole);
bhv_constant(oBobombBuddyCannonStatus);
bhv_constant(oBobombBuddyPosXCopy);
bhv_constant(oBobombBuddyPosYCopy);
bhv_constant(oBobombBuddyPosZCopy);
/* Bob-ombExplosionBubble */
bhv_constant(oBobombExpBubGfxScaleFacX);
bhv_constant(oBobombExpBubGfxScaleFacY);
bhv_constant(oBobombExpBubGfxExpRateX);
bhv_constant(oBobombExpBubGfxExpRateY);
/* Bomp(Small) */
bhv_constant(oSmallBompInitX);
/* Boo */
bhv_constant(oBooDeathStatus);
bhv_constant(oBooTargetOpacity);
bhv_constant(oBooBaseScale);
bhv_constant(oBooOscillationTimer);
bhv_constant(oBooMoveYawDuringHit);
bhv_constant(oBooMoveYawBeforeHit);
bhv_constant(oBooParentBigBoo);
bhv_constant(oBooNegatedAggressiveness);
bhv_constant(oBooInitialMoveYaw);
bhv_constant(oBooTurningSpeed);
/* BigBoo */
bhv_constant(oBigBooNumMinionBoosKilled);
/* Bookend */
bhv_constant(oBookendUnkF4);
bhv_constant(oBookendUnkF8);
/* BookSwitch */
bhv_constant(oBookSwitchUnkF4);
/* BookSwitchManager */
bhv_constant(oBookSwitchManagerUnkF4);
bhv_constant(oBookSwitchManagerUnkF8);
/* HauntedBookshelf */
bhv_constant(oHauntedBookshelfShouldOpen);
/* BouncingFireBall */
bhv_constant(oBouncingFireBallUnkF4);
/* BowlingBall */
bhv_constant(oBowlingBallTargetYaw);
//-reservedforpathing
/* BowlingBallSpawner(Generic) */
bhv_constant(oBBallSpawnerMaxSpawnDist);
bhv_constant(oBBallSpawnerSpawnOdds);
bhv_constant(oBBallSpawnerPeriodMinus1);
/* Bowser */
bhv_constant(oBowserUnk88);
bhv_constant(oBowserUnkF4);
bhv_constant(oBowserUnkF8);
bhv_constant(oBowserDistToCentre);
bhv_constant(oBowserUnk106);
bhv_constant(oBowserUnk108);
bhv_constant(oBowserHeldAnglePitch);
bhv_constant(oBowserHeldAngleVelYaw);
bhv_constant(oBowserUnk10E);
bhv_constant(oBowserUnk110);
bhv_constant(oBowserAngleToCentre);
bhv_constant(oBowserUnk1AC);
bhv_constant(oBowserUnk1AE);
bhv_constant(oBowserEyesShut);
bhv_constant(oBowserUnk1B2);
/* BowserShockwave */
bhv_constant(oBowserShockWaveUnkF4);
/* BlackSmokeBowser */
bhv_constant(oBlackSmokeBowserUnkF4);
/* BowserKeyCutscene */
bhv_constant(oBowserKeyScale);
/* BowserPuzzle */
bhv_constant(oBowserPuzzleCompletionFlags);
/* BowserPuzzlePiece */
bhv_constant(oBowserPuzzlePieceOffsetX);
bhv_constant(oBowserPuzzlePieceOffsetY);
bhv_constant(oBowserPuzzlePieceOffsetZ);
bhv_constant(oBowserPuzzlePieceContinuePerformingAction);
bhv_constant(oBowserPuzzlePieceActionList);
bhv_constant(oBowserPuzzlePieceNextAction);
/* Bubba */
bhv_constant(oBubbaUnkF4);
bhv_constant(oBubbaUnkF8);
bhv_constant(oBubbaUnkFC);
bhv_constant(oBubbaUnk100);
bhv_constant(oBubbaUnk104);
bhv_constant(oBubbaUnk108);
bhv_constant(oBubbaUnk10C);
bhv_constant(oBubbaUnk1AC);
bhv_constant(oBubbaUnk1AE);
bhv_constant(oBubbaUnk1B0);
bhv_constant(oBubbaUnk1B2);
/* BulletBill */
bhv_constant(oBulletBillInitialMoveYaw);
/* Bully(allvariants) */
bhv_constant(oBullySubtype);
bhv_constant(oBullyPrevX);
bhv_constant(oBullyPrevY);
bhv_constant(oBullyPrevZ);
bhv_constant(oBullyKBTimerAndMinionKOCounter);
bhv_constant(oBullyMarioCollisionAngle);
bhv_constant(oBullyLastNetworkPlayerIndex);
/* Butterfly */
bhv_constant(oButterflyYPhase);
/* TripletButterfly */
bhv_constant(oTripletButterflyScale);
bhv_constant(oTripletButterflySpeed);
bhv_constant(oTripletButterflyBaseYaw);
bhv_constant(oTripletButterflyTargetPitch);
bhv_constant(oTripletButterflyTargetYaw);
bhv_constant(oTripletButterflyType);
bhv_constant(oTripletButterflyModel);
bhv_constant(oTripletButterflySelectedButterfly);
bhv_constant(oTripletButterflyScalePhase);
/* Cannon */
bhv_constant(oCannonUnkF4);
bhv_constant(oCannonUnkF8);
bhv_constant(oCannonUnk10C);
bhv_constant(oCannonPlayerIndex);
/* Cap */
bhv_constant(oCapUnkF4);
bhv_constant(oCapUnkF8);
/* ChainChomp */
bhv_constant(oChainChompSegments);
bhv_constant(oChainChompMaxDistFromPivotPerChainPart);
bhv_constant(oChainChompMaxDistBetweenChainParts);
bhv_constant(oChainChompDistToPivot);
bhv_constant(oChainChompUnk104);
bhv_constant(oChainChompRestrictedByChain);
bhv_constant(oChainChompTargetPitch);
bhv_constant(oChainChompNumLunges);
bhv_constant(oChainChompReleaseStatus);
bhv_constant(oChainChompHitGate);
/* CheckerboardPlatform */
bhv_constant(oCheckerBoardPlatformUnkF8);
bhv_constant(oCheckerBoardPlatformUnkFC);
bhv_constant(oCheckerBoardPlatformUnk1AC);
/* CheepCheep */
bhv_constant(oCheepCheepUnkF4);
bhv_constant(oCheepCheepUnkF8);
bhv_constant(oCheepCheepUnkFC);
bhv_constant(oCheepCheepUnk104);
bhv_constant(oCheepCheepUnk108);
/* Chuckya */
bhv_constant(oChuckyaUnk88);
bhv_constant(oChuckyaUnkF8);
bhv_constant(oChuckyaUnkFC);
bhv_constant(oChuckyaUnk100);
/* Clam */
bhv_constant(oClamUnkF4);
/* Cloud */
bhv_constant(oCloudCenterX);
bhv_constant(oCloudCenterY);
bhv_constant(oCloudBlowing);
bhv_constant(oCloudGrowSpeed);
bhv_constant(oCloudFwooshMovementRadius);
/* Coin */
bhv_constant(oCoinUnkF4);
bhv_constant(oCoinUnkF8);
bhv_constant(oCoinUnk110);
#ifndef VERSION_JP
bhv_constant(oCoinUnk1B0);
#endif
/* CollisionParticle */
bhv_constant(oCollisionParticleUnkF4);
/* ControllablePlatform */
bhv_constant(oControllablePlatformUnkF8);
bhv_constant(oControllablePlatformUnkFC);
bhv_constant(oControllablePlatformUnk100);
/* BreakableBoxSmall(SmallCorkBox) */
bhv_constant(oBreakableBoxSmallReleased);
bhv_constant(oBreakableBoxSmallFramesSinceReleased);
/* JumpingBox(CrazyBox) */
bhv_constant(oJumpingBoxUnkF4);
bhv_constant(oJumpingBoxUnkF8);
/* RRCruiserWing */
bhv_constant(oRRCruiserWingUnkF4);
bhv_constant(oRRCruiserWingUnkF8);
/* DonutPlatformSpawner */
bhv_constant(oDonutPlatformSpawnerSpawnedPlatforms);
/* Door */
bhv_constant(oDoorUnk88);
bhv_constant(oDoorUnkF8);
bhv_constant(oDoorUnkFC);
bhv_constant(oDoorUnk100);
/* Dorrie */
bhv_constant(oDorrieDistToHome);
bhv_constant(oDorrieOffsetY);
bhv_constant(oDorrieVelY);
bhv_constant(oDorrieForwardDistToMario);
bhv_constant(oDorrieYawVel);
bhv_constant(oDorrieLiftingMario);
bhv_constant(oDorrieGroundPounded);
bhv_constant(oDorrieAngleToHome);
bhv_constant(oDorrieNeckAngle);
bhv_constant(oDorrieHeadRaiseSpeed);
/* Elevator */
bhv_constant(oElevatorUnkF4);
bhv_constant(oElevatorUnkF8);
bhv_constant(oElevatorUnkFC);
bhv_constant(oElevatorUnk100);
/* ExclamationBox */
bhv_constant(oExclamationBoxUnkF4);
bhv_constant(oExclamationBoxUnkF8);
bhv_constant(oExclamationBoxUnkFC);
bhv_constant(oExclamationBoxForce);
/* EyerokBoss */
bhv_constant(oEyerokBossNumHands);
bhv_constant(oEyerokBossUnkFC);
bhv_constant(oEyerokBossActiveHand);
bhv_constant(oEyerokBossUnk104);
bhv_constant(oEyerokBossUnk108);
bhv_constant(oEyerokBossUnk10C);
bhv_constant(oEyerokBossUnk110);
bhv_constant(oEyerokBossUnk1AC);
/* EyerokHand */
bhv_constant(oEyerokHandWakeUpTimer);
bhv_constant(oEyerokReceivedAttack);
bhv_constant(oEyerokHandUnkFC);
bhv_constant(oEyerokHandUnk100);
bhv_constant(oEyerokHandDead);
/* FallingPillar */
bhv_constant(oFallingPillarPitchAcceleration);
/* FireSpitter */
bhv_constant(oFireSpitterScaleVel);
bhv_constant(oFireSpitterLastWaterY);
/* BlueFish */
bhv_constant(oBlueFishRandomVel);
bhv_constant(oBlueFishRandomTime);
bhv_constant(oBlueFishRandomAngle);
/* FishGroup */
bhv_constant(oFishWaterLevel);
bhv_constant(oFishGoalY);
bhv_constant(oFishHeightOffset);
bhv_constant(oFishYawVel);
bhv_constant(oFishRoamDistance);
bhv_constant(oFishGoalVel);
bhv_constant(oFishDepthDistance);
bhv_constant(oFishActiveDistance);
/* Flame */
bhv_constant(oFlameScale);
bhv_constant(oFlameSpeedTimerOffset);
bhv_constant(oFlameUnkFC);
bhv_constant(oFlameBowser);
/* BlueFlame */
bhv_constant(oBlueFlameNextScale);
/* SmallPiranhaFlame */
bhv_constant(oSmallPiranhaFlameStartSpeed);
bhv_constant(oSmallPiranhaFlameEndSpeed);
bhv_constant(oSmallPiranhaFlameModel);
bhv_constant(oSmallPiranhaFlameNextFlameTimer);
bhv_constant(oSmallPiranhaFlameSpeed);
/* MovingFlame */
bhv_constant(oMovingFlameTimer);
/* FlamethrowerFlame */
bhv_constant(oFlameThowerFlameUnk110);
/* Flamethrower */
bhv_constant(oFlameThowerUnk110);
/* FloatingPlatform */
bhv_constant(oFloatingPlatformUnkF4);
bhv_constant(oFloatingPlatformUnkF8);
bhv_constant(oFloatingPlatformUnkFC);
bhv_constant(oFloatingPlatformUnk100);
/* FloorSwitchPressAnimation */
bhv_constant(oFloorSwitchPressAnimationUnkF4);
bhv_constant(oFloorSwitchPressAnimationUnkF8);
bhv_constant(oFloorSwitchPressAnimationUnkFC);
bhv_constant(oFloorSwitchPressAnimationUnk100);
/* FlyGuy */
bhv_constant(oFlyGuyIdleTimer);
bhv_constant(oFlyGuyOscTimer);
bhv_constant(oFlyGuyUnusedJitter);
bhv_constant(oFlyGuyLungeYDecel);
bhv_constant(oFlyGuyLungeTargetPitch);
bhv_constant(oFlyGuyTargetRoll);
bhv_constant(oFlyGuyScaleVel);
/* GrandStar */
bhv_constant(oGrandStarUnk108);
/* HorizontalGrindel */
bhv_constant(oHorizontalGrindelTargetYaw);
bhv_constant(oHorizontalGrindelDistToHome);
bhv_constant(oHorizontalGrindelOnGround);
/* Goomba */
bhv_constant(oGoombaSize);
bhv_constant(oGoombaScale);
bhv_constant(oGoombaWalkTimer);
bhv_constant(oGoombaTargetYaw);
bhv_constant(oGoombaBlinkTimer);
bhv_constant(oGoombaTurningAwayFromWall);
bhv_constant(oGoombaRelativeSpeed);
bhv_constant(oGoombaJumpCooldown);
/* HauntedChair */
bhv_constant(oHauntedChairUnkF4);
bhv_constant(oHauntedChairUnkF8);
bhv_constant(oHauntedChairUnkFC);
bhv_constant(oHauntedChairUnk100);
bhv_constant(oHauntedChairUnk104);
/* Heave-Ho */
bhv_constant(oHeaveHoUnk88);
bhv_constant(oHeaveHoUnkF4);
/* HiddenObject */
bhv_constant(oHiddenObjectUnkF4);
/* Hoot */
bhv_constant(oHootAvailability);
bhv_constant(oHootMarioReleaseTime);
/* HorizontalMovement */
bhv_constant(oHorizontalMovementUnkF4);
bhv_constant(oHorizontalMovementUnkF8);
bhv_constant(oHorizontalMovementUnk100);
bhv_constant(oHorizontalMovementUnk104);
bhv_constant(oHorizontalMovementUnk108);
/* KickableBoard */
bhv_constant(oKickableBoardF4);
bhv_constant(oKickableBoardF8);
/* KingBob-omb */
bhv_constant(oKingBobombUnk88);
bhv_constant(oKingBobombUnkF8);
bhv_constant(oKingBobombUnkFC);
bhv_constant(oKingBobombUnk100);
bhv_constant(oKingBobombUnk104);
bhv_constant(oKingBobombUnk108);
/* Klepto */
bhv_constant(oKleptoDistanceToTarget);
bhv_constant(oKleptoUnkF8);
bhv_constant(oKleptoUnkFC);
bhv_constant(oKleptoSpeed);
bhv_constant(oKleptoStartPosX);
bhv_constant(oKleptoStartPosY);
bhv_constant(oKleptoStartPosZ);
bhv_constant(oKleptoTimeUntilTargetChange);
bhv_constant(oKleptoTargetNumber);
bhv_constant(oKleptoUnk1AE);
bhv_constant(oKleptoUnk1B0);
bhv_constant(oKleptoYawToTarget);
/* Koopa */
bhv_constant(oKoopaAgility);
bhv_constant(oKoopaMovementType);
bhv_constant(oKoopaTargetYaw);
bhv_constant(oKoopaUnshelledTimeUntilTurn);
bhv_constant(oKoopaTurningAwayFromWall);
bhv_constant(oKoopaDistanceToMario);
bhv_constant(oKoopaAngleToMario);
bhv_constant(oKoopaBlinkTimer);
bhv_constant(oKoopaCountdown);
bhv_constant(oKoopaTheQuickRaceIndex);
bhv_constant(oKoopaTheQuickInitTextboxCooldown);
//-forkoopathequickreservedforpathing
/* KoopaRaceEndpoint */
bhv_constant(oKoopaRaceEndpointRaceBegun);
bhv_constant(oKoopaRaceEndpointKoopaFinished);
bhv_constant(oKoopaRaceEndpointRaceStatus);
bhv_constant(oKoopaRaceEndpointUnk100);
bhv_constant(oKoopaRaceEndpointRaceEnded);
/* KoopaShellFlame */
bhv_constant(oKoopaShellFlameUnkF4);
bhv_constant(oKoopaShellFlameUnkF8);
/* CameraLakitu */
bhv_constant(oCameraLakituBlinkTimer);
bhv_constant(oCameraLakituSpeed);
bhv_constant(oCameraLakituCircleRadius);
bhv_constant(oCameraLakituFinishedDialog);
#ifndef VERSION_JP
bhv_constant(oCameraLakituUnk104);
#endif
bhv_constant(oCameraLakituPitchVel);
bhv_constant(oCameraLakituYawVel);
/* EvilLakitu */
bhv_constant(oEnemyLakituNumSpinies);
bhv_constant(oEnemyLakituBlinkTimer);
bhv_constant(oEnemyLakituSpinyCooldown);
bhv_constant(oEnemyLakituFaceForwardCountdown);
/* IntroCutsceneLakitu */
bhv_constant(oIntroLakituSplineSegmentProgress);
bhv_constant(oIntroLakituSplineSegment);
bhv_constant(oIntroLakituUnk100);
bhv_constant(oIntroLakituUnk104);
bhv_constant(oIntroLakituUnk108);
bhv_constant(oIntroLakituUnk10C);
bhv_constant(oIntroLakituUnk110);
bhv_constant(oIntroLakituCloud);
/* MainMenuButton */
bhv_constant(oMenuButtonState);
bhv_constant(oMenuButtonTimer);
bhv_constant(oMenuButtonOrigPosX);
bhv_constant(oMenuButtonOrigPosY);
bhv_constant(oMenuButtonOrigPosZ);
bhv_constant(oMenuButtonScale);
bhv_constant(oMenuButtonActionPhase);
bhv_constant(oMenuButtonIsCustom);
/* MantaRay */
bhv_constant(oMantaTargetPitch);
bhv_constant(oMantaTargetYaw);
/* Merry-Go-Round */
bhv_constant(oMerryGoRoundStopped);
bhv_constant(oMerryGoRoundMusicShouldPlay);
bhv_constant(oMerryGoRoundMarioIsOutside);
/* Merry-Go-RoundBooManager */
bhv_constant(oMerryGoRoundBooManagerNumBoosKilled);
bhv_constant(oMerryGoRoundBooManagerNumBoosSpawned);
/* Mips */
bhv_constant(oMipsStarStatus);
bhv_constant(oMipsStartWaypointIndex);
//-reservedforpathing
bhv_constant(oMipsForwardVelocity);
/* Moneybag */
bhv_constant(oMoneybagJumpState);
/* MontyMole */
bhv_constant(oMontyMoleCurrentHole);
bhv_constant(oMontyMoleHeightRelativeToFloor);
bhv_constant(oMontyMoleHoleX);
bhv_constant(oMontyMoleHoleY);
bhv_constant(oMontyMoleHoleZ);
/* MontyMoleHole */
bhv_constant(oMontyMoleHoleCooldown);
/* Mr.Blizzard */
bhv_constant(oMrBlizzardScale);
bhv_constant(oMrBlizzardHeldObj);
bhv_constant(oMrBlizzardGraphYVel);
bhv_constant(oMrBlizzardTimer);
bhv_constant(oMrBlizzardDizziness);
bhv_constant(oMrBlizzardChangeInDizziness);
bhv_constant(oMrBlizzardGraphYOffset);
bhv_constant(oMrBlizzardDistFromHome);
bhv_constant(oMrBlizzardTargetMoveYaw);
/* Mr.I */
bhv_constant(oMrIUnkF4);
bhv_constant(oMrIUnkFC);
bhv_constant(oMrIUnk100);
bhv_constant(oMrIUnk104);
bhv_constant(oMrIUnk108);
bhv_constant(oMrISize);
bhv_constant(oMrIUnk110);
/* ObjectRespawner */
bhv_constant(oRespawnerModelToRespawn);
bhv_constant(oRespawnerMinSpawnDist);
bhv_constant(oRespawnerBehaviorToRespawn);
/* OpenableGrill */
bhv_constant(oOpenableGrillUnk88);
bhv_constant(oOpenableGrillUnkF4);
/* IntroCutscenePeach */
bhv_constant(oIntroPeachYawFromFocus);
bhv_constant(oIntroPeachPitchFromFocus);
bhv_constant(oIntroPeachDistToCamera);
/* RacingPenguin */
bhv_constant(oRacingPenguinInitTextCooldown);
//-reservedforpathing
bhv_constant(oRacingPenguinWeightedNewTargetSpeed);
bhv_constant(oRacingPenguinFinalTextbox);
bhv_constant(oRacingPenguinMarioWon);
bhv_constant(oRacingPenguinReachedBottom);
bhv_constant(oRacingPenguinMarioCheated);
/* SmallPenguin */
bhv_constant(oSmallPenguinUnk88);
bhv_constant(oSmallPenguinUnk100);
bhv_constant(oSmallPenguinUnk104);
bhv_constant(oSmallPenguinUnk108);
bhv_constant(oSmallPenguinUnk110);
/* SLWalkingPenguin */
bhv_constant(oSLWalkingPenguinWindCollisionXPos);
bhv_constant(oSLWalkingPenguinWindCollisionZPos);
bhv_constant(oSLWalkingPenguinCurStep);
bhv_constant(oSLWalkingPenguinCurStepTimer);
/* PiranhaPlant */
bhv_constant(oPiranhaPlantSleepMusicState);
bhv_constant(oPiranhaPlantScale);
/* FirePiranhaPlant */
bhv_constant(oFirePiranhaPlantNeutralScale);
bhv_constant(oFirePiranhaPlantScale);
bhv_constant(oFirePiranhaPlantActive);
bhv_constant(oFirePiranhaPlantDeathSpinTimer);
bhv_constant(oFirePiranhaPlantDeathSpinVel);
/* Pitoune */
bhv_constant(oPitouneUnkF4);
bhv_constant(oPitouneUnkF8);
bhv_constant(oPitouneUnkFC);
/* Platform */
bhv_constant(oPlatformTimer);
bhv_constant(oPlatformUnkF8);
bhv_constant(oPlatformUnkFC);
bhv_constant(oPlatformUnk10C);
bhv_constant(oPlatformUnk110);
/* PlatformonTracks */
bhv_constant(oPlatformOnTrackBaseBallIndex);
bhv_constant(oPlatformOnTrackDistMovedSinceLastBall);
bhv_constant(oPlatformOnTrackSkiLiftRollVel);
bhv_constant(oPlatformOnTrackStartWaypoint);
bhv_constant(oPlatformOnTrackPrevWaypoint);
bhv_constant(oPlatformOnTrackPrevWaypointFlags);
bhv_constant(oPlatformOnTrackPitch);
bhv_constant(oPlatformOnTrackYaw);
bhv_constant(oPlatformOnTrackOffsetY);
bhv_constant(oPlatformOnTrackIsNotSkiLift);
bhv_constant(oPlatformOnTrackIsNotHMC);
bhv_constant(oPlatformOnTrackType);
bhv_constant(oPlatformOnTrackWasStoodOn);
/* PlatformSpawner */
bhv_constant(oPlatformSpawnerUnkF4);
bhv_constant(oPlatformSpawnerUnkF8);
bhv_constant(oPlatformSpawnerUnkFC);
bhv_constant(oPlatformSpawnerUnk100);
bhv_constant(oPlatformSpawnerUnk104);
bhv_constant(oPlatformSpawnerUnk108);
/* Pokey */
bhv_constant(oPokeyAliveBodyPartFlags);
bhv_constant(oPokeyNumAliveBodyParts);
bhv_constant(oPokeyBottomBodyPartSize);
bhv_constant(oPokeyHeadWasKilled);
bhv_constant(oPokeyTargetYaw);
bhv_constant(oPokeyChangeTargetTimer);
bhv_constant(oPokeyTurningAwayFromWall);
/* PokeyBodyPart */
bhv_constant(oPokeyBodyPartDeathDelayAfterHeadKilled);
bhv_constant(oPokeyBodyPartBlinkTimer);
/* DDDPole */
bhv_constant(oDDDPoleVel);
bhv_constant(oDDDPoleMaxOffset);
bhv_constant(oDDDPoleOffset);
/* PyramidTop */
bhv_constant(oPyramidTopPillarsTouched);
/* PyramidTopExplosion */
bhv_constant(oPyramidTopFragmentsScale);
/* RollingLog */
bhv_constant(oRollingLogUnkF4);
/* LllRotatingHexFlame */
bhv_constant(oLllRotatingHexFlameUnkF4);
bhv_constant(oLllRotatingHexFlameUnkF8);
bhv_constant(oLllRotatingHexFlameUnkFC);
/* Scuttlebug */
bhv_constant(oScuttlebugUnkF4);
bhv_constant(oScuttlebugUnkF8);
bhv_constant(oScuttlebugUnkFC);
/* ScuttlebugSpawner */
bhv_constant(oScuttlebugSpawnerUnk88);
bhv_constant(oScuttlebugSpawnerUnkF4);
/* SeesawPlatform */
bhv_constant(oSeesawPlatformPitchVel);
/* ShipPart3 */
bhv_constant(oShipPart3UnkF4);
bhv_constant(oShipPart3UnkF8);
/* SinkWhenSteppedOn */
bhv_constant(oSinkWhenSteppedOnUnk104);
bhv_constant(oSinkWhenSteppedOnUnk108);
/* Skeeter */
bhv_constant(oSkeeterTargetAngle);
bhv_constant(oSkeeterUnkF8);
bhv_constant(oSkeeterUnkFC);
bhv_constant(oSkeeterWaitTime);
bhv_constant(oSkeeterLastWaterY);
bhv_constant(oSkeeterUnk1AC);
/* JrbSlidingBox */
bhv_constant(oJrbSlidingBoxUnkF4);
bhv_constant(oJrbSlidingBoxUnkF8);
bhv_constant(oJrbSlidingBoxUnkFC);
/* WFSlidingBrickPlatform */
bhv_constant(oWFSlidBrickPtfmMovVel);
/* Smoke */
bhv_constant(oSmokeTimer);
/* Snowman'sBottom */
bhv_constant(oSnowmansBottomUnkF4);
bhv_constant(oSnowmansBottomUnkF8);
bhv_constant(oSnowmansBottomUnk1AC);
//-reservedforpathing
/* Snowman'sHead */
bhv_constant(oSnowmansHeadUnkF4);
/* SnowmanWindBlowing */
bhv_constant(oSLSnowmanWindOriginalYaw);
/* Snufit */
bhv_constant(oSnufitRecoil);
bhv_constant(oSnufitScale);
bhv_constant(oSnufitCircularPeriod);
bhv_constant(oSnufitBodyScalePeriod);
bhv_constant(oSnufitBodyBaseScale);
bhv_constant(oSnufitBullets);
bhv_constant(oSnufitXOffset);
bhv_constant(oSnufitYOffset);
bhv_constant(oSnufitZOffset);
bhv_constant(oSnufitBodyScale);
/* Spindel */
bhv_constant(oSpindelUnkF4);
bhv_constant(oSpindelUnkF8);
/* SpinningHeart */
bhv_constant(oSpinningHeartTotalSpin);
bhv_constant(oSpinningHeartPlayedSound);
/* Spiny */
bhv_constant(oSpinyTimeUntilTurn);
bhv_constant(oSpinyTargetYaw);
bhv_constant(oSpinyTurningAwayFromWall);
/* SoundEffect */
bhv_constant(oSoundEffectUnkF4);
/* StarSpawn */
bhv_constant(oStarSpawnDisFromHome);
bhv_constant(oStarSpawnUnkFC);
bhv_constant(oStarSpawnExtCutsceneFlags);
/* HiddenStar */
//Secrets/RedCoins
bhv_constant(oHiddenStarTriggerCounter);
bhv_constant(oHiddenStarLastInteractedObject);
//Overallverydifficulttodetermineusage,mostlystubbedcode.
/* SparkleSpawnStar */
bhv_constant(oSparkleSpawnUnk1B0);
/* SealedDoorStar */
bhv_constant(oUnlockDoorStarState);
bhv_constant(oUnlockDoorStarTimer);
bhv_constant(oUnlockDoorStarYawVel);
/* CelebrationStar */
bhv_constant(oCelebStarUnkF4);
bhv_constant(oCelebStarDiameterOfRotation);
/* StarSelector */
bhv_constant(oStarSelectorType);
bhv_constant(oStarSelectorTimer);
bhv_constant(oStarSelectorSize);
/* SushiShark */
bhv_constant(oSushiSharkUnkF4);
/* SwingPlatform */
bhv_constant(oSwingPlatformAngle);
bhv_constant(oSwingPlatformSpeed);
/* Swoop */
bhv_constant(oSwoopBonkCountdown);
bhv_constant(oSwoopTargetPitch);
bhv_constant(oSwoopTargetYaw);
/* Thwomp */
bhv_constant(oThwompRandomTimer);
/* TiltingPlatform */
bhv_constant(oTiltingPyramidNormalX);
bhv_constant(oTiltingPyramidNormalY);
bhv_constant(oTiltingPyramidNormalZ);
bhv_constant(oTiltingPyramidMarioOnPlatform);
/* ToadMessage */
bhv_constant(oToadMessageDialogId);
bhv_constant(oToadMessageRecentlyTalked);
bhv_constant(oToadMessageState);
/* ToxBox */
bhv_constant(oToxBoxMovementPattern);
bhv_constant(oToxBoxMovementStep);
/* TTCRotatingSolid */
bhv_constant(oTTCRotatingSolidNumTurns);
bhv_constant(oTTCRotatingSolidNumSides);
bhv_constant(oTTCRotatingSolidRotationDelay);
bhv_constant(oTTCRotatingSolidVelY);
bhv_constant(oTTCRotatingSolidSoundTimer);
/* TTCPendulum */
bhv_constant(oTTCPendulumAccelDir);
bhv_constant(oTTCPendulumAngle);
bhv_constant(oTTCPendulumAngleVel);
bhv_constant(oTTCPendulumAngleAccel);
bhv_constant(oTTCPendulumDelay);
bhv_constant(oTTCPendulumSoundTimer);
/* TTCTreadmill */
bhv_constant(oTTCTreadmillBigSurface);
bhv_constant(oTTCTreadmillSmallSurface);
bhv_constant(oTTCTreadmillSpeed);
bhv_constant(oTTCTreadmillTargetSpeed);
bhv_constant(oTTCTreadmillTimeUntilSwitch);
/* TTCMovingBar */
bhv_constant(oTTCMovingBarDelay);
bhv_constant(oTTCMovingBarStoppedTimer);
bhv_constant(oTTCMovingBarOffset);
bhv_constant(oTTCMovingBarSpeed);
bhv_constant(oTTCMovingBarStartOffset);
/* TTCCog */
bhv_constant(oTTCCogDir);
bhv_constant(oTTCCogSpeed);
bhv_constant(oTTCCogTargetVel);
/* TTCPitBlock */
bhv_constant(oTTCPitBlockPeakY);
bhv_constant(oTTCPitBlockDir);
bhv_constant(oTTCPitBlockWaitTime);
/* TTCElevator */
bhv_constant(oTTCElevatorDir);
bhv_constant(oTTCElevatorPeakY);
bhv_constant(oTTCElevatorMoveTime);
/* TTC2DRotator */
bhv_constant(oTTC2DRotatorMinTimeUntilNextTurn);
bhv_constant(oTTC2DRotatorTargetYaw);
bhv_constant(oTTC2DRotatorIncrement);
bhv_constant(oTTC2DRotatorRandomDirTimer);
bhv_constant(oTTC2DRotatorSpeed);
/* TTCSpinner */
bhv_constant(oTTCSpinnerDir);
bhv_constant(oTTCChangeDirTimer);
/* BetaTrampoline */
bhv_constant(oBetaTrampolineMarioOnTrampoline);
/* TreasureChest */
bhv_constant(oTreasureChestCurrentAnswer);
bhv_constant(oTreasureChestIsLastInteractionIncorrect);
bhv_constant(oTreasureChestIsAboveWater);
bhv_constant(oTreasureChestSound);
bhv_constant(oTreasureChestLastNetworkPlayerIndex);
/* TreeSnowOrLeaf */
bhv_constant(oTreeSnowOrLeafUnkF4);
bhv_constant(oTreeSnowOrLeafUnkF8);
bhv_constant(oTreeSnowOrLeafUnkFC);
/* TumblingBridge */
bhv_constant(oTumblingBridgeUnkF4);
/* Tweester */
bhv_constant(oTweesterScaleTimer);
bhv_constant(oTweesterUnused);
/* Ukiki */
bhv_constant(oUkikiTauntCounter);
bhv_constant(oUkikiTauntsToBeDone);
//-reservedforpathing
bhv_constant(oUkikiChaseFleeRange);
bhv_constant(oUkikiTextState);
bhv_constant(oUkikiTextboxTimer);
bhv_constant(oUkikiCageSpinTimer);
bhv_constant(oUkikiHasCap);
/* UkikiCage */
bhv_constant(oUkikiCageNextAction);
/* Unagi */
bhv_constant(oUnagiUnkF4);
bhv_constant(oUnagiUnkF8);
//-reservedforpathing
bhv_constant(oUnagiUnk110);
bhv_constant(oUnagiUnk1AC);
bhv_constant(oUnagiUnk1B0);
bhv_constant(oUnagiUnk1B2);
/* WaterBomb */
bhv_constant(oWaterBombVerticalStretch);
bhv_constant(oWaterBombStretchSpeed);
bhv_constant(oWaterBombOnGround);
bhv_constant(oWaterBombNumBounces);
/* WaterBombSpawner */
bhv_constant(oWaterBombSpawnerBombActive);
bhv_constant(oWaterBombSpawnerTimeToSpawn);
/* WaterBombCannon */
bhv_constant(oWaterCannonUnkF4);
bhv_constant(oWaterCannonUnkF8);
bhv_constant(oWaterCannonUnkFC);
bhv_constant(oWaterCannonUnk100);
/* CannonBarrelBubbles */
bhv_constant(oCannonBarrelBubblesUnkF4);
/* WaterLevelPillar */
bhv_constant(oWaterLevelPillarDrained);
/* WaterLevelTrigger */
bhv_constant(oWaterLevelTriggerUnkF4);
bhv_constant(oWaterLevelTriggerTargetWaterLevel);
/* WaterObjects */
bhv_constant(oWaterObjUnkF4);
bhv_constant(oWaterObjUnkF8);
bhv_constant(oWaterObjUnkFC);
bhv_constant(oWaterObjUnk100);
/* WaterRing(bothvariants) */
bhv_constant(oWaterRingScalePhaseX);
bhv_constant(oWaterRingScalePhaseY);
bhv_constant(oWaterRingScalePhaseZ);
bhv_constant(oWaterRingNormalX);
bhv_constant(oWaterRingNormalY);
bhv_constant(oWaterRingNormalZ);
bhv_constant(oWaterRingMarioDistInFront);
bhv_constant(oWaterRingIndex);
bhv_constant(oWaterRingAvgScale);
/* WaterRingSpawner(JetStreamRingSpawnerandMantaRay) */
bhv_constant(oWaterRingSpawnerRingsCollected);
/* WaterRingManager(JetStreamRingSpawnerandMantaRayRingManager) */
bhv_constant(oWaterRingMgrNextRingIndex);
bhv_constant(oWaterRingMgrLastRingCollected);
/* WaveTrail */
bhv_constant(oWaveTrailSize);
/* Whirlpool */
bhv_constant(oWhirlpoolInitFacePitch);
bhv_constant(oWhirlpoolInitFaceRoll);
bhv_constant(oWhirlpoolTimeout);
/* WhitePuffExplode */
bhv_constant(oWhitePuffUnkF4);
bhv_constant(oWhitePuffUnkF8);
bhv_constant(oWhitePuffUnkFC);
/* WhiteWindParticle */
bhv_constant(oStrongWindParticlePenguinObj);
/* Whomp */
bhv_constant(oWhompShakeVal);
/* Wiggler */
bhv_constant(oWigglerFallThroughFloorsHeight);
bhv_constant(oWigglerSegments);
bhv_constant(oWigglerWalkAnimSpeed);
bhv_constant(oWigglerSquishSpeed);
bhv_constant(oWigglerTimeUntilRandomTurn);
bhv_constant(oWigglerTargetYaw);
bhv_constant(oWigglerWalkAwayFromWallTimer);
bhv_constant(oWigglerUnused);
bhv_constant(oWigglerTextStatus);
/* LllWoodPiece */
bhv_constant(oLllWoodPieceOscillationTimer);
/* WoodenPost */
bhv_constant(oWoodenPostTotalMarioAngle);
bhv_constant(oWoodenPostPrevAngleToMario);
bhv_constant(oWoodenPostSpeedY);
bhv_constant(oWoodenPostMarioPounding);
bhv_constant(oWoodenPostOffsetY);
/* Yoshi */
bhv_constant(oYoshiBlinkTimer);
bhv_constant(oYoshiChosenHome);
bhv_constant(oYoshiTargetYaw);
/* BreakableWall */
bhv_constant(oBreakableWallForce);
*found = false;
return 0;
}
template <typename T>
DataNode<T> *FindDataNode(DataNodes<T> &aDataNodes, String &aName, u32 aModelIdentifier) {
DataNode<T> *best = NULL;
for (auto& node : aDataNodes) {
if (aName == node->mName) {
if (aModelIdentifier == node->mModelIdentifier) {
return node;
}
best = node;
}
}
return best;
}
static BehaviorScript ParseBehaviorScriptSymbolArgInternal(GfxData *aGfxData, DataNode<BehaviorScript> *aNode, u64 &aTokenIndex, bool *found) {
String _Arg = aNode->mTokens[aTokenIndex++];
u64 _ModelIdentifier = aNode->mModelIdentifier;
*found = true;
// Built-in functions
const void *_FunctionPtr = DynOS_Builtin_Func_GetFromName(_Arg.begin());
if (_FunctionPtr != NULL) {
return (s64) _FunctionPtr;
}
// Built-in actors
auto builtinActor = DynOS_Builtin_Actor_GetFromName(_Arg.begin());
if (builtinActor != NULL) {
return (BehaviorScript)builtinActor;
}
// Built-in Lvl Geos
auto builtinGeo = DynOS_Builtin_LvlGeo_GetFromName(_Arg.begin());
if (builtinGeo != NULL) {
return (BehaviorScript)builtinGeo;
}
// Built-in Cols
auto builtinCol = DynOS_Builtin_Col_GetFromName(_Arg.begin());
if (builtinCol != NULL) {
return (BehaviorScript)builtinCol;
}
// Built-in Animations
auto builtinAnim = DynOS_Builtin_Anim_GetFromName(_Arg.begin());
if (builtinAnim != NULL) {
return (BehaviorScript)builtinAnim;
}
// Integers
bool integerFound = false;
s64 integerValue = DynOS_Misc_ParseInteger(_Arg, &integerFound);
if (integerFound) {
return integerValue;
}
// Parse integer constants
bool intConstantFound = false;
s64 constantIntValue = DynOS_Bhv_ParseBehaviorIntegerScriptConstants(_Arg, &intConstantFound);
if (intConstantFound) {
return (BehaviorScript) constantIntValue;
}
// Recursive descent parsing
bool rdIntSuccess = false;
s64 rdIntValue = DynOS_RecursiveDescent_Parse(_Arg.begin(), &rdIntSuccess, DynOS_Bhv_ParseBehaviorIntegerScriptConstants);
if (rdIntSuccess) {
return (BehaviorScript)rdIntValue;
}
// Parse all other constants last so everything else is found for certain.
bool constantFound = false;
s64 constantValue = DynOS_Bhv_ParseBehaviorScriptConstants(_Arg, &constantFound);
if (constantFound) {
return (BehaviorScript) constantValue;
}
*found = false;
return 0;
}
static BehaviorScript ParseBehaviorScriptSymbolArg(GfxData *aGfxData, DataNode<BehaviorScript> *aNode, u64 &aTokenIndex) {
bool found = true;
BehaviorScript value = ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &found);
if (!found) {
const String &_Arg = aNode->mTokens[aTokenIndex - 1];
PrintDataError(" ERROR: Unknown bhv arg: %s", _Arg.begin());
}
return value;
}
#define AddPointerToList(symbol, aGfxData, pointer) \
/*Print("%s: Adding pointer %x to list.", symbol, pointer);*/ \
aGfxData->mPointerList.Add(pointer); \
#define bhv_symbol_0(symb) \
if (_Symbol == #symb) { \
BehaviorScript _Bs[] = { symb() }; \
memcpy(aHead, _Bs, sizeof(_Bs)); \
aHead += (sizeof(_Bs) / sizeof(_Bs[0])); \
return; \
}
#define bhv_symbol_1(symb, n) \
if (_Symbol == #symb) { \
BehaviorScript _Arg0 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
if (n != 0) { AddPointerToList(#symb, aGfxData, aHead + n); } \
BehaviorScript _Bs[] = { symb(_Arg0) }; \
memcpy(aHead, _Bs, sizeof(_Bs)); \
aHead += (sizeof(_Bs) / sizeof(_Bs[0])); \
return; \
}
#define bhv_symbol_2(symb, n1, n2) \
if (_Symbol == #symb) { \
BehaviorScript _Arg0 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
BehaviorScript _Arg1 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
if (n1 != 0) { AddPointerToList(#symb, aGfxData, aHead + n1); } \
if (n2 != 0) { AddPointerToList(#symb, aGfxData, aHead + n2); } \
BehaviorScript _Bs[] = { symb(_Arg0, _Arg1) }; \
memcpy(aHead, _Bs, sizeof(_Bs)); \
aHead += (sizeof(_Bs) / sizeof(_Bs[0])); \
return; \
}
#define bhv_symbol_3(symb, n1, n2, n3) \
if (_Symbol == #symb) { \
BehaviorScript _Arg0 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
BehaviorScript _Arg1 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
BehaviorScript _Arg2 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
if (n1 != 0) { AddPointerToList(#symb, aGfxData, aHead + n1); } \
if (n2 != 0) { AddPointerToList(#symb, aGfxData, aHead + n2); } \
if (n3 != 0) { AddPointerToList(#symb, aGfxData, aHead + n3); } \
BehaviorScript _Bs[] = { symb(_Arg0, _Arg1, _Arg2) }; \
memcpy(aHead, _Bs, sizeof(_Bs)); \
aHead += (sizeof(_Bs) / sizeof(_Bs[0])); \
return; \
}
#define bhv_symbol_4(symb, n1, n2, n3, n4) \
if (_Symbol == #symb) { \
BehaviorScript _Arg0 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
BehaviorScript _Arg1 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
BehaviorScript _Arg2 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
BehaviorScript _Arg3 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
BehaviorScript _Arg4 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
BehaviorScript _Arg5 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
BehaviorScript _Arg6 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
BehaviorScript _Arg7 = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex); \
if (n1 != 0) { AddPointerToList(#symb, aGfxData, aHead + n1); } \
if (n2 != 0) { AddPointerToList(#symb, aGfxData, aHead + n2); } \
if (n3 != 0) { AddPointerToList(#symb, aGfxData, aHead + n3); } \
if (n4 != 0) { AddPointerToList(#symb, aGfxData, aHead + n4); } \
BehaviorScript _Bs[] = { symb(_Arg0, _Arg1, _Arg2, _Arg3, _Arg4, _Arg5, _Arg6, _Arg7) }; \
memcpy(aHead, _Bs, sizeof(_Bs)); \
aHead += (sizeof(_Bs) / sizeof(_Bs[0])); \
return; \
}
static void ParseBehaviorScriptSymbol(GfxData *aGfxData, DataNode<BehaviorScript> *aNode, BehaviorScript *&aHead, u64 &aTokenIndex, Array<u64> &aSwitchNodes) {
const String &_Symbol = aNode->mTokens[aTokenIndex++];
bhv_symbol_0(RETURN);
bhv_symbol_0(END_REPEAT);
bhv_symbol_0(END_REPEAT_CONTINUE);
bhv_symbol_0(BEGIN_LOOP);
bhv_symbol_0(END_LOOP);
bhv_symbol_0(BREAK);
bhv_symbol_0(BREAK_UNUSED);
bhv_symbol_0(DEACTIVATE);
bhv_symbol_0(DROP_TO_FLOOR);
bhv_symbol_0(BILLBOARD);
bhv_symbol_0(CYLBOARD);
bhv_symbol_0(HIDE);
bhv_symbol_0(SET_HOME);
bhv_symbol_0(DISABLE_RENDERING);
bhv_symbol_1(ID, 0);
bhv_symbol_1(BEGIN, 0);
bhv_symbol_1(DELAY, 0);
bhv_symbol_1(BEGIN_REPEAT, 0);
bhv_symbol_1(CMD_NOP_1, 0);
bhv_symbol_1(CMD_NOP_2, 0);
bhv_symbol_1(CMD_NOP_3, 0);
bhv_symbol_1(SET_MODEL, 0);
bhv_symbol_1(DELAY_VAR, 0);
bhv_symbol_1(BEGIN_REPEAT_UNUSED, 0);
bhv_symbol_1(ANIMATE, 0);
bhv_symbol_1(SET_INTERACT_TYPE, 0);
bhv_symbol_1(SET_INTERACT_SUBTYPE, 0);
//bhv_symbol_1(SPAWN_WATER_DROPLET, 1);
bhv_symbol_2(ADD_FLOAT, 0, 0);
bhv_symbol_2(SET_FLOAT, 0, 0);
bhv_symbol_2(ADD_INT, 0, 0);
bhv_symbol_2(SET_INT, 0, 0);
bhv_symbol_2(OR_INT, 0, 0);
bhv_symbol_2(BIT_CLEAR, 0, 0);
bhv_symbol_2(SET_HITBOX, 0, 0);
bhv_symbol_2(CMD_NOP_4, 0, 0);
bhv_symbol_2(SET_HURTBOX, 0, 0);
bhv_symbol_2(SCALE, 0, 0);
bhv_symbol_2(PARENT_BIT_CLEAR, 0, 0);
bhv_symbol_2(ANIMATE_TEXTURE, 0, 0);
bhv_symbol_2(SET_INT_UNUSED, 0, 0);
bhv_symbol_3(SET_INT_RAND_RSHIFT, 0, 0, 0);
bhv_symbol_3(SET_RANDOM_INT, 0, 0, 0);
bhv_symbol_3(ADD_RANDOM_FLOAT, 0, 0, 0);
bhv_symbol_3(ADD_INT_RAND_RSHIFT, 0, 0, 0);
bhv_symbol_3(SUM_FLOAT, 0, 0, 0);
bhv_symbol_3(SUM_INT, 0, 0, 0);
bhv_symbol_3(SET_HITBOX_WITH_OFFSET, 0, 0, 0);
bhv_symbol_4(SET_OBJ_PHYSICS, 0, 0, 0, 0);
// Both CALL and GOTO can have a offset to their addresses
// in their non-extended counterparts.
// We might be able to support this in DynOS. But I would not know how.
// Call Behavior
if (_Symbol == "CALL") {
u64 topTokenIndex = aTokenIndex;
bool foundBeh = true;
BehaviorScript behavior = ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundBeh);
if (foundBeh) {
aGfxData->mPointerList.Add(aHead + 1);
BehaviorScript _Bs[] = { CALL(behavior) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
} else {
u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 0]);
BehaviorScript _Bs[] = { CALL_EXT(behIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
}
return;
}
// Call Behavior
if (_Symbol == "CALL_NATIVE") {
u64 topTokenIndex = aTokenIndex;
bool foundFunc = true;
BehaviorScript function = ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundFunc);
if (foundFunc) {
aGfxData->mPointerList.Add(aHead + 1);
BehaviorScript _Bs[] = { CALL_NATIVE(function) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
} else {
u32 funcIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 0]);
BehaviorScript _Bs[] = { CALL_NATIVE_EXT(funcIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
}
return;
}
// Jump to Behavior (Goto)
if (_Symbol == "GOTO") {
u64 topTokenIndex = aTokenIndex;
bool foundBeh = true;
BehaviorScript behavior = ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundBeh);
if (foundBeh) {
aGfxData->mPointerList.Add(aHead + 1);
BehaviorScript _Bs[] = { GOTO(behavior) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
} else {
u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 0]);
BehaviorScript _Bs[] = { GOTO_EXT(behIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
}
return;
}
// Spawn Child
if (_Symbol == "SPAWN_CHILD") {
u64 topTokenIndex = aTokenIndex;
bool foundBeh = true;
BehaviorScript modelID = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex);
BehaviorScript behavior = ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundBeh);
if (foundBeh) {
aGfxData->mPointerList.Add(aHead + 2);
BehaviorScript _Bs[] = { SPAWN_CHILD(modelID, behavior) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
} else {
u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 2, aNode->mTokens[topTokenIndex + 1]);
BehaviorScript _Bs[] = { SPAWN_CHILD_EXT(modelID, behIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
}
return;
}
// Spawn Child with Parameter
if (_Symbol == "SPAWN_CHILD_WITH_PARAM") {
u64 topTokenIndex = aTokenIndex;
bool foundBeh = true;
BehaviorScript bhvParam = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex);
BehaviorScript modelID = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex);
BehaviorScript behavior = ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundBeh);
if (foundBeh) {
aGfxData->mPointerList.Add(aHead + 2);
BehaviorScript _Bs[] = { SPAWN_CHILD_WITH_PARAM(bhvParam, modelID, behavior) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
} else {
u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 2, aNode->mTokens[topTokenIndex + 2]);
BehaviorScript _Bs[] = { SPAWN_CHILD_WITH_PARAM_EXT(bhvParam, modelID, behIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
}
return;
}
// Spawn Object
if (_Symbol == "SPAWN_OBJ") {
u64 topTokenIndex = aTokenIndex;
bool foundBeh = true;
BehaviorScript modelID = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex);
BehaviorScript behavior = ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundBeh);
if (foundBeh) {
aGfxData->mPointerList.Add(aHead + 2);
BehaviorScript _Bs[] = { SPAWN_OBJ(modelID, behavior) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
} else {
u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 2, aNode->mTokens[topTokenIndex + 1]);
BehaviorScript _Bs[] = { SPAWN_OBJ_EXT(modelID, behIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
}
return;
}
if (_Symbol == "LOAD_ANIMATIONS") {
u64 topTokenIndex = aTokenIndex;
bool foundAnimation = true;
BehaviorScript field = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex);
BehaviorScript animations = ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundAnimation);
if (foundAnimation) {
aGfxData->mPointerList.Add(aHead + 1);
BehaviorScript _Bs[] = { LOAD_ANIMATIONS(field, animations) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
} else {
//u32 animIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 0]);
//BehaviorScript _Bs[] = { LOAD_ANIMATIONS_EXT(field, animIndex) };
//memcpy(aHead, _Bs, sizeof(_Bs));
//aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
PrintDataError(" ERROR: : Custom external animations are currently not supported. Skipping LOAD_ANIMATIONS_EXT.");
}
return;
}
if (_Symbol == "LOAD_COLLISION_DATA") {
u64 topTokenIndex = aTokenIndex;
bool foundCollisionData = true;
BehaviorScript collisionData = ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundCollisionData);
if (foundCollisionData) {
aGfxData->mPointerList.Add(aHead + 1);
BehaviorScript _Bs[] = { LOAD_COLLISION_DATA(collisionData) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
} else {
u32 colDataIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 0]);
BehaviorScript _Bs[] = { LOAD_COLLISION_DATA_EXT(colDataIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
}
return;
}
// We support directly using some extended types if needed.
if (_Symbol == "CALL_EXT" || _Symbol == "CALL_CUSTOM") {
u64 topTokenIndex = aTokenIndex;
bool foundBeh = true;
ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundBeh);
u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 0]);
BehaviorScript _Bs[] = { CALL_EXT(behIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
return;
}
if (_Symbol == "CALL_NATIVE_EXT" || _Symbol == "CALL_CUSTOM_NATIVE") {
u64 topTokenIndex = aTokenIndex;
bool foundFunc = true;
ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundFunc);
u32 funcIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 0]);
BehaviorScript _Bs[] = { CALL_NATIVE_EXT(funcIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
return;
}
if (_Symbol == "GOTO_EXT") {
u64 topTokenIndex = aTokenIndex;
bool foundBeh = true;
ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundBeh);
u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 0]);
BehaviorScript _Bs[] = { GOTO_EXT(behIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
return;
}
if (_Symbol == "SPAWN_CHILD_EXT" || _Symbol == "SPAWN_LUA_CHILD") {
u64 topTokenIndex = aTokenIndex;
bool foundBeh = true;
BehaviorScript modelID = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex);
ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundBeh);
u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 2, aNode->mTokens[topTokenIndex + 1]);
BehaviorScript _Bs[] = { SPAWN_CHILD_EXT(modelID, behIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
return;
}
if (_Symbol == "SPAWN_CHILD_WITH_PARAM_EXT" || _Symbol == "SPAWN_LUA_CHILD_WITH_PARAM") {
u64 topTokenIndex = aTokenIndex;
bool foundBeh = true;
BehaviorScript bhvParam = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex);
BehaviorScript modelID = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex);
ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundBeh);
u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 2, aNode->mTokens[topTokenIndex + 2]);
BehaviorScript _Bs[] = { SPAWN_CHILD_WITH_PARAM_EXT(bhvParam, modelID, behIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
return;
}
if (_Symbol == "SPAWN_OBJ_EXT" || _Symbol == "SPAWN_LUA_OBJ") {
u64 topTokenIndex = aTokenIndex;
bool foundBeh = true;
BehaviorScript modelID = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex);
ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundBeh);
u32 behIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 2, aNode->mTokens[topTokenIndex + 1]);
BehaviorScript _Bs[] = { SPAWN_OBJ_EXT(modelID, behIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
return;
}
/*
if (_Symbol == "LOAD_ANIMATIONS_EXT" || _Symbol == "LOAD_CUSTOM_ANIMATIONS") {
u64 topTokenIndex = aTokenIndex;
bool foundAnimation = true;
BehaviorScript field = ParseBehaviorScriptSymbolArg(aGfxData, aNode, aTokenIndex);
ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundAnimation);
u32 animIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 0]);
BehaviorScript _Bs[] = { LOAD_ANIMATIONS_EXT(field, animIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
return;
}
*/
if (_Symbol == "LOAD_COLLISION_DATA_EXT" || _Symbol == "LOAD_CUSTOM_COLLISION_DATA") {
u64 topTokenIndex = aTokenIndex;
bool foundCollisionData = true;
ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &foundCollisionData);
u32 colDataIndex = DynOS_Lua_RememberVariable(aGfxData, aHead + 1, aNode->mTokens[topTokenIndex + 0]);
BehaviorScript _Bs[] = { LOAD_COLLISION_DATA_EXT(colDataIndex) };
memcpy(aHead, _Bs, sizeof(_Bs));
aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
return;
}
// Unknown
PrintDataError(" ERROR: Unknown behavior symbol: %s", _Symbol.begin());
}
DataNode<BehaviorScript> *DynOS_Bhv_Parse(GfxData *aGfxData, DataNode<BehaviorScript> *aNode, bool aDisplayPercent) {
if (aNode->mData) return aNode;
// Behavior script data
aNode->mData = New<BehaviorScript>(aNode->mTokens.Count() * BEHAVIOR_SCRIPT_SIZE_PER_TOKEN);
BehaviorScript *_Head = aNode->mData;
Array<u64> _SwitchNodes;
for (u64 _TokenIndex = 0; _TokenIndex < aNode->mTokens.Count();) { // Don't increment _TokenIndex here!
ParseBehaviorScriptSymbol(aGfxData, aNode, _Head, _TokenIndex, _SwitchNodes);
if (aDisplayPercent && aGfxData->mErrorCount == 0) { PrintNoNewLine("%3d%%\b\b\b\b", (s32) (_TokenIndex * 100) / aNode->mTokens.Count()); }
}
if (aDisplayPercent && aGfxData->mErrorCount == 0) { Print("100%%"); }
aNode->mSize = (u32)(_Head - aNode->mData);
aNode->mLoadIndex = aGfxData->mLoadIndex++;
return aNode;
}
static DataNode<BehaviorScript> *GetBehaviorScript(GfxData *aGfxData, const String &aBhvRoot) {
for (DataNode<BehaviorScript> *_Node : aGfxData->mBehaviorScripts) {
if (_Node->mName == aBhvRoot) {
return _Node;
}
}
return NULL;
}
/////////////
// Writing //
/////////////
static void DynOS_Bhv_Write(BinFile* aFile, GfxData* aGfxData, DataNode<BehaviorScript> *aNode) {
if (!aNode->mData) return;
// Name
aFile->Write<u8>(DATA_TYPE_BEHAVIOR_SCRIPT);
aNode->mName.Write(aFile);
// Version
aFile->Write<u8>(BEHAVIOR_MAJOR_VER);
aFile->Write<u8>(BEHAVIOR_MINOR_VER);
aFile->Write<u8>(BEHAVIOR_PATCH_VER);
// Data
aFile->Write<u32>(aNode->mSize);
for (u32 i = 0; i != aNode->mSize; ++i) {
BehaviorScript *_Head = &aNode->mData[i];
if (aGfxData->mPointerList.Find((void *) _Head) != -1) {
DynOS_Pointer_Write(aFile, (const void *) (*_Head), aGfxData);
} else if (aGfxData->mLuaPointerList.Find((void *) _Head) != -1) {
DynOS_Pointer_Lua_Write(aFile, *(u32 *)_Head, aGfxData);
} else {
aFile->Write<u32>(*((u32 *) _Head));
}
}
}
static bool DynOS_Bhv_WriteBinary(const SysPath &aOutputFilename, GfxData *aGfxData) {
BinFile *_File = BinFile::OpenW(aOutputFilename.c_str());
if (!_File) {
PrintDataError(" ERROR: Unable to create file \"%s\"", aOutputFilename.c_str());
return false;
}
for (u64 i = 0; i != aGfxData->mLoadIndex; ++i) {
for (auto &_Node : aGfxData->mBehaviorScripts) {
if (_Node->mLoadIndex == i) {
DynOS_Bhv_Write(_File, aGfxData, _Node);
}
}
}
BinFile::Close(_File);
return true;
}
/////////////
// Reading //
/////////////
static DataNode<BehaviorScript> *DynOS_Bhv_Load(BinFile *aFile, GfxData *aGfxData) {
// Sanity check the files size. The minimum valid size is 9 bytes.
// 1 byte for the type, 1 bytes for the name length, 3 bytes for the version, And 4 bytes for the behaviors size.
if (aFile->Size() < 9) {
PrintDataError(" ERROR: Behavior file is smaller then it should be, Rejecting '%s'.", aFile->GetFilename());
// We have nothing to return, So return NULL.
return NULL;
}
// Allocate our node.
DataNode<BehaviorScript> *_Node = New<DataNode<BehaviorScript>>();
// Name
_Node->mName.Read(aFile);
// Version
u8 majorVersion = aFile->Read<u8>();
u8 minorVersion = aFile->Read<u8>();
u8 patchVersion = aFile->Read<u8>();
// Version Sanity Check
//
// If the major version doesn't match, then a drasitc change has happened and
// we can't read it no matter what. If it's just minor or patch. We might have
// code to support it.
if (majorVersion != BEHAVIOR_MIN_MAJOR_VER || (minorVersion < BEHAVIOR_MIN_MINOR_VER || patchVersion < BEHAVIOR_MIN_PATCH_VER)) {
PrintDataError(" ERROR: Behavior file is version %u.%u.%u, which is not supported! Rejecting '%s'.", majorVersion, minorVersion, patchVersion, aFile->GetFilename());
// We don't return this since we failed to read the behavior.
Delete(_Node);
// We have nothing to return, So return NULL.
return NULL;
}
// If we have nothing in the .bhv file, It compiled incorrectly or is maliciously crafted.
// We also check if the specified behavior size is valid for the file.
u32 dataSize = aFile->Read<u32>();
if (dataSize == 0 || (dataSize > (aFile->Size() - aFile->Offset()))) {
PrintDataError(" ERROR: Behavior file has a invalid behavior in it! Rejecting '%s'.", aFile->GetFilename());
// We don't return this since we failed to read the behavior.
Delete(_Node);
// We have nothing to return, So return NULL.
return NULL;
}
// Data
_Node->mSize = dataSize;
_Node->mData = New<BehaviorScript>(_Node->mSize);
// Read it
for (u32 i = 0; i != _Node->mSize; ++i) {
if (aFile->EoF()) {
PrintDataError(" ERROR: Reached EOF when reading file! Expected %llx bytes!", _Node->mSize * sizeof(u32));
break;
}
u32 _Value = aFile->Read<u32>();
void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _Value, &_Node->mFlags);
if (_Ptr) {
_Node->mData[i] = (uintptr_t) _Ptr;
} else {
_Node->mData[i] = (uintptr_t) _Value;
}
}
// Add it
if (aGfxData != NULL) {
aGfxData->mBehaviorScripts.Add(_Node);
}
return _Node;
}
GfxData *DynOS_Bhv_LoadFromBinary(const SysPath &aFilename, const char *aBehaviorName) {
// Load data from binary file
GfxData *_GfxData = NULL;
BinFile *_File = BinFile::OpenR(aFilename.c_str());
if (_File != NULL) {
_GfxData = New<GfxData>();
for (bool _Done = false; !_Done;) {
switch (_File->Read<u8>()) {
case DATA_TYPE_BEHAVIOR_SCRIPT: DynOS_Bhv_Load(_File, _GfxData); break;
default: _Done = true; break;
}
}
BinFile::Close(_File);
}
return _GfxData;
}
//////////////
// Generate //
//////////////
static String GetBehaviorFolder(const Array<Pair<u64, String>> &aBehaviorsFolders, u64 aModelIdentifier) {
for (const auto &_Pair : aBehaviorsFolders) {
if (_Pair.first == aModelIdentifier) {
return _Pair.second;
}
}
return String();
}
static void DynOS_Bhv_Generate(const SysPath &aPackFolder, Array<Pair<u64, String>> _BehaviorsFolders, GfxData *_GfxData) {
// do not regen this folder if we find any existing bins
for (s32 bhvIndex = _GfxData->mBehaviorScripts.Count() - 1; bhvIndex >= 0; bhvIndex--) {
auto &_BhvNode = _GfxData->mBehaviorScripts[bhvIndex];
String _BhvRootName = _BhvNode->mName;
// If there is an existing binary file for this layout, skip and go to the next behavior.
SysPath _BinFilename = fstring("%s/%s.bhv", aPackFolder.c_str(), _BhvRootName.begin());
if (fs_sys_file_exists(_BinFilename.c_str())) {
return;
}
}
// generate in reverse order to detect children
for (s32 bhvIndex = _GfxData->mBehaviorScripts.Count() - 1; bhvIndex >= 0; bhvIndex--) {
auto &_BhvNode = _GfxData->mBehaviorScripts[bhvIndex];
String _BhvRootName = _BhvNode->mName;
// If there is an existing binary file for this layout, skip and go to the next behavior.
SysPath _BinFilename = fstring("%s/%s.bhv", aPackFolder.c_str(), _BhvRootName.begin());
// Init
_GfxData->mLoadIndex = 0;
_GfxData->mErrorCount = 0;
_GfxData->mModelIdentifier = _BhvNode->mModelIdentifier;
_GfxData->mPackFolder = aPackFolder;
_GfxData->mPointerList = { NULL }; // The NULL pointer is needed, so we add it here
_GfxData->mPointerOffsetList = { };
_GfxData->mLuaPointerList = { };
_GfxData->mLuaTokenList = { };
_GfxData->mGfxContext.mCurrentTexture = NULL;
_GfxData->mGfxContext.mCurrentPalette = NULL;
_GfxData->mGeoNodeStack.Clear();
// Parse data
PrintNoNewLine("%s.bhv: Behavior identifier: %X - Processing... ", _BhvRootName.begin(), _GfxData->mModelIdentifier);
PrintConsole(CONSOLE_MESSAGE_INFO, "%s.bhv: Behavior identifier: %X - Processing... ", _BhvRootName.begin(), _GfxData->mModelIdentifier);
DynOS_Bhv_Parse(_GfxData, _BhvNode, true);
// Write if no error
if (_GfxData->mErrorCount == 0) {
DynOS_Bhv_WriteBinary(_BinFilename, _GfxData);
} else {
PrintError(" %u error(s): Unable to parse data", _GfxData->mErrorCount);
}
// Clear data pointers
ClearBhvDataNodes(_GfxData->mBehaviorScripts);
_GfxData->mPointerList.Clear();
_GfxData->mPointerOffsetList.Clear();
_GfxData->mLuaPointerList.Clear();
_GfxData->mLuaTokenList.Clear();
}
}
void DynOS_Bhv_GeneratePack(const SysPath &aPackFolder) {
Print("Processing behaviors: \"%s\"", aPackFolder.c_str());
Array<Pair<u64, String>> _BehaviorsFolders;
GfxData *_GfxData = New<GfxData>();
// Read the behavior_data.c files from the pack folder and any subfolders.
// Read the main folder.
if (fs_sys_dir_exists(aPackFolder.c_str())) {
_GfxData->mModelIdentifier = 0;
DynOS_Read_Source(_GfxData, fstring("%s/behavior_data.c", aPackFolder.c_str()));
if (_GfxData->mModelIdentifier != 0) {
_BehaviorsFolders.Add({ _GfxData->mModelIdentifier, String(aPackFolder.c_str()) });
}
}
// Read the subfolders.
DIR *aPackDir = opendir(aPackFolder.c_str());
if (aPackDir) {
// Read the subfolders.
struct dirent *_PackEnt = NULL;
while ((_PackEnt = readdir(aPackDir)) != NULL) {
// Skip . and ..
if (SysPath(_PackEnt->d_name) == ".") continue;
if (SysPath(_PackEnt->d_name) == "..") continue;
// For each subfolder, read tokens from behavior_data.c
SysPath _Folder = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name);
if (fs_sys_dir_exists(_Folder.c_str())) {
_GfxData->mModelIdentifier = 0;
DynOS_Read_Source(_GfxData, fstring("%s/behavior_data.c", _Folder.c_str()));
if (_GfxData->mModelIdentifier != 0) {
_BehaviorsFolders.Add({ _GfxData->mModelIdentifier, String(_PackEnt->d_name) });
}
}
}
closedir(aPackDir);
}
// Generate a binary file for each behavior found in the GfxData
DynOS_Bhv_Generate(aPackFolder, _BehaviorsFolders, _GfxData);
DynOS_Gfx_Free(_GfxData);
}