Advertisement
Baoulettes

blablabla

Jun 27th, 2022
729
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 57.00 KB | None | 0 0
  1. #include "global.h"
  2. #include "overlays/actors/ovl_En_Elf/z_en_elf.h"
  3. #include "objects/gameplay_keep/gameplay_keep.h"
  4. #include "overlays/effects/ovl_Effect_Ss_Dead_Sound/z_eff_ss_dead_sound.h"
  5.  
  6. #define FLAGS 0
  7.  
  8. //Used to force variable to be used in different function, feel free to correct me if you have a better way
  9. static s16 DroppedItemRot = 0;
  10.  
  11. void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx);
  12. void EnItem00_Destroy(Actor* thisx, GlobalContext* globalCtx);
  13. void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx);
  14. void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx);
  15.  
  16. void func_8001DFC8(EnItem00* this, GlobalContext* globalCtx);
  17. void func_8001E1C8(EnItem00* this, GlobalContext* globalCtx);
  18. void func_8001E304(EnItem00* this, GlobalContext* globalCtx);
  19. void func_8001E5C8(EnItem00* this, GlobalContext* globalCtx);
  20.  
  21. void EnItem00_DrawRupee(EnItem00* this, GlobalContext* globalCtx);
  22. void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx);
  23. void EnItem00_DrawHeartContainer(EnItem00* this, GlobalContext* globalCtx);
  24. void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx);
  25.  
  26. const ActorInit En_Item00_InitVars = {
  27.     ACTOR_EN_ITEM00,
  28.     ACTORCAT_MISC,
  29.     FLAGS,
  30.     OBJECT_GAMEPLAY_KEEP,
  31.     sizeof(EnItem00),
  32.     (ActorFunc)EnItem00_Init,
  33.     (ActorFunc)EnItem00_Destroy,
  34.     (ActorFunc)EnItem00_Update,
  35.     (ActorFunc)EnItem00_Draw,
  36.     NULL,
  37. };
  38.  
  39. static ColliderCylinderInit sCylinderInit = {
  40.     {
  41.         COLTYPE_NONE,
  42.         AT_NONE,
  43.         AC_ON | AC_TYPE_PLAYER,
  44.         OC1_NONE,
  45.         OC2_NONE,
  46.         COLSHAPE_CYLINDER,
  47.     },
  48.     {
  49.         ELEMTYPE_UNK0,
  50.         { 0x00000000, 0x00, 0x00 },
  51.         { 0x00000010, 0x00, 0x00 },
  52.         TOUCH_NONE | TOUCH_SFX_NORMAL,
  53.         BUMP_ON,
  54.         OCELEM_NONE,
  55.     },
  56.     { 10, 30, 0, { 0, 0, 0 } },
  57. };
  58.  
  59. static InitChainEntry sInitChain[] = {
  60.     ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_STOP),
  61. };
  62.  
  63. static Color_RGBA8 sEffectPrimColor = { 255, 255, 127, 0 };
  64. static Color_RGBA8 sEffectEnvColor = { 255, 255, 255, 0 };
  65. static Vec3f sEffectVelocity = { 0.0f, 0.1f, 0.0f };
  66. static Vec3f sEffectAccel = { 0.0f, 0.01f, 0.0f };
  67.  
  68. static void* sRupeeTex[] = {
  69.     gRupeeGreenTex, gRupeeBlueTex, gRupeeRedTex, gRupeePinkTex, gRupeeOrangeTex,
  70. };
  71.  
  72. static void* sItemDropTex[] = {
  73.     gDropRecoveryHeartTex, gDropBombTex,       gDropArrows1Tex,   gDropArrows2Tex,
  74.     gDropArrows3Tex,       gDropBombTex,       gDropDekuNutTex,   gDropDekuStickTex,
  75.     gDropMagicLargeTex,    gDropMagicSmallTex, gDropDekuSeedsTex, gDropKeySmallTex,
  76. };
  77.  
  78. static u8 sItemDropIds[] = {
  79.     ITEM00_RUPEE_GREEN,
  80.     ITEM00_RUPEE_BLUE,
  81.     0xFF,
  82.     0xFF,
  83.     ITEM00_RUPEE_BLUE,
  84.     ITEM00_RUPEE_GREEN,
  85.     ITEM00_MAGIC_SMALL,
  86.     ITEM00_HEART,
  87.     ITEM00_HEART,
  88.     0xFF,
  89.     ITEM00_MAGIC_SMALL,
  90.     ITEM00_FLEXIBLE,
  91.     ITEM00_SEEDS,
  92.     ITEM00_SEEDS,
  93.     0xFF,
  94.     ITEM00_RUPEE_BLUE,
  95.     ITEM00_RUPEE_GREEN,
  96.     ITEM00_MAGIC_SMALL,
  97.     ITEM00_RUPEE_GREEN,
  98.     ITEM00_RUPEE_BLUE,
  99.     ITEM00_HEART,
  100.     0xFF,
  101.     ITEM00_HEART,
  102.     0xFF,
  103.     ITEM00_FLEXIBLE,
  104.     0xFF,
  105.     ITEM00_BOMBS_A,
  106.     0xFF,
  107.     ITEM00_SEEDS,
  108.     0xFF,
  109.     0xFF,
  110.     ITEM00_MAGIC_SMALL,
  111.     ITEM00_RUPEE_GREEN,
  112.     ITEM00_RUPEE_GREEN,
  113.     ITEM00_MAGIC_SMALL,
  114.     0xFF,
  115.     ITEM00_HEART,
  116.     0xFF,
  117.     0xFF,
  118.     ITEM00_HEART,
  119.     0xFF,
  120.     ITEM00_SEEDS,
  121.     ITEM00_SEEDS,
  122.     0xFF,
  123.     ITEM00_BOMBS_A,
  124.     0xFF,
  125.     ITEM00_FLEXIBLE,
  126.     ITEM00_MAGIC_SMALL,
  127.     ITEM00_RUPEE_GREEN,
  128.     ITEM00_RUPEE_GREEN,
  129.     ITEM00_NUTS,
  130.     0xFF,
  131.     ITEM00_SEEDS,
  132.     ITEM00_SEEDS,
  133.     ITEM00_NUTS,
  134.     ITEM00_HEART,
  135.     ITEM00_HEART,
  136.     ITEM00_SEEDS,
  137.     0xFF,
  138.     ITEM00_FLEXIBLE,
  139.     0xFF,
  140.     0xFF,
  141.     0xFF,
  142.     0xFF,
  143.     ITEM00_RUPEE_GREEN,
  144.     ITEM00_RUPEE_GREEN,
  145.     ITEM00_SEEDS,
  146.     ITEM00_BOMBS_A,
  147.     ITEM00_MAGIC_SMALL,
  148.     ITEM00_BOMBS_A,
  149.     0xFF,
  150.     0xFF,
  151.     ITEM00_HEART,
  152.     0xFF,
  153.     0xFF,
  154.     ITEM00_HEART,
  155.     ITEM00_HEART,
  156.     0xFF,
  157.     0xFF,
  158.     ITEM00_MAGIC_SMALL,
  159.     ITEM00_RUPEE_GREEN,
  160.     ITEM00_MAGIC_SMALL,
  161.     ITEM00_RUPEE_GREEN,
  162.     0xFF,
  163.     ITEM00_RUPEE_BLUE,
  164.     0xFF,
  165.     0xFF,
  166.     ITEM00_HEART,
  167.     0xFF,
  168.     0xFF,
  169.     ITEM00_HEART,
  170.     ITEM00_FLEXIBLE,
  171.     ITEM00_SEEDS,
  172.     ITEM00_SEEDS,
  173.     0xFF,
  174.     ITEM00_MAGIC_SMALL,
  175.     ITEM00_RUPEE_GREEN,
  176.     ITEM00_RUPEE_BLUE,
  177.     0xFF,
  178.     ITEM00_RUPEE_GREEN,
  179.     0xFF,
  180.     ITEM00_HEART,
  181.     0xFF,
  182.     0xFF,
  183.     ITEM00_BOMBS_A,
  184.     ITEM00_ARROWS_SMALL,
  185.     0xFF,
  186.     ITEM00_ARROWS_MEDIUM,
  187.     ITEM00_MAGIC_SMALL,
  188.     ITEM00_FLEXIBLE,
  189.     0xFF,
  190.     ITEM00_MAGIC_LARGE,
  191.     ITEM00_RUPEE_GREEN,
  192.     0xFF,
  193.     ITEM00_RUPEE_BLUE,
  194.     0xFF,
  195.     ITEM00_RUPEE_GREEN,
  196.     ITEM00_HEART,
  197.     ITEM00_FLEXIBLE,
  198.     ITEM00_BOMBS_A,
  199.     ITEM00_ARROWS_SMALL,
  200.     0xFF,
  201.     0xFF,
  202.     0xFF,
  203.     ITEM00_MAGIC_SMALL,
  204.     0xFF,
  205.     0xFF,
  206.     ITEM00_MAGIC_LARGE,
  207.     ITEM00_ARROWS_LARGE,
  208.     ITEM00_ARROWS_MEDIUM,
  209.     ITEM00_ARROWS_MEDIUM,
  210.     ITEM00_ARROWS_SMALL,
  211.     ITEM00_ARROWS_SMALL,
  212.     ITEM00_FLEXIBLE,
  213.     ITEM00_ARROWS_SMALL,
  214.     ITEM00_ARROWS_SMALL,
  215.     ITEM00_ARROWS_SMALL,
  216.     ITEM00_ARROWS_MEDIUM,
  217.     ITEM00_ARROWS_SMALL,
  218.     ITEM00_ARROWS_SMALL,
  219.     ITEM00_ARROWS_SMALL,
  220.     ITEM00_ARROWS_MEDIUM,
  221.     ITEM00_ARROWS_LARGE,
  222.     ITEM00_ARROWS_LARGE,
  223.     ITEM00_MAGIC_LARGE,
  224.     ITEM00_MAGIC_SMALL,
  225.     ITEM00_MAGIC_SMALL,
  226.     ITEM00_MAGIC_SMALL,
  227.     ITEM00_MAGIC_SMALL,
  228.     ITEM00_MAGIC_LARGE,
  229.     ITEM00_MAGIC_SMALL,
  230.     ITEM00_MAGIC_SMALL,
  231.     ITEM00_MAGIC_SMALL,
  232.     ITEM00_MAGIC_LARGE,
  233.     ITEM00_MAGIC_SMALL,
  234.     ITEM00_MAGIC_LARGE,
  235.     ITEM00_MAGIC_SMALL,
  236.     ITEM00_MAGIC_SMALL,
  237.     ITEM00_MAGIC_SMALL,
  238.     ITEM00_MAGIC_LARGE,
  239.     ITEM00_BOMBS_A,
  240.     0xFF,
  241.     ITEM00_BOMBS_A,
  242.     0xFF,
  243.     ITEM00_BOMBS_A,
  244.     ITEM00_FLEXIBLE,
  245.     ITEM00_BOMBS_A,
  246.     ITEM00_BOMBS_A,
  247.     ITEM00_BOMBS_A,
  248.     0xFF,
  249.     0xFF,
  250.     0xFF,
  251.     0xFF,
  252.     ITEM00_BOMBS_A,
  253.     0xFF,
  254.     ITEM00_BOMBS_A,
  255.     ITEM00_HEART,
  256.     ITEM00_HEART,
  257.     ITEM00_HEART,
  258.     ITEM00_HEART,
  259.     ITEM00_HEART,
  260.     ITEM00_HEART,
  261.     ITEM00_HEART,
  262.     ITEM00_HEART,
  263.     ITEM00_HEART,
  264.     ITEM00_HEART,
  265.     ITEM00_HEART,
  266.     ITEM00_HEART,
  267.     ITEM00_HEART,
  268.     ITEM00_HEART,
  269.     ITEM00_HEART,
  270.     ITEM00_HEART,
  271.     ITEM00_RUPEE_RED,
  272.     ITEM00_RUPEE_BLUE,
  273.     ITEM00_RUPEE_BLUE,
  274.     ITEM00_RUPEE_RED,
  275.     ITEM00_RUPEE_BLUE,
  276.     ITEM00_RUPEE_BLUE,
  277.     ITEM00_RUPEE_BLUE,
  278.     ITEM00_RUPEE_RED,
  279.     ITEM00_RUPEE_RED,
  280.     ITEM00_RUPEE_BLUE,
  281.     ITEM00_RUPEE_RED,
  282.     ITEM00_RUPEE_BLUE,
  283.     ITEM00_RUPEE_RED,
  284.     ITEM00_RUPEE_RED,
  285.     ITEM00_RUPEE_RED,
  286.     ITEM00_RUPEE_RED,
  287.     ITEM00_SEEDS,
  288.     0xFF,
  289.     ITEM00_NUTS,
  290.     0xFF,
  291.     ITEM00_STICK,
  292.     0xFF,
  293.     0xFF,
  294.     ITEM00_SEEDS,
  295.     0xFF,
  296.     0xFF,
  297.     0xFF,
  298.     ITEM00_NUTS,
  299.     0xFF,
  300.     ITEM00_NUTS,
  301.     ITEM00_HEART,
  302.     ITEM00_SEEDS,
  303.     ITEM00_HEART,
  304.     0xFF,
  305.     ITEM00_SEEDS,
  306.     0xFF,
  307.     ITEM00_HEART,
  308.     0xFF,
  309.     0xFF,
  310.     ITEM00_HEART,
  311.     ITEM00_HEART,
  312.     0xFF,
  313.     0xFF,
  314.     ITEM00_HEART,
  315.     0xFF,
  316.     ITEM00_HEART,
  317.     ITEM00_SEEDS,
  318.     ITEM00_FLEXIBLE,
  319. };
  320.  
  321. static u8 sDropQuantities[] = {
  322.     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  323.     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
  324.     1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  325.     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  326.     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  327.     1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 1, 1, 3, 1, 3, 1, 1, 1, 3, 1, 1,
  328.     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 0, 0, 0, 0,
  329. };
  330.  
  331. void EnItem00_SetupAction(EnItem00* this, EnItem00ActionFunc actionFunc) {
  332.     this->actionFunc = actionFunc;
  333. }
  334.  
  335. void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
  336.     EnItem00* this = (EnItem00*)thisx;
  337.     s32 pad;
  338.     f32 yOffset = 980.0f;
  339.     f32 shadowScale = 6.0f;
  340.     s32 getItemId = GI_NONE;
  341.     s16 spawnParam8000 = this->actor.params & 0x8000;
  342.     s32 pad1;
  343.  
  344.     this->ogParams = this->actor.params;
  345.  
  346.     this->collectibleFlag = (this->actor.params & 0x3F00) >> 8;
  347.  
  348.     this->actor.params &= 0xFF;
  349.  
  350.     if (Flags_GetCollectible(globalCtx, this->collectibleFlag)) {
  351.         Actor_Kill(&this->actor);
  352.         return;
  353.     }
  354.  
  355.     Actor_ProcessInitChain(&this->actor, sInitChain);
  356.     Collider_InitCylinder(globalCtx, &this->collider);
  357.     Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
  358.  
  359.     this->unk_158 = 1;
  360.  
  361.     switch (this->actor.params) {
  362.         case ITEM00_RUPEE_GREEN:
  363.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  364.                 Actor_SetScale(&this->actor, 0.3f);
  365.                 this->scale = 0.3f;
  366.                 yOffset = 50.0f;
  367.                 shadowScale = 0.3f;
  368.                 this->actor.world.rot.x = 0x4000;
  369.                 break;
  370.             }
  371.         case ITEM00_RUPEE_BLUE:
  372.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  373.                 Actor_SetScale(&this->actor, 0.3f);
  374.                 this->scale = 0.3f;
  375.                 yOffset = 50.0f;
  376.                 shadowScale = 0.3f;
  377.                 this->actor.world.rot.x = 0x4000;
  378.             }
  379.         case ITEM00_RUPEE_RED:
  380.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  381.                 Actor_SetScale(&this->actor, 0.3f);
  382.                 this->scale = 0.3f;
  383.                 yOffset = 50.0f;
  384.                 shadowScale = 0.3f;
  385.                 this->actor.world.rot.x = 0x4000;
  386.             } else {
  387.                 Actor_SetScale(&this->actor, 0.015f);
  388.                 this->scale = 0.015f;
  389.                 yOffset = 750.0f;
  390.             }
  391.             break;
  392.         case ITEM00_SMALL_KEY:
  393.             this->unk_158 = 0;
  394.             Actor_SetScale(&this->actor, 0.03f);
  395.             this->scale = 0.03f;
  396.             yOffset = 350.0f;
  397.             break;
  398.         case ITEM00_HEART_PIECE:
  399.             this->unk_158 = 0;
  400.             yOffset = 650.0f;
  401.             Actor_SetScale(&this->actor, 0.02f);
  402.             this->scale = 0.02f;
  403.             break;
  404.         case ITEM00_HEART:
  405.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  406.                 this->actor.home.rot.z = Rand_CenteredFloat(65535.0f);
  407.                 yOffset = 25.0f;
  408.                 Actor_SetScale(&this->actor, 0.3f);
  409.                 this->scale = 0.3f;
  410.                 shadowScale = 0.5f;
  411.             } else {
  412.                 this->actor.home.rot.z = Rand_CenteredFloat(65535.0f);
  413.                 yOffset = 430.0f;
  414.                 Actor_SetScale(&this->actor, 0.02f);
  415.                 this->scale = 0.02f;
  416.             }
  417.             break;
  418.         case ITEM00_HEART_CONTAINER:
  419.             yOffset = 430.0f;
  420.             this->unk_158 = 0;
  421.             Actor_SetScale(&this->actor, 0.02f);
  422.             this->scale = 0.02f;
  423.             break;
  424.         case ITEM00_ARROWS_SINGLE:
  425.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  426.                 Actor_SetScale(&this->actor, 0.2f);
  427.                 this->scale = 0.2f;
  428.                 yOffset = 50.0f;
  429.                 shadowScale = 0.5f;
  430.                 this->actor.world.rot.x = 0x4000;
  431.             } else {
  432.                 yOffset = 400.0f;
  433.                 Actor_SetScale(&this->actor, 0.02f);
  434.                 this->scale = 0.02f;
  435.             }
  436.             break;
  437.         case ITEM00_ARROWS_SMALL:
  438.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  439.                 Actor_SetScale(&this->actor, 0.2f);
  440.                 this->scale = 0.2f;
  441.                 yOffset = 50.0f;
  442.                 shadowScale = 0.5f;
  443.                 this->actor.world.rot.x = 0x4000;
  444.                 break;
  445.             }
  446.         case ITEM00_ARROWS_MEDIUM:
  447.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  448.                 Actor_SetScale(&this->actor, 0.2f);
  449.                 this->scale = 0.2f;
  450.                 yOffset = 50.0f;
  451.                 shadowScale = 0.5f;
  452.                 this->actor.world.rot.x = 0x4000;
  453.                 break;
  454.             }
  455.         case ITEM00_ARROWS_LARGE:
  456.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  457.                 Actor_SetScale(&this->actor, 0.2f);
  458.                 this->scale = 0.2f;
  459.                 yOffset = 50.0f;
  460.                 shadowScale = 0.5f;
  461.                 this->actor.world.rot.x = 0x4000;
  462.             } else {
  463.                 Actor_SetScale(&this->actor, 0.035f);
  464.                 this->scale = 0.035f;
  465.                 yOffset = 250.0f;
  466.             }
  467.             break;
  468.         case ITEM00_BOMBS_A:
  469.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  470.                 Actor_SetScale(&this->actor, 0.2f);
  471.                 this->scale = 0.2f;
  472.                 yOffset = 50.0f;
  473.                 shadowScale = 0.5f;
  474.                 this->actor.world.rot.x = 0x4000;
  475.                 break;
  476.             }
  477.         case ITEM00_BOMBS_B:
  478.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  479.                 Actor_SetScale(&this->actor, 0.2f);
  480.                 this->scale = 0.2f;
  481.                 yOffset = 50.0f;
  482.                 shadowScale = 0.5f;
  483.                 this->actor.world.rot.x = 0x4000;
  484.                 break;
  485.             }
  486.         case ITEM00_NUTS:
  487.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  488.                 Actor_SetScale(&this->actor, 0.2f);
  489.                 this->scale = 0.2f;
  490.                 yOffset = 50.0f;
  491.                 shadowScale = 0.5f;
  492.                 this->actor.world.rot.x = 0x4000;
  493.                 break;
  494.             }
  495.         case ITEM00_STICK:
  496.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  497.                 Actor_SetScale(&this->actor, 0.2f);
  498.                 this->scale = 0.2f;
  499.                 yOffset = 50.0f;
  500.                 shadowScale = 0.5f;
  501.                 this->actor.world.rot.x = 0x4000;
  502.                 break;
  503.             }
  504.         case ITEM00_MAGIC_SMALL:
  505.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  506.                 Actor_SetScale(&this->actor, 0.2f);
  507.                 this->scale = 0.2f;
  508.                 yOffset = 50.0f;
  509.                 shadowScale = 0.5f;
  510.                 this->actor.world.rot.x = 0x4000;
  511.                 break;
  512.             }
  513.         case ITEM00_SEEDS:
  514.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  515.                 Actor_SetScale(&this->actor, 0.2f);
  516.                 this->scale = 0.2f;
  517.                 yOffset = 50.0f;
  518.                 shadowScale = 0.5f;
  519.                 this->actor.world.rot.x = 0x4000;
  520.                 break;
  521.             }
  522.         case ITEM00_BOMBS_SPECIAL:
  523.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  524.                 Actor_SetScale(&this->actor, 0.2f);
  525.                 this->scale = 0.2f;
  526.                 yOffset = 50.0f;
  527.                 shadowScale = 0.5f;
  528.                 this->actor.world.rot.x = 0x4000;
  529.             } else {
  530.                 Actor_SetScale(&this->actor, 0.03f);
  531.                 this->scale = 0.03f;
  532.                 yOffset = 320.0f;
  533.             }
  534.             break;
  535.         case ITEM00_MAGIC_LARGE:
  536.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  537.                 Actor_SetScale(&this->actor, 0.2f);
  538.                 this->scale = 0.2f;
  539.                 yOffset = 50.0f;
  540.                 shadowScale = 0.5f;
  541.                 this->actor.world.rot.x = 0x4000;
  542.             } else {
  543.                 Actor_SetScale(&this->actor, 0.045 - 1e-10);
  544.                 this->scale = 0.045 - 1e-10;
  545.                 yOffset = 320.0f;
  546.             }
  547.             break;
  548.         case ITEM00_RUPEE_ORANGE:
  549.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  550.                 Actor_SetScale(&this->actor, 0.45f);
  551.                 this->scale = 0.45f;
  552.                 yOffset = 50.0f;
  553.                 shadowScale = 0.3f;
  554.                 this->actor.world.rot.x = 0x4000;
  555.             } else {
  556.                 Actor_SetScale(&this->actor, 0.045 - 1e-10);
  557.                 this->scale = 0.045 - 1e-10;
  558.                 yOffset = 750.0f;
  559.             }
  560.             break;
  561.         case ITEM00_RUPEE_PURPLE:
  562.             if (CVar_GetS32("gNewDrops", 0) != 0) {
  563.                 Actor_SetScale(&this->actor, 0.4f);
  564.                 this->scale = 0.4f;
  565.                 yOffset = 50.0f;
  566.                 shadowScale = 0.3f;
  567.                 this->actor.world.rot.x = 0x4000;
  568.             } else {
  569.                 Actor_SetScale(&this->actor, 0.03f);
  570.                 this->scale = 0.03f;
  571.                 yOffset = 750.0f;
  572.             }
  573.             break;
  574.         case ITEM00_FLEXIBLE:
  575.             yOffset = 500.0f;
  576.             Actor_SetScale(&this->actor, 0.01f);
  577.             this->scale = 0.01f;
  578.             break;
  579.         case ITEM00_SHIELD_DEKU:
  580.             this->actor.objBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_SHIELD_1);
  581.             Actor_SetObjectDependency(globalCtx, &this->actor);
  582.             Actor_SetScale(&this->actor, 0.5f);
  583.             this->scale = 0.5f;
  584.             yOffset = 0.0f;
  585.             shadowScale = 0.6f;
  586.             this->actor.world.rot.x = 0x4000;
  587.             break;
  588.         case ITEM00_SHIELD_HYLIAN:
  589.             this->actor.objBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_SHIELD_2);
  590.             Actor_SetObjectDependency(globalCtx, &this->actor);
  591.             Actor_SetScale(&this->actor, 0.5f);
  592.             this->scale = 0.5f;
  593.             yOffset = 0.0f;
  594.             shadowScale = 0.6f;
  595.             this->actor.world.rot.x = 0x4000;
  596.             break;
  597.         case ITEM00_TUNIC_ZORA:
  598.         case ITEM00_TUNIC_GORON:
  599.             this->actor.objBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_CLOTHES);
  600.             Actor_SetObjectDependency(globalCtx, &this->actor);
  601.             Actor_SetScale(&this->actor, 0.5f);
  602.             this->scale = 0.5f;
  603.             yOffset = 0.0f;
  604.             shadowScale = 0.6f;
  605.             this->actor.world.rot.x = 0x4000;
  606.             break;
  607.     }
  608.  
  609.     this->unk_156 = 0;
  610.     ActorShape_Init(&this->actor.shape, yOffset, ActorShadow_DrawCircle, shadowScale);
  611.     this->actor.shape.shadowAlpha = 180;
  612.     this->actor.focus.pos = this->actor.world.pos;
  613.     this->getItemId = GI_NONE;
  614.  
  615.     if (!spawnParam8000) {
  616.         EnItem00_SetupAction(this, func_8001DFC8);
  617.         this->unk_15A = -1;
  618.         return;
  619.     }
  620.  
  621.     this->unk_15A = 15;
  622.     this->unk_154 = 35;
  623.  
  624.     this->actor.speedXZ = 0.0f;
  625.     this->actor.velocity.y = 0.0f;
  626.     this->actor.gravity = 0.0f;
  627.  
  628.     switch (this->actor.params) {
  629.         case ITEM00_RUPEE_GREEN:
  630.             Item_Give(globalCtx, ITEM_RUPEE_GREEN);
  631.             break;
  632.         case ITEM00_RUPEE_BLUE:
  633.             Item_Give(globalCtx, ITEM_RUPEE_BLUE);
  634.             break;
  635.         case ITEM00_RUPEE_RED:
  636.             Item_Give(globalCtx, ITEM_RUPEE_RED);
  637.             break;
  638.         case ITEM00_RUPEE_PURPLE:
  639.             Item_Give(globalCtx, ITEM_RUPEE_PURPLE);
  640.             break;
  641.         case ITEM00_RUPEE_ORANGE:
  642.             Item_Give(globalCtx, ITEM_RUPEE_GOLD);
  643.             break;
  644.         case ITEM00_HEART:
  645.             Item_Give(globalCtx, ITEM_HEART);
  646.             break;
  647.         case ITEM00_FLEXIBLE:
  648.             Health_ChangeBy(globalCtx, 0x70);
  649.             break;
  650.         case ITEM00_BOMBS_A:
  651.         case ITEM00_BOMBS_B:
  652.             Item_Give(globalCtx, ITEM_BOMBS_5);
  653.             break;
  654.         case ITEM00_ARROWS_SINGLE:
  655.             Item_Give(globalCtx, ITEM_BOW);
  656.             break;
  657.         case ITEM00_ARROWS_SMALL:
  658.             Item_Give(globalCtx, ITEM_ARROWS_SMALL);
  659.             break;
  660.         case ITEM00_ARROWS_MEDIUM:
  661.             Item_Give(globalCtx, ITEM_ARROWS_MEDIUM);
  662.             break;
  663.         case ITEM00_ARROWS_LARGE:
  664.             Item_Give(globalCtx, ITEM_ARROWS_LARGE);
  665.             break;
  666.         case ITEM00_MAGIC_LARGE:
  667.             getItemId = GI_MAGIC_SMALL;
  668.             break;
  669.         case ITEM00_MAGIC_SMALL:
  670.             getItemId = GI_MAGIC_LARGE;
  671.             break;
  672.         case ITEM00_SMALL_KEY:
  673.             Item_Give(globalCtx, ITEM_KEY_SMALL);
  674.             break;
  675.         case ITEM00_SEEDS:
  676.             getItemId = GI_SEEDS_5;
  677.             break;
  678.         case ITEM00_NUTS:
  679.             getItemId = GI_NUTS_5;
  680.             break;
  681.         case ITEM00_STICK:
  682.             getItemId = GI_STICKS_1;
  683.             break;
  684.         case ITEM00_HEART_PIECE:
  685.         case ITEM00_HEART_CONTAINER:
  686.         case ITEM00_SHIELD_DEKU:
  687.         case ITEM00_SHIELD_HYLIAN:
  688.         case ITEM00_TUNIC_ZORA:
  689.         case ITEM00_TUNIC_GORON:
  690.         case ITEM00_BOMBS_SPECIAL:
  691.             break;
  692.     }
  693.  
  694.     if ((gSaveContext.n64ddFlag || getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) {
  695.         getItemId = GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum);
  696.         func_8002F554(&this->actor, globalCtx, getItemId);
  697.     }
  698.  
  699.     EnItem00_SetupAction(this, func_8001E5C8);
  700.     this->actionFunc(this, globalCtx);
  701. }
  702.  
  703. void EnItem00_Destroy(Actor* thisx, GlobalContext* globalCtx) {
  704.     EnItem00* this = (EnItem00*)thisx;
  705.  
  706.     Collider_DestroyCylinder(globalCtx, &this->collider);
  707. }
  708.  
  709. void func_8001DFC8(EnItem00* this, GlobalContext* globalCtx) {
  710.  
  711.     if (CVar_GetS32("gNewDrops", 0) !=0) { //set the rotation system on selected model only :)
  712.         if ((this->actor.params == ITEM_RUPEE_GOLD) || (this->actor.params == ITEM_RUPEE_PURPLE) ||
  713.             (this->actor.params == ITEM00_ARROWS_SINGLE) || (this->actor.params == ITEM00_ARROWS_SMALL) ||
  714.             (this->actor.params == ITEM00_ARROWS_MEDIUM) || (this->actor.params == ITEM00_ARROWS_LARGE) ||
  715.             (this->actor.params == ITEM00_BOMBS_A) || (this->actor.params == ITEM00_BOMBS_B) ||
  716.             (this->actor.params == ITEM00_NUTS) || (this->actor.params == ITEM00_STICK) ||
  717.             (this->actor.params == ITEM00_MAGIC_SMALL) || (this->actor.params == ITEM00_SEEDS) ||
  718.             (this->actor.params == ITEM00_MAGIC_LARGE) || (this->actor.params == ITEM00_HEART) || (this->actor.params == ITEM00_BOMBS_SPECIAL)) {
  719.             this->actor.shape.rot.y = DroppedItemRot;
  720.         }
  721.     }
  722.    
  723.     if ((this->actor.params <= ITEM00_RUPEE_RED) || ((this->actor.params == ITEM00_HEART) && (this->unk_15A < 0)) ||
  724.             (this->actor.params == ITEM00_HEART_PIECE) ||
  725.             (gSaveContext.n64ddFlag && this->actor.params == ITEM00_SMALL_KEY)) {
  726.         this->actor.shape.rot.y += 960;
  727.     } else {
  728.         if ((this->actor.params >= ITEM00_SHIELD_DEKU) && (this->actor.params != ITEM00_BOMBS_SPECIAL)) {
  729.             if (this->unk_15A == -1) {
  730.                 if (Math_SmoothStepToS(&this->actor.shape.rot.x, this->actor.world.rot.x - 0x4000, 2, 3000, 1500) ==
  731.                     0) {
  732.                     this->unk_15A = -2;
  733.                 }
  734.             } else {
  735.                 if (Math_SmoothStepToS(&this->actor.shape.rot.x, -this->actor.world.rot.x - 0x4000, 2, 3000, 1500) ==
  736.                     0) {
  737.                     this->unk_15A = -1;
  738.                 }
  739.             }
  740.             Math_SmoothStepToS(&this->actor.world.rot.x, 0, 2, 2500, 500);
  741.         }
  742.     }
  743.  
  744.     if (this->actor.params == ITEM00_HEART_PIECE) {
  745.         this->actor.shape.yOffset = Math_SinS(this->actor.shape.rot.y) * 150.0f + 850.0f;
  746.     }
  747.  
  748.     if (gSaveContext.n64ddFlag && this->actor.params == ITEM00_SMALL_KEY) {
  749.         this->actor.shape.yOffset = 600.0f;
  750.     }
  751.  
  752.     Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 1.0f, 0.5f, 0.0f);
  753.  
  754.     if (this->unk_154 == 0) {
  755.         if ((this->actor.params != ITEM00_SMALL_KEY) && (this->actor.params != ITEM00_HEART_PIECE) &&
  756.             (this->actor.params != ITEM00_HEART_CONTAINER)) {
  757.             this->unk_154 = -1;
  758.         }
  759.     }
  760.  
  761.     if (this->unk_15A == 0) {
  762.         if ((this->actor.params != ITEM00_SMALL_KEY) && (this->actor.params != ITEM00_HEART_PIECE) &&
  763.             (this->actor.params != ITEM00_HEART_CONTAINER)) {
  764.             Actor_Kill(&this->actor);
  765.         }
  766.     }
  767.  
  768.     if ((this->actor.gravity != 0.0f) && !(this->actor.bgCheckFlags & 0x0001)) {
  769.         EnItem00_SetupAction(this, func_8001E1C8);
  770.     }
  771. }
  772.  
  773. void func_8001E1C8(EnItem00* this, GlobalContext* globalCtx) {
  774.     f32 originalVelocity;
  775.     Vec3f effectPos;
  776.  
  777.     if (this->actor.params <= ITEM00_RUPEE_RED) {
  778.         this->actor.shape.rot.y += 960;
  779.     }
  780.  
  781.     if (globalCtx->gameplayFrames & 1) {
  782.         effectPos.x = this->actor.world.pos.x + Rand_CenteredFloat(10.0f);
  783.         effectPos.y = this->actor.world.pos.y + Rand_CenteredFloat(10.0f);
  784.         effectPos.z = this->actor.world.pos.z + Rand_CenteredFloat(10.0f);
  785.         EffectSsKiraKira_SpawnSmall(globalCtx, &effectPos, &sEffectVelocity, &sEffectAccel, &sEffectPrimColor,
  786.                                     &sEffectEnvColor);
  787.     }
  788.  
  789.     if (this->actor.bgCheckFlags & 0x0003) {
  790.         originalVelocity = this->actor.velocity.y;
  791.         if (originalVelocity > -2.0f) {
  792.             EnItem00_SetupAction(this, func_8001DFC8);
  793.             this->actor.velocity.y = 0.0f;
  794.         } else {
  795.             this->actor.velocity.y = originalVelocity * -0.8f;
  796.             this->actor.bgCheckFlags &= ~1;
  797.         }
  798.     }
  799. }
  800.  
  801. void func_8001E304(EnItem00* this, GlobalContext* globalCtx) {
  802.     s32 pad;
  803.     Vec3f pos;
  804.     s32 rotOffset;
  805.  
  806.     this->unk_15A++;
  807.  
  808.     if (this->actor.params == ITEM00_HEART) {
  809.         if (this->actor.velocity.y < 0.0f) {
  810.             this->actor.speedXZ = 0.0f;
  811.             this->actor.gravity = -0.4f;
  812.             if (this->actor.velocity.y < -1.5f) {
  813.                 this->actor.velocity.y = -1.5f;
  814.             }
  815.             this->actor.home.rot.z += (s16)((this->actor.velocity.y + 3.0f) * 1000.0f);
  816.             this->actor.world.pos.x +=
  817.                 Math_CosS(this->actor.yawTowardsPlayer) * (-3.0f * Math_CosS(this->actor.home.rot.z));
  818.             this->actor.world.pos.z +=
  819.                 Math_SinS(this->actor.yawTowardsPlayer) * (-3.0f * Math_CosS(this->actor.home.rot.z));
  820.         }
  821.     }
  822.  
  823.     if (this->actor.params <= ITEM00_RUPEE_RED) {
  824.         this->actor.shape.rot.y += 960;
  825.     } else if ((this->actor.params >= ITEM00_SHIELD_DEKU) && (this->actor.params != ITEM00_BOMBS_SPECIAL)) {
  826.         this->actor.world.rot.x -= 700;
  827.         this->actor.shape.rot.y += 400;
  828.         this->actor.shape.rot.x = this->actor.world.rot.x - 0x4000;
  829.     }
  830.  
  831.     if (this->actor.velocity.y <= 2.0f) {
  832.         rotOffset = (u16)this->actor.shape.rot.z + 10000;
  833.         if (rotOffset < 65535) {
  834.             this->actor.shape.rot.z += 10000;
  835.         } else {
  836.             this->actor.shape.rot.z = -1;
  837.         }
  838.     }
  839.  
  840.     if (!(globalCtx->gameplayFrames & 1)) {
  841.         pos.x = this->actor.world.pos.x + (Rand_ZeroOne() - 0.5f) * 10.0f;
  842.         pos.y = this->actor.world.pos.y + (Rand_ZeroOne() - 0.5f) * 10.0f;
  843.         pos.z = this->actor.world.pos.z + (Rand_ZeroOne() - 0.5f) * 10.0f;
  844.         EffectSsKiraKira_SpawnSmall(globalCtx, &pos, &sEffectVelocity, &sEffectAccel, &sEffectPrimColor,
  845.                                     &sEffectEnvColor);
  846.     }
  847.  
  848.     if (this->actor.bgCheckFlags & 0x0003) {
  849.         EnItem00_SetupAction(this, func_8001DFC8);
  850.         this->actor.shape.rot.z = 0;
  851.         this->actor.velocity.y = 0.0f;
  852.         this->actor.speedXZ = 0.0f;
  853.     }
  854. }
  855.  
  856. void func_8001E5C8(EnItem00* this, GlobalContext* globalCtx) {
  857.     Player* player = GET_PLAYER(globalCtx);
  858.  
  859.     if (this->getItemId != GI_NONE) {
  860.         if (!Actor_HasParent(&this->actor, globalCtx)) {
  861.             func_8002F434(&this->actor, globalCtx, this->getItemId, 50.0f, 80.0f);
  862.             this->unk_15A++;
  863.         } else {
  864.             this->getItemId = GI_NONE;
  865.         }
  866.     }
  867.  
  868.     if (this->unk_15A == 0) {
  869.         Actor_Kill(&this->actor);
  870.         return;
  871.     }
  872.  
  873.     this->actor.world.pos = player->actor.world.pos;
  874.  
  875.     if (this->actor.params <= ITEM00_RUPEE_RED) {
  876.         this->actor.shape.rot.y += 960;
  877.     } else if (this->actor.params == ITEM00_HEART) {
  878.         this->actor.shape.rot.y = 0;
  879.     }
  880.  
  881.     this->actor.world.pos.y += 40.0f + Math_SinS(this->unk_15A * 15000) * (this->unk_15A * 0.3f);
  882.  
  883.     if (LINK_IS_ADULT) {
  884.         this->actor.world.pos.y += 20.0f;
  885.     }
  886. }
  887.  
  888. // The BSS in the function acted weird in the past. It is matching now but might cause issues in the future
  889. void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) {
  890.     static u32 D_80157D90;
  891.     static s16 D_80157D94[1];
  892.     s16* params;
  893.     Actor* dynaActor;
  894.     s32 getItemId = GI_NONE;
  895.     s16 sp3A = 0;
  896.     s16 i;
  897.     u32* temp;
  898.     EnItem00* this = (EnItem00*)thisx;
  899.     s32 pad;
  900.  
  901.     if (CVar_GetS32("gNewDrops", 0) !=0) { //Update 3D Model rotation on frame update :)
  902.         DroppedItemRot += 100;
  903.     }
  904.  
  905.     if (this->unk_15A > 0) {
  906.         this->unk_15A--;
  907.         if (CVar_GetS32("gDropsDontDie", 0) && (this->unk_154 <= 0)) {
  908.             this->unk_15A++;
  909.         }
  910.     }
  911.  
  912.     if ((this->unk_15A > 0) && (this->unk_15A < 41) && (this->unk_154 <= 0)) {
  913.         this->unk_156 = this->unk_15A;
  914.     }
  915.  
  916.     this->actionFunc(this, globalCtx);
  917.     Math_SmoothStepToF(&this->actor.scale.x, this->scale, 0.1f, this->scale * 0.1f, 0.0f);
  918.     temp = &D_80157D90;
  919.  
  920.     this->actor.scale.z = this->actor.scale.x;
  921.     this->actor.scale.y = this->actor.scale.x;
  922.  
  923.     if (this->actor.gravity) {
  924.         if (this->actor.bgCheckFlags & 0x0003) {
  925.             if (*temp != globalCtx->gameplayFrames) {
  926.                 D_80157D90 = globalCtx->gameplayFrames;
  927.                 D_80157D94[0] = 0;
  928.                 for (i = 0; i < 50; i++) {
  929.                     if (globalCtx->colCtx.dyna.bgActorFlags[i] & 1) {
  930.                         dynaActor = globalCtx->colCtx.dyna.bgActors[i].actor;
  931.                         if ((dynaActor != NULL) && (dynaActor->update != NULL)) {
  932.                             if ((dynaActor->world.pos.x != dynaActor->prevPos.x) ||
  933.                                 (dynaActor->world.pos.y != dynaActor->prevPos.y) ||
  934.                                 (dynaActor->world.pos.z != dynaActor->prevPos.z)) {
  935.                                 D_80157D94[0]++;
  936.                                 break;
  937.                             }
  938.                         }
  939.                     }
  940.                 }
  941.             }
  942.  
  943.         } else {
  944.             sp3A = 1;
  945.             Actor_MoveForward(&this->actor);
  946.         }
  947.  
  948.         if (sp3A || D_80157D94[0]) {
  949.             Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 10.0f, 15.0f, 15.0f, 0x1D);
  950.  
  951.             if (this->actor.floorHeight <= -10000.0f) {
  952.                 Actor_Kill(&this->actor);
  953.                 return;
  954.             }
  955.         }
  956.     }
  957.  
  958.     Collider_UpdateCylinder(&this->actor, &this->collider);
  959.     CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
  960.  
  961.     if ((this->actor.params == ITEM00_SHIELD_DEKU) || (this->actor.params == ITEM00_SHIELD_HYLIAN) ||
  962.         (this->actor.params == ITEM00_TUNIC_ZORA) || (this->actor.params == ITEM00_TUNIC_GORON)) {
  963.         this->actor.shape.yOffset = Math_CosS(this->actor.shape.rot.x) * 37.0f;
  964.         this->actor.shape.yOffset = ABS(this->actor.shape.yOffset);
  965.     }
  966.  
  967.     if (this->unk_154 > 0) {
  968.         return;
  969.     }
  970.  
  971.     if (!((this->actor.xzDistToPlayer <= 30.0f) && (this->actor.yDistToPlayer >= -50.0f) &&
  972.           (this->actor.yDistToPlayer <= 50.0f))) {
  973.         if (!Actor_HasParent(&this->actor, globalCtx)) {
  974.             return;
  975.         }
  976.     }
  977.  
  978.     if (globalCtx->gameOverCtx.state != GAMEOVER_INACTIVE) {
  979.         return;
  980.     }
  981.  
  982.     switch (this->actor.params) {
  983.         case ITEM00_RUPEE_GREEN:
  984.             Item_Give(globalCtx, ITEM_RUPEE_GREEN);
  985.             break;
  986.         case ITEM00_RUPEE_BLUE:
  987.             Item_Give(globalCtx, ITEM_RUPEE_BLUE);
  988.             break;
  989.         case ITEM00_RUPEE_RED:
  990.             Item_Give(globalCtx, ITEM_RUPEE_RED);
  991.             break;
  992.         case ITEM00_RUPEE_PURPLE:
  993.             Item_Give(globalCtx, ITEM_RUPEE_PURPLE);
  994.             break;
  995.         case ITEM00_RUPEE_ORANGE:
  996.             Item_Give(globalCtx, ITEM_RUPEE_GOLD);
  997.             break;
  998.         case ITEM00_STICK:
  999.             getItemId = GI_STICKS_1;
  1000.             break;
  1001.         case ITEM00_NUTS:
  1002.             getItemId = GI_NUTS_5;
  1003.             break;
  1004.         case ITEM00_HEART:
  1005.             Item_Give(globalCtx, ITEM_HEART);
  1006.             break;
  1007.         case ITEM00_FLEXIBLE:
  1008.             Health_ChangeBy(globalCtx, 0x70);
  1009.             break;
  1010.         case ITEM00_BOMBS_A:
  1011.         case ITEM00_BOMBS_B:
  1012.             Item_Give(globalCtx, ITEM_BOMBS_5);
  1013.             break;
  1014.         case ITEM00_ARROWS_SINGLE:
  1015.             Item_Give(globalCtx, ITEM_BOW);
  1016.             break;
  1017.         case ITEM00_ARROWS_SMALL:
  1018.             Item_Give(globalCtx, ITEM_ARROWS_SMALL);
  1019.             break;
  1020.         case ITEM00_ARROWS_MEDIUM:
  1021.             Item_Give(globalCtx, ITEM_ARROWS_MEDIUM);
  1022.             break;
  1023.         case ITEM00_ARROWS_LARGE:
  1024.             Item_Give(globalCtx, ITEM_ARROWS_LARGE);
  1025.             break;
  1026.         case ITEM00_SEEDS:
  1027.             getItemId = GI_SEEDS_5;
  1028.             break;
  1029.         case ITEM00_SMALL_KEY:
  1030.             getItemId = GI_KEY_SMALL;
  1031.             break;
  1032.         case ITEM00_HEART_PIECE:
  1033.             getItemId = GI_HEART_PIECE;
  1034.             break;
  1035.         case ITEM00_HEART_CONTAINER:
  1036.             getItemId = GI_HEART_CONTAINER;
  1037.             break;
  1038.         case ITEM00_MAGIC_LARGE:
  1039.             getItemId = GI_MAGIC_LARGE;
  1040.             break;
  1041.         case ITEM00_MAGIC_SMALL:
  1042.             getItemId = GI_MAGIC_SMALL;
  1043.             break;
  1044.         case ITEM00_SHIELD_DEKU:
  1045.             getItemId = GI_SHIELD_DEKU;
  1046.             break;
  1047.         case ITEM00_SHIELD_HYLIAN:
  1048.             getItemId = GI_SHIELD_HYLIAN;
  1049.             break;
  1050.         case ITEM00_TUNIC_ZORA:
  1051.             getItemId = GI_TUNIC_ZORA;
  1052.             break;
  1053.         case ITEM00_TUNIC_GORON:
  1054.             getItemId = GI_TUNIC_GORON;
  1055.             break;
  1056.         case ITEM00_BOMBS_SPECIAL:
  1057.             break;
  1058.     }
  1059.  
  1060.     params = &this->actor.params;
  1061.  
  1062.     if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) {
  1063.         if (gSaveContext.n64ddFlag) {
  1064.             getItemId = GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum);
  1065.         }
  1066.         func_8002F554(&this->actor, globalCtx, getItemId);
  1067.     }
  1068.  
  1069.     switch (*params) {
  1070.         case ITEM00_HEART_PIECE:
  1071.         case ITEM00_HEART_CONTAINER:
  1072.         case ITEM00_SMALL_KEY:
  1073.         case ITEM00_SHIELD_DEKU:
  1074.         case ITEM00_SHIELD_HYLIAN:
  1075.         case ITEM00_TUNIC_ZORA:
  1076.         case ITEM00_TUNIC_GORON:
  1077.             if (Actor_HasParent(&this->actor, globalCtx)) {
  1078.                 Flags_SetCollectible(globalCtx, this->collectibleFlag);
  1079.                 Actor_Kill(&this->actor);
  1080.             }
  1081.             return;
  1082.     }
  1083.  
  1084.     if ((*params <= ITEM00_RUPEE_RED) || (*params == ITEM00_RUPEE_ORANGE)) {
  1085.         Audio_PlaySoundGeneral(NA_SE_SY_GET_RUPY, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
  1086.     } else if (getItemId != GI_NONE) {
  1087.         if (Actor_HasParent(&this->actor, globalCtx)) {
  1088.             Flags_SetCollectible(globalCtx, this->collectibleFlag);
  1089.             Actor_Kill(&this->actor);
  1090.         }
  1091.         return;
  1092.     } else {
  1093.         Audio_PlaySoundGeneral(NA_SE_SY_GET_ITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
  1094.     }
  1095.  
  1096.     Flags_SetCollectible(globalCtx, this->collectibleFlag);
  1097.  
  1098.     this->unk_15A = 15;
  1099.     this->unk_154 = 35;
  1100.     this->actor.shape.rot.z = 0;
  1101.     this->actor.speedXZ = 0;
  1102.     this->actor.velocity.y = 0;
  1103.     this->actor.gravity = 0;
  1104.  
  1105.     Actor_SetScale(&this->actor, this->scale);
  1106.  
  1107.     this->getItemId = GI_NONE;
  1108.     EnItem00_SetupAction(this, func_8001E5C8);
  1109. }
  1110.  
  1111. void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) {
  1112.     EnItem00* this = (EnItem00*)thisx;
  1113.     f32 mtxScale;
  1114.  
  1115.     if (!(this->unk_156 & this->unk_158)) {
  1116.         switch (this->actor.params) {
  1117.             case ITEM00_RUPEE_GREEN:
  1118.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1119.                     GetItem_Draw(globalCtx, GID_RUPEE_GREEN);
  1120.                     break;
  1121.                 }
  1122.             case ITEM00_RUPEE_BLUE:
  1123.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1124.                     GetItem_Draw(globalCtx, GID_RUPEE_BLUE);
  1125.                     break;
  1126.                 }
  1127.             case ITEM00_RUPEE_RED:
  1128.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1129.                     GetItem_Draw(globalCtx, GID_RUPEE_RED);
  1130.                     break;
  1131.                 }
  1132.             case ITEM00_RUPEE_ORANGE:
  1133.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1134.                     GetItem_Draw(globalCtx, GID_RUPEE_GOLD);
  1135.                     break;
  1136.                 }
  1137.             case ITEM00_RUPEE_PURPLE:
  1138.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1139.                     GetItem_Draw(globalCtx, GID_RUPEE_PURPLE);
  1140.                 } else {
  1141.                     EnItem00_DrawRupee(this, globalCtx);
  1142.                 }
  1143.                 break;
  1144.             case ITEM00_HEART_PIECE:
  1145.                 EnItem00_DrawHeartPiece(this, globalCtx);
  1146.                 break;
  1147.             case ITEM00_HEART_CONTAINER:
  1148.                 EnItem00_DrawHeartContainer(this, globalCtx);
  1149.                 break;
  1150.             case ITEM00_HEART:
  1151.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1152.                     GetItem_Draw(globalCtx, GID_HEART);
  1153.                     mtxScale = 16.0f;
  1154.                     Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
  1155.                     break;
  1156.                 } else {
  1157.                     if (this->unk_15A < 0) {
  1158.                         if (this->unk_15A == -1) {
  1159.                             s8 bankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_HEART);
  1160.  
  1161.                             if (Object_IsLoaded(&globalCtx->objectCtx, bankIndex)) {
  1162.                                 this->actor.objBankIndex = bankIndex;
  1163.                                 Actor_SetObjectDependency(globalCtx, &this->actor);
  1164.                                 this->unk_15A = -2;
  1165.                             }
  1166.                         } else {
  1167.                             mtxScale = 16.0f;
  1168.                             Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
  1169.                             GetItem_Draw(globalCtx, GID_HEART);
  1170.                         }
  1171.                         break;
  1172.                     }
  1173.                 }
  1174.             case ITEM00_BOMBS_A:
  1175.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1176.                     GetItem_Draw(globalCtx, GID_BOMB);
  1177.                     break;
  1178.                 }
  1179.             case ITEM00_BOMBS_B:
  1180.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1181.                     GetItem_Draw(globalCtx, GID_BOMB);
  1182.                     break;
  1183.                 }
  1184.             case ITEM00_BOMBS_SPECIAL:
  1185.             case ITEM00_ARROWS_SINGLE:
  1186.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1187.                     GetItem_Draw(globalCtx, GID_ARROWS_SMALL);
  1188.                     break;
  1189.                 }
  1190.             case ITEM00_ARROWS_SMALL:
  1191.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1192.                     GetItem_Draw(globalCtx, GID_ARROWS_SMALL);
  1193.                     break;
  1194.                 }
  1195.             case ITEM00_ARROWS_MEDIUM:
  1196.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1197.                     GetItem_Draw(globalCtx, GID_ARROWS_MEDIUM);
  1198.                     break;
  1199.                 }
  1200.             case ITEM00_ARROWS_LARGE:
  1201.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1202.                     GetItem_Draw(globalCtx, GID_ARROWS_LARGE);
  1203.                     break;
  1204.                 }
  1205.             case ITEM00_NUTS:
  1206.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1207.                     GetItem_Draw(globalCtx, GID_NUTS);
  1208.                     break;
  1209.                 }
  1210.             case ITEM00_STICK:
  1211.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1212.                     GetItem_Draw(globalCtx, GID_STICK);
  1213.                     break;
  1214.                 }
  1215.             case ITEM00_MAGIC_LARGE:
  1216.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1217.                     GetItem_Draw(globalCtx, GID_MAGIC_LARGE);
  1218.                     break;
  1219.                 }
  1220.             case ITEM00_MAGIC_SMALL:
  1221.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1222.                     GetItem_Draw(globalCtx, GID_MAGIC_SMALL);
  1223.                     break;
  1224.                 }
  1225.             case ITEM00_SEEDS:
  1226.                 if (CVar_GetS32("gNewDrops", 0) != 0) {
  1227.                     GetItem_Draw(globalCtx, GID_SEEDS);
  1228.                     break;
  1229.                 }
  1230.             case ITEM00_SMALL_KEY:
  1231.                 EnItem00_DrawCollectible(this, globalCtx);
  1232.                 break;
  1233.             case ITEM00_SHIELD_DEKU:
  1234.                 GetItem_Draw(globalCtx, GID_SHIELD_DEKU);
  1235.                 break;
  1236.             case ITEM00_SHIELD_HYLIAN:
  1237.                 GetItem_Draw(globalCtx, GID_SHIELD_HYLIAN);
  1238.                 break;
  1239.             case ITEM00_TUNIC_ZORA:
  1240.                 GetItem_Draw(globalCtx, GID_TUNIC_ZORA);
  1241.                 break;
  1242.             case ITEM00_TUNIC_GORON:
  1243.                 GetItem_Draw(globalCtx, GID_TUNIC_GORON);
  1244.                 break;
  1245.             case ITEM00_FLEXIBLE:
  1246.                 break;
  1247.         }
  1248.     }
  1249. }
  1250.  
  1251. void EnItem00_NotesParticles(Actor* Parent, GlobalContext* globalCtx, s16 getItemId){
  1252.     printf("getItemId[%s]\n",getItemId);
  1253.     if (getItemId == GI_MINUET_OF_FOREST || getItemId == GI_BOLERO_OF_FIRE || getItemId == GI_SERENADE_OF_WATER || getItemId == GI_REQUIEM_OF_SPIRIT || getItemId == GI_NOCTURNE_OF_SHADOW || getItemId == GI_PRELUDE_OF_LIGHT ) {
  1254.         s16 color_slot = getItemId-2;
  1255.         s16* colors[6][3] = {
  1256.             {255,255,255},  //Minuet Color
  1257.             {109, 73,143},  //Bolero Color
  1258.             {217,110, 48},  //Serenade Color
  1259.             { 62,109, 23},  //Requiem Color
  1260.             {237,231, 62},  //Nocturne Color
  1261.             { 98,177,211}  //Prelude Color
  1262.         };
  1263.         static Vec3f velocity = { 0.0f, 0.2f, 0.0f };
  1264.         static Vec3f accel = { 0.0f, 0.05f, 0.0f };
  1265.         Color_RGBA8 primColor = { colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 0 };
  1266.         Color_RGBA8 envColor = { colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 0 }; //Tu peux sois faire un deuxieme array avec les Env sois faire des math dedans
  1267.         Vec3f pos;
  1268.  
  1269.         velocity.x = Rand_CenteredFloat(3.0f);
  1270.         velocity.z = Rand_CenteredFloat(3.0f);
  1271.         velocity.y = -0.05f;
  1272.         accel.y = -0.025f;
  1273.         pos.x = Rand_CenteredFloat(12.0f) + Parent->world.pos.x;
  1274.         pos.y = (Rand_ZeroOne() * 6.0f) + Parent->world.pos.y;
  1275.         pos.z = Rand_CenteredFloat(12.0f) + Parent->world.pos.z;
  1276.         EffectSsKiraKira_SpawnDispersed(globalCtx, &pos, &velocity, &accel, &primColor, &envColor, 5000, 16);
  1277.     }    
  1278. }
  1279.  
  1280. /**
  1281.  * Draw Function used for Rupee types of En_Item00.
  1282.  */
  1283. void EnItem00_DrawRupee(EnItem00* this, GlobalContext* globalCtx) {
  1284.     s32 pad;
  1285.     s32 texIndex;
  1286.  
  1287.     OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1546);
  1288.  
  1289.     func_80093D18(globalCtx->state.gfxCtx);
  1290.     func_8002EBCC(&this->actor, globalCtx, 0);
  1291.  
  1292.     if (this->actor.params <= ITEM00_RUPEE_RED) {
  1293.         texIndex = this->actor.params;
  1294.     } else {
  1295.         texIndex = this->actor.params - 0x10;
  1296.     }
  1297.  
  1298.     gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1562),
  1299.               G_MTX_MODELVIEW | G_MTX_LOAD);
  1300.  
  1301.     gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sRupeeTex[texIndex]));
  1302.  
  1303.     gSPDisplayList(POLY_OPA_DISP++, gRupeeDL);
  1304.  
  1305.     CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1568);
  1306. }
  1307.  
  1308. /**
  1309.  * Draw Function used for most collectible types of En_Item00 (ammo, bombs, sticks, nuts, magic...).
  1310.  */
  1311. void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) {
  1312.     if ((gSaveContext.n64ddFlag && this->getItemId != GI_NONE) || this->actor.params == ITEM00_SMALL_KEY) {
  1313.         f32 mtxScale = 16.0f;
  1314.         Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
  1315.         EnItem00_NotesParticles(&this->actor, globalCtx,this->getItemId);
  1316.         GetItem_Draw(globalCtx, GetItemModelFromId(GetRandomizedItemId(this->getItemId, this->actor.id, this->ogParams,
  1317.                                                                        globalCtx->sceneNum)));
  1318.     } else {
  1319.         s32 texIndex = this->actor.params - 3;
  1320.  
  1321.         OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1594);
  1322.  
  1323.         POLY_OPA_DISP = Gameplay_SetFog(globalCtx, POLY_OPA_DISP);
  1324.  
  1325.         if (this->actor.params == ITEM00_BOMBS_SPECIAL) {
  1326.             texIndex = 1;
  1327.         } else if (this->actor.params >= ITEM00_ARROWS_SMALL) {
  1328.             texIndex -= 3;
  1329.         }
  1330.  
  1331.         POLY_OPA_DISP = func_800946E4(POLY_OPA_DISP);
  1332.  
  1333.         gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sItemDropTex[texIndex]));
  1334.  
  1335.         gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1607),
  1336.                   G_MTX_MODELVIEW | G_MTX_LOAD);
  1337.         gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
  1338.  
  1339.         CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1611);
  1340.     }
  1341. }
  1342.  
  1343. /**
  1344.  * Draw Function used for the Heart Container type of En_Item00.
  1345.  */
  1346. void EnItem00_DrawHeartContainer(EnItem00* this, GlobalContext* globalCtx) {
  1347.     s32 pad;
  1348.  
  1349.     OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1623);
  1350.  
  1351.     func_80093D18(globalCtx->state.gfxCtx);
  1352.     func_8002EBCC(&this->actor, globalCtx, 0);
  1353.     gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1634),
  1354.               G_MTX_MODELVIEW | G_MTX_LOAD);
  1355.     gSPDisplayList(POLY_OPA_DISP++, gHeartPieceExteriorDL);
  1356.  
  1357.     func_80093D84(globalCtx->state.gfxCtx);
  1358.     func_8002ED80(&this->actor, globalCtx, 0);
  1359.     gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1644),
  1360.               G_MTX_MODELVIEW | G_MTX_LOAD);
  1361.     gSPDisplayList(POLY_XLU_DISP++, gHeartContainerInteriorDL);
  1362.  
  1363.     CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1647);
  1364. }
  1365.  
  1366. /**
  1367.  * Draw Function used for the Piece of Heart type of En_Item00.
  1368.  */
  1369. void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) {
  1370.     if (gSaveContext.n64ddFlag) {
  1371.         f32 mtxScale = 16.0f;
  1372.         Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
  1373.         EnItem00_NotesParticles(&this->actor, globalCtx, this->getItemId);
  1374.         GetItem_Draw(globalCtx, GetItemModelFromId(GetRandomizedItemId(this->getItemId, this->actor.id, this->ogParams,
  1375.                                                                        globalCtx->sceneNum)));
  1376.     } else {
  1377.         s32 pad;
  1378.  
  1379.         OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1658);
  1380.  
  1381.         func_80093D84(globalCtx->state.gfxCtx);
  1382.         func_8002ED80(&this->actor, globalCtx, 0);
  1383.         gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1670),
  1384.                   G_MTX_MODELVIEW | G_MTX_LOAD);
  1385.  
  1386.         gSPDisplayList(POLY_XLU_DISP++, gHeartPieceInteriorDL);
  1387.  
  1388.         CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1673);
  1389.     }
  1390. }
  1391.  
  1392. /**
  1393.  * Converts a given drop type ID based on link's current age, health and owned items.
  1394.  * Returns a new drop type ID or -1 to cancel the drop.
  1395.  */
  1396. s16 func_8001F404(s16 dropId) {
  1397.     if (LINK_IS_ADULT) {
  1398.         if (dropId == ITEM00_SEEDS) {
  1399.             dropId = ITEM00_ARROWS_SMALL;
  1400.         } else if (dropId == ITEM00_STICK) {
  1401.             dropId = ITEM00_RUPEE_GREEN;
  1402.         }
  1403.     } else {
  1404.         if (dropId == ITEM00_ARROWS_SMALL || dropId == ITEM00_ARROWS_MEDIUM || dropId == ITEM00_ARROWS_LARGE) {
  1405.             dropId = ITEM00_SEEDS;
  1406.         }
  1407.     }
  1408.  
  1409.     // This is convoluted but it seems like it must be a single condition to match
  1410.     // clang-format off
  1411.     if (((dropId == ITEM00_BOMBS_A      || dropId == ITEM00_BOMBS_SPECIAL || dropId == ITEM00_BOMBS_B)      && INV_CONTENT(ITEM_BOMB) == ITEM_NONE) ||
  1412.         ((dropId == ITEM00_ARROWS_SMALL || dropId == ITEM00_ARROWS_MEDIUM || dropId == ITEM00_ARROWS_LARGE) && INV_CONTENT(ITEM_BOW) == ITEM_NONE) ||
  1413.         ((dropId == ITEM00_MAGIC_LARGE  || dropId == ITEM00_MAGIC_SMALL)                                    && gSaveContext.magicLevel == 0) ||
  1414.         ((dropId == ITEM00_SEEDS)                                                                           && INV_CONTENT(ITEM_SLINGSHOT) == ITEM_NONE)) {
  1415.         return -1;
  1416.     }
  1417.     // clang-format on
  1418.  
  1419.     if (dropId == ITEM00_HEART && gSaveContext.healthCapacity == gSaveContext.health) {
  1420.         return ITEM00_RUPEE_GREEN;
  1421.     }
  1422.  
  1423.     return dropId;
  1424. }
  1425.  
  1426. // External functions used by other actors to drop collectibles, which usually results in spawning an En_Item00 actor.
  1427.  
  1428. EnItem00* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, s16 params) {
  1429.     s32 pad[2];
  1430.     EnItem00* spawnedActor = NULL;
  1431.     s16 param4000 = params & 0x4000;
  1432.     s16 param8000 = params & 0x8000;
  1433.     s16 param3F00 = params & 0x3F00;
  1434.  
  1435.     params &= 0x3FFF;
  1436.  
  1437.     if (((params & 0x00FF) == ITEM00_FLEXIBLE) && !param4000) {
  1438.         // TODO: Prevent the cast to EnItem00 here since this is a different actor (En_Elf)
  1439.         spawnedActor = (EnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x,
  1440.                                               spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, FAIRY_HEAL_TIMED);
  1441.         EffectSsDeadSound_SpawnStationary(globalCtx, spawnPos, NA_SE_EV_BUTTERFRY_TO_FAIRY, true,
  1442.                                           DEADSOUND_REPEAT_MODE_OFF, 40);
  1443.     } else {
  1444.         if (!param8000) {
  1445.             params = func_8001F404(params & 0x00FF);
  1446.         }
  1447.  
  1448.         if (params != -1) {
  1449.             spawnedActor = (EnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, spawnPos->x,
  1450.                                                   spawnPos->y, spawnPos->z, 0, 0, 0, params | param8000 | param3F00);
  1451.             if ((spawnedActor != NULL) && !param8000) {
  1452.                 spawnedActor->actor.velocity.y = !param4000 ? 8.0f : -2.0f;
  1453.                 spawnedActor->actor.speedXZ = 2.0f;
  1454.                 spawnedActor->actor.gravity = -0.9f;
  1455.                 spawnedActor->actor.world.rot.y = Rand_CenteredFloat(65536.0f);
  1456.                 Actor_SetScale(&spawnedActor->actor, 0.0f);
  1457.                 EnItem00_SetupAction(spawnedActor, func_8001E304);
  1458.                 spawnedActor->unk_15A = 220;
  1459.                 if ((spawnedActor->actor.params != ITEM00_SMALL_KEY) &&
  1460.                     (spawnedActor->actor.params != ITEM00_HEART_PIECE) &&
  1461.                     (spawnedActor->actor.params != ITEM00_HEART_CONTAINER)) {
  1462.                     spawnedActor->actor.room = -1;
  1463.                 }
  1464.                 spawnedActor->actor.flags |= ACTOR_FLAG_4;
  1465.             }
  1466.         }
  1467.     }
  1468.     return spawnedActor;
  1469. }
  1470.  
  1471. EnItem00* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, s16 params) {
  1472.     EnItem00* spawnedActor = NULL;
  1473.     s32 pad;
  1474.     s16 param4000 = params & 0x4000;
  1475.     s16 param8000 = params & 0x8000;
  1476.     s16 param3F00 = params & 0x3F00;
  1477.  
  1478.     params &= 0x3FFF;
  1479.  
  1480.     if (((params & 0x00FF) == ITEM00_FLEXIBLE) && !param4000) {
  1481.         // TODO: Prevent the cast to EnItem00 here since this is a different actor (En_Elf)
  1482.         spawnedActor = (EnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x,
  1483.                                               spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, FAIRY_HEAL_TIMED);
  1484.         EffectSsDeadSound_SpawnStationary(globalCtx, spawnPos, NA_SE_EV_BUTTERFRY_TO_FAIRY, true,
  1485.                                           DEADSOUND_REPEAT_MODE_OFF, 40);
  1486.     } else {
  1487.         params = func_8001F404(params & 0x00FF);
  1488.         if (params != -1) {
  1489.             spawnedActor = (EnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, spawnPos->x,
  1490.                                                   spawnPos->y, spawnPos->z, 0, 0, 0, params | param8000 | param3F00);
  1491.             if ((spawnedActor != NULL) && !param8000) {
  1492.                 spawnedActor->actor.velocity.y = 0.0f;
  1493.                 spawnedActor->actor.speedXZ = 0.0f;
  1494.                 spawnedActor->actor.gravity = param4000 ? 0.0f : -0.9f;
  1495.                 spawnedActor->actor.world.rot.y = Rand_CenteredFloat(65536.0f);
  1496.                 spawnedActor->actor.flags |= ACTOR_FLAG_4;
  1497.             }
  1498.         }
  1499.     }
  1500.  
  1501.     return spawnedActor;
  1502. }
  1503.  
  1504. void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3f* spawnPos, s16 params) {
  1505.     s32 pad;
  1506.     EnItem00* spawnedActor;
  1507.     s16 dropQuantity;
  1508.     s16 param8000;
  1509.     s16 dropTableIndex = Rand_ZeroOne() * 16.0f;
  1510.     u8 dropId;
  1511.  
  1512.     param8000 = params & 0x8000;
  1513.     params &= 0x7FFF;
  1514.  
  1515.     if (fromActor != NULL) {
  1516.         if (fromActor->dropFlag) {
  1517.             if (fromActor->dropFlag & 0x01) {
  1518.                 params = 1 * 0x10;
  1519.                 dropTableIndex = 11;
  1520.             } else if (fromActor->dropFlag & 0x02) {
  1521.                 params = 1 * 0x10;
  1522.                 dropTableIndex = 6;
  1523.             } else if (fromActor->dropFlag & 0x04) {
  1524.                 params = 6 * 0x10;
  1525.                 dropTableIndex = 9;
  1526.             } else if (fromActor->dropFlag & 0x08) {
  1527.                 params = 3 * 0x10;
  1528.                 dropTableIndex = 11;
  1529.             } else if (fromActor->dropFlag & 0x10) {
  1530.                 params = 6 * 0x10;
  1531.                 dropTableIndex = 12;
  1532.             } else if (fromActor->dropFlag & 0x20) {
  1533.                 params = 0 * 0x10;
  1534.                 dropTableIndex = 0;
  1535.             } else if (fromActor->dropFlag & 0x40) {
  1536.                 params = 0 * 0x10;
  1537.                 dropTableIndex = 1;
  1538.             }
  1539.         }
  1540.         if (fromActor->dropFlag & 0x20) {
  1541.             dropId = ITEM00_RUPEE_PURPLE;
  1542.         } else {
  1543.             dropId = sItemDropIds[params + dropTableIndex];
  1544.         }
  1545.     } else {
  1546.         dropId = sItemDropIds[params + dropTableIndex];
  1547.     }
  1548.  
  1549.     if (dropId == ITEM00_FLEXIBLE) {
  1550.         if (gSaveContext.health <= 0x10) { // 1 heart or less
  1551.             Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0,
  1552.                         0, 0, FAIRY_HEAL_TIMED);
  1553.             EffectSsDeadSound_SpawnStationary(globalCtx, spawnPos, NA_SE_EV_BUTTERFRY_TO_FAIRY, true,
  1554.                                               DEADSOUND_REPEAT_MODE_OFF, 40);
  1555.             return;
  1556.         } else if (gSaveContext.health <= 0x30) { // 3 hearts or less
  1557.             params = 0xB * 0x10;
  1558.             dropTableIndex = 0x0;
  1559.             dropId = ITEM00_HEART;
  1560.         } else if (gSaveContext.health <= 0x50) { // 5 hearts or less
  1561.             params = 0xA * 0x10;
  1562.             dropTableIndex = 0x0;
  1563.             dropId = ITEM00_HEART;
  1564.         } else if ((gSaveContext.magicLevel != 0) && (gSaveContext.magic == 0)) { // Empty magic meter
  1565.             params = 0xA * 0x10;
  1566.             dropTableIndex = 0x0;
  1567.             dropId = ITEM00_MAGIC_LARGE;
  1568.         } else if ((gSaveContext.magicLevel != 0) && (gSaveContext.magic <= (gSaveContext.magicLevel >> 1))) {
  1569.             params = 0xA * 0x10;
  1570.             dropTableIndex = 0x0;
  1571.             dropId = ITEM00_MAGIC_SMALL;
  1572.         } else if (!LINK_IS_ADULT && (AMMO(ITEM_SLINGSHOT) < 6)) {
  1573.             params = 0xA * 0x10;
  1574.             dropTableIndex = 0x0;
  1575.             dropId = ITEM00_SEEDS;
  1576.         } else if (LINK_IS_ADULT && (AMMO(ITEM_BOW) < 6)) {
  1577.             params = 0xA * 0x10;
  1578.             dropTableIndex = 0x0;
  1579.             dropId = ITEM00_ARROWS_MEDIUM;
  1580.         } else if (AMMO(ITEM_BOMB) < 6) {
  1581.             params = 0xD * 0x10;
  1582.             dropTableIndex = 0x0;
  1583.             dropId = ITEM00_BOMBS_A;
  1584.         } else if (gSaveContext.rupees < 11) {
  1585.             params = 0xA * 0x10;
  1586.             dropTableIndex = 0x0;
  1587.             dropId = ITEM00_RUPEE_RED;
  1588.         } else {
  1589.             return;
  1590.         }
  1591.     }
  1592.  
  1593.     if (dropId != 0xFF) {
  1594.         dropQuantity = sDropQuantities[params + dropTableIndex];
  1595.         while (dropQuantity > 0) {
  1596.             if (!param8000) {
  1597.                 dropId = func_8001F404(dropId);
  1598.                 if (dropId != 0xFF) {
  1599.                     spawnedActor = (EnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, spawnPos->x,
  1600.                                                           spawnPos->y, spawnPos->z, 0, 0, 0, dropId);
  1601.                     if ((spawnedActor != NULL) && (dropId != 0xFF)) {
  1602.                         spawnedActor->actor.velocity.y = 8.0f;
  1603.                         spawnedActor->actor.speedXZ = 2.0f;
  1604.                         spawnedActor->actor.gravity = -0.9f;
  1605.                         spawnedActor->actor.world.rot.y = Rand_ZeroOne() * 40000.0f;
  1606.                         Actor_SetScale(&spawnedActor->actor, 0.0f);
  1607.                         EnItem00_SetupAction(spawnedActor, func_8001E304);
  1608.                         spawnedActor->actor.flags |= ACTOR_FLAG_4;
  1609.                         if ((spawnedActor->actor.params != ITEM00_SMALL_KEY) &&
  1610.                             (spawnedActor->actor.params != ITEM00_HEART_PIECE) &&
  1611.                             (spawnedActor->actor.params != ITEM00_HEART_CONTAINER)) {
  1612.                             spawnedActor->actor.room = -1;
  1613.                         }
  1614.                         spawnedActor->unk_15A = 220;
  1615.                     }
  1616.                 }
  1617.             } else {
  1618.                 Item_DropCollectible(globalCtx, spawnPos, params | 0x8000);
  1619.             }
  1620.             dropQuantity--;
  1621.         }
  1622.     }
  1623. }
  1624.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement