sm64coopdx/data/dynos_bin_behavior.cpp
djoslin0 81af37eef6
Some checks are pending
Build coop / build-linux (push) Waiting to run
Build coop / build-steamos (push) Waiting to run
Build coop / build-windows-opengl (push) Waiting to run
Build coop / build-windows-directx (push) Waiting to run
Build coop / build-macos-arm (push) Waiting to run
Build coop / build-macos-intel (push) Waiting to run
Regenerate DynOS assets when source files are modified (#873)
Previously to recompile DynOS assets you had to remove the
bin/lvl/bhv/tex/col/etc files. Now the game will compare the
last-modified-timestamps of the generated/compiled assets vs
the other files that are within those directories. If the presumed-
source files have a later modified timestamp DynOS will regenerate
those assets.

While this results in scanning the attributes of files more, it
also prevents parsing files unnecessarily. Previously actors
would always parse their source files and build up GfxData
unnecessarily.

---------

Co-authored-by: MysterD <myster@d>
2025-07-02 23:24:35 +10:00

2702 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);
bhv_constant(id_bhvAmbientLight);
bhv_constant(id_bhvPointLight);
// 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);
/* PointLight */
bhv_constant(oLightID);
*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 Macros
auto builtinLvlMacro = DynOS_Builtin_LvlMacro_GetFromName(_Arg.begin());
if (builtinLvlMacro != NULL) {
return (BehaviorScript)builtinLvlMacro;
}
// 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) {
// 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());
if (!DynOS_ShouldGeneratePack2Ext(aPackFolder, ".bhv", ".c")) {
return;
}
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);
}