#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 "src/game/area.h" #include "src/game/object_list_processor.h" #include "src/game/interaction.h" #include "src/pc/lua/utils/smlua_anim_utils.h" #include "src/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 void ClearBhvDataNodes(DataNodes &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_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_UNUSED_1); 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 DataNode *FindDataNode(DataNodes &aDataNodes, String &aName, u32 aModelIdentifier) { DataNode *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 *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 *aNode, u64 &aTokenIndex) { bool found = true; BehaviorScript value = ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &found); if (!found) { const String &_Arg = aNode->mTokens[aTokenIndex - 1]; PrintError(" 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 *aNode, BehaviorScript *&aHead, u64 &aTokenIndex, Array &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])); PrintError(" 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 PrintError(" ERROR: Unknown behavior symbol: %s", _Symbol.begin()); } DataNode *DynOS_Bhv_Parse(GfxData *aGfxData, DataNode *aNode, bool aDisplayPercent) { if (aNode->mData) return aNode; // Behavior script data aNode->mData = New(aNode->mTokens.Count() * BEHAVIOR_SCRIPT_SIZE_PER_TOKEN); BehaviorScript *_Head = aNode->mData; Array _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 *GetBehaviorScript(GfxData *aGfxData, const String &aBhvRoot) { for (DataNode *_Node : aGfxData->mBehaviorScripts) { if (_Node->mName == aBhvRoot) { return _Node; } } return NULL; } ///////////// // Writing // ///////////// static void DynOS_Bhv_Write(BinFile* aFile, GfxData* aGfxData, DataNode *aNode) { if (!aNode->mData) return; // Name aFile->Write(DATA_TYPE_BEHAVIOR_SCRIPT); aNode->mName.Write(aFile); // Version aFile->Write(BEHAVIOR_MAJOR_VER); aFile->Write(BEHAVIOR_MINOR_VER); aFile->Write(BEHAVIOR_PATCH_VER); // Data aFile->Write(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 *) _Head)); } } } static bool DynOS_Bhv_WriteBinary(const SysPath &aOutputFilename, GfxData *aGfxData) { BinFile *_File = BinFile::OpenW(aOutputFilename.c_str()); if (!_File) { PrintError(" 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 *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) { PrintError(" 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 *_Node = New>(); // Name _Node->mName.Read(aFile); // Version u8 majorVersion = aFile->Read(); u8 minorVersion = aFile->Read(); u8 patchVersion = aFile->Read(); // 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)) { PrintError(" 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(); if (dataSize == 0 || (dataSize > (aFile->Size() - aFile->Offset()))) { PrintError(" 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(_Node->mSize); // Read it for (u32 i = 0; i != _Node->mSize; ++i) { if (aFile->EoF()) { PrintError(" ERROR: Reached EOF when reading file! Expected %llx bytes!", _Node->mSize * sizeof(u32)); break; } u32 _Value = aFile->Read(); 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(); for (bool _Done = false; !_Done;) { switch (_File->Read()) { 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> &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> _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: Model 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 { Print(" %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("---------- Behavior Pack folder: \"%s\" ----------", aPackFolder.c_str()); Array> _BehaviorsFolders; GfxData *_GfxData = New(); // 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); }