Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
item_entity.c
Go to the documentation of this file.
1#include "common.h"
2#include "inventory.h"
3#include "vars_access.h"
4#include "effects.h"
5#include "hud_element.h"
7#include "world/partners.h"
8#include "sparkle_script.h"
9#include "item_entity.h"
10#include "message_ids.h"
11#include "nu/nusys.h"
12#include "ld_addrs.h"
13#include "sprite.h"
14#include "sprite/player.h"
15
16#define MAX_ITEM_ENTITIES 256
17
19
20extern Gfx Gfx_RM1_ALPHATEST[];
21extern Gfx Gfx_RM2_ALPHATEST[];
23
26
28extern s32* gHudElementCacheSize;
29
31
44#if !VERSION_JP
46#endif
55
57void appendGfx_item_entity(void*);
58void draw_item_entities(void);
59void draw_ui_item_entities(void);
69void draw_content_pickup_item_header(ItemEntity* item, s32 posX, s32 posY);
70void draw_content_cant_carry_more(ItemEntity* item, s32 posX, s32 posY);
71void draw_content_pickup_item_desc(ItemEntity* item, s32 posX, s32 posY);
72
74 {{{ -12, 0, 0 }, 0, { 0x2300, 0x2300 }, { 0, 0, 0, 255 }}},
75 {{{ 11, 0, 0 }, 0, { 0x2000, 0x2300 }, { 0, 0, 0, 255 }}},
76 {{{ 11, 23, 0 }, 0, { 0x2000, 0x2000 }, { 0, 0, 0, 255 }}},
77 {{{ -12, 23, 0 }, 0, { 0x2300, 0x2000 }, { 0, 0, 0, 255 }}},
78};
79
81 {{{ -16, 0, 0 }, 0, { 0x2400, 0x2400 }, { 0, 0, 0, 255 }}},
82 {{{ 15, 0, 0 }, 0, { 0x2000, 0x2400 }, { 0, 0, 0, 255 }}},
83 {{{ 15, 31, 0 }, 0, { 0x2000, 0x2000 }, { 0, 0, 0, 255 }}},
84 {{{ -16, 31, 0 }, 0, { 0x2400, 0x2000 }, { 0, 0, 0, 255 }}},
85};
86
100
108
116
117Lights1 ItemEntityLights = gdSPDefLights1(255, 255, 255, 0, 0, 0, 0, 0, 0);
118
119#if !VERSION_JP
122#endif
123
125 item->sparkleReadPos = (s32*)script;
126 item->sparkleNextUpdate = 1;
127 item->sparkleSavedPos = (s32*)script;
128}
129
131 s32* readPos = item->sparkleReadPos;
132
133 switch (*readPos++) {
135 item->sparkleNextUpdate = *readPos++;
136 item->sparkleUnk44 = *readPos++;
137 item->sparkleReadPos = readPos;
138 break;
140 item->sparkleReadPos = item->sparkleSavedPos;
141 return TRUE;
142 case SPARKLE_OP_Jump:
143 item->sparkleSavedPos = readPos;
144 item->sparkleReadPos = readPos;
145 return TRUE;
146 case SPARKLE_OP_SetCI:
147 item->sparkleNextUpdate = *readPos++;
148 item->sparkleRaster = (IMG_PTR)*readPos++;
149 item->sparklePalette = (PAL_PTR)*readPos++;
150 item->sparkleWidth = *readPos++;
151 item->sparkleHeight = *readPos++;
152 item->sparkleReadPos = readPos;
153 break;
154 case SPARKLE_OP_Break:
155 readPos++; // ignore arg
156 item->sparkleReadPos = readPos;
157 case SPARKLE_OP_End:
158 return TRUE;
159 }
160 return FALSE;
161}
162
164 item->sparkleNextUpdate--;
165 if (item->sparkleNextUpdate <= 0) {
166 while (sparkle_script_step(item)) {}
167 }
168}
169
171 f32 x, y, z;
172 f32 angle;
178
182 angle = clamp_angle(180.0f - gCameras[gCurrentCamID].curYaw);
183
184 guTranslateF(sp18, x, y, z);
185 guTranslateF(sp58, item->pos.x, item->pos.y + 12.0f, item->pos.z);
186 guRotateF(sp98, angle, 0.0f, 1.0f, 0.0f);
190
205
206 ifxImg.raster = item->sparkleRaster;
207 ifxImg.palette = item->sparklePalette;
208 ifxImg.width = item->sparkleWidth;
209 ifxImg.height = item->sparkleHeight;
210 ifxImg.xOffset = -item->sparkleWidth / 2;
211 ifxImg.yOffset = item->sparkleHeight / 2;
212 ifxImg.alpha = 255;
214
217}
218
219ItemEntity* get_item_entity(s32 itemEntityIndex) {
220 return gCurrentItemEntities[itemEntityIndex];
221}
222
224 Shadow* shadow;
225
227 if (item->shadowIndex >= 0) {
228 shadow = get_shadow_by_index(item->shadowIndex);
229 shadow->flags |= ENTITY_FLAG_HIDDEN;
230 }
231}
232
234 Shadow* shadow;
235
237 if (item->shadowIndex >= 0) {
238 shadow = get_shadow_by_index(item->shadowIndex);
239 shadow->flags &= ~ENTITY_FLAG_HIDDEN;
240 }
241}
242
244 s32 i;
245
248 } else {
250 }
251
252 for (i = 0; i < MAX_ITEM_ENTITIES; i++) {
254 }
255
261
264 }
265
269#if !VERSION_JP
271#endif
272}
273
277 } else {
279 }
280
282#if !VERSION_JP
284#endif
287}
288
289extern s32* gItemEntityScripts[];
290
292 s32* pos;
294 s32 cond;
295 s32 raster;
296 s32 palette;
297 s32 size;
298 s32 i;
299
300 item->savedReadPos = item->readPos = pos = gItemEntityScripts[item->itemID];
301
302 while (TRUE) {
303 switch (*pos++) {
305 break;
308 default:
309 continue;
311 pos += 2;
312 continue;
314 pos++;
315 raster = *pos++;
316 palette = *pos++;
317
318 // 32x32 or 24x24 (divided by 2 because these are ci4 iamges)
319 size = (item->flags & ITEM_ENTITY_FLAG_FULLSIZE) ? (32 * 32 / 2) : (24 * 24 / 2);
320
322 i = 0;
323 while (TRUE) {
324 if (entry->id == -1) {
325 entry->id = raster;
327
328 ASSERT(*gHudElementCacheSize + size < 0x11000);
329 nuPiReadRom((s32)icon_ROM_START + raster, entry->data, size);
330 *gHudElementCacheSize += size;
332 *pos = i;
333 } else {
334 *pos = (u16)(*pos) | (i << 16);
335 }
336 pos++;
337 break;
338 } else {
339 cond = entry->id == raster; // TODO required to match
340 if (cond) {
342 *pos = i;
343 } else {
344 *pos = (u16)(*pos) | (i << 16);
345 }
346 pos++;
347 break;
348 }
349 }
350 entry++;
351 i++;
352 }
354
356 i = 0;
357 while (TRUE) {
358 if (entry->id == -1) {
359 entry->id = palette;
361 ASSERT(*gHudElementCacheSize + 0x20 < 0x11000);
362 nuPiReadRom((s32)icon_ROM_START + palette, entry->data, 0x20);
363 *gHudElementCacheSize += 0x20;
365 *pos = i;
366 } else {
367 *pos = (u16)(*pos) | (i << 16);
368 }
369 pos++;
370 break;
371 } else if (entry->id == palette) {
373 *pos = i;
374 } else {
375 *pos = (u16)(*pos) | (i << 16);
376 }
377 pos++;
378 break;
379 }
380 entry++;
381 i++;
382 }
383 continue;
384 }
385 break;
386 }
387 item_entity_update(item);
388}
389
390s32 make_item_entity(s32 itemID, f32 x, f32 y, f32 z, s32 itemSpawnMode, s32 pickupDelay, s32 angle, s32 pickupFlagIndex) {
391 s32 i;
392 s32 id;
393 ItemEntity* item;
395 Shadow* shadow;
396
399 }
400
401 if (pickupFlagIndex > 0) {
402 switch (itemSpawnMode) {
418 return -1;
419 }
420 break;
421 }
422 }
423
424 for (i = 0; i < MAX_ITEM_ENTITIES; i++) {
425 if (gCurrentItemEntities[i] == NULL) {
426 break;
427 }
428 }
429
431
432 id = i;
433 gCurrentItemEntities[id] = item = heap_malloc(sizeof(*item));
435 ASSERT(item != NULL);
436
437 item->renderGroup = (itemID & 0xF0000) >> 16;
438 if (item->renderGroup == VIS_GROUP_5) {
439 item->renderGroup = -1;
440 }
441
442 item->spawnType = itemSpawnMode;
444 item->pos.x = x;
445 item->pos.y = y;
446 item->pos.z = z;
447
448 itemID &= 0xFFFF;
449
451 item->flags |= ITEM_ENTITY_FLAG_10;
453 item->pickupMsgFlags = 0;
455 item->itemID = itemID;
456 item->physicsData = NULL;
457 item->pickupDelay = pickupDelay;
458 item->scale = 1.0f;
459 item->spawnAngle = angle;
460 item->shadowIndex = -1;
461 item->nextUpdate = 1;
462 item->lastPos.x = -9999;
463 item->lastPos.y = -9999;
464 item->lastPos.z = -9999;
466
468 if (gItemTable[itemID].typeFlags & ITEM_TYPE_FLAG_ENTITY_FULLSIZE) {
471 }
472
475 }
477
478 switch (item->spawnType) {
481 break;
485 break;
488 break;
493 break;
499 break;
504 break;
509 break;
515 break;
520 break;
526 break;
533 break;
536 break;
542 break;
547 break;
552 break;
557 break;
565 break;
572 break;
579 break;
583 item->scale = 0.8f;
585 break;
591 item->scale = 0.8f;
593 break;
599 item->scale = 0.8f;
601 break;
605 item->scale = 0.8f;
607 break;
612 item->scale = 0.8f;
614 break;
619 break;
626 break;
633 break;
634 }
635
636 switch (item->spawnType) {
642 item->shadowIndex = create_shadow_type(SHADOW_VARYING_CIRCLE, item->pos.x, item->pos.y, item->pos.z);
643 shadow = get_shadow_by_index(item->shadowIndex);
644
646 shadow->flags |= ENTITY_FLAG_HIDDEN;
647 }
648
649 x = item->pos.x;
650 y = item->pos.y + 12.0f;
651 z = item->pos.z;
652 hitDepth = 1000.0f;
654 shadow->pos.x = x;
655 shadow->pos.y = y;
656 shadow->pos.z = z;
658 shadow->rot.y = 0.0f;
660 set_standard_shadow_scale(shadow, hitDepth * 0.5f);
661 break;
662 }
663
664 if (item->pickupDelay != 0) {
665 hide_item_entity(item);
666 }
667
668 item_entity_load(item);
669
670 if (item->itemID == ITEM_COIN) {
673 }
674
675 if (item->itemID == ITEM_STAR_PIECE) {
677 }
678
679 return id;
680}
681
682s32 make_item_entity_nodelay(s32 itemID, f32 x, f32 y, f32 z, s32 itemSpawnMode, s32 pickupVar) {
683 return make_item_entity(itemID, x, y, z, itemSpawnMode, 0, -1, pickupVar);
684}
685
686s32 make_item_entity_delayed(s32 itemID, f32 x, f32 y, f32 z, s32 itemSpawnMode, s32 pickupDelay, s32 pickupVar) {
687 return make_item_entity(itemID, x, y, z, itemSpawnMode, pickupDelay, -1, pickupVar);
688}
689
690s32 make_item_entity_at_player(s32 itemID, s32 category, s32 pickupMsgFlags) {
692 ItemEntity* item;
693 Shadow* shadow;
694 s32 i;
695 f32 posX;
696 f32 posY;
697 f32 posZ;
698 f32 depth;
699 s32 id;
700
701 for (i = 0; i < MAX_ITEM_ENTITIES; i++) {
702 if (gCurrentItemEntities[i] == NULL) {
703 break;
704 }
705 }
707 id = i;
708
709 gCurrentItemEntities[id] = item = heap_malloc(sizeof(*item));
711 ASSERT(item != NULL);
712
713 itemID &= 0xFFFF;
714 item->renderGroup = -1;
716 item->flags |= ITEM_ENTITY_FLAG_10;
718 if (category != ITEM_TYPE_CONSUMABLE) {
720 }
721 item->pickupMsgFlags = pickupMsgFlags;
724 item->boundVar = 0;
725 item->pos.x = playerStatus->pos.x;
726 item->pos.y = playerStatus->pos.y;
727 item->pos.z = playerStatus->pos.z;
728
729 item->shadowIndex = -1;
730 item->nextUpdate = 1;
731 item->lastPos.x = -9999;
732 item->lastPos.y = -9999;
733 item->lastPos.z = -9999;
734 item->scale = 1.0f;
735 item->itemID = itemID;
736 item->physicsData = NULL;
737 item->pickupDelay = 0;
738 item->spawnAngle = 0;
740
741 if (gItemTable[itemID].typeFlags & ITEM_TYPE_FLAG_ENTITY_FULLSIZE) {
743 }
744
747 }
749
750 item->shadowIndex = create_shadow_type(SHADOW_VARYING_CIRCLE, item->pos.x, item->pos.y, item->pos.z);
751 shadow = get_shadow_by_index(item->shadowIndex);
752 shadow->flags |= ENTITY_FLAG_HIDDEN;
753
754 posX = item->pos.x;
755 posY = item->pos.y + 12.0f;
756 posZ = item->pos.z;
757 depth = 1000.0f;
759 shadow->pos.x = posX;
760 shadow->pos.y = posY;
761 shadow->pos.z = posZ;
762
764 shadow->rot.y = 0.0f;
766 set_standard_shadow_scale(shadow, depth * 0.5f);
767
768 item_entity_load(item);
769 if (item->itemID == ITEM_COIN) {
772 }
773 return id;
774}
775
777 s32* args;
778 s32 max, threshold;
779
780 entity->nextUpdate--;
781 if (entity->nextUpdate != 0) {
782 return;
783 }
784
785 do {
786 args = entity->readPos;
787 switch(*args++) {
789 entity->nextUpdate = 60;
790 return;
792 entity->nextUpdate = *args++;
793 *args++;
794 *args++;
796 entity->lookupRasterIndex = *args++;
797 entity->lookupPaletteIndex = *args++;
798 } else {
799 entity->lookupRasterIndex = *args++ >> 16;
800 entity->lookupPaletteIndex = *args++ >> 16;
801 }
802 entity->readPos = args;
803 return;
805 entity->readPos = entity->savedReadPos;
806 break;
808 entity->savedReadPos = args;
809 entity->readPos = args;
810 break;
812 max = *args++;
813 threshold = *args++;
814 if (rand_int(max) < threshold) {
815 entity->readPos = entity->savedReadPos;
816 } else {
817 entity->readPos = args;
818 }
819 break;
820 }
821 } while (TRUE);
822}
823
825 ItemEntity* item;
826 f32 x, y, z, hitDepth;
827 s32 i;
828
830 return;
831 }
832
833 for (i = 0; i < MAX_ITEM_ENTITIES; i++) {
834 item = gCurrentItemEntities[i];
835
836 if (item != NULL && item->flags != 0) {
837 if (item->itemID == ITEM_COIN) {
838 if (rand_int(100) > 90) {
843 }
845 }
846
847 item_entity_update(item);
848
849 switch (item->spawnType) {
852 break;
856 break;
863 break;
866 break;
867 }
868
869 item = gCurrentItemEntities[i];
870 if (item != NULL) {
871 s32 xs, ys, zs;
872
873 switch (item->spawnType) {
879 xs = item->pos.x;
880 ys = item->pos.y;
881 zs = item->pos.z;
882
883 if (xs != item->lastPos.x || ys != item->lastPos.y || zs != item->lastPos.z) {
884 Shadow* shadow = get_shadow_by_index(item->shadowIndex);
885
886 x = item->pos.x;
887 y = item->pos.y + 12.0f;
888 z = item->pos.z;
889 hitDepth = 1000.0f;
891
892 shadow->pos.x = x;
893 shadow->pos.y = y;
894 shadow->pos.z = z;
896 shadow->rot.y = 0.0f;
898 set_standard_shadow_scale(shadow, hitDepth * 0.5f);
899 }
900 break;
901 }
902 item->lastPos.x = item->pos.x;
903 item->lastPos.y = item->pos.y;
904 item->lastPos.z = item->pos.z;
905 }
906 }
907 }
908}
909
910void appendGfx_item_entity(void* data) {
911 ItemEntity* item = (ItemEntity*)data;
914 s32 alpha = 255;
915 s32 yOffset;
916 f32 rot;
917
920 alpha = 255;
921 alpha = (item->alpha * alpha) / 255;
922 }
923 if (item->flags & ITEM_ENTITY_FLAG_HIDING) {
924 u8 r, g, b, a;
925
926 mdl_get_shroud_tint_params(&r, &g, &b, &a);
927 alpha = (alpha * (255 - a)) / 255;
928 }
929 }
930
931 if (!(item->flags & ITEM_ENTITY_FLAG_FULLSIZE)) {
932 yOffset = -2;
933 } else {
934 yOffset = -3;
935 }
936
937 if (item->itemID == ITEM_COIN || item->itemID == ITEM_STAR_POINT || item->itemID == ITEM_HEART) {
938 item->scale = 1.0f;
939 }
940
941 rot = clamp_angle(180.0f - gCameras[gCurrentCamID].curYaw);
942 guTranslateF(mtxTranslate, item->pos.x, item->pos.y + yOffset, item->pos.z);
943 guRotateF(mtxRotY, rot, 0.0f, 1.0f, 0.0f);
944 if (item->flags & ITEM_ENTITY_RESIZABLE) {
945 guScaleF(mtxScale, item->scale, item->scale, item->scale);
947 }
950
952
955
956 if (gSpriteShadingProfile->flags != 0) {
958 } else {
960 }
963
965 if (gSpriteShadingProfile->flags != 0) {
969 } else {
975 gDPSetPrimColor(gMainGfxPos++, 0, 0, 255, 255, 255, alpha);
976 }
977 }
978
979 if (!(item->flags & ITEM_ENTITY_FLAG_FULLSIZE)) {
981 if (gSpriteShadingProfile->flags != 0) {
986 gDPLoadTile(gMainGfxPos++, G_TX_LOADTILE, 0, 0, 0x002E, 0x005C);
990 gDPSetTileSize(gMainGfxPos++, 1, 0x0400, 0x0400, 0x045C, 0x045C);
995 gDPSetTileSize(gMainGfxPos++, 2, 0, 0, 0x00FC, 0);
996
998 func_801491E4(mtxTranslate, 0, 0, 24, 24, alpha);
999 } else {
1000 func_801491E4(mtxTranslate, 0, 0, 24, 24, 255);
1001 }
1002 } else {
1007 gDPLoadTile(gMainGfxPos++, G_TX_LOADTILE, 0, 0, 0x002E, 0x005C);
1011 gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE, 0x0400, 0x0400, 0x045C, 0x045C);
1012 }
1014 } else {
1016 if (gSpriteShadingProfile->flags != 0) {
1021 gDPLoadTile(gMainGfxPos++, G_TX_LOADTILE, 0, 0, 0x003E, 0x007C);
1025 gDPSetTileSize(gMainGfxPos++, 1, 0x0400, 0x0400, 0x047C, 0x047C);
1030 gDPSetTileSize(gMainGfxPos++, 2, 0, 0, 0x00FC, 0);
1032 func_801491E4(mtxTranslate, 0, 0, 32, 32, alpha);
1033 } else {
1034 func_801491E4(mtxTranslate, 0, 0, 32, 32, 255);
1035 }
1036 } else {
1041 gDPLoadTile(gMainGfxPos++, G_TX_LOADTILE, 0, 0, 0x003E, 0x007C);
1045 gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE, 0x0400, 0x0400, 0x047C, 0x047C);
1046 }
1048 }
1051
1052 if (item->itemID == ITEM_COIN) {
1053 draw_coin_sparkles(item);
1054 }
1055}
1056
1058 RenderTask rt;
1059 RenderTask* rtPtr = &rt;
1061 s32 i;
1062
1063 for (i = 0; i < MAX_ITEM_ENTITIES; i++) {
1065
1066 if (item != NULL
1067 && item->flags != 0
1068 && !(item->flags & ITEM_ENTITY_FLAG_HIDDEN)
1069 && (item->flags & (1 << gCurrentCamID))
1070 && !(item->flags & ITEM_ENTITY_FLAG_INVISIBLE)
1071 && (item->renderGroup == -1 || ItemEntityRenderGroup == item->renderGroup))
1072 {
1073 if (!(item->flags & ITEM_ENTITY_FLAG_TRANSPARENT)) {
1074 rtPtr->renderMode = RENDER_MODE_ALPHATEST;
1075 } else {
1077 }
1078
1079 rtPtr->appendGfxArg = item;
1080 rtPtr->appendGfx = appendGfx_item_entity;
1081 rtPtr->dist = 0;
1082
1085 }
1086 }
1087}
1088
1091 return;
1092 }
1093
1094 for (s32 i = 0; i < MAX_ITEM_ENTITIES; i++) {
1096
1097 if (item != NULL && item->flags != 0) {
1098 switch (item->spawnType) {
1101 break;
1105 break;
1112 break;
1113 }
1114 }
1115 }
1116}
1117
1119 s32 i;
1120 s32 offsetY;
1121 f32 rotX;
1122 Mtx sp18;
1123 Matrix4f sp58;
1124 Matrix4f sp98;
1125 Matrix4f spD8;
1126 u8 r1, g1, b1, a1;
1127 s32 alpha;
1128
1129 // needed to move 'i++' to the bottom
1130 for (i = 0; i < MAX_ITEM_ENTITIES;) {
1132 if (item != NULL) {
1133 if ((item->flags != 0)) {
1134 if (!(item->flags & ITEM_ENTITY_FLAG_HIDDEN)) {
1135 if ((item->flags & ITEM_ENTITY_FLAG_INVISIBLE)) {
1136 if (!(item->flags & ITEM_ENTITY_FLAG_FULLSIZE)) {
1137 offsetY = -4;
1138 } else {
1139 offsetY = 0;
1140 }
1141
1142 if (item->itemID == ITEM_COIN || item->itemID == ITEM_STAR_POINT || item->itemID == ITEM_HEART) {
1143 offsetY = 0;
1144 item->scale = 1.0f;
1145 }
1146
1147 rotX = clamp_angle(180.0f - gCameras[gCurrentCamID].curYaw);
1148 guTranslateF(sp58, item->pos.x, -item->pos.y - offsetY, item->pos.z);
1149 guRotateF(sp98, rotX, 0.0f, 1.0f, 0.0f);
1150 if (item->flags & ITEM_ENTITY_RESIZABLE) {
1151 guScaleF(spD8, item->scale, item->scale, item->scale);
1153 }
1155 guMtxF2L(sp58, &sp18);
1158
1159 if (gSpriteShadingProfile->flags != 0) {
1161 } else {
1163 }
1166
1167 alpha = 255;
1169 if (item->flags & ITEM_ENTITY_FLAG_TRANSPARENT) {
1170 alpha = item->alpha * alpha / 255;
1171 }
1172 if (item->flags & ITEM_ENTITY_FLAG_HIDING) {
1174 alpha = alpha * (255 - a1) / 255;
1175 }
1177 if (gSpriteShadingProfile->flags != 0) {
1180 } else {
1184 gDPSetPrimColor(gMainGfxPos++, 0, 0, 255, 255, 255, alpha);
1185 }
1186 }
1187 }
1188
1189 if (!(item->flags & ITEM_ENTITY_FLAG_FULLSIZE)) {
1191 if (gSpriteShadingProfile->flags != 0) {
1195 gDPLoadTile(gMainGfxPos++, G_TX_LOADTILE, 0, 0, 0x002E, 0x005C);
1198 gDPSetTileSize(gMainGfxPos++, 1, 0x0400, 0x0400, 0x045C, 0x045C);
1201 gDPSetTileSize(gMainGfxPos++, 2, 0, 0, 0x00FC, 0);
1203 func_801491E4(sp58, 0, 0, 24, 24, alpha);
1204 } else {
1205 func_801491E4(sp58, 0, 0, 24, 24, 255);
1206 }
1207 } else {
1211 gDPLoadTile(gMainGfxPos++, G_TX_LOADTILE, 0, 0, 0x002E, 0x005C);
1214 gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE, 0x0400, 0x0400, 0x045C, 0x045C);
1215 }
1217 } else {
1219 if (gSpriteShadingProfile->flags != 0) {
1223 gDPLoadTile(gMainGfxPos++, G_TX_LOADTILE, 0, 0, 0x003E, 0x007C);
1226 gDPSetTileSize(gMainGfxPos++, 1, 0x0400, 0x0400, 0x047C, 0x047C);
1229 gDPSetTileSize(gMainGfxPos++, 2, 0, 0, 0x00FC, 0);
1231 func_801491E4(sp58, 0, 0, 32, 32, alpha);
1232 } else {
1233 func_801491E4(sp58, 0, 0, 32, 32, 255);
1234 }
1235 } else {
1239 gDPLoadTile(gMainGfxPos++, G_TX_LOADTILE, 0, 0, 0x003E, 0x007C);
1242 gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE, 0x0400, 0x0400, 0x047C, 0x047C);
1243 }
1245 }
1248 }
1249 }
1250 }
1251 }
1252 i++;
1253 }
1254}
1255
1257 s32 index;
1258
1259 for (index = 0; index < MAX_ITEM_ENTITIES; index++) {
1260 if (gCurrentItemEntities[index] == entity) {
1261 break;
1262 }
1263 }
1264
1265 if (index < MAX_ITEM_ENTITIES) {
1266 if (entity->physicsData != NULL) {
1267 heap_free(entity->physicsData);
1268 }
1269
1270 switch (entity->spawnType) {
1277 delete_shadow(entity->shadowIndex);
1278 break;
1279 }
1280
1283 gCurrentItemEntities[index] = NULL;
1284 }
1285}
1286
1305
1306void func_80133A94(s32 idx, s32 itemID) {
1308
1309 item->itemID = itemID;
1310
1313
1314 if (gItemTable[itemID].typeFlags & ITEM_TYPE_FLAG_ENTITY_FULLSIZE) {
1317 }
1318
1319 item_entity_load(item);
1320}
1321
1327 s32 actionState = playerStatus->actionState;
1329 f32 itemX, itemY, itemZ;
1334 f32 spriteFacingAngle;
1335 f32 hammerY;
1336 f32 dx, dz;
1337 f32 dist;
1338 f32 angle;
1340 // below weird temps required to match
1346
1349 return TRUE;
1350 }
1351
1353 return FALSE;
1354 }
1355
1357 return FALSE;
1358 }
1359
1361 return FALSE;
1362 }
1363
1364 tmpFourteen = 14.0f;
1365 if (isPickingUpItem) {
1366 return FALSE;
1367 }
1368
1370 tmpYTopThreshold = 18.0f;
1371 itemHitboxHeight = 27.0f;
1372
1373 hitDetected = item->flags; // required to match
1374 if (item->flags & ITEM_ENTITY_FLAG_HIDDEN) {
1375 return FALSE;
1376 }
1377
1380 return FALSE;
1381 }
1382
1383 if (partnerStatus->partnerActionState != PARTNER_ACTION_NONE && partnerStatus->actingPartner == PARTNER_BOW) {
1384 return FALSE;
1385 }
1386
1387 if (
1388 (actionState == ACTION_STATE_USE_SPINNING_FLOWER
1389 || actionState == ACTION_STATE_USE_MUNCHLESIA
1390 || actionState == ACTION_STATE_USE_TWEESTER)
1391 && item->itemID != ITEM_COIN)
1392 {
1393 return FALSE;
1394 }
1395
1397 return FALSE;
1398 }
1399
1401 playerX = playerStatus->pos.x;
1402 playerY = playerStatus->pos.y;
1403 playerZ = playerStatus->pos.z;
1404 playerHalfHeight = playerStatus->colliderHeight / 2;
1405 playerHalfRadius = playerStatus->colliderDiameter / 4;
1406
1407 spriteFacingAngle = playerStatus->spriteFacingAngle;
1408 if (spriteFacingAngle < 180.0f) {
1409 spriteFacingAngle = clamp_angle(camera->curYaw - 90.0f);
1410 } else {
1411 spriteFacingAngle = clamp_angle(camera->curYaw + 90.0f);
1412 }
1413
1414 hammerX = playerX;
1415 hammerY = playerY;
1416 hammerZ = playerZ;
1417 if (get_clamped_angle_diff(camera->curYaw, spriteFacingAngle) < 0.0f) {
1418 angle = clamp_angle(camera->curYaw - 90.0f);
1419 if (playerStatus->trueAnimation & SPRITE_ID_BACK_FACING) {
1420 angle = clamp_angle(angle + 30.0f);
1421 }
1422 } else {
1423 angle = clamp_angle(camera->curYaw + 90.0f);
1424 if (playerStatus->trueAnimation & SPRITE_ID_BACK_FACING) {
1425 angle = clamp_angle(angle - 30.0f);
1426 }
1427 }
1428
1429 add_vec2D_polar(&hammerX, &hammerZ, 24.0f, angle);
1430
1431 itemX = item->pos.x;
1432 itemY = item->pos.y;
1433 itemZ = item->pos.z;
1434
1435 itemPickupRadius = 13.5f;
1436
1437 // check for player collision
1438 dx = itemX - playerX;
1439 dz = itemZ - playerZ;
1440 dist = sqrtf(SQ(dx) + SQ(dz));
1441
1442 if (!(playerHalfRadius + itemPickupRadius <= dist) // XZ distance is close enough
1443 && !(itemY + itemHitboxHeight < playerY) // item is not below player
1444 && !(playerY + playerHalfHeight < itemY)) // player is not below item
1445 {
1446 hitDetected = TRUE;
1447 }
1448
1449 // check for hammer collision
1450 if (playerStatus->actionState == ACTION_STATE_HAMMER && (playerStatus->flags & PS_FLAG_HAMMER_CHECK)) {
1451 dx = itemX - hammerX;
1452 dz = itemZ - hammerZ;
1453 dist = sqrtf(SQ(dx) + SQ(dz));
1454
1455 if (!(hammerRadius + itemPickupRadius <= dist) // XZ distance is close enough
1456 && !(itemY + itemHitboxHeight < hammerY) // item is not below hammer
1457 && !(hammerY + hammerHitboxHeight < itemY)) // hammer is not below item
1458 {
1459 hitDetected = TRUE;
1460 }
1461 }
1462
1463 // if an item spawns inside the player, wait a bit before allowing pickup
1464 if (hitDetected) {
1468 return FALSE;
1469 }
1471 }
1472 return TRUE;
1473 }
1474
1475 // no hit detected, skip 'spawned within player' checks in the future
1478 }
1479 return FALSE;
1480}
1481
1483 ItemEntity* item;
1484 f32 dx, dy, dz;
1485 s32 i;
1486
1489 {
1490 return -1;
1491 }
1492
1493 for (i = 0; i < MAX_ITEM_ENTITIES; i++){
1494 item = gCurrentItemEntities[i];
1495
1496 if (item == NULL) {
1497 continue;
1498 }
1499
1500 if (item->flags == 0) {
1501 continue;
1502 }
1503
1505 continue;
1506 }
1507
1508 if (item->spawnType == ITEM_SPAWN_MODE_INVISIBLE) {
1509 continue;
1510 }
1511
1512 if (item->flags & ITEM_ENTITY_FLAG_HIDDEN) {
1513 continue;
1514 }
1515
1517 continue;
1518 }
1519
1520 dx = item->pos.x - x;
1521 dz = item->pos.y - y;
1522 dy = item->pos.z - z;
1523 if (sqrtf(SQ(dx) + SQ(dz) + SQ(dy)) < dist) {
1524 return i;
1525 }
1526 }
1527 return -1;
1528}
1529
1530void set_item_entity_flags(s32 index, s32 flags) {
1531 ItemEntity* item = gCurrentItemEntities[index];
1532
1533 item->flags |= flags;
1534#if !VERSION_JP
1536 D_801565A8 = TRUE;
1537 }
1538#endif
1539}
1540
1541void clear_item_entity_flags(s32 index, s32 flags) {
1542 ItemEntity* item = gCurrentItemEntities[index];
1543
1544 item->flags &= ~flags;
1545}
1546
1552
1555#if VERSION_JP
1556 return isPickingUpItem;
1557#else
1558 b32 ret = D_801565A8 != FALSE;
1559
1560 if (isPickingUpItem) {
1561 ret = TRUE;
1562 }
1563 return ret;
1564#endif
1565}
1566
1567void set_item_entity_position(s32 itemEntityIndex, f32 x, f32 y, f32 z) {
1568 ItemEntity* item = gCurrentItemEntities[itemEntityIndex];
1569
1570 item->pos.x = x;
1571 item->pos.y = y;
1572 item->pos.z = z;
1573}
1574
1578
1582
1587 s32 camID;
1588 s32 hit;
1591 f32 temp;
1592
1593 if (isPickingUpItem) {
1594 return;
1595 }
1596
1597 if (item->pickupDelay != 0) {
1598 item->pickupDelay--;
1599 return;
1600 }
1601
1603 camID = CAM_BATTLE;
1604 } else {
1606 }
1607
1608 switch (item->state) {
1610 reveal_item_entity(item);
1611 physData = heap_malloc(sizeof(*physData));
1612 item->physicsData = physData;
1613 ASSERT(physData != NULL);
1614
1615 if (item->flags & ITEM_ENTITY_FLAG_TOSS_HIGHER) {
1616 physData->verticalVel = 16.0f;
1617 physData->gravity = 2.0f;
1618 } else if (!(item->flags & ITEM_ENTITY_FLAG_TOSS_LOWER)) {
1619 physData->verticalVel = 12.0f;
1620 physData->gravity = 2.0f;
1621 } else {
1622 physData->verticalVel = 14.0f;
1623 physData->gravity = 2.0f;
1624 }
1625
1626 physData->collisionRadius = 24.0f;
1627 physData->constVel = 24.0f;
1628 if (item->spawnAngle < 0) {
1629 if (item_is_consumable(item->itemID) || item_is_key(item->itemID)) {
1630 if (rand_int(10000) < 5000) {
1631 physData->moveAngle = clamp_angle(gCameras[camID].curYaw + 105.0f + rand_int(30) - 15.0f);
1632 } else {
1633 physData->moveAngle = clamp_angle(gCameras[camID].curYaw - 105.0f + rand_int(30) - 15.0f);
1634 }
1635 physData->verticalVel += 4.0f;
1636 } else {
1637 switch (item->itemID) {
1638 case ITEM_HEART:
1639 physData->moveAngle = clamp_angle(gCameras[camID].curYaw + 90.0f + rand_int(120) - 60.0f);
1640 break;
1641 case ITEM_FLOWER_POINT:
1642 physData->moveAngle = clamp_angle(gCameras[camID].curYaw - 90.0f + rand_int(120) + 60.0f);
1643 break;
1644 case ITEM_COIN:
1645 if (rand_int(10000) < 5000) {
1646 physData->moveAngle = clamp_angle(gCameras[camID].curYaw + 90.0f + rand_int(120) - 60.0f);
1647 } else {
1648 physData->moveAngle = clamp_angle(gCameras[camID].curYaw - 90.0f + rand_int(120) - 60.0f);
1649 }
1650 break;
1652 if (rand_int(10000) >= 5000) {
1653 physData->moveAngle = clamp_angle(gCameras[camID].curYaw - 90.0f + rand_int(120) - 60.0f);
1654 } else {
1655 physData->moveAngle = clamp_angle(gCameras[camID].curYaw + 90.0f + rand_int(120) - 60.0f);
1656 }
1657 break;
1658 case ITEM_STAR_POINT:
1660 physData->moveAngle = clamp_angle(gCameras[camID].curYaw - 90.0f + rand_int(120) - 60.0f);
1661 break;
1662 }
1663 if (rand_int(10000) < 5000) {
1664 physData->moveAngle = clamp_angle(gCameras[camID].curYaw + 90.0f + rand_int(60) - 30.0f);
1665 } else {
1666 physData->moveAngle = clamp_angle(gCameras[camID].curYaw - 90.0f + rand_int(60) - 30.0f);
1667 }
1668 break;
1669 case ITEM_HEART_POINT:
1670 physData->moveAngle = clamp_angle(gCameras[camID].curYaw + 90.0f + rand_int(120) - 60.0f);
1671 break;
1672 case ITEM_STAR_PIECE:
1673 if (rand_int(10000) < 5000) {
1674 physData->moveAngle = clamp_angle(gCameras[camID].curYaw + 90.0f + rand_int(60) - 30.0f);
1675 } else {
1676 physData->moveAngle = clamp_angle(gCameras[camID].curYaw - 90.0f + rand_int(60) - 30.0f);
1677 }
1678 break;
1679 case ITEM_HEART_PIECE:
1680 physData->moveAngle = clamp_angle(gCameras[camID].curYaw + 90.0f + rand_int(120) - 60.0f);
1681 break;
1682 default:
1683 physData->moveAngle = 0.0f;
1684 break;
1685 }
1686 }
1687
1688 if (!(item->flags & ITEM_ENTITY_FLAG_TOSS_HIGHER)) {
1689 temp = rand_int(2000);
1690 temp = (temp / 1000.0f) + 1.5;
1691 theta = DEG_TO_RAD(physData->moveAngle);
1694 physData->velX = temp * sinAngle;
1695 physData->velZ = -temp * cosAngle;
1696 } else {
1697 temp = rand_int(2000);
1698 temp = (temp / 1000.0f) + 2.0;
1699 theta = DEG_TO_RAD(physData->moveAngle);
1702 physData->velX = temp * sinAngle;
1703 physData->velZ = -temp * cosAngle;
1704 }
1705 } else {
1706 physData->moveAngle = clamp_angle(item->spawnAngle);
1708 temp = 1.5f + (0.6 * (item->spawnAngle / 360));
1709 } else {
1710 temp = 2.1f;
1711 }
1712 theta = DEG_TO_RAD(physData->moveAngle);
1715 physData->velX = temp * sinAngle;
1716 physData->velZ = -temp * cosAngle;
1717 }
1718
1720 physData->timeLeft = 180;
1721 physData->useSimplePhysics = FALSE;
1722 } else {
1723 if (!(item->flags & ITEM_ENTITY_FLAG_400000)) {
1724 physData->timeLeft = 17;
1725 } else {
1726 physData->timeLeft = 20;
1727 }
1728 physData->useSimplePhysics = FALSE;
1729 physData->verticalVel = 15.0f;
1730 physData->gravity = 1.6f;
1731 }
1732
1734 physData->timeLeft = 60;
1735 physData->useSimplePhysics = FALSE;
1736 physData->velX = 0.0f;
1737 physData->velZ = 0.0f;
1738 }
1739
1741 physData->verticalVel = 0.0f;
1742 physData->velX = 0.0f;
1743 physData->velZ = 0.0f;
1744 physData->useSimplePhysics = TRUE;
1745 }
1746
1748 physData->verticalVel = 0.0f;
1749 physData->velX = 0.0f;
1750 physData->velZ = 0.0f;
1751 physData->useSimplePhysics = TRUE;
1752 }
1753
1756 }
1758 break;
1759
1761 physData = item->physicsData;
1762
1763 // test for pickup
1766 && physData->useSimplePhysics
1768 ) {
1770 break;
1771 }
1772
1773 // check for expiration
1777 ) {
1778 physData->timeLeft--;
1779 if (physData->timeLeft < 0) {
1781 break;
1782 }
1783 }
1784
1785 // apply gravity
1786 if (!(item->flags & ITEM_ENTITY_FLAG_NO_GRAVITY)) {
1787 if (!(item->flags & ITEM_ENTITY_FLAG_CANT_COLLECT)) {
1788 physData->verticalVel -= physData->gravity;
1789 if (physData->verticalVel < -16.0) {
1790 physData->verticalVel = -16.0f;
1791 }
1792 item->pos.y += physData->verticalVel;
1793 item->pos.x += physData->velX;
1794 item->pos.z += physData->velZ;
1795 }
1796 }
1797
1798 // handle auto-collection from multi-coin bricks
1800 && physData->verticalVel <= 0.0f
1801 ) {
1803 break;
1804 }
1805
1806 // if the item has upward velocity, try moving it up
1810 && physData->verticalVel > 0.0f
1811 ) {
1812 temp = physData->constVel;
1813 outX = item->pos.x;
1814 outY = item->pos.y;
1815 outZ = item->pos.z;
1816 outDepth = temp + physData->verticalVel;
1817
1818 if (!physData->useSimplePhysics) {
1820 } else {
1822 }
1823
1824 if (hit && outDepth < temp) {
1825 item->pos.y = outY - temp;
1826 physData->verticalVel = 0.0f;
1827 }
1828 }
1829
1830 // if the item has non-zero lateral velocity, try moving it laterally
1834 && (physData->velX != 0.0f || physData->velZ != 0.0f)
1835 ) {
1836 outX = item->pos.x;
1837 outY = item->pos.y;
1838 outZ = item->pos.z;
1839
1840 if (!physData->useSimplePhysics) {
1841 hit = npc_test_move_complex_with_slipping(COLLIDER_FLAG_IGNORE_NPC, &outX, &outY, &outZ, 0.0f, physData->moveAngle, physData->constVel, physData->collisionRadius);
1842 } else {
1843 hit = npc_test_move_simple_with_slipping(COLLIDER_FLAG_IGNORE_NPC, &outX, &outY, &outZ, 0.0f, physData->moveAngle, physData->constVel, physData->collisionRadius);
1844 }
1845
1846 if (hit) {
1847 // if a wall is hit, bounce back
1848 item->pos.x = outX;
1849 item->pos.y = outY;
1850 item->pos.z = outZ;
1851 physData->moveAngle = clamp_angle(physData->moveAngle + 180.0f);
1852 theta = DEG_TO_RAD(physData->moveAngle);
1855 physData->velX = sinAngle * 2.0;
1856 physData->velZ = cosAngle * -2.0;
1857 }
1858 }
1859
1860 // if the item has downward velocity, try moving it down
1861 if (!(item->flags & ITEM_ENTITY_FLAG_NO_MOTION)
1863 && physData->verticalVel <= 0.0
1864 ) {
1865 physData->useSimplePhysics = TRUE;
1867 outX = item->pos.x;
1868 outY = (item->pos.y - physData->verticalVel) + 12.0f;
1869 outZ = item->pos.z;
1870 outDepth = -physData->verticalVel + 12.0f;
1871 if (!physData->useSimplePhysics) {
1873 } else {
1875 }
1876 } else {
1877 outX = item->pos.x;
1878 outY = (item->pos.y - physData->verticalVel) + 12.0f;
1879 outZ = item->pos.z;
1880 outDepth = -physData->verticalVel + 12.0f;
1881 if (outY < outDepth + 0.0f) {
1882 outY = 0.0f;
1883 hit = TRUE;
1884 } else {
1885 hit = FALSE;
1886 }
1887 }
1888
1889 // handle bounce
1890 if (hit) {
1891 item->pos.y = outY;
1892 physData->verticalVel = -physData->verticalVel / 1.25;
1893 if (physData->verticalVel < 3.0) {
1894 physData->verticalVel = 0.0f;
1895 physData->velX = 0.0f;
1896 physData->velZ = 0.0f;
1898 } else {
1899 if (item_is_badge(item->itemID)) {
1901 } else if (item_is_consumable(item->itemID) || item_is_key(item->itemID)) {
1903 } else {
1904 switch (item->itemID) {
1905 case ITEM_HEART:
1907 break;
1908 case ITEM_COIN:
1910 break;
1913 break;
1914 case ITEM_HEART_PIECE:
1916 break;
1917 case ITEM_STAR_POINT:
1919 break;
1920 case ITEM_HEART_POINT:
1922 break;
1923 case ITEM_STAR_PIECE:
1925 break;
1926 case ITEM_FLOWER_POINT:
1928 break;
1929 }
1930 }
1931 }
1932 }
1933 }
1934
1935 if (item->pos.y < -2000.0f) {
1937 }
1938 break;
1939 }
1940
1941 if (item->state == ITEM_PHYSICS_STATE_DEAD) {
1943 }
1944
1945 if (item->state == ITEM_PHYSICS_STATE_TOUCH) {
1948 }
1949
1950 fx_small_gold_sparkle(0, item->pos.x, item->pos.y + 16.0f, item->pos.z, 1.0f, 0);
1951
1952 if (item_is_consumable(item->itemID) || item_is_key(item->itemID) || item_is_badge(item->itemID)) {
1954 } else if (item->itemID == ITEM_STAR_PIECE) {
1955 playerData->starPiecesCollected++;
1957 } else {
1959 item->itemID = -1;
1960 }
1961
1962 switch (item->itemID) {
1963 case ITEM_HEART:
1964 if (playerData->curHP < playerData->curMaxHP) {
1965 fx_recover(0, playerStatus->pos.x, playerStatus->pos.y + playerStatus->colliderHeight, playerStatus->pos.z, 1);
1967 }
1968 playerData->curHP++;
1969 if (playerData->curHP > playerData->curMaxHP) {
1970 playerData->curHP = playerData->curMaxHP;
1971 }
1973 fx_sparkles(4, playerStatus->pos.x, playerStatus->pos.y + playerStatus->colliderHeight, playerStatus->pos.z, 30.0f);
1974 break;
1975 case ITEM_FLOWER_POINT:
1976 if (playerData->curFP < playerData->curMaxFP) {
1977 fx_recover(1, playerStatus->pos.x, playerStatus->pos.y + playerStatus->colliderHeight, playerStatus->pos.z, 1);
1979 }
1980 playerData->curFP++;
1981 if (playerData->curFP > playerData->curMaxFP) {
1982 playerData->curFP = playerData->curMaxFP;
1983 }
1985 fx_sparkles(4, playerStatus->pos.x, playerStatus->pos.y + playerStatus->colliderHeight, playerStatus->pos.z, 30.0f);
1986 break;
1987 case ITEM_COIN:
1988 playerData->coins++;
1989 if (playerData->coins > 999) {
1990 playerData->coins = 999;
1991 }
1993 playerData->totalCoinsEarned++;
1994 if (playerData->totalCoinsEarned > 99999) {
1995 playerData->totalCoinsEarned = 99999;
1996 }
1997 break;
2000 break;
2001 case ITEM_STAR_POINT:
2002 playerData->starPoints++;
2003 if (playerData->starPoints > 100) {
2004 playerData->starPoints = 100;
2005 }
2007 break;
2008 case ITEM_HEART_POINT:
2009 playerData->curHP = playerData->curMaxHP;
2010 playerData->curFP = playerData->curMaxFP;
2012 break;
2013 }
2014#if !VERSION_JP
2015 D_801565A8 = FALSE;
2016#endif
2019 }
2020 }
2021
2022 // items in this unused state are managed by a script
2023 // when the script is done executing, destroy these items
2024 if (item->state == ITEM_PHYSICS_STATE_04) {
2026#if !VERSION_JP
2027 D_801565A8 = FALSE;
2028#endif
2031 }
2032 }
2033
2034 if (item->state == ITEM_PHYSICS_STATE_PICKUP) {
2038#if !VERSION_JP
2039 D_801565A8 = FALSE;
2040#endif
2042 }
2043}
2044
2046 if (item->state == ITEM_PHYSICS_STATE_ALIVE) {
2047 ItemEntityPhysicsData* physicsData = item->physicsData;
2048 s32 flag = (item->flags & ITEM_ENTITY_FLAG_ODD_SPAWN_PARITY) > 0;
2049
2052 if (physicsData->timeLeft < 60) {
2053 if ((item->flags & ITEM_ENTITY_FLAG_CANT_COLLECT) || ((gGameStatusPtr->frameCounter + flag) & 1)) {
2055 } else {
2057 }
2058 }
2059 } else {
2060 if (physicsData->timeLeft < 10) {
2061 item->alpha = physicsData->timeLeft * 28;
2063 }
2064 }
2065 }
2066 }
2067}
2068
2070 if (item->state == ITEM_PHYSICS_STATE_INIT) {
2071 if (test_item_player_collision(item)) {
2072 // change spawn type to initiate pickup
2076#if !VERSION_JP
2077 D_801565A8 = FALSE;
2078#endif
2080 }
2081 }
2082}
2083
2086
2089
2092
2098 s32 numEntries;
2099 s32 msgID;
2100 s32 i;
2101
2102 if (item->state == ITEM_PICKUP_STATE_INIT) {
2104 if (!(item->flags & ITEM_ENTITY_FLAG_2000000)) {
2109 }
2110 hide_item_entity(item);
2112 }
2113
2114 switch (item->state) {
2116 if (!(item->flags & ITEM_ENTITY_FLAG_2000000)) {
2117 // list of action state conditions which allow item pickup
2118 // remain in this state (via break) until one of these is TRUE
2119 s32 actionState = playerStatus->actionState;
2120 if (!(
2122 || ((playerStatus->timeInAir != 0 || actionState == ACTION_STATE_JUMP || actionState == ACTION_STATE_FALLING)
2123 && playerStatus->enableCollisionOverlapsCheck
2124 && playerStatus->inputDisabledCount != 0)
2125 || actionState == ACTION_STATE_LAUNCH
2126 || actionState == ACTION_STATE_RIDE
2127 || actionState == ACTION_STATE_IDLE
2128 || (actionState == ACTION_STATE_USE_SPINNING_FLOWER && playerStatus->actionSubstate == 1)
2129 )) {
2130 break;
2131 }
2132 }
2133
2137 } else if (gItemTable[item->itemID].typeFlags & ITEM_TYPE_FLAG_KEY) {
2139 } else if (item->itemID == ITEM_COIN) {
2140 sfx_play_sound_at_position(SOUND_COIN_PICKUP, 0, item->pos.x, item->pos.y, item->pos.z);
2141 } else {
2143 }
2144 }
2145
2150
2151 if (!(item->flags & ITEM_ENTITY_FLAG_2000000)) {
2153 for (i = 0; i < ARRAY_COUNT(playerData->invItems); i++) {
2154 if (playerData->invItems[i] == ITEM_NONE) {
2155 break;
2156 }
2157 }
2158
2159 if (i < ARRAY_COUNT(playerData->invItems)) {
2160 playerData->invItems[i] = item->itemID;
2161 } else {
2163 goto block_47; // TODO required to match
2164 }
2165 }
2166
2168 for (i = 0; i < ARRAY_COUNT(playerData->keyItems); i++) {
2169 if (playerData->keyItems[i] == ITEM_NONE) {
2170 break;
2171 }
2172 }
2173
2174 if (i < ARRAY_COUNT(playerData->keyItems)) {
2175 playerData->keyItems[i] = item->itemID;
2176 } else {
2178 goto block_47; // TODO required to match
2179 }
2180 }
2181
2183 for (i = 0; i < ARRAY_COUNT(playerData->badges); i++) {
2184 if (playerData->badges[i] == ITEM_NONE) {
2185 break;
2186 }
2187 }
2188
2189 if (i < ARRAY_COUNT(playerData->badges)) {
2190 playerData->badges[i] = item->itemID;
2191 } else {
2193 goto block_47; // TODO required to match
2194 }
2195 }
2196
2197 if (item->itemID == ITEM_STAR_PIECE) {
2198 playerData->starPieces++;
2199 if (playerData->starPieces > MAX_STAR_PIECES) {
2200 playerData->starPieces = MAX_STAR_PIECES;
2201 }
2202 }
2203
2204 if (item->itemID == ITEM_LUCKY_STAR) {
2205 playerData->hasActionCommands = TRUE;
2206 }
2207
2208 if (item->itemID >= ITEM_HAMMER && item->itemID <= ITEM_ULTRA_HAMMER) {
2209 playerData->hammerLevel = item->itemID - ITEM_HAMMER;
2210 }
2211
2212 if (item->itemID >= ITEM_BOOTS && item->itemID <= ITEM_ULTRA_BOOTS) {
2213 playerData->bootsLevel = item->itemID - ITEM_BOOTS;
2214 }
2215 }
2216
2217block_47: // TODO required to match
2220 }
2222 func_801363A0(item);
2226 }
2229 break;
2230
2232 if (ItemPickupStateDelay == 9) {
2235 || (item->itemID == ITEM_STAR_PIECE)
2237 || (item->flags & ITEM_ENTITY_FLAG_4000000)
2239 ) {
2240 item->pos.x = playerStatus->pos.x;
2241 item->pos.y = playerStatus->pos.y + playerStatus->colliderHeight;
2242 item->pos.z = playerStatus->pos.z;
2244 }
2245
2248 1,
2249 item->pos.x,
2250 item->pos.y + 8.0f,
2251 item->pos.z,
2252 1.0f,
2254 );
2255 }
2256 }
2257
2258 if (ItemPickupStateDelay < 9) {
2261 || (item->itemID == ITEM_STAR_PIECE)
2263 || (item->flags & ITEM_ENTITY_FLAG_4000000)
2265 ) {
2267 }
2268 }
2269
2270 if (ItemPickupStateDelay == 7) {
2273 || (item->itemID == ITEM_STAR_PIECE)
2275 || (item->flags & ITEM_ENTITY_FLAG_4000000)
2277 ) {
2279 }
2280 }
2281
2282 if (ItemPickupStateDelay == 6) {
2283 func_801363A0(item);
2285 if (item->itemID != ITEM_STAR_PIECE && item->itemID != ITEM_COIN) {
2287 }
2288 }
2289
2290 if (ItemPickupStateDelay != 0) {
2292 break;
2293 }
2294
2295 // wait for input
2298 {
2299 hide_item_entity(item);
2302 && !(playerStatus->animFlags & PA_FLAG_NO_OOB_RESPAWN)
2303 ) {
2305 }
2306
2309 }
2313 }
2314 break;
2318 {
2320 }
2321 break;
2325 {
2328 break;
2329 }
2330
2334 break;
2335 }
2337 break;
2339 msgID = MSG_NONE;
2342 }
2343 if (item->itemID == ITEM_STAR_PIECE) {
2345 }
2349 break;
2351 if (GotItemTutorialClosed == TRUE) {
2353 } else {
2354 break;
2355 }
2357 if (!(item->flags & ITEM_ENTITY_FLAG_2000000)) {
2362 }
2368 break;
2370 numEntries = 0;
2372 // add new item to menu
2373 itemData = &gItemTable[item->itemID];
2374 menu->ptrIcon[numEntries] = gItemHudScripts[itemData->hudElemID].enabled;
2375 menu->userIndex[numEntries] = item->itemID;
2376 menu->enabled[numEntries] = TRUE;
2377 menu->nameMsg[numEntries] = itemData->nameMsg;
2378 menu->descMsg[numEntries] = itemData->shortDescMsg;
2379 numEntries++;
2380 // add player inventory to menu
2381 for (i = 0; i < ARRAY_COUNT(playerData->invItems); i++) {
2382 if (playerData->invItems[i] != ITEM_NONE) {
2383 itemData = &gItemTable[playerData->invItems[i]];
2384 menu->ptrIcon[numEntries] = gItemHudScripts[itemData->hudElemID].enabled;
2385 menu->userIndex[numEntries] = playerData->invItems[i];
2386 menu->enabled[numEntries] = TRUE;
2387 menu->nameMsg[numEntries] = itemData->nameMsg;
2388 menu->descMsg[numEntries] = itemData->shortDescMsg;
2389 numEntries++;
2390 }
2391 }
2392 menu->popupType = POPUP_MENU_THROW_AWAY_ITEM;
2393 menu->numEntries = numEntries;
2394 menu->initialPos = 0;
2400 }
2401 break;
2406 {
2408 }
2409 break;
2411 if (ItemPickupStateDelay == 0) {
2412 ThrowAwayMenuIdx = menu->result;
2413 if (ThrowAwayMenuIdx == 0) {
2414 break;
2415 }
2417 }
2419 if (ItemPickupStateDelay >= 15) {
2421 if (ThrowAwayMenuIdx == 255) {
2422 ThrowAwayMenuIdx = 1;
2423 }
2424 ThrowAwayItemID = menu->userIndex[ThrowAwayMenuIdx - 1];
2426
2430 playerStatus->pos.x,
2431 playerStatus->pos.y + playerStatus->colliderHeight,
2432 playerStatus->pos.z, 3, 0, 0
2433 )
2434 )->renderGroup = -1;
2435
2436 if (ThrowAwayMenuIdx >= 2) {
2437 playerData->invItems[ThrowAwayMenuIdx - 2] = ITEM_NONE;
2439 add_item(item->itemID);
2440 }
2442 func_801363A0(item);
2446 }
2447 break;
2452 }
2453 break;
2458 {
2460 }
2461 break;
2473 break;
2474 }
2475}
2476
2477#if VERSION_JP
2478#define WD_VAR1 44
2479#define WD_VAR2 25
2480#define WD_VAR3 20
2481#define X_VAR1 32
2482#define HT_VAR1 40
2483#define WD_VAR4 242
2484#else
2485#define WD_VAR1 54
2486#define WD_VAR2 30
2487#define WD_VAR3 30
2488#define X_VAR1 20
2489#define HT_VAR1 height
2490#define WD_VAR4 280
2491#endif
2492
2495 s32 itemMsg;
2496 s32 width;
2497 s32 posX;
2498 s32 offsetY;
2499 s32 posY;
2500 s32 height;
2501 s32 v1;
2502
2503 switch (item->state) {
2506 if (!(itemData->typeFlags & ITEM_TYPE_FLAG_BADGE)) {
2509 } else {
2511 }
2512
2515 }
2518 }
2521 }
2522
2523 set_message_text_var(itemData->nameMsg, 0);
2524
2526 item->itemID != ITEM_STAR_PIECE &&
2529 width = get_msg_width(itemMsg, 0) + WD_VAR1;
2530 } else {
2531 width = get_msg_width(itemMsg, 0) + WD_VAR2;
2532 }
2533 posX = 160 - width / 2;
2534 posY = 76;
2535 } else {
2538 } else {
2540 }
2541
2544 }
2547 }
2550 }
2551
2552 set_message_text_var(itemData->nameMsg, 0);
2553 width = get_msg_width(itemMsg, 0) + WD_VAR3;
2554 posX = 160 - width / 2;
2555 posY = 76;
2556 }
2557#if !VERSION_JP
2559#endif
2561 offsetY = 28;
2562 } else {
2563 offsetY = 0;
2564 }
2568 && item->itemID != ITEM_STAR_PIECE)
2569 ) {
2570 set_window_properties(WIN_PICKUP_HEADER, posX, posY - 24 + offsetY, width,
2573 set_window_properties(WIN_PICKUP_HEADER, posX, posY - 24 + offsetY, width,
2575 } else {
2576 set_window_properties(WIN_PICKUP_HEADER, posX, posY - 24 + offsetY, width,
2578 }
2579 if (item->itemID != ITEM_STAR_PIECE && item->itemID != ITEM_COIN) {
2580 posX = X_VAR1;
2582 }
2584 width = get_msg_width(MSG_Menus_0060, 0) + 24;
2585 posX = 160 - width / 2;
2587 }
2588 break;
2590 set_message_text_var(itemData->nameMsg, 0);
2591#if VERSION_JP
2592 width = get_msg_width(gItemTable[ThrowAwayItemID].nameMsg, 0) + 104;
2593#else
2594 width = get_msg_width(MSG_Menus_005F, 0) + 54;
2595#endif
2596 posX = 160 - width / 2;
2598 break;
2599 }
2600}
2601
2602#if VERSION_JP
2603#define X_PICKUP_ITEM_1 12
2604#define X_PICKUP_ITEM_2 36
2605#define X_PICKUP_THREW 36
2606#define Y_PICKUP_ITEM_1 12
2607#define Y_PICKUP_ITEM_2 12
2608#define Y_PICKUP_THREW 12
2609#else
2610#define X_PICKUP_ITEM_1 15
2611#define X_PICKUP_ITEM_2 40
2612#define X_PICKUP_THREW 40
2613#define Y_PICKUP_ITEM_1 offsetY
2614#define Y_PICKUP_ITEM_2 offsetY
2615#define Y_PICKUP_THREW 4
2616#endif
2617
2618void draw_content_pickup_item_header(ItemEntity* item, s32 posX, s32 posY) {
2620 s32 itemMsg;
2621 s32 offsetY;
2622
2623 switch (item->state) {
2628 if (!(itemData->typeFlags & ITEM_TYPE_FLAG_BADGE)) {
2631 } else {
2633 }
2634 set_message_text_var(itemData->nameMsg, 0);
2635
2638 }
2641 }
2644 }
2645 } else {
2648 } else {
2650 }
2651
2654 }
2657 }
2660 }
2661
2662 set_message_text_var(itemData->nameMsg, 0);
2663 }
2664
2665#if !VERSION_JP
2667#endif
2668
2671 || item->itemID == ITEM_STAR_PIECE
2674 ) {
2675 draw_msg(itemMsg, posX + X_PICKUP_ITEM_1, posY + Y_PICKUP_ITEM_1, 255, MSG_PAL_2F, 0);
2676 } else {
2677 draw_msg(itemMsg, posX + X_PICKUP_ITEM_2, posY + Y_PICKUP_ITEM_2, 255, MSG_PAL_2F, 0);
2679 hud_element_set_render_pos(ItemPickupIconHID, posX + 20, posY + 20);
2681 }
2682 }
2683 break;
2688 hud_element_set_render_pos(ItemPickupIconHID, posX + 20, posY + 20);
2690 break;
2691 }
2692}
2693
2694void draw_content_cant_carry_more(ItemEntity* item, s32 x, s32 y) {
2695 draw_msg(MSG_Menus_0060, x + 12, y + 4, 255, MSG_PAL_34, 0);
2696}
2697
2698void draw_content_pickup_item_desc(ItemEntity* item, s32 posX, s32 posY) {
2700 s32 itemMsg;
2701
2702 switch (item->state) {
2708 draw_msg(itemMsg, posX + 8, posY, 255, MSG_PAL_STANDARD, 0);
2709 break;
2710 }
2711}
void create_standard_popup_menu(PopupMenu *popup)
BSS s32 PopupMenu_SelectedIndex
IconHudScriptPair gItemHudScripts[]
s32 * sparkleSavedPos
u32 pressedButtons[4]
Mtx matrixStack[0x200]
#define PAL_PTR
#define IMG_PTR
s32 HudElemID
s32 b32
struct ItemEntityPhysicsData * physicsData
f32 Matrix4f[4][4]
Vec3f playerGroundTraceAngles
s8 flags
Definition demo_api.c:15
Vec3s pos
Definition demo_api.c:17
#define guRotateF
#define get_msg_width
#define sfx_play_sound_at_position
#define queue_render_task
#define sqrtf
#define npc_raycast_down_sides
#define guMtxF2L
#define guTranslateF
#define guMtxCatF
#define rand_int
#define clamp_angle
#define draw_msg
#define mdl_get_shroud_tint_params
#define guScaleF
EffectInstanceDataPtr data
Definition effects.h:2605
struct GotItemOutlineFXData * gotItemOutline
Definition effects.h:2491
#define ASSERT(condition)
@ ITEM_PICKUP_STATE_HIDE_TOO_MANY
Definition enums.h:2752
@ ITEM_PICKUP_STATE_AWAIT_TUTORIAL
Definition enums.h:2749
@ ITEM_PICKUP_STATE_SHOW_THREW_AWAY
Definition enums.h:2754
@ ITEM_PICKUP_STATE_SHOW_GOT_ITEM
Definition enums.h:2743
@ ITEM_PICKUP_STATE_HIDE_THREW_AWAY
Definition enums.h:2755
@ ITEM_PICKUP_STATE_CHECK_TUTORIALS
Definition enums.h:2747
@ ITEM_PICKUP_STATE_SHOW_TOO_MANY
Definition enums.h:2751
@ ITEM_PICKUP_STATE_THROW_AWAY_DONE
Definition enums.h:2756
@ ITEM_PICKUP_STATE_AWAIT_THROW_AWAY
Definition enums.h:2753
@ ITEM_PICKUP_STATE_INIT
Definition enums.h:2741
@ ITEM_PICKUP_STATE_HIDE_GOT_ITEM
Definition enums.h:2744
@ ITEM_PICKUP_STATE_DONE
Definition enums.h:2745
@ ITEM_PICKUP_STATE_SHOW_TUTORIAL
Definition enums.h:2748
@ ITEM_PICKUP_STATE_AWAIT_VALID_STATE
Definition enums.h:2742
@ BUTTON_A
Definition enums.h:2790
@ BUTTON_STICK_UP
Definition enums.h:2791
@ BUTTON_STICK_DOWN
Definition enums.h:2792
@ BUTTON_STICK_LEFT
Definition enums.h:2793
@ BUTTON_STICK_RIGHT
Definition enums.h:2794
@ BUTTON_B
Definition enums.h:2789
@ ITEM_ENTITY_FLAG_DONE_FALLING
Definition enums.h:2723
@ ITEM_ENTITY_FLAG_1000
Definition enums.h:2706
@ ITEM_ENTITY_FLAG_CAM1
Definition enums.h:2696
@ ITEM_ENTITY_FLAG_NO_MOTION
Definition enums.h:2722
@ ITEM_ENTITY_FLAG_800000
Definition enums.h:2717
@ ITEM_ENTITY_FLAG_CAM0
Definition enums.h:2695
@ ITEM_ENTITY_FLAG_10
Definition enums.h:2699
@ ITEM_ENTITY_FLAG_8000
Definition enums.h:2709
@ ITEM_ENTITY_RESIZABLE
Definition enums.h:2708
@ ITEM_ENTITY_FLAG_CANT_COLLECT
Definition enums.h:2715
@ ITEM_ENTITY_FLAG_NO_GRAVITY
Definition enums.h:2707
@ ITEM_ENTITY_FLAG_SAVE_ON_RECEIPT
Definition enums.h:2725
@ ITEM_ENTITY_FLAG_HIDING
Definition enums.h:2721
@ ITEM_ENTITY_FLAG_ODD_SPAWN_PARITY
Definition enums.h:2711
@ ITEM_ENTITY_FLAG_4000000
Definition enums.h:2720
@ ITEM_ENTITY_FLAG_ANGLE_RELATIVE_VELOCITY
Definition enums.h:2724
@ ITEM_ENTITY_FLAG_FULLSIZE
Definition enums.h:2712
@ ITEM_ENTITY_FLAG_HIDDEN
Definition enums.h:2700
@ ITEM_ENTITY_FLAG_CAM2
Definition enums.h:2697
@ ITEM_ENTITY_FLAG_400000
Definition enums.h:2716
@ ITEM_ENTITY_FLAG_TRANSPARENT
Definition enums.h:2713
@ ITEM_ENTITY_FLAG_SAVE_ON_TOUCH
Definition enums.h:2704
@ ITEM_ENTITY_FLAG_TOSS_LOWER
Definition enums.h:2710
@ ITEM_ENTITY_FLAG_JUST_SPAWNED
Definition enums.h:2701
@ ITEM_ENTITY_FLAG_TOSS_HIGHER
Definition enums.h:2718
@ ITEM_ENTITY_FLAG_SAVE_ON_INIT
Definition enums.h:2705
@ ITEM_ENTITY_FLAG_2000000
Definition enums.h:2719
@ ITEM_ENTITY_FLAG_NEVER_VANISH
Definition enums.h:2703
@ ITEM_ENTITY_FLAG_AUTO_COLLECT
Definition enums.h:2702
@ ITEM_ENTITY_FLAG_INVISIBLE
Definition enums.h:2714
@ POPUP_MENU_THROW_AWAY_ITEM
Definition enums.h:3133
@ WINDOW_PRIORITY_0
Definition enums.h:3182
@ MSG_PAL_34
Definition enums.h:5456
@ MSG_PAL_STANDARD
Definition enums.h:5414
@ MSG_PAL_2F
Definition enums.h:5451
@ ITEM_PHYSICS_STATE_TOUCH
Definition enums.h:2733
@ ITEM_PHYSICS_STATE_INIT
Definition enums.h:2730
@ ITEM_PHYSICS_STATE_DEAD
Definition enums.h:2732
@ ITEM_PHYSICS_STATE_PICKUP
Definition enums.h:2735
@ ITEM_PHYSICS_STATE_04
Definition enums.h:2734
@ ITEM_PHYSICS_STATE_ALIVE
Definition enums.h:2731
@ ITEM_SPAWN_AT_PLAYER
Definition enums.h:2319
@ ITEM_SPAWN_MODE_FALL
Definition enums.h:2305
@ ITEM_SPAWN_MODE_TOSS_SPAWN_ALWAYS_SMALL
Definition enums.h:2317
@ ITEM_SPAWN_MODE_FIXED_NEVER_VANISH
Definition enums.h:2308
@ ITEM_SPAWN_MODE_FIXED_SPAWN_ALWAYS
Definition enums.h:2307
@ ITEM_SPAWN_MODE_FIXED
Definition enums.h:2309
@ ITEM_SPAWN_MODE_TOSS_FADE3
Definition enums.h:2316
@ ITEM_SPAWN_MODE_DECORATION
Definition enums.h:2292
@ ITEM_SPAWN_MODE_INVISIBLE
Definition enums.h:2293
@ ITEM_SPAWN_MODE_ITEM_BLOCK_ITEM
Definition enums.h:2301
@ ITEM_SPAWN_MODE_FALL_SPAWN_ONCE
Definition enums.h:2306
@ ITEM_SPAWN_MODE_FIXED_SPAWN_ALWAYS_NEVER_VANISH
Definition enums.h:2310
@ ITEM_SPAWN_MODE_TOSS_FADE1
Definition enums.h:2314
@ ITEM_SPAWN_MODE_TOSS_SPAWN_ONCE
Definition enums.h:2298
@ ITEM_SPAWN_MODE_ITEM_BLOCK_SPAWN_ALWAYS
Definition enums.h:2311
@ ITEM_SPAWN_MODE_BATTLE_REWARD
Definition enums.h:2295
@ ITEM_SPAWN_MODE_TOSS_SPAWN_ALWAYS
Definition enums.h:2294
@ ITEM_SPAWN_MODE_TOSS_SPAWN_ALWAYS_NEVER_VANISH
Definition enums.h:2300
@ ITEM_SPAWN_MODE_TOSS
Definition enums.h:2297
@ ITEM_SPAWN_MODE_TOSS_SPAWN_ONCE_NEVER_VANISH
Definition enums.h:2299
@ ITEM_SPAWN_MODE_TOSS_NEVER_VANISH
Definition enums.h:2296
@ ITEM_SPAWN_MODE_TOSS_FADE2
Definition enums.h:2315
@ ITEM_SPAWN_MODE_TOSS_HIGHER_NEVER_VANISH
Definition enums.h:2313
@ ITEM_SPAWN_MODE_FALL_NEVER_VANISH
Definition enums.h:2304
@ ITEM_SPAWN_MODE_UNKNOWN_1B
Definition enums.h:2318
@ ITEM_SPAWN_MODE_FALL_SPAWN_ALWAYS
Definition enums.h:2303
@ ITEM_SPAWN_MODE_KEY
Definition enums.h:2291
@ ITEM_SPAWN_MODE_ITEM_BLOCK_COIN
Definition enums.h:2312
@ ITEM_SPAWN_MODE_ITEM_BLOCK_BADGE
Definition enums.h:2302
@ SHADOW_VARYING_CIRCLE
Definition enums.h:2535
@ PS_FLAG_HAMMER_CHECK
Definition enums.h:3073
@ PARTNER_ACTION_NONE
Definition enums.h:2932
@ ITEM_TYPE_CONSUMABLE
Definition enums.h:1827
@ ENCOUNTER_TRIGGER_CONVERSATION
Definition enums.h:272
@ ITEM_TYPE_FLAG_BADGE
Definition enums.h:1839
@ ITEM_TYPE_FLAG_CONSUMABLE
Definition enums.h:1836
@ ITEM_TYPE_FLAG_WORLD_USABLE
Definition enums.h:1834
@ ITEM_TYPE_FLAG_GEAR
Definition enums.h:1838
@ ITEM_TYPE_FLAG_KEY
Definition enums.h:1837
@ ITEM_TYPE_FLAG_ENTITY_FULLSIZE
Definition enums.h:1843
@ VIS_GROUP_5
Definition enums.h:2285
@ WINDOW_FLAG_INITIAL_ANIMATION
Definition enums.h:4995
@ COLLIDER_FLAG_IGNORE_NPC
Definition enums.h:4696
@ RENDER_TASK_FLAG_REFLECT_FLOOR
Definition enums.h:3318
@ PA_FLAG_NO_OOB_RESPAWN
Definition enums.h:3121
@ TIME_FREEZE_FULL
Definition enums.h:3466
@ TIME_FREEZE_NONE
Definition enums.h:3464
@ ITEM_PICKUP_FLAG_UNKNOWN
Definition enums.h:2762
@ ITEM_PICKUP_FLAG_NO_ANIMS
Definition enums.h:2761
@ ITEM_PICKUP_FLAG_3_STAR_PIECES
Definition enums.h:2764
@ ITEM_PICKUP_FLAG_UNIQUE
Definition enums.h:2765
@ ITEM_PICKUP_FLAG_NO_SOUND
Definition enums.h:2760
@ ITEM_PICKUP_FLAG_1_COIN
Definition enums.h:2763
@ CONTEXT_WORLD
Definition enums.h:3528
@ SOUND_FLOWER_PICKUP
Definition enums.h:927
@ SOUND_COIN_BOUNCE
Definition enums.h:923
@ SOUND_ITEM_BOUNCE
Definition enums.h:930
@ SOUND_STAR_PIECE_BOUNCE
Definition enums.h:929
@ SOUND_RECOVER
Definition enums.h:1386
@ SOUND_BADGE_BOUNCE
Definition enums.h:931
@ SOUND_JINGLE_GOT_BADGE
Definition enums.h:708
@ SOUND_HEART_BOUNCE
Definition enums.h:925
@ SOUND_COIN_PICKUP
Definition enums.h:922
@ SOUND_JINGLE_GOT_KEY
Definition enums.h:707
@ SOUND_HEART_PICKUP
Definition enums.h:924
@ SOUND_JINGLE_GOT_ITEM
Definition enums.h:706
@ SOUND_FLOWER_BOUNCE
Definition enums.h:928
@ RENDER_MODE_ALPHATEST
Definition enums.h:3276
@ RENDER_MODE_SURFACE_XLU_LAYER1
Definition enums.h:3282
@ ENTITY_FLAG_HIDDEN
Definition enums.h:2613
@ PARTNER_BOW
Definition enums.h:2894
@ ACTION_STATE_RIDE
Definition enums.h:2461
@ ACTION_STATE_JUMP
Definition enums.h:2430
@ ACTION_STATE_USE_MUNCHLESIA
Set by the jan_09 squishy flower entity; throws the player in the air.
Definition enums.h:2458
@ ACTION_STATE_LAUNCH
Shy Guy Toybox jack-in-the-boxes.
Definition enums.h:2433
@ ACTION_STATE_IDLE
Definition enums.h:2426
@ ACTION_STATE_USE_TWEESTER
Definition enums.h:2459
@ ACTION_STATE_USE_SPINNING_FLOWER
Definition enums.h:2457
@ ACTION_STATE_FALLING
Definition enums.h:2435
@ ACTION_STATE_HAMMER
Definition enums.h:2446
@ ENCOUNTER_STATE_NEUTRAL
Definition enums.h:6295
@ ENCOUNTER_STATE_NONE
Definition enums.h:6293
@ SOUND_SPACE_DEFAULT
Definition enums.h:1737
@ GLOBAL_OVERRIDES_CANT_PICK_UP_ITEMS
Definition enums.h:4338
@ GLOBAL_OVERRIDES_40
Definition enums.h:4324
@ GLOBAL_OVERRIDES_800
Definition enums.h:4329
@ GLOBAL_OVERRIDES_200
Definition enums.h:4327
@ GLOBAL_OVERRIDES_PREV_400
Definition enums.h:4332
@ GLOBAL_OVERRIDES_400
Definition enums.h:4328
@ GLOBAL_OVERRIDES_DISABLE_BATTLES
Definition enums.h:4326
@ GLOBAL_OVERRIDES_PREV_800
Definition enums.h:4333
@ CAM_DEFAULT
Definition enums.h:1800
@ CAM_BATTLE
Definition enums.h:1801
@ WIN_POPUP_DESC
Definition enums.h:5259
@ WIN_POPUP_TITLE_B
Definition enums.h:5257
@ WIN_PICKUP_HEADER
Definition enums.h:5252
@ EVT_GROUP_FLAG_MENUS
Definition evt.h:135
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1689
s32 is_player_dismounted(void)
Definition 77480.c:827
b32 npc_raycast_down_around(s32, f32 *, f32 *, f32 *, f32 *, f32, f32)
void msg_printer_set_origin_pos(MessagePrintState *msgPrintState, s32 x, s32 y)
Definition msg.c:1489
void hide_popup_menu(void)
void basic_hidden_window_update(s32 windowIndex, s32 *flags, s32 *posX, s32 *posY, s32 *posZ, f32 *scaleX, f32 *scaleY, f32 *rotX, f32 *rotY, f32 *rotZ, s32 *darkening, s32 *opacity)
Definition windows.c:184
void set_standard_shadow_scale(Shadow *shadow, f32 scale)
Definition entity.c:1674
void set_window_update(s32 panelID, s32)
Definition windows.c:434
void partner_disable_input(void)
Definition partners.c:2489
s32 npc_test_move_complex_with_slipping(s32, f32 *, f32 *, f32 *, f32, f32, f32, f32)
void suggest_player_anim_always_forward(AnimID anim)
Definition 77480.c:913
void sort_consumables(void)
Bubbles up player inventory items such that all ITEM_NONE values are at the bottom.
Definition inventory.c:410
void decrement_status_bar_disabled(void)
Definition inventory.c:1657
s32 imgfx_appendGfx_component(s32, ImgFXTexture *, u32, Matrix4f)
Definition imgfx.c:703
void func_801491E4(Matrix4f mtx, s32, s32, s32, s32, s32 alpha)
s32 disable_player_input(void)
Definition 77480.c:990
Shadow * get_shadow_by_index(s32 index)
Definition entity.c:534
s32 resume_all_group(s32 groupFlags)
void basic_window_update(s32 windowIndex, s32 *flags, s32 *posX, s32 *posY, s32 *posZ, f32 *scaleX, f32 *scaleY, f32 *rotX, f32 *rotY, f32 *rotZ, s32 *darkening, s32 *opacity)
Definition windows.c:161
s32 evt_set_variable(Evt *script, Bytecode var, s32 value)
Definition evt.c:1846
f32 cos_rad(f32 x)
Definition 43F0.c:716
s32 enable_player_input(void)
Definition 77480.c:998
void destroy_popup_menu(void)
s32 create_worker_scene(void(*updateFunc)(void), void(*renderFunc)(void))
Definition worker.c:32
s32 heap_free(void *ptr)
Definition heap.c:42
s32 is_starting_conversation(void)
Definition encounter.c:2817
b32 npc_test_move_simple_with_slipping(s32, f32 *, f32 *, f32 *, f32, f32, f32, f32)
void set_action_state(s32 actionState)
Definition 7E9D0.c:209
MessagePrintState * msg_get_printer_for_msg(s32 msgID, s32 *a1)
Definition msg.c:1424
b32 npc_raycast_up(s32, f32 *, f32 *, f32 *, f32 *)
s32 create_shadow_type(s32 type, f32 x, f32 y, f32 z)
Definition entity.c:1528
void set_message_text_var(s32 msgID, s32 index)
Definition msg.c:1520
void set_window_properties(s32 panelID, s32 posX, s32 posY, s32 width, s32 height, u8, void *drawContents, void *drawContentsArg, s8 parent)
Definition windows.c:373
s32 does_script_exist(s32 id)
f32 sin_rad(f32 x)
Definition 43F0.c:712
s32 get_time_freeze_mode(void)
Definition main_loop.c:390
void set_time_freeze_mode(s32)
Time freeze modes: 0: none 1: NPCs move, can't be interacted with 2: NPCs don't move,...
Definition main_loop.c:358
s32 create_worker_frontUI(void(*updateFunc)(void), void(*drawFunc)(void))
Definition worker.c:63
void delete_shadow(s32)
Definition entity.c:626
void add_vec2D_polar(f32 *x, f32 *y, f32 r, f32 theta)
Definition 43F0.c:684
f32 get_clamped_angle_diff(f32, f32)
Definition 43F0.c:605
void * heap_malloc(s32 size)
Definition heap.c:34
void increment_status_bar_disabled(void)
Definition inventory.c:1665
s32 get_msg_lines(s32 messageID)
Definition msg.c:1979
void hud_element_set_script(s32 id, HudScript *anim)
void hud_element_draw_next(s32 id)
void hud_element_set_render_pos(s32 id, s32 x, s32 y)
s32 hud_element_create(HudScript *anim)
Creates a new HUD element and returns its ID.
void hud_element_set_flags(s32 id, s32 flags)
Turns on the given flags.
void hud_element_free(s32 id)
@ HUD_ELEMENT_FLAG_80
Definition hud_element.h:78
HudScript * enabled
s32 add_item(s32 itemID)
Add itemID to player inventory and return inventory slot in which it was placed.
Definition inventory.c:152
void draw_content_pickup_item_desc(ItemEntity *item, s32 posX, s32 posY)
void reveal_item_entity(ItemEntity *item)
void set_item_entity_flags(s32 index, s32 flags)
void clear_item_entity_data(void)
BSS PopupMenu ItemPickupMenu
Definition item_entity.c:47
void init_item_entity_list(void)
s16 PickupMessageWindowYOffsets[]
Gfx D_8014C620[]
Definition item_entity.c:87
u8 * gHudElementCacheBuffer
BSS s16 CoinSparkleCenterY
Definition item_entity.c:36
#define MAX_ITEM_ENTITIES
Definition item_entity.c:16
void update_item_entity_pickup(ItemEntity *)
void item_entity_load(ItemEntity *item)
BSS s16 CoinSparkleCenterZ
Definition item_entity.c:37
HudCacheEntry * gHudElementCacheTablePalette
void update_item_entity_collectable(ItemEntity *)
SparkleScript SparkleScript_Coin
b32 is_picking_up_item(void)
BSS s32 pad_ItemEntity[3]
Definition item_entity.c:38
#define WD_VAR4
BSS s32 ItemEntityAlternatingSpawn
Definition item_entity.c:33
BSS s16 D_801565A8
Definition item_entity.c:45
void set_current_item_entity_render_group(s32 group)
void clear_item_entity_flags(s32 index, s32 flags)
ItemEntity * get_item_entity(s32 itemEntityIndex)
Gfx D_8014C6A0[]
void appendGfx_item_entity(void *)
s32 * gHudElementCacheSize
#define WD_VAR2
#define WD_VAR3
s32 make_item_entity_nodelay(s32 itemID, f32 x, f32 y, f32 z, s32 itemSpawnMode, s32 pickupVar)
BSS HudElemID ItemPickupIconHID
Definition item_entity.c:48
HudCacheEntry * gHudElementCacheTableRaster
s32 test_item_player_collision(ItemEntity *)
BSS s16 ItemSpawnWithinPlayerPickupDelay
Definition item_entity.c:43
void draw_item_entities(void)
s32 * gItemEntityScripts[]
s32 test_item_entity_position(f32 x, f32 y, f32 z, f32 dist)
Gfx Gfx_RM2_ALPHATEST[]
Definition model.c:905
void draw_content_cant_carry_more(ItemEntity *item, s32 posX, s32 posY)
Gfx D_8014C678[]
void draw_ui_item_entity_collectable(ItemEntity *)
void draw_content_pickup_item_header(ItemEntity *item, s32 posX, s32 posY)
#define X_PICKUP_ITEM_2
void draw_ui_item_entity_no_pickup(ItemEntity *)
#define Y_PICKUP_THREW
BSS s16 isPickingUpItem
Definition item_entity.c:42
#define X_VAR1
BSS s32 ThrowAwayItemID
Definition item_entity.c:51
BSS EffectInstance * ItemPickupGotOutline
Definition item_entity.c:52
void draw_ui_item_entities(void)
BSS ItemEntity ** gCurrentItemEntities
Definition item_entity.c:41
BSS s16 CoinSparkleCenterX
Definition item_entity.c:35
#define HT_VAR1
void remove_item_entity_by_index(s32 index)
BSS s32 UnusedItemPhysicsScriptID
Definition item_entity.c:32
Vtx D_8014C5E0[4]
Definition item_entity.c:80
Gfx Gfx_RM1_ALPHATEST[]
Definition model.c:676
#define X_PICKUP_ITEM_1
void func_801363A0(ItemEntity *)
void update_item_entity_no_pickup(ItemEntity *)
void draw_ui_item_entity_stationary(ItemEntity *)
Lights1 ItemEntityLights
void item_entity_update(ItemEntity *)
#define WD_VAR1
s32 make_item_entity_at_player(s32 itemID, s32 category, s32 pickupMsgFlags)
BSS s32 ThrowAwayMenuIdx
Definition item_entity.c:50
BSS ItemEntity * BattleItemEntities[256]
Definition item_entity.c:40
void update_item_entities(void)
void func_80133A94(s32 idx, s32 itemID)
BSS s32 ItemPickupStateDelay
Definition item_entity.c:49
#define Y_PICKUP_ITEM_1
s32 ItemEntitiesCreated
Definition item_entity.c:30
void auto_collect_item_entity(s32 index)
void draw_coin_sparkles(ItemEntity *item)
#define Y_PICKUP_ITEM_2
BSS s32 ItemEntityRenderGroup
Definition item_entity.c:34
s32 make_item_entity(s32 itemID, f32 x, f32 y, f32 z, s32 itemSpawnMode, s32 pickupDelay, s32 angle, s32 pickupFlagIndex)
#define X_PICKUP_THREW
s16 PickupHeaderWindowHeight[]
BSS b32 GotItemTutorialClosed
Definition item_entity.c:54
s32 sparkle_script_step(ItemEntity *item)
s32 make_item_entity_delayed(s32 itemID, f32 x, f32 y, f32 z, s32 itemSpawnMode, s32 pickupDelay, s32 pickupVar)
s32 get_current_item_entity_render_group(void)
BSS MessagePrintState * GotItemTutorialPrinter
Definition item_entity.c:53
void remove_item_entity_by_reference(ItemEntity *entity)
void render_item_entities(void)
Vtx D_8014C5A0[4]
Definition item_entity.c:73
void sparkle_script_update(ItemEntity *item)
void sparkle_script_init(ItemEntity *item, SparkleScript *script)
void update_item_entity_stationary(ItemEntity *)
BSS ItemEntity * WorldItemEntities[256]
Definition item_entity.c:39
void set_item_entity_position(s32 itemEntityIndex, f32 x, f32 y, f32 z)
void hide_item_entity(ItemEntity *item)
@ ITEM_SCRIPT_OP_End
Definition item_entity.h:9
@ ITEM_SCRIPT_OP_RandomRestart
Definition item_entity.h:13
@ ITEM_SCRIPT_OP_SetImage
Definition item_entity.h:10
@ ITEM_SCRIPT_OP_Restart
Definition item_entity.h:11
@ ITEM_SCRIPT_OP_Loop
Definition item_entity.h:12
EncounterStatus gCurrentEncounter
Definition encounter.c:176
void partner_enable_input(void)
Definition partners.c:2480
void sfx_play_sound(s32 soundID)
Definition sfx.c:517
@ GF_Tutorial_GotStarPiece
@ GF_Tutorial_GotItem
#define BSS
Definition macros.h:7
#define ARRAY_COUNT(arr)
Definition macros.h:40
#define EVT_GAME_FLAG_CUTOFF
Definition macros.h:34
#define DEG_TO_RAD(deg)
Definition macros.h:138
#define PM_CC_32
Definition macros.h:389
#define PM_CC_2F
Definition macros.h:388
#define MAX_STAR_PIECES
Definition macros.h:100
#define SQ(x)
Definition macros.h:170
#define EVT_INDEX_OF_GAME_FLAG(v)
Definition macros.h:142
@ SPARKLE_OP_SetCI
@ SPARKLE_OP_End
@ SPARKLE_OP_Jump
@ SPARKLE_OP_Restart
@ SPARKLE_OP_Break
@ SPARKLE_OP_SetGfx
s32 SparkleScript[]
@ SPRITE_ID_BACK_FACING
Definition sprite.h:13
s32 gOverrideFlags
Definition main_loop.c:11
ItemData gItemTable[]
PartnerStatus gPartnerStatus
Definition partners.c:42
GameStatus * gGameStatusPtr
Definition main_loop.c:32
Camera gCameras[4]
Definition cam_main.c:17
Gfx * gMainGfxPos
Definition cam_main.c:15
PlayerData gPlayerData
Definition 77480.c:40
u16 gMatrixListPos
Definition main_loop.c:45
SpriteShadingProfile * gSpriteShadingProfile
PlayerStatus gPlayerStatus
Definition 77480.c:39
s32 gCurrentCameraID
Definition cam_math.c:4
s32 gEncounterState
Definition encounter.c:174
Window gWindows[64]
Definition windows.c:23
DisplayContext * gDisplayContext
Definition cam_main.c:16
s16 gCurrentCamID
Definition cam_main.c:13
s32 set_global_flag(s32 index)
Definition vars_access.c:65
s32 get_global_flag(s32 index)
Definition vars_access.c:89