mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2026-04-26 20:11:42 +00:00
Unhardcoded more values ; generated more tex files ; special set home function ; fixed lua bhv bugs
Unhardcoded KingBobomb values, Mips values, star dialog values Generated tex files when they're of the form levels/XXX/NUMBER Now lua behaviors can call cur_obj_set_home_once() to set home correctly Lua behaviors are now overridden correctly when created through spawn infos Behavior checks now translate to the overridden behavior before checking
This commit is contained in:
parent
59a36149fe
commit
7e7833f676
22 changed files with 211 additions and 30 deletions
|
|
@ -6332,6 +6332,11 @@ function cur_obj_set_hitbox_radius_and_height(radius, height)
|
|||
-- ...
|
||||
end
|
||||
|
||||
--- @return nil
|
||||
function cur_obj_set_home_once()
|
||||
-- ...
|
||||
end
|
||||
|
||||
--- @param radius number
|
||||
--- @param height number
|
||||
--- @return nil
|
||||
|
|
|
|||
|
|
@ -167,17 +167,25 @@
|
|||
--- @field public UnagiTrajectory Pointer_Trajectory
|
||||
|
||||
--- @class BehaviorValues
|
||||
--- @field public KingBobombFVel number
|
||||
--- @field public KingBobombHealth integer
|
||||
--- @field public KingBobombYawVel integer
|
||||
--- @field public KingWhompHealth integer
|
||||
--- @field public KoopaBobAgility number
|
||||
--- @field public KoopaCatchupAgility number
|
||||
--- @field public KoopaThiAgility number
|
||||
--- @field public MipsStar1Requirement integer
|
||||
--- @field public MipsStar2Requirement integer
|
||||
--- @field public RacingPenguinBigHeight number
|
||||
--- @field public RacingPenguinBigRadius number
|
||||
--- @field public RacingPenguinHeight number
|
||||
--- @field public RacingPenguinRadius number
|
||||
--- @field public ShowStarMilestones integer
|
||||
--- @field public ToadStar1Requirement integer
|
||||
--- @field public ToadStar2Requirement integer
|
||||
--- @field public ToadStar3Requirement integer
|
||||
--- @field public dialogs BehaviorDialogs
|
||||
--- @field public starsNeededForDialog StarsNeededForDialog
|
||||
--- @field public trajectories BehaviorTrajectories
|
||||
|
||||
--- @class BullyCollisionData
|
||||
|
|
@ -1509,6 +1517,7 @@
|
|||
--- @field public platform Object
|
||||
--- @field public prevObj Object
|
||||
--- @field public respawnInfoType integer
|
||||
--- @field public setHome integer
|
||||
--- @field public unused1 integer
|
||||
--- @field public usingObj Object
|
||||
|
||||
|
|
@ -1639,6 +1648,14 @@
|
|||
--- @field public UnagiStarPos Vec3f
|
||||
--- @field public WigglerStarPos Vec3f
|
||||
|
||||
--- @class StarsNeededForDialog
|
||||
--- @field public dialog1 integer
|
||||
--- @field public dialog2 integer
|
||||
--- @field public dialog3 integer
|
||||
--- @field public dialog4 integer
|
||||
--- @field public dialog5 integer
|
||||
--- @field public dialog6 integer
|
||||
|
||||
--- @class Struct802A272C
|
||||
--- @field public vecF Vec3f
|
||||
--- @field public vecS Vec3s
|
||||
|
|
|
|||
|
|
@ -344,13 +344,41 @@ DataNode<TexData>* DynOS_Tex_LoadFromBinary(const SysPath &aPackFolder, const Sy
|
|||
// Generate //
|
||||
//////////////
|
||||
|
||||
static bool is_level_number_png(SysPath& aPath) {
|
||||
// normalize
|
||||
String path = aPath.c_str();
|
||||
char* p = path.begin();
|
||||
while (*p != '\0') {
|
||||
if (*p == '\\') {
|
||||
*p = '/';
|
||||
}
|
||||
break;
|
||||
}
|
||||
p = path.begin();
|
||||
|
||||
// compare 'levels/'
|
||||
s16 levelsLength = strlen("levels/");
|
||||
if (strncmp(p, "levels/", levelsLength)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// skip past level name
|
||||
p += levelsLength;
|
||||
while (*p != '\0') {
|
||||
if (*p == '/') { break; }
|
||||
p++;
|
||||
}
|
||||
if (*p != '/') { return false; }
|
||||
p++;
|
||||
|
||||
return (*p >= '0' && *p <= '9');
|
||||
}
|
||||
|
||||
static void DynOS_Tex_GeneratePack_Recursive(const SysPath &aPackFolder, SysPath &aOutputFolder, SysPath& aRelativePath, SysPath& aPrefix, GfxData *aGfxData, bool aAllowCustomTextures) {
|
||||
SysPath _DirPath = fstring("%s/%s", aPackFolder.c_str(), aRelativePath.c_str());
|
||||
|
||||
// skip generation if any .c files exist
|
||||
if (FileTypeExists(_DirPath, ".c")) {
|
||||
return;
|
||||
}
|
||||
// skip generation if any .c files exist, and it isn't levels/xxx/NUMBER
|
||||
bool containsC = FileTypeExists(_DirPath, ".c");
|
||||
|
||||
DIR *_PackDir = opendir(_DirPath.c_str());
|
||||
if (!_PackDir) { return; }
|
||||
|
|
@ -387,8 +415,12 @@ static void DynOS_Tex_GeneratePack_Recursive(const SysPath &aPackFolder, SysPath
|
|||
continue;
|
||||
}
|
||||
|
||||
// write the file
|
||||
SysPath _RelativePath = fstring("%s%s", aRelativePath.c_str(), _PackEnt->d_name);
|
||||
if (containsC && !is_level_number_png(_RelativePath)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// write the file
|
||||
String _BaseName;
|
||||
const char* _OverrideName = DynOS_Builtin_Tex_GetNameFromFileName(_RelativePath.c_str());
|
||||
if (_OverrideName) {
|
||||
|
|
|
|||
|
|
@ -2973,6 +2973,24 @@
|
|||
|
||||
<br />
|
||||
|
||||
## [cur_obj_set_home_once](#cur_obj_set_home_once)
|
||||
|
||||
### Lua Example
|
||||
`cur_obj_set_home_once()`
|
||||
|
||||
### Parameters
|
||||
- None
|
||||
|
||||
### Returns
|
||||
- None
|
||||
|
||||
### C Prototype
|
||||
`void cur_obj_set_home_once(void);`
|
||||
|
||||
[:arrow_up_small:](#)
|
||||
|
||||
<br />
|
||||
|
||||
## [cur_obj_set_hurtbox_radius_and_height](#cur_obj_set_hurtbox_radius_and_height)
|
||||
|
||||
### Lua Example
|
||||
|
|
|
|||
|
|
@ -1195,6 +1195,7 @@
|
|||
- [cur_obj_set_face_angle_to_move_angle](functions-4.md#cur_obj_set_face_angle_to_move_angle)
|
||||
- [cur_obj_set_hitbox_and_die_if_attacked](functions-4.md#cur_obj_set_hitbox_and_die_if_attacked)
|
||||
- [cur_obj_set_hitbox_radius_and_height](functions-4.md#cur_obj_set_hitbox_radius_and_height)
|
||||
- [cur_obj_set_home_once](functions-4.md#cur_obj_set_home_once)
|
||||
- [cur_obj_set_hurtbox_radius_and_height](functions-4.md#cur_obj_set_hurtbox_radius_and_height)
|
||||
- [cur_obj_set_pos_relative](functions-4.md#cur_obj_set_pos_relative)
|
||||
- [cur_obj_set_pos_relative_to_parent](functions-4.md#cur_obj_set_pos_relative_to_parent)
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@
|
|||
- [SpawnInfo](#SpawnInfo)
|
||||
- [SpawnParticlesInfo](#SpawnParticlesInfo)
|
||||
- [StarPositions](#StarPositions)
|
||||
- [StarsNeededForDialog](#StarsNeededForDialog)
|
||||
- [Struct802A272C](#Struct802A272C)
|
||||
- [Surface](#Surface)
|
||||
- [TextureInfo](#TextureInfo)
|
||||
|
|
@ -285,17 +286,25 @@
|
|||
|
||||
| Field | Type | Access |
|
||||
| ----- | ---- | ------ |
|
||||
| KingBobombFVel | `number` | |
|
||||
| KingBobombHealth | `integer` | |
|
||||
| KingBobombYawVel | `integer` | |
|
||||
| KingWhompHealth | `integer` | |
|
||||
| KoopaBobAgility | `number` | |
|
||||
| KoopaCatchupAgility | `number` | |
|
||||
| KoopaThiAgility | `number` | |
|
||||
| MipsStar1Requirement | `integer` | |
|
||||
| MipsStar2Requirement | `integer` | |
|
||||
| RacingPenguinBigHeight | `number` | |
|
||||
| RacingPenguinBigRadius | `number` | |
|
||||
| RacingPenguinHeight | `number` | |
|
||||
| RacingPenguinRadius | `number` | |
|
||||
| ShowStarMilestones | `integer` | |
|
||||
| ToadStar1Requirement | `integer` | |
|
||||
| ToadStar2Requirement | `integer` | |
|
||||
| ToadStar3Requirement | `integer` | |
|
||||
| dialogs | [BehaviorDialogs](structs.md#BehaviorDialogs) | read-only |
|
||||
| starsNeededForDialog | [StarsNeededForDialog](structs.md#StarsNeededForDialog) | read-only |
|
||||
| trajectories | [BehaviorTrajectories](structs.md#BehaviorTrajectories) | read-only |
|
||||
|
||||
[:arrow_up_small:](#)
|
||||
|
|
@ -1117,6 +1126,7 @@
|
|||
| platform | [Object](structs.md#Object) | |
|
||||
| prevObj | [Object](structs.md#Object) | |
|
||||
| respawnInfoType | `integer` | |
|
||||
| setHome | `integer` | |
|
||||
| unused1 | `integer` | |
|
||||
| usingObj | [Object](structs.md#Object) | |
|
||||
|
||||
|
|
@ -2077,6 +2087,21 @@
|
|||
|
||||
<br />
|
||||
|
||||
## [StarsNeededForDialog](#StarsNeededForDialog)
|
||||
|
||||
| Field | Type | Access |
|
||||
| ----- | ---- | ------ |
|
||||
| dialog1 | `integer` | |
|
||||
| dialog2 | `integer` | |
|
||||
| dialog3 | `integer` | |
|
||||
| dialog4 | `integer` | |
|
||||
| dialog5 | `integer` | |
|
||||
| dialog6 | `integer` | |
|
||||
|
||||
[:arrow_up_small:](#)
|
||||
|
||||
<br />
|
||||
|
||||
## [Struct802A272C](#Struct802A272C)
|
||||
|
||||
| Field | Type | Access |
|
||||
|
|
|
|||
|
|
@ -221,6 +221,7 @@ struct Object
|
|||
/*?????*/ u8 globalPlayerIndex;
|
||||
/*?????*/ struct Object* usingObj;
|
||||
/*?????*/ u8 hookRender;
|
||||
/*?????*/ u8 setHome;
|
||||
};
|
||||
|
||||
struct ObjectHitbox
|
||||
|
|
|
|||
|
|
@ -789,6 +789,7 @@ static s32 bhv_cmd_set_home(void) {
|
|||
gCurrentObject->oHomeX = gCurrentObject->oPosX;
|
||||
gCurrentObject->oHomeY = gCurrentObject->oPosY;
|
||||
gCurrentObject->oHomeZ = gCurrentObject->oPosZ;
|
||||
gCurrentObject->setHome = TRUE;
|
||||
}
|
||||
gCurBhvCommand++;
|
||||
return BHV_PROC_CONTINUE;
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ void king_bobomb_act_0(void) {
|
|||
gSecondCameraFocus = o;
|
||||
cur_obj_init_animation_with_sound(5);
|
||||
cur_obj_set_pos_to_home();
|
||||
o->oHealth = 3;
|
||||
o->oHealth = gBehaviorValues.KingBobombHealth;
|
||||
if (should_start_or_continue_dialog(marioState, o) && cur_obj_can_mario_activate_textbox_2(&gMarioStates[0], 500.0f, 100.0f)) {
|
||||
o->oSubAction++;
|
||||
seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40);
|
||||
|
|
@ -93,11 +93,11 @@ void king_bobomb_act_2(void) {
|
|||
} else
|
||||
cur_obj_init_animation_with_sound(11);
|
||||
if (o->oKingBobombUnk108 == 0) {
|
||||
o->oForwardVel = 3.0f;
|
||||
o->oForwardVel = gBehaviorValues.KingBobombFVel;
|
||||
struct MarioState* marioState = king_bobomb_nearest_mario_state();
|
||||
if (marioState != NULL) {
|
||||
s32 angleToPlayer = obj_angle_to_object(o, marioState->marioObj);
|
||||
cur_obj_rotate_yaw_toward(angleToPlayer, 0x100);
|
||||
cur_obj_rotate_yaw_toward(angleToPlayer, gBehaviorValues.KingBobombYawVel);
|
||||
}
|
||||
} else {
|
||||
o->oForwardVel = 0.0f;
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ void bhv_mips_init(void) {
|
|||
u8 starFlags = save_file_get_star_flags(gCurrSaveFileNum - 1, -1);
|
||||
|
||||
// If the player has >= 15 stars and hasn't collected first MIPS star...
|
||||
if (save_file_get_total_star_count(gCurrSaveFileNum - 1, COURSE_MIN - 1, COURSE_MAX - 1) >= 15
|
||||
if (save_file_get_total_star_count(gCurrSaveFileNum - 1, COURSE_MIN - 1, COURSE_MAX - 1) >= gBehaviorValues.MipsStar1Requirement
|
||||
&& !(starFlags & SAVE_FLAG_TO_STAR_FLAG(SAVE_FLAG_COLLECTED_MIPS_STAR_1))) {
|
||||
o->oBehParams2ndByte = 0;
|
||||
#ifndef VERSION_JP
|
||||
|
|
@ -44,7 +44,7 @@ void bhv_mips_init(void) {
|
|||
#endif
|
||||
}
|
||||
// If the player has >= 50 stars and hasn't collected second MIPS star...
|
||||
else if (save_file_get_total_star_count(gCurrSaveFileNum - 1, COURSE_MIN - 1, COURSE_MAX - 1) >= 50
|
||||
else if (save_file_get_total_star_count(gCurrSaveFileNum - 1, COURSE_MIN - 1, COURSE_MAX - 1) >= gBehaviorValues.MipsStar2Requirement
|
||||
&& !(starFlags & SAVE_FLAG_TO_STAR_FLAG(SAVE_FLAG_COLLECTED_MIPS_STAR_2))) {
|
||||
o->oBehParams2ndByte = 1;
|
||||
#ifndef VERSION_JP
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ void whomp_act_0(void) {
|
|||
seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40);
|
||||
} else {
|
||||
cur_obj_set_pos_to_home();
|
||||
o->oHealth = 3;
|
||||
o->oHealth = gBehaviorValues.KingWhompHealth;
|
||||
}
|
||||
} else if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 1, CUTSCENE_DIALOG, gBehaviorValues.dialogs.KingWhompDialog, whomp_act_0_continue_dialog)) {
|
||||
o->oAction = 2;
|
||||
|
|
|
|||
|
|
@ -93,16 +93,24 @@ struct LevelValues gLevelValues = { 0 };
|
|||
///////////////
|
||||
|
||||
struct BehaviorValues gDefaultBehaviorValues = {
|
||||
.KoopaBobAgility = 4.0f,
|
||||
.KoopaCatchupAgility = 8.0f,
|
||||
.KoopaThiAgility = 6.0f,
|
||||
.KoopaBobAgility = 4.0f,
|
||||
.KoopaCatchupAgility = 8.0f,
|
||||
.KoopaThiAgility = 6.0f,
|
||||
.RacingPenguinBigHeight = 250.0f,
|
||||
.RacingPenguinBigRadius = 350.0f,
|
||||
.RacingPenguinHeight = 200.0f,
|
||||
.RacingPenguinRadius = 200.0f,
|
||||
.ToadStar1Requirement = 12,
|
||||
.ToadStar2Requirement = 25,
|
||||
.ToadStar3Requirement = 35,
|
||||
.RacingPenguinHeight = 200.0f,
|
||||
.RacingPenguinRadius = 200.0f,
|
||||
.ToadStar1Requirement = 12,
|
||||
.ToadStar2Requirement = 25,
|
||||
.ToadStar3Requirement = 35,
|
||||
.KingBobombFVel = 3.0f,
|
||||
.KingBobombYawVel = 0x100,
|
||||
.KingBobombHealth = 3,
|
||||
.KingWhompHealth = 3,
|
||||
.MipsStar1Requirement = 15,
|
||||
.MipsStar2Requirement = 50,
|
||||
.ShowStarMilestones = TRUE,
|
||||
.starsNeededForDialog = { 1, 3, 8, 30, 50, 70 },
|
||||
.dialogs = {
|
||||
.BobombBuddyBob1Dialog = DIALOG_004,
|
||||
.BobombBuddyBob2Dialog = DIALOG_105,
|
||||
|
|
|
|||
|
|
@ -178,6 +178,16 @@ struct BehaviorDialogs {
|
|||
enum DialogId YoshiDialog;
|
||||
};
|
||||
|
||||
#define STARS_NEEDED_FOR_DIALOG_COUNT 6
|
||||
struct StarsNeededForDialog {
|
||||
u16 dialog1;
|
||||
u16 dialog2;
|
||||
u16 dialog3;
|
||||
u16 dialog4;
|
||||
u16 dialog5;
|
||||
u16 dialog6;
|
||||
};
|
||||
|
||||
struct BehaviorValues {
|
||||
f32 KoopaBobAgility;
|
||||
f32 KoopaCatchupAgility;
|
||||
|
|
@ -189,6 +199,14 @@ struct BehaviorValues {
|
|||
u16 ToadStar1Requirement;
|
||||
u16 ToadStar2Requirement;
|
||||
u16 ToadStar3Requirement;
|
||||
f32 KingBobombFVel;
|
||||
s16 KingBobombYawVel;
|
||||
s16 KingBobombHealth;
|
||||
s16 KingWhompHealth;
|
||||
s16 MipsStar1Requirement;
|
||||
s16 MipsStar2Requirement;
|
||||
u8 ShowStarMilestones;
|
||||
struct StarsNeededForDialog starsNeededForDialog;
|
||||
struct BehaviorDialogs dialogs;
|
||||
struct BehaviorTrajectories trajectories;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -480,7 +480,7 @@ u32 mario_check_object_grab(struct MarioState *m) {
|
|||
if (m->input & INPUT_INTERACT_OBJ_GRABBABLE) {
|
||||
script = virtual_to_segmented(0x13, m->interactObj->behavior);
|
||||
|
||||
if (script == bhvBowser) {
|
||||
if (script == smlua_override_behavior(bhvBowser)) {
|
||||
s16 facingDYaw = m->faceAngle[1] - m->interactObj->oMoveAngleYaw;
|
||||
if (facingDYaw >= -0x5555 && facingDYaw <= 0x5555) {
|
||||
m->faceAngle[1] = m->interactObj->oMoveAngleYaw;
|
||||
|
|
@ -2042,7 +2042,7 @@ u32 interact_grabbable(struct MarioState *m, u32 interactType, struct Object *o)
|
|||
}
|
||||
}
|
||||
|
||||
if (script != bhvBowser) {
|
||||
if (script != smlua_override_behavior(bhvBowser)) {
|
||||
push_mario_out_of_object(m, o, -5.0f);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -57,8 +57,6 @@ static s8 D_8032CBE4 = 0;
|
|||
static s8 D_8032CBE8 = 0;
|
||||
static s8 D_8032CBEC[7] = { 2, 3, 2, 1, 2, 3, 2 };
|
||||
|
||||
static u8 sStarsNeededForDialog[] = { 1, 3, 8, 30, 50, 70 };
|
||||
|
||||
static BehaviorScript* localDialogNPCBehavior = NULL;
|
||||
|
||||
/**
|
||||
|
|
@ -247,8 +245,19 @@ s32 get_star_collection_dialog(struct MarioState *m) {
|
|||
return dialogID;
|
||||
}
|
||||
|
||||
for (s32 i = 0; i < ARRAY_COUNT(sStarsNeededForDialog); i++) {
|
||||
s32 numStarsRequired = sStarsNeededForDialog[i];
|
||||
if (!gBehaviorValues.ShowStarMilestones) { return 0; }
|
||||
|
||||
for (s32 i = 0; i < STARS_NEEDED_FOR_DIALOG_COUNT; i++) {
|
||||
s32 numStarsRequired = 999;
|
||||
switch (i) {
|
||||
case 0: numStarsRequired = gBehaviorValues.starsNeededForDialog.dialog1; break;
|
||||
case 1: numStarsRequired = gBehaviorValues.starsNeededForDialog.dialog2; break;
|
||||
case 2: numStarsRequired = gBehaviorValues.starsNeededForDialog.dialog3; break;
|
||||
case 3: numStarsRequired = gBehaviorValues.starsNeededForDialog.dialog4; break;
|
||||
case 4: numStarsRequired = gBehaviorValues.starsNeededForDialog.dialog5; break;
|
||||
case 5: numStarsRequired = gBehaviorValues.starsNeededForDialog.dialog6; break;
|
||||
}
|
||||
|
||||
if (m->prevNumStarsForDialog < numStarsRequired && m->numStars >= numStarsRequired) {
|
||||
dialogID = i + gBehaviorValues.dialogs.StarCollectionBaseDialog;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include "spawn_object.h"
|
||||
#include "spawn_sound.h"
|
||||
#include "pc/network/network.h"
|
||||
#include "pc/lua/smlua_hooks.h"
|
||||
|
||||
u8 (*gContinueDialogFunction)(void) = NULL;
|
||||
struct Object* gContinueDialogFunctionObject = NULL;
|
||||
|
|
@ -117,7 +118,7 @@ Gfx *geo_update_layer_transparency(s32 callContext, struct GraphNode *node, UNUS
|
|||
}
|
||||
}
|
||||
#else // gDebugInfo accesses were removed in all non-JP versions.
|
||||
if (objectOpacity == 0 && segmented_to_virtual(bhvBowser) == objectGraphNode->behavior) {
|
||||
if (objectOpacity == 0 && segmented_to_virtual(smlua_override_behavior(bhvBowser)) == objectGraphNode->behavior) {
|
||||
objectGraphNode->oAnimState = 2;
|
||||
}
|
||||
// the debug info check was removed in US. so we need to
|
||||
|
|
@ -982,6 +983,7 @@ struct Object* cur_obj_find_nearest_pole(void) {
|
|||
}
|
||||
|
||||
struct Object *cur_obj_find_nearest_object_with_behavior(const BehaviorScript *behavior, f32 *dist) {
|
||||
behavior = smlua_override_behavior(behavior);
|
||||
uintptr_t *behaviorAddr = segmented_to_virtual(behavior);
|
||||
struct Object *closestObj = NULL;
|
||||
struct Object *obj;
|
||||
|
|
@ -1074,6 +1076,7 @@ s32 count_objects_with_behavior(const BehaviorScript *behavior) {
|
|||
}
|
||||
|
||||
struct Object *find_object_with_behavior(const BehaviorScript *behavior) {
|
||||
behavior = smlua_override_behavior(behavior);
|
||||
uintptr_t *behaviorAddr = segmented_to_virtual(behavior);
|
||||
struct ObjectNode *listHead = &gObjectLists[get_object_list_from_behavior(behaviorAddr)];
|
||||
struct ObjectNode *obj = listHead->next;
|
||||
|
|
@ -1269,7 +1272,7 @@ void cur_obj_move_after_thrown_or_dropped(f32 forwardVel, f32 velY) {
|
|||
}
|
||||
|
||||
void cur_obj_get_thrown_or_placed(f32 forwardVel, f32 velY, s32 thrownAction) {
|
||||
if (o->behavior == segmented_to_virtual(bhvBowser)) {
|
||||
if (o->behavior == segmented_to_virtual(smlua_override_behavior(bhvBowser))) {
|
||||
// Interestingly, when bowser is thrown, he is offset slightly to
|
||||
// Mario's right
|
||||
cur_obj_set_pos_relative_to_parent(-41.684f, 85.859f, 321.577f);
|
||||
|
|
@ -3180,3 +3183,11 @@ void cur_obj_spawn_star_at_y_offset(f32 targetX, f32 targetY, f32 targetZ, f32 o
|
|||
o->oPosY = objectPosY;
|
||||
}
|
||||
#endif
|
||||
|
||||
void cur_obj_set_home_once(void) {
|
||||
if (o->setHome) { return; }
|
||||
o->setHome = TRUE;
|
||||
o->oHomeX = o->oPosX;
|
||||
o->oHomeY = o->oPosY;
|
||||
o->oHomeZ = o->oPosZ;
|
||||
}
|
||||
|
|
@ -313,4 +313,6 @@ f32 cur_obj_lateral_dist_from_obj_to_home(struct Object* obj);
|
|||
void cur_obj_spawn_star_at_y_offset(f32 targetX, f32 targetY, f32 targetZ, f32 offsetY);
|
||||
#endif
|
||||
|
||||
void cur_obj_set_home_once(void);
|
||||
|
||||
#endif // OBJECT_HELPERS_H
|
||||
|
|
|
|||
|
|
@ -532,7 +532,7 @@ void spawn_objects_from_info(UNUSED s32 unused, struct SpawnInfo *spawnInfo) {
|
|||
// as it is the most frequently used by objects.
|
||||
object->oBehParams2ndByte = ((spawnInfo->behaviorArg) >> 16) & 0xFF;
|
||||
|
||||
object->behavior = script;
|
||||
object->behavior = smlua_override_behavior(script);
|
||||
object->unused1 = 0;
|
||||
|
||||
// Record death/collection in the SpawnInfo
|
||||
|
|
|
|||
|
|
@ -326,6 +326,7 @@ struct Object *allocate_object(struct ObjectNode *objList) {
|
|||
obj->areaTimer = 0;
|
||||
obj->areaTimerDuration = 0;
|
||||
obj->areaTimerRunOnceCallback = NULL;
|
||||
obj->setHome = FALSE;
|
||||
|
||||
obj->usingObj = NULL;
|
||||
|
||||
|
|
|
|||
|
|
@ -205,19 +205,27 @@ static struct LuaObjectField sBehaviorTrajectoriesFields[LUA_BEHAVIOR_TRAJECTORI
|
|||
{ "UnagiTrajectory", LVT_TRAJECTORY_P, offsetof(struct BehaviorTrajectories, UnagiTrajectory), false, LOT_POINTER },
|
||||
};
|
||||
|
||||
#define LUA_BEHAVIOR_VALUES_FIELD_COUNT 12
|
||||
#define LUA_BEHAVIOR_VALUES_FIELD_COUNT 20
|
||||
static struct LuaObjectField sBehaviorValuesFields[LUA_BEHAVIOR_VALUES_FIELD_COUNT] = {
|
||||
{ "KingBobombFVel", LVT_F32, offsetof(struct BehaviorValues, KingBobombFVel), false, LOT_NONE },
|
||||
{ "KingBobombHealth", LVT_S16, offsetof(struct BehaviorValues, KingBobombHealth), false, LOT_NONE },
|
||||
{ "KingBobombYawVel", LVT_S16, offsetof(struct BehaviorValues, KingBobombYawVel), false, LOT_NONE },
|
||||
{ "KingWhompHealth", LVT_S16, offsetof(struct BehaviorValues, KingWhompHealth), false, LOT_NONE },
|
||||
{ "KoopaBobAgility", LVT_F32, offsetof(struct BehaviorValues, KoopaBobAgility), false, LOT_NONE },
|
||||
{ "KoopaCatchupAgility", LVT_F32, offsetof(struct BehaviorValues, KoopaCatchupAgility), false, LOT_NONE },
|
||||
{ "KoopaThiAgility", LVT_F32, offsetof(struct BehaviorValues, KoopaThiAgility), false, LOT_NONE },
|
||||
{ "MipsStar1Requirement", LVT_S16, offsetof(struct BehaviorValues, MipsStar1Requirement), false, LOT_NONE },
|
||||
{ "MipsStar2Requirement", LVT_S16, offsetof(struct BehaviorValues, MipsStar2Requirement), false, LOT_NONE },
|
||||
{ "RacingPenguinBigHeight", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinBigHeight), false, LOT_NONE },
|
||||
{ "RacingPenguinBigRadius", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinBigRadius), false, LOT_NONE },
|
||||
{ "RacingPenguinHeight", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinHeight), false, LOT_NONE },
|
||||
{ "RacingPenguinRadius", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinRadius), false, LOT_NONE },
|
||||
{ "ShowStarMilestones", LVT_U8, offsetof(struct BehaviorValues, ShowStarMilestones), false, LOT_NONE },
|
||||
{ "ToadStar1Requirement", LVT_U16, offsetof(struct BehaviorValues, ToadStar1Requirement), false, LOT_NONE },
|
||||
{ "ToadStar2Requirement", LVT_U16, offsetof(struct BehaviorValues, ToadStar2Requirement), false, LOT_NONE },
|
||||
{ "ToadStar3Requirement", LVT_U16, offsetof(struct BehaviorValues, ToadStar3Requirement), false, LOT_NONE },
|
||||
{ "dialogs", LVT_COBJECT, offsetof(struct BehaviorValues, dialogs), true, LOT_BEHAVIORDIALOGS },
|
||||
{ "starsNeededForDialog", LVT_COBJECT, offsetof(struct BehaviorValues, starsNeededForDialog), true, LOT_STARSNEEDEDFORDIALOG },
|
||||
{ "trajectories", LVT_COBJECT, offsetof(struct BehaviorValues, trajectories), true, LOT_BEHAVIORTRAJECTORIES },
|
||||
};
|
||||
|
||||
|
|
@ -885,7 +893,7 @@ static struct LuaObjectField sNetworkPlayerFields[LUA_NETWORK_PLAYER_FIELD_COUNT
|
|||
{ "type", LVT_U8, offsetof(struct NetworkPlayer, type), true, LOT_NONE },
|
||||
};
|
||||
|
||||
#define LUA_OBJECT_FIELD_COUNT 754
|
||||
#define LUA_OBJECT_FIELD_COUNT 755
|
||||
static struct LuaObjectField sObjectFields[LUA_OBJECT_FIELD_COUNT] = {
|
||||
{ "activeFlags", LVT_S16, offsetof(struct Object, activeFlags), false, LOT_NONE },
|
||||
{ "areaTimer", LVT_U32, offsetof(struct Object, areaTimer), false, LOT_NONE },
|
||||
|
|
@ -1650,6 +1658,7 @@ static struct LuaObjectField sObjectFields[LUA_OBJECT_FIELD_COUNT] = {
|
|||
// { "rawData", LOT_???, offsetof(struct Object, rawData), false, LOT_??? }, <--- UNIMPLEMENTED
|
||||
// { "respawnInfo", LVT_???, offsetof(struct Object, respawnInfo), false, LOT_??? }, <--- UNIMPLEMENTED
|
||||
{ "respawnInfoType", LVT_S16, offsetof(struct Object, respawnInfoType), false, LOT_NONE },
|
||||
{ "setHome", LVT_U8, offsetof(struct Object, setHome), false, LOT_NONE },
|
||||
// { "transform", LVT_???, offsetof(struct Object, transform), false, LOT_??? }, <--- UNIMPLEMENTED
|
||||
{ "unused1", LVT_U32, offsetof(struct Object, unused1), false, LOT_NONE },
|
||||
{ "usingObj", LVT_COBJECT_P, offsetof(struct Object, usingObj), false, LOT_OBJECT },
|
||||
|
|
@ -1809,6 +1818,16 @@ static struct LuaObjectField sStarPositionsFields[LUA_STAR_POSITIONS_FIELD_COUNT
|
|||
{ "WigglerStarPos", LVT_COBJECT, offsetof(struct StarPositions, WigglerStarPos), true, LOT_VEC3F },
|
||||
};
|
||||
|
||||
#define LUA_STARS_NEEDED_FOR_DIALOG_FIELD_COUNT 6
|
||||
static struct LuaObjectField sStarsNeededForDialogFields[LUA_STARS_NEEDED_FOR_DIALOG_FIELD_COUNT] = {
|
||||
{ "dialog1", LVT_U16, offsetof(struct StarsNeededForDialog, dialog1), false, LOT_NONE },
|
||||
{ "dialog2", LVT_U16, offsetof(struct StarsNeededForDialog, dialog2), false, LOT_NONE },
|
||||
{ "dialog3", LVT_U16, offsetof(struct StarsNeededForDialog, dialog3), false, LOT_NONE },
|
||||
{ "dialog4", LVT_U16, offsetof(struct StarsNeededForDialog, dialog4), false, LOT_NONE },
|
||||
{ "dialog5", LVT_U16, offsetof(struct StarsNeededForDialog, dialog5), false, LOT_NONE },
|
||||
{ "dialog6", LVT_U16, offsetof(struct StarsNeededForDialog, dialog6), false, LOT_NONE },
|
||||
};
|
||||
|
||||
#define LUA_STRUCT802_A272_C_FIELD_COUNT 2
|
||||
static struct LuaObjectField sStruct802A272CFields[LUA_STRUCT802_A272_C_FIELD_COUNT] = {
|
||||
{ "vecF", LVT_COBJECT, offsetof(struct Struct802A272C, vecF), true, LOT_VEC3F },
|
||||
|
|
@ -1984,6 +2003,7 @@ struct LuaObjectTable sLuaObjectAutogenTable[LOT_AUTOGEN_MAX - LOT_AUTOGEN_MIN]
|
|||
{ LOT_SPAWNINFO, sSpawnInfoFields, LUA_SPAWN_INFO_FIELD_COUNT },
|
||||
{ LOT_SPAWNPARTICLESINFO, sSpawnParticlesInfoFields, LUA_SPAWN_PARTICLES_INFO_FIELD_COUNT },
|
||||
{ LOT_STARPOSITIONS, sStarPositionsFields, LUA_STAR_POSITIONS_FIELD_COUNT },
|
||||
{ LOT_STARSNEEDEDFORDIALOG, sStarsNeededForDialogFields, LUA_STARS_NEEDED_FOR_DIALOG_FIELD_COUNT },
|
||||
{ LOT_STRUCT802A272C, sStruct802A272CFields, LUA_STRUCT802_A272_C_FIELD_COUNT },
|
||||
{ LOT_SURFACE, sSurfaceFields, LUA_SURFACE_FIELD_COUNT },
|
||||
{ LOT_TEXTUREINFO, sTextureInfoFields, LUA_TEXTURE_INFO_FIELD_COUNT },
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ enum LuaObjectAutogenType {
|
|||
LOT_SPAWNINFO,
|
||||
LOT_SPAWNPARTICLESINFO,
|
||||
LOT_STARPOSITIONS,
|
||||
LOT_STARSNEEDEDFORDIALOG,
|
||||
LOT_STRUCT802A272C,
|
||||
LOT_SURFACE,
|
||||
LOT_TEXTUREINFO,
|
||||
|
|
|
|||
|
|
@ -12872,6 +12872,16 @@ int smlua_func_cur_obj_set_hitbox_radius_and_height(lua_State* L) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
int smlua_func_cur_obj_set_home_once(UNUSED lua_State* L) {
|
||||
if(!smlua_functions_valid_param_count(L, 0)) { return 0; }
|
||||
|
||||
|
||||
extern void cur_obj_set_home_once(void);
|
||||
cur_obj_set_home_once();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int smlua_func_cur_obj_set_hurtbox_radius_and_height(lua_State* L) {
|
||||
if(!smlua_functions_valid_param_count(L, 2)) { return 0; }
|
||||
|
||||
|
|
@ -17664,6 +17674,7 @@ void smlua_bind_functions_autogen(void) {
|
|||
smlua_bind_function(L, "cur_obj_set_face_angle_to_move_angle", smlua_func_cur_obj_set_face_angle_to_move_angle);
|
||||
smlua_bind_function(L, "cur_obj_set_hitbox_and_die_if_attacked", smlua_func_cur_obj_set_hitbox_and_die_if_attacked);
|
||||
smlua_bind_function(L, "cur_obj_set_hitbox_radius_and_height", smlua_func_cur_obj_set_hitbox_radius_and_height);
|
||||
smlua_bind_function(L, "cur_obj_set_home_once", smlua_func_cur_obj_set_home_once);
|
||||
smlua_bind_function(L, "cur_obj_set_hurtbox_radius_and_height", smlua_func_cur_obj_set_hurtbox_radius_and_height);
|
||||
smlua_bind_function(L, "cur_obj_set_pos_relative", smlua_func_cur_obj_set_pos_relative);
|
||||
smlua_bind_function(L, "cur_obj_set_pos_relative_to_parent", smlua_func_cur_obj_set_pos_relative_to_parent);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue