Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
partners.h File Reference

Go to the source code of this file.

Data Structures

struct  WorldPartner
 

Typedefs

typedef void(* PartnerFunc) (Npc *partner)
 
typedef s32(* PartnerBoolFunc) (Npc *partner)
 
typedef s32(* PartnerTesHitFunc) (Npc *partner, Npc *enemy)
 

Functions

s32 partner_init_get_out (Npc *)
 
s32 partner_get_out (Npc *)
 
s32 partner_init_put_away (Npc *partner)
 
s32 partner_put_away (Npc *partner)
 
s32 partner_can_use_ability (void)
 
s32 partner_use_ability (void)
 
void partner_do_player_collision (Npc *partner)
 
void partner_walking_follow_player (Npc *partner)
 
s32 func_800EA52C (s32)
 
s32 partner_force_player_flip_done (void)
 
void partner_suspend_ability_script (void)
 
void partner_resume_ability_script (void)
 
void partner_enable_input (void)
 

Variables

NpcwPartnerNpc
 

Data Structure Documentation

◆ WorldPartner

struct WorldPartner
Data Fields
void * dmaStart
void * dmaEnd
void * dmaDest Always 0x802BD100
s32 isFlying
PartnerFunc init
EvtScript * takeOut
EvtScript * update
EvtScript * useAbility
EvtScript * putAway
s32 idle
PartnerTesHitFunc testFirstStrike
PartnerBoolFunc canUseAbility
PartnerBoolFunc canPlayerOpenMenus
PartnerFunc preBattle
PartnerFunc postBattle
EvtScript * onEnterMap

Typedef Documentation

◆ PartnerFunc

typedef void(* PartnerFunc) (Npc *partner)

Definition at line 4 of file partners.h.

◆ PartnerBoolFunc

typedef s32(* PartnerBoolFunc) (Npc *partner)

Definition at line 5 of file partners.h.

◆ PartnerTesHitFunc

typedef s32(* PartnerTesHitFunc) (Npc *partner, Npc *enemy)

Definition at line 6 of file partners.h.

Function Documentation

◆ partner_init_get_out()

s32 partner_init_get_out ( Npc * npc)

Definition at line 2249 of file partners.c.

2249 {
2253 return wPartnerFollowState;
2254}
@ COLLIDER_FLAG_IGNORE_PLAYER
Definition enums.h:4281
@ NPC_FLAG_IGNORE_PLAYER_COLLISION
Definition enums.h:3040
BSS s16 wPartnerFollowState
Definition partners.c:51
s32 flags
s32 collisionChannel

◆ partner_get_out()

s32 partner_get_out ( Npc * partner)
Bug
? collider flags not properly masked with COLLIDER_FLAG_SURFACE_TYPE

Definition at line 2256 of file partners.c.

2256 {
2259 f32 x, y, z, hitDepth;
2260 f32 var_f0;
2261
2263
2264 switch (wPartnerFollowState) {
2265 case 0:
2266 if (clamp_angle(playerStatus->spriteFacingAngle) < 180.0f) {
2267 partner->yaw = clamp_angle(camera->curYaw + 90.0f);
2268 } else {
2269 partner->yaw = clamp_angle(camera->curYaw - 90.0f);
2270 }
2271 partner->moveToPos.x = playerStatus->pos.x;
2272 partner->moveToPos.y = playerStatus->pos.y;
2273 if (wPartner->isFlying) {
2274 partner->moveToPos.y = playerStatus->pos.y;
2275 }
2276 partner->moveToPos.z = playerStatus->pos.z;
2277 add_vec2D_polar(&partner->moveToPos.x, &partner->moveToPos.z, playerStatus->colliderDiameter, partner->yaw);
2278 moveToX = partner->moveToPos.x;
2279 moveToY = partner->moveToPos.y;
2280 moveToZ = partner->moveToPos.z;
2281 if (!wPartner->isFlying) {
2282 x = moveToX;
2283 y = moveToY + partner->collisionHeight;
2284 z = moveToZ;
2285 add_vec2D_polar(&x, &z, 2.0f, gCameras[gCurrentCameraID].curYaw);
2286 hitDepth = 1000.0f;
2287 if (npc_raycast_down_around(COLLIDER_FLAG_IGNORE_PLAYER, &x, &y, &z, &hitDepth, partner->yaw, partner->collisionDiameter)) {
2290
2292 moveToX = playerStatus->pos.x;
2293 moveToY = playerStatus->pos.y;
2294 moveToZ = playerStatus->pos.z;
2295 add_vec2D_polar(&x, &z, 2.0f, gCameras[gCurrentCameraID].curYaw);
2296 }
2297 } else {
2298 moveToX = playerStatus->pos.x;
2299 moveToY = playerStatus->pos.y;
2300 moveToZ = playerStatus->pos.z;
2301 add_vec2D_polar(&x, &z, 2.0f, gCameras[gCurrentCameraID].curYaw);
2302 }
2303 }
2304
2305 x = partner->pos.x = playerStatus->pos.x;
2306 y = partner->pos.y = playerStatus->pos.y + (playerStatus->colliderHeight / 2);
2307 z = partner->pos.z = playerStatus->pos.z;
2308
2309 partner->moveSpeed = 4.0f;
2310 partner->jumpScale = 1.2f;
2311 partner->planarFlyDist = dist2D(x, z, moveToX, moveToZ);
2312 partner->yaw = atan2(x, z, moveToX, moveToZ);
2313 partner->duration = partner->planarFlyDist / partner->moveSpeed;
2314 if (partner->duration < 10) {
2315 partner->duration = 10;
2316 partner->moveSpeed = partner->planarFlyDist / partner->duration;
2317 }
2318 partner->jumpVel = (moveToY - y + (partner->jumpScale * partner->duration * partner->duration * 0.5f)) /
2319 partner->duration;
2321 y = moveToY - y;
2323 break;
2324 case 1:
2325 if (partner->jumpVel < 0.0f && npc_try_snap_to_ground(partner, fabsf(partner->jumpVel))) {
2327 break;
2328 }
2329 partner->jumpVel -= partner->jumpScale;
2330 partner->pos.y += partner->jumpVel;
2331 if (partner->jumpVel <= 0.0f) {
2333 }
2334 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
2336 var_f0 = partner->duration;
2337 if (var_f0 > 10.0f) {
2338 var_f0 = 10.0f;
2339 }
2340
2341 partner->scale.x = (10.0f - var_f0) / 10.0f;
2342 partner->scale.y = partner->scale.x;
2343 partner->scale.z = partner->scale.x;
2344
2345 partner->duration--;
2346 if (partner->duration < 0) {
2348 }
2349 break;
2350 case 2:
2351 partner->pos.y = partner->moveToPos.y;
2352 partner->jumpVel = 0.0f;
2353 partner->scale.x = 1.0f;
2354 partner->scale.y = 1.0f;
2355 partner->scale.z = 1.0f;
2356 partner->moveToPos.x = partner->pos.x;
2357 partner->moveToPos.y = partner->pos.y;
2358 partner->moveToPos.z = partner->pos.z;
2359 partner->pos.x = partner->pos.x;
2360 partner->pos.y = playerStatus->pos.y;
2361 if (wPartner->isFlying) {
2362 partner->pos.y = playerStatus->pos.y;
2363 }
2364 partner->pos.z = partner->pos.z;
2366 partner->pos.x = partner->moveToPos.x;
2367 partner->pos.y = partner->moveToPos.y;
2368 partner->pos.z = partner->moveToPos.z;
2369 if (partner->flags & NPC_FLAG_GROUNDED) {
2370 if (!wPartner->isFlying) {
2372 }
2373 }
2374 return true;
2375 }
2376 return false;
2377}
BSS s32 PopupMenu_SelectedIndex
#define clamp_angle
#define atan2
@ SURFACE_TYPE_LAVA
Definition enums.h:4258
@ SURFACE_TYPE_SPIKES
Definition enums.h:4257
@ SURFACE_INTERACT_LAND
Definition enums.h:4271
@ NPC_FLAG_GROUNDED
Definition enums.h:3044
f32 fabsf(f32 f)
b32 npc_raycast_down_around(s32, f32 *, f32 *, f32 *, f32 *, f32, f32)
s32 get_collider_flags(s32 colliderID)
Definition collision.c:481
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:670
void add_vec2D_polar(f32 *x, f32 *y, f32 r, f32 theta)
Definition 43F0.c:685
s32 npc_try_snap_to_ground(Npc *npc, f32 velocity)
Definition npc.c:580
void npc_surface_spawn_fx(Npc *npc, SurfaceInteractMode mode)
Definition surfaces.c:394
void npc_do_world_collision(Npc *npc)
Definition npc.c:277
void npc_move_heading(Npc *npc, f32 speed, f32 yaw)
Definition npc.c:983
PartnerAnimations gPartnerAnimations[]
Definition partners.c:343
void partner_clear_player_tracking(Npc *partner)
Definition partners.c:2433
BSS s32 wCurrentPartnerId
Definition partners.c:57
BSS WorldPartner * wPartner
Definition partners.c:62
s32 NpcHitQueryColliderID
Camera gCameras[4]
Definition cam_main.c:16
PlayerStatus gPlayerStatus
Definition 77480.c:38
s32 gCurrentCameraID
Definition cam_math.c:5

◆ partner_init_put_away()

s32 partner_init_put_away ( Npc * partner)

Definition at line 2175 of file partners.c.

2175 {
2176 partner->collisionChannel = COLLIDER_FLAG_IGNORE_PLAYER;
2179 return wPartnerFollowState;
2180}

◆ partner_put_away()

s32 partner_put_away ( Npc * partner)

Definition at line 2182 of file partners.c.

2182 {
2187 f32 tempPosX;
2188 f32 tempPosZ;
2189 f32 tempPosY;
2191
2192 switch (wPartnerFollowState){
2193 case 0:
2195 tempMoveToY = partner->pos.y;
2196 tempMoveToZ = partner->pos.z;
2197 partner->flags &= ~NPC_FLAG_GRAVITY;
2198 partner->flags &= ~NPC_FLAG_FLYING;
2199 tempPosX = playerStatus->pos.x;
2200 partner->moveToPos.x = tempPosX;
2201 tempPosY = playerStatus->pos.y + (playerStatus->colliderHeight / 2);
2202 partner->moveToPos.y = playerStatus->pos.y + (playerStatus->colliderHeight / 2);
2203 tempPosZ = playerStatus->pos.z;
2207 partner->moveSpeed = 4.0f;
2208 partner->jumpScale = 1.6f;
2209 partner->moveToPos.z = tempPosZ;
2212 partner->duration = 15;
2213 partner->moveSpeed = partner->planarFlyDist / partner->duration;
2215 partner->jumpVel = (tempMoveToY + partner->jumpScale * partner->duration * partner->duration * 0.5f) / partner->duration;
2219 break;
2220 case 1:
2221 partner->jumpVel -= partner->jumpScale;
2222 partner->pos.y += partner->jumpVel;
2223 if (partner->jumpVel <= 0.0f) {
2225 }
2226 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
2227 tempDuration = partner->duration;
2228 if (partner->duration > 10.0f) {
2229 tempDuration = 10.0f;
2230 }
2231 partner->scale.x = tempDuration / 10.0f;
2232 partner->scale.y = partner->scale.x;
2233 partner->scale.z = partner->scale.x;
2234 partner->duration--;
2235 if (partner->duration < 0) {
2237 }
2238 break;
2239 case 2:
2241 partner->jumpVel = 0.0f;
2242 partner->pos.y = partner->moveToPos.y;
2244 return true;
2245 }
2246 return false;
2247}
void disable_npc_blur(Npc *npc)
Definition npc.c:1085
void enable_npc_blur(Npc *npc)
Definition npc.c:1064
f32 wSavedPartnerPosZ
Definition partners.c:341
f32 wSavedPartnerPosX
Definition partners.c:339
f32 wSavedPartnerPosY
Definition partners.c:340

◆ partner_can_use_ability()

s32 partner_can_use_ability ( void )

Definition at line 993 of file partners.c.

993 {
995 return true;
996 }
997 return false;
998}
Npc * wPartnerNpc
Definition partners.c:43
PartnerBoolFunc canUseAbility
Definition partners.h:20

◆ partner_use_ability()

s32 partner_use_ability ( void )

Definition at line 964 of file partners.c.

964 {
966
968 && wPartner != nullptr
970 {
973 } else if (wCurrentPartnerId != PARTNER_NONE) {
974 D_8010CFE0 = 1;
977 return true;
978 }
979 }
980 return false;
981}
@ BUTTON_B
Definition enums.h:2775
@ SOUND_MENU_ERROR
Definition enums.h:936
@ PARTNER_NONE
Definition enums.h:2919
@ PARTNER_CMD_USE_ABILITY
Definition enums.h:2987
s32 is_starting_conversation(void)
Definition encounter.c:2815
PartnerStatus gPartnerStatus
Definition partners.c:42
BSS s32 NextPartnerCommand
Definition partners.c:61
BSS s32 D_8010CFE0
Definition partners.c:59
void _use_partner_ability(void)
Definition partners.c:625
void sfx_play_sound(s32 soundID)
GameStatus * gGameStatusPtr
Definition main_loop.c:31

◆ partner_do_player_collision()

void partner_do_player_collision ( Npc * partner)

Definition at line 2492 of file partners.c.

2492 {
2500 f32 W;
2501
2502 transform_point(gCameras[CAM_DEFAULT].mtxPerspective,
2503 playerStatus->pos.x, playerStatus->pos.y, playerStatus->pos.z, 1.0f,
2505 transform_point(gCameras[CAM_DEFAULT].mtxPerspective, partner->pos.x, partner->pos.y, partner->pos.z, 1.0f,
2510 if (playerScreenX <= (partner->collisionDiameter + playerStatus->colliderDiameter) * 0.9f &&
2511 playerScreenY <= partner->collisionHeight + playerStatus->colliderHeight && playerScreenZ <= 4.0)
2512 {
2514 atan2(playerStatus->pos.x, playerStatus->pos.z, partner->pos.x, partner->pos.z));
2516 }
2517}
#define transform_point
@ CAM_DEFAULT
Definition enums.h:1826

Referenced by partner_flying_update_motion(), and partner_walking_update_motion().

◆ partner_walking_follow_player()

void partner_walking_follow_player ( Npc * partner)

Definition at line 1231 of file partners.c.

1231 {
1236 f32 x, y, z;
1237 f32 distance;
1238 f32 yaw;
1239 f32 temp_a3;
1240 f32 angle;
1242
1243 switch (wPartnerFollowState) {
1244 case 0:
1248 x = partner->pos.x;
1249 y = partner->pos.y;
1250 z = partner->pos.z;
1251 partner->moveSpeed = 3.0f;
1252
1253 distance = dist2D(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1254 if (distance >= 50.0) {
1255 partner->moveSpeed = !(playerStatus->animFlags & PA_FLAG_SPINNING) ? 5.0f : 7.0f;
1256 }
1257 if (wPartnerTetherDistance < 20.0) {
1258 partner->moveSpeed = 4.0f;
1259 }
1261 if (!(partner->flags & NPC_FLAG_GROUNDED)) {
1263 }
1264 while (true) {
1266 yaw = atan2(x, z, moveHistoryX, moveHistoryZ);
1267 if (partner->moveSpeed < distance) {
1268 distance = dist2D(x, z, playerStatus->pos.x, playerStatus->pos.z);
1269 if (distance >= 50.0) {
1270 break;
1271 }
1274 if (partner->moveSpeed > 3.0) {
1275 partner->moveSpeed = 3.0f;
1276 if (wPartnerTetherDistance < 20.0f) {
1277 partner->moveSpeed = 4.0f;
1278 }
1279 } else {
1280 partner->moveSpeed += 1.0;
1281 }
1282 break;
1283 } else {
1284 partner->moveSpeed = 0.0f;
1285 partner->yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1286 }
1287 }
1289 yaw = partner->yaw;
1290 partner->moveSpeed = 0.0f;
1291 partner->jumpScale = 0.0f;
1294 break;
1295 } else {
1296 D_8010CFBC++;
1297 if (D_8010CFBC >= 40) {
1298 D_8010CFBC = 0;
1299 }
1303
1304 if (fabsf(get_clamped_angle_diff(partner->yaw, atan2(partner->pos.x, partner->pos.z, moveHistoryX, moveHistoryZ))) > 90.0f) {
1306 break;
1307 }
1308
1309 if ((partner->flags & NPC_FLAG_GROUNDED) && currentSnapshot->isJumping) {
1311 break;
1312 }
1313 }
1314 }
1315
1316 if (!(partner->flags & NPC_FLAG_GROUNDED)) {
1317 partner->moveSpeed *= 0.5f;
1318 }
1319 partner->yaw = yaw;
1320 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
1326 ) {
1327 if (!func_800EA4B0(partner->curWall)) {
1328 D_8010CFBC++;
1329 if (D_8010CFBC >= 40) {
1330 D_8010CFBC = 0;
1331 }
1335 if (fabsf(get_clamped_angle_diff(partner->yaw, atan2(partner->pos.x, partner->pos.z, moveHistoryX, moveHistoryZ))) > 90.0f) {
1337 return;
1338 }
1339 } else {
1341 return;
1342 }
1343 }
1344 break;
1345 case 1:
1349 moveHistoryX = partner->pos.x;
1350 moveHistoryY = playerStatus->pos.y;
1351 moveHistoryZ = partner->pos.z;
1352 add_vec2D_polar(&moveHistoryX, &moveHistoryZ, 6.0f, atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z));
1353 } else {
1354 break;
1355 }
1356 } else {
1357 D_8010CFBC++;
1358 if (D_8010CFBC >= 40) {
1359 D_8010CFBC = 0;
1360 }
1365 }
1366 partner->moveToPos.x = moveHistoryX;
1367 partner->moveToPos.y = moveHistoryY;
1368 partner->moveToPos.z = moveHistoryZ;
1369 partner->duration = 0;
1370 partner->jumpScale = 3.0f;
1371 partner->moveSpeed = 6.0f;
1372 partner->planarFlyDist = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1373 partner->yaw = atan2(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1374 if (partner->planarFlyDist > 50.0) {
1375 partner->planarFlyDist = 50.0f;
1376 }
1377 distance = partner->planarFlyDist;
1378 y = partner->moveToPos.y - partner->pos.y;
1380 partner->jumpVel = 0.0f;
1381 partner->yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1383 return;
1384 }
1385 partner->duration = distance / partner->moveSpeed;
1386 if (partner->duration < 10) {
1387 partner->duration = 10;
1388 }
1389 partner->moveSpeed = partner->planarFlyDist / partner->duration;
1390 partner->jumpVel = (y + partner->jumpScale * partner->duration * partner->duration * 0.5f) / partner->duration;
1391 if (partner->jumpVel > 20.0) {
1392 partner->jumpVel = 20.0f;
1393 }
1394 if (partner->jumpVel < 0.0) {
1395 partner->jumpVel = 0.0f;
1396 }
1399 } else {
1401 }
1402
1403 partner->moveToPos.x = partner->pos.x;
1404 partner->moveToPos.y = partner->pos.y;
1405 partner->moveToPos.z = partner->pos.z;
1406 partner->flags |= NPC_FLAG_JUMPING;
1408 // fallthrough
1409 case 2:
1410 partner->jumpVel -= partner->jumpScale;
1411 partner->pos.y += partner->jumpVel;
1412 if (partner->jumpVel <= 0.0f) {
1414 }
1415 if (partner->pos.y < -2000.0f) {
1417 partner->flags &= ~NPC_FLAG_JUMPING;
1418 partner->jumpVel = 0.0f;
1419 partner->yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1420 partner->pos.x = playerStatus->pos.x;
1421 partner->pos.y = playerStatus->pos.y;
1422 partner->pos.z = playerStatus->pos.z;
1424 return;
1425 }
1426 if (partner->jumpVel <= 0.0f) {
1427 distance = fabsf(partner->jumpVel) + 11.0f;
1428 x = partner->pos.x;
1429 y = partner->pos.y + distance;
1430 z = partner->pos.z;
1431 if (npc_raycast_down_around(partner->collisionChannel, &x, &y, &z, &distance, partner->yaw, partner->collisionDiameter) != 0) {
1432 if (distance <= fabsf(partner->jumpVel) + 22.0f) {
1434 partner->flags &= ~NPC_FLAG_JUMPING;
1435 partner->jumpVel = 0.0f;
1436 partner->pos.y = y;
1437 partner->yaw = atan2(x, z, playerStatus->pos.x, playerStatus->pos.z);
1440 distance = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1441 if (distance < 5.0) {
1442 partner->pos.x = playerStatus->pos.x;
1443 partner->pos.y = playerStatus->pos.y;
1444 partner->pos.z = playerStatus->pos.z;
1445 add_vec2D_polar(&partner->pos.x, &partner->pos.z, 5.0f, clamp_angle((cameras[CAM_DEFAULT].curYaw + 90.0f) - playerStatus->spriteFacingAngle));
1447 }
1448 break;
1449 }
1450 }
1451 }
1452 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
1453 break;
1454 case 5:
1458 x = partner->pos.x;
1459 y = partner->pos.y;
1460 z = partner->pos.z;
1461 distance = dist2D(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1463 if (D_8010CFCA == 0) {
1464 partner->moveSpeed = 0.0f;
1465 partner->jumpScale = 0.0f;
1467 if (playerStatus->actionState == ACTION_STATE_TALK) {
1468 D_8010CFCA = 0;
1469 }
1473 return;
1474 }
1475 } else {
1476 temp_a3 = clamp_angle(cameras[CAM_DEFAULT].curYaw + (playerStatus->spriteFacingAngle < 180.0f ? 90.0f : -90.0f));
1477 partner->moveToPos.x = playerStatus->pos.x;
1478 partner->moveToPos.y = playerStatus->pos.y;
1479 partner->moveToPos.z = playerStatus->pos.z;
1480 add_vec2D_polar(&partner->moveToPos.x, &partner->moveToPos.z, wPartnerTetherDistance - 10.0f, temp_a3);
1481 yaw = atan2(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1482 distance = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1483 partner->moveSpeed = 2.0f;
1484 if (distance > 2.0f) {
1485 partner->yaw = yaw;
1488 D_800F803A = 0;
1489 } else {
1490 D_800F803A++;
1491 if (D_800F803A > 10) {
1492 yaw = playerStatus->targetYaw;
1493 partner->moveSpeed = 0.0f;
1494 partner->jumpScale = 0.0f;
1495 partner->renderYaw = yaw;
1497 if (D_8010CFCA == 2 || playerStatus->actionState == ACTION_STATE_TALK) {
1498 D_8010CFCA = 0;
1499 }
1500 }
1501 }
1502 } else {
1503 yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1504 partner->yaw = yaw;
1505 partner->moveSpeed = 0.0f;
1506 partner->jumpScale = 0.0f;
1508 if (D_8010CFCA == 2 || playerStatus->actionState == ACTION_STATE_TALK) {
1509 D_8010CFCA = 0;
1510 }
1511 }
1512 partner->yaw = yaw;
1513 npc_move_heading(partner, partner->moveSpeed, yaw);
1515 distance = 1000.0f;
1516 x = partner->pos.x;
1517 z = partner->pos.z;
1518 y = partner->pos.y + partner->collisionHeight;
1519 if (npc_raycast_down_around(partner->collisionChannel, &x, &y, &z, &distance, partner->yaw, partner->collisionDiameter) != 0) {
1522 partner->yaw = clamp_angle(yaw + 180.0f);
1523 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
1524 partner->moveSpeed = 0.0f;
1525 partner->jumpScale = 0.0f;
1527 if (D_8010CFCA == 2) {
1528 D_8010CFCA = 0;
1529 } else if (playerStatus->actionState == ACTION_STATE_TALK) {
1530 D_8010CFCA = 0;
1531 }
1532 } else if (!func_800EA4B0(NpcHitQueryColliderID)) {
1533 D_8010CFCA = 2;
1534 }
1535 }
1536 break;
1537 }
1538 }
1539 distance = dist2D(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1542 D_8010CFCA = 2;
1543 }
1544 } else {
1545 while (true) {
1546 if (currentSnapshot->isJumping) {
1547 break;
1548 }
1549 yaw = atan2(partner->pos.x, partner->pos.z, moveHistoryX, moveHistoryZ);
1550 if (fabsf(get_clamped_angle_diff(yaw, atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z))) < 90.0f) {
1551 break;
1552 }
1554 break;
1555 }
1556 D_8010CFBC++;
1557 if (D_8010CFBC >= 40) {
1558 D_8010CFBC = 0;
1559 }
1563 }
1564 if (!currentSnapshot->isJumping) {
1566 return;
1567 }
1568 while (true) {
1569 if (!currentSnapshot->isJumping) {
1570 break;
1571 }
1572 yaw = atan2(partner->pos.x, partner->pos.z, moveHistoryX, moveHistoryZ);
1573 if (fabsf(get_clamped_angle_diff(yaw, atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z))) < 90.0f) {
1574 break;
1575 }
1577 break;
1578 }
1579 D_8010CFBC++;
1580 if (D_8010CFBC >= 40) {
1581 D_8010CFBC = 0;
1582 }
1586 }
1588 return;
1589 }
1590 break;
1591 case 15:
1592 switch (D_8010CFCE) {
1593 case 0:
1594 angle = clamp_angle(player_get_side_angle() + 180.0f);
1595 partner->moveToPos.x = playerStatus->pos.x;
1596 partner->moveToPos.y = playerStatus->pos.y;
1597 partner->moveToPos.z = playerStatus->pos.z;
1598 add_vec2D_polar(&partner->moveToPos.x, &partner->moveToPos.z, playerStatus->colliderDiameter, angle);
1599 distance = dist2D(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1601 partner->moveSpeed = wPartnerMoveSpeed;
1603 yaw = atan2(partner->pos.x, partner->pos.z, partner->moveToPos.x, partner->moveToPos.z);
1604 partner->yaw = D_800F8034 = yaw;
1605 D_8010CFCE++;
1606 // fallthrough
1607 case 1:
1608 if (wPartnerMoveTime != 0) {
1610 if (partner->jumpScale != 0.0f) {
1611 partner->jumpVel -= partner->jumpScale;
1612 partner->pos.y += partner->jumpVel;
1613 if (partner->jumpVel <= 0.0f) {
1615 }
1616 if (partner->jumpVel <= 0.0f) {
1617 distance = fabsf(partner->jumpVel) + 11.0f;
1618 x = partner->pos.x;
1619 y = partner->pos.y + distance;
1620 z = partner->pos.z;
1621 if ((npc_raycast_down_around(partner->collisionChannel, &x, &y, &z, &distance, partner->yaw, partner->collisionDiameter) != 0) && (distance <= (fabsf(partner->jumpVel) + 22.0f))) {
1623 partner->jumpScale = 0.0f;
1624 partner->jumpVel = 0.0f;
1625 partner->pos.y = y;
1626 partner->flags &= ~NPC_FLAG_JUMPING;
1627 }
1628 }
1629 }
1630 partner->moveSpeed = wPartnerMoveSpeed;
1631 partner->yaw = D_800F8034;
1632 npc_move_heading(partner, partner->moveSpeed, partner->yaw);
1634 } else {
1636 partner->moveSpeed = 0.0f;
1637 partner->jumpScale = 0.0f;
1639 partner->yaw = clamp_angle((cameras[CAM_DEFAULT].curYaw + 270.0f) - playerStatus->spriteFacingAngle);
1640 wPartnerMoveTime = 30;
1641 D_8010CFCE++;
1642 }
1643 return;
1644 case 2:
1645 if (wPartnerMoveTime != 0) {
1647 return;
1648 }
1650 D_8010CFCA = 0;
1651 D_8010CFCE = 0;
1652 }
1653 break;
1654 case 20:
1656 break;
1657 case 40:
1658 if (partner->flags & NPC_FLAG_GROUNDED) {
1659 if (func_800EA4B0(partner->curFloor)) {
1662 } else {
1664 }
1665 break;
1666 }
1667 partner->jumpScale = 3.0f;
1668 partner->jumpVel -= partner->jumpScale;
1669 partner->pos.y += partner->jumpVel;
1670 if (partner->jumpVel <= 0.0f) {
1672 }
1673 if (partner->pos.y < -2000.0f) {
1675 partner->flags &= ~NPC_FLAG_JUMPING;
1676 partner->jumpVel = 0.0f;
1677 partner->yaw = atan2(partner->pos.x, partner->pos.z, playerStatus->pos.x, playerStatus->pos.z);
1678 partner->pos.x = playerStatus->pos.x;
1679 partner->pos.y = playerStatus->pos.y;
1680 partner->pos.z = playerStatus->pos.z;
1682 return;
1683 }
1684 distance = fabsf(partner->jumpVel) + 11.0f;
1685 x = partner->pos.x;
1686 y = partner->pos.y + distance;
1687 z = partner->pos.z;
1688 if (npc_raycast_down_around(partner->collisionChannel, &x, &y, &z, &distance, partner->yaw, partner->collisionDiameter) != 0) {
1690 partner->flags &= ~NPC_FLAG_JUMPING;
1691 partner->jumpVel = 0.0f;
1692 partner->pos.y = y;
1693 partner->yaw = atan2(x, z, playerStatus->pos.x, playerStatus->pos.z);
1696 }
1697 break;
1698 case 50:
1699 break;
1700 }
1701}
@ PARTNER_ANIM_INDEX_RUN
Definition enums.h:3442
@ PARTNER_ANIM_INDEX_WALK
Definition enums.h:3437
@ PA_FLAG_SPINNING
Definition enums.h:3141
@ ACTION_STATE_TALK
Reading signs doesn't count.
Definition enums.h:2426
@ SURFACE_INTERACT_RUN
Definition enums.h:4270
@ SURFACE_INTERACT_WALK
Definition enums.h:4269
@ NPC_FLAG_JUMPING
Definition enums.h:3043
@ NPC_FLAG_COLLDING_FORWARD_WITH_WORLD
Definition enums.h:3046
f32 player_get_side_angle(void)
Definition 7BB60.c:1178
f32 get_clamped_angle_diff(f32, f32)
Definition 43F0.c:606
BSS PlayerPathElement gPlayerMoveHistory[40]
Definition partners.c:46
BSS s32 gPlayerMoveHistoryIndex
Definition partners.c:47
s16 D_800F803A
Definition partners.c:165
s32 func_800EA4B0(s32 collisionID)
Definition partners.c:497
BSS s32 D_8010CFBC
Definition partners.c:48
BSS s16 D_8010CFCA
Definition partners.c:52
s32 wPartnerMoveTime
Definition partners.c:161
f32 D_800F8034
Definition partners.c:163
BSS f32 wPartnerTetherDistance
Definition partners.c:49
f32 wPartnerMoveSpeed
Definition partners.c:162
void partner_move_to_goal(Npc *, s32)
Definition partners.c:2519
BSS s16 D_8010CFCE
Definition partners.c:54

Referenced by partner_walking_update_motion().

◆ func_800EA52C()

s32 func_800EA52C ( s32 partnerID)

Definition at line 537 of file partners.c.

537 {
540 s32 ret = false;
541
542 if (playerStatus->flags & PS_FLAG_HIT_FIRE) {
543 return false;
544 }
545
546 // any partner
550 ) {
551 ret = true;
552 }
553
554 // check specific partners
555 if (partnerID == PARTNER_BOW) {
557 ret = true;
558 }
559 } else if (partnerID == PARTNER_PARAKARRY) {
564 ) {
565 ret = true;
566 }
567 }
568
569 return ret;
570}
@ PS_FLAG_HIT_FIRE
Definition enums.h:3084
@ PARTNER_BOW
Definition enums.h:2928
@ PARTNER_PARAKARRY
Definition enums.h:2923
@ ACTION_STATE_RIDE
Definition enums.h:2447
@ ACTION_STATE_IDLE
Definition enums.h:2412
@ ACTION_STATE_WALK
Definition enums.h:2413
@ ACTION_STATE_RUN
Definition enums.h:2414

◆ partner_force_player_flip_done()

s32 partner_force_player_flip_done ( void )

Definition at line 2451 of file partners.c.

2451 {
2455
2456 if (playerStatus->flipYaw[CAM_DEFAULT] == 0.0f) {
2457 if (!(playerStatus->spriteFacingAngle >= 90.0f) || !(playerStatus->spriteFacingAngle < 270.0f)) {
2458 isFacingLeft = true;
2459 playerStatus->targetYaw = clamp_angle(cameras[CAM_DEFAULT].curYaw - 90.0f);
2460 } else {
2461 isFacingLeft = false;
2462 playerStatus->targetYaw = clamp_angle(cameras[CAM_DEFAULT].curYaw + 90.0f);
2463 }
2464 } else if (get_clamped_angle_diff(cameras[CAM_DEFAULT].curYaw, playerStatus->targetYaw) < 0.0f) {
2465 isFacingLeft = true;
2466 playerStatus->targetYaw = clamp_angle(cameras[CAM_DEFAULT].curYaw - 90.0f);
2467
2468 } else {
2469 isFacingLeft = false;
2470 playerStatus->targetYaw = clamp_angle(cameras[CAM_DEFAULT].curYaw + 90.0f);
2471 }
2472
2473 playerStatus->curYaw = playerStatus->targetYaw;
2474 return isFacingLeft;
2475}

◆ partner_suspend_ability_script()

void partner_suspend_ability_script ( void )

Definition at line 1117 of file partners.c.

1117 {
1118 if (wCurrentPartnerId != nullptr) {
1121 }
1122 }
1123}
s32 does_script_exist(s32 id)
void suspend_all_script(s32 id)
BSS s32 wPartnerCurrentScriptID
Definition partners.c:58

◆ partner_resume_ability_script()

void partner_resume_ability_script ( void )

Definition at line 1125 of file partners.c.

1125 {
1126 if (wCurrentPartnerId != nullptr) {
1129 }
1130 }
1131}
void resume_all_script(s32 id)

◆ partner_enable_input()

void partner_enable_input ( void )

Definition at line 2477 of file partners.c.

2477 {
2479
2481 if (partnerStatus->inputDisabledCount < 0) {
2482 partnerStatus->inputDisabledCount = 0;
2483 }
2484}

Referenced by check_input_open_menus(), SentinelAI_GrabPlayer(), update_encounters_conversation(), update_encounters_post_battle(), and update_item_entity_pickup().

Variable Documentation

◆ wPartnerNpc