Merge pull request #8 from MelonSpeedruns/testing-out-item-replacement-melon

This commit is contained in:
briaguya 2022-05-28 18:22:26 -04:00 committed by GitHub
commit 3178a547b7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 166 additions and 10 deletions

View file

@ -289,6 +289,7 @@ typedef struct EnItem00 {
/* 0x15A */ s16 unk_15A; /* 0x15A */ s16 unk_15A;
/* 0x15C */ f32 scale; /* 0x15C */ f32 scale;
/* 0x160 */ ColliderCylinder collider; /* 0x160 */ ColliderCylinder collider;
s16 ogParams;
} EnItem00; // size = 0x1AC } EnItem00; // size = 0x1AC
// Only A_OBJ_SIGNPOST_OBLONG and A_OBJ_SIGNPOST_ARROW are used in room files. // Only A_OBJ_SIGNPOST_OBLONG and A_OBJ_SIGNPOST_ARROW are used in room files.

View file

@ -3,6 +3,9 @@
#include <fstream> #include <fstream>
#include <variables.h> #include <variables.h>
#include <macros.h> #include <macros.h>
#include <objects/gameplay_keep/gameplay_keep.h>
#include <objects/object_gi_bomb_1/object_gi_bomb_1.h>
#include <objects/object_gi_letter/object_gi_letter.h>
using json = nlohmann::json; using json = nlohmann::json;
@ -282,6 +285,135 @@ std::unordered_map<std::string, RandomizerCheck> SpoilerfileCheckNameToEnum = {
{"Ganons Tower Boss Key Chest", GANONS_TOWER_BOSS_KEY_CHEST} {"Ganons Tower Boss Key Chest", GANONS_TOWER_BOSS_KEY_CHEST}
}; };
std::unordered_map<s16, s16> itemIdToModel = { { GI_NONE, GID_MAX },
{ GI_BOMBS_5, GID_BOMB },
{ GI_NUTS_5, GID_NUTS },
{ GI_BOMBCHUS_10, GID_BOMBCHU },
{ GI_BOW, GID_BOW },
{ GI_SLINGSHOT, GID_SLINGSHOT },
{ GI_BOOMERANG, GID_BOOMERANG },
{ GI_STICKS_1, GID_STICK },
{ GI_HOOKSHOT, GID_HOOKSHOT },
{ GI_LONGSHOT, GID_LONGSHOT },
{ GI_LENS, GID_LENS },
{ GI_LETTER_ZELDA, GID_LETTER_ZELDA },
{ GI_OCARINA_OOT, GID_OCARINA_TIME },
{ GI_HAMMER, GID_HAMMER },
{ GI_COJIRO, GID_COJIRO },
{ GI_LETTER_RUTO, GID_LETTER_RUTO },
{ GI_LETTER_RUTO, GID_LETTER_RUTO },
{ GI_BOTTLE, GID_BOTTLE },
{ GI_POTION_RED, GID_POTION_RED },
{ GI_POTION_GREEN, GID_POTION_GREEN },
{ GI_POTION_BLUE, GID_POTION_BLUE },
{ GI_FAIRY, GID_FAIRY },
{ GI_MILK_BOTTLE, GID_MILK },
{ GI_LETTER_RUTO, GID_LETTER_RUTO },
{ GI_BEAN, GID_BEAN },
{ GI_MASK_SKULL, GID_MASK_SKULL },
{ GI_MASK_SPOOKY, GID_MASK_SPOOKY },
{ GI_CHICKEN, GID_CHICKEN },
{ GI_MASK_KEATON, GID_MASK_KEATON },
{ GI_MASK_BUNNY, GID_MASK_BUNNY },
{ GI_MASK_TRUTH, GID_MASK_TRUTH },
{ GI_POCKET_EGG, GID_EGG },
{ GI_POCKET_CUCCO, GID_CHICKEN },
{ GI_ODD_MUSHROOM, GID_ODD_MUSHROOM },
{ GI_ODD_POTION, GID_ODD_POTION },
{ GI_SAW, GID_SAW },
{ GI_SWORD_BROKEN, GID_SWORD_BROKEN },
{ GI_PRESCRIPTION, GID_PRESCRIPTION },
{ GI_FROG, GID_FROG },
{ GI_EYEDROPS, GID_EYEDROPS },
{ GI_CLAIM_CHECK, GID_CLAIM_CHECK },
{ GI_SWORD_KOKIRI, GID_SWORD_KOKIRI },
{ GI_SWORD_KNIFE, GID_SWORD_BGS },
{ GI_SHIELD_DEKU, GID_SHIELD_DEKU },
{ GI_SHIELD_HYLIAN, GID_SHIELD_HYLIAN },
{ GI_SHIELD_MIRROR, GID_SHIELD_MIRROR },
{ GI_TUNIC_GORON, GID_TUNIC_GORON },
{ GI_TUNIC_ZORA, GID_TUNIC_ZORA },
{ GI_BOOTS_IRON, GID_BOOTS_IRON },
{ GI_BOOTS_HOVER, GID_BOOTS_HOVER },
{ GI_QUIVER_40, GID_QUIVER_40 },
{ GI_QUIVER_50, GID_QUIVER_50 },
{ GI_BOMB_BAG_20, GID_BOMB_BAG_20 },
{ GI_BOMB_BAG_30, GID_BOMB_BAG_30 },
{ GI_BOMB_BAG_40, GID_BOMB_BAG_40 },
{ GI_GAUNTLETS_SILVER, GID_GAUNTLETS_SILVER },
{ GI_GAUNTLETS_GOLD, GID_GAUNTLETS_GOLD },
{ GI_SCALE_SILVER, GID_SCALE_SILVER },
{ GI_SCALE_GOLD, GID_SCALE_GOLDEN },
{ GI_STONE_OF_AGONY, GID_STONE_OF_AGONY },
{ GI_GERUDO_CARD, GID_GERUDO_CARD },
{ GI_OCARINA_FAIRY, GID_OCARINA_FAIRY },
{ GI_SEEDS_5, GID_SEEDS },
{ GI_HEART_CONTAINER, GID_HEART_CONTAINER },
{ GI_HEART_PIECE, GID_HEART_PIECE },
{ GI_KEY_BOSS, GID_KEY_BOSS },
{ GI_COMPASS, GID_COMPASS },
{ GI_MAP, GID_DUNGEON_MAP },
{ GI_KEY_SMALL, GID_KEY_SMALL },
{ GI_MAGIC_SMALL, GID_MAGIC_SMALL },
{ GI_MAGIC_LARGE, GID_MAGIC_LARGE },
{ GI_WALLET_ADULT, GID_WALLET_ADULT },
{ GI_WALLET_GIANT, GID_WALLET_GIANT },
{ GI_WEIRD_EGG, GID_EGG },
{ GI_HEART, GID_HEART },
{ GI_ARROWS_SMALL, GID_ARROWS_SMALL },
{ GI_ARROWS_MEDIUM, GID_ARROWS_MEDIUM },
{ GI_ARROWS_LARGE, GID_ARROWS_LARGE },
{ GI_RUPEE_GREEN, GID_RUPEE_GREEN },
{ GI_RUPEE_BLUE, GID_RUPEE_BLUE },
{ GI_RUPEE_RED, GID_RUPEE_RED },
{ GI_HEART_CONTAINER_2, GI_HEART_CONTAINER_2 },
{ GI_MILK, GID_MILK },
{ GI_MASK_GORON, GID_MASK_GORON },
{ GI_MASK_ZORA, GID_MASK_ZORA },
{ GI_MASK_GERUDO, GID_MASK_GERUDO },
{ GI_BRACELET, GID_BRACELET },
{ GI_RUPEE_PURPLE, GID_RUPEE_PURPLE },
{ GI_RUPEE_GOLD, GID_RUPEE_GOLD },
{ GI_SWORD_BGS, GID_SWORD_BGS },
{ GI_ARROW_FIRE, GID_ARROW_FIRE },
{ GI_ARROW_ICE, GID_ARROW_ICE },
{ GI_ARROW_LIGHT, GID_ARROW_LIGHT },
{ GI_SKULL_TOKEN, GID_SKULL_TOKEN },
{ GI_DINS_FIRE, GID_DINS_FIRE },
{ GI_FARORES_WIND, GID_FARORES_WIND },
{ GI_NAYRUS_LOVE, GID_NAYRUS_LOVE },
{ GI_BULLET_BAG_30, GID_BULLET_BAG },
{ GI_BULLET_BAG_40, GID_BULLET_BAG },
{ GI_STICKS_5, GID_STICK },
{ GI_STICKS_10, GID_STICK },
{ GI_NUTS_5_2, GID_NUTS },
{ GI_NUTS_10, GID_NUTS },
{ GI_BOMBS_1, GID_BOMB },
{ GI_BOMBS_10, GID_BOMB },
{ GI_BOMBS_20, GID_BOMB },
{ GI_BOMBS_30, GID_BOMB },
{ GI_SEEDS_30, GID_SEEDS },
{ GI_BOMBCHUS_5, GID_BOMBCHU },
{ GI_BOMBCHUS_20, GID_BOMBCHU },
{ GI_FISH, GID_FISH },
{ GI_BUGS, GID_BUG },
{ GI_BLUE_FIRE, GID_BLUE_FIRE },
{ GI_POE, GID_POE },
{ GI_BIG_POE, GID_BIG_POE },
{ GI_DOOR_KEY, GID_KEY_SMALL },
{ GI_RUPEE_GREEN_LOSE, GID_RUPEE_GREEN },
{ GI_RUPEE_BLUE_LOSE, GID_RUPEE_BLUE },
{ GI_RUPEE_RED_LOSE, GID_RUPEE_RED },
{ GI_RUPEE_PURPLE_LOSE, GID_RUPEE_PURPLE },
{ GI_HEART_PIECE_WIN, GID_HEART_PIECE },
{ GI_STICK_UPGRADE_20, GID_STICK },
{ GI_STICK_UPGRADE_30, GID_STICK },
{ GI_NUT_UPGRADE_30, GID_NUTS },
{ GI_NUT_UPGRADE_40, GID_NUTS },
{ GI_BULLET_BAG_50, GID_BULLET_BAG_50 },
{ GI_ICE_TRAP, GID_MAX },
{ GI_TEXT_0, GID_MAX } };
std::unordered_map<std::string, RandomizerGet> SpoilerfileGetNameToEnum = { std::unordered_map<std::string, RandomizerGet> SpoilerfileGetNameToEnum = {
{"Bombs (5)", BOMBS_5}, {"Bombs (5)", BOMBS_5},
{"Deku Nuts (5)", DEKU_NUTS_5}, {"Deku Nuts (5)", DEKU_NUTS_5},
@ -507,6 +639,10 @@ std::unordered_map<std::string, RandomizerGet> SpoilerfileGetNameToEnum = {
{"Light Medallion", LIGHT_MEDALLION} {"Light Medallion", LIGHT_MEDALLION}
}; };
s16 Randomizer::GetItemModelFromId(s16 itemId) {
return itemIdToModel[itemId];
}
void Randomizer::LoadItemLocations() { void Randomizer::LoadItemLocations() {
// bandaid until new save stuff happens // bandaid until new save stuff happens
ParseItemLocations(""); ParseItemLocations("");
@ -790,6 +926,11 @@ RandomizerCheck Randomizer::GetCheckFromSceneAndParams(s16 sceneNum, s16 actorPa
case 22787: case 22787:
return KF_MIDOS_BOTTOM_RIGHT_CHEST; return KF_MIDOS_BOTTOM_RIGHT_CHEST;
} }
case 84:
switch (actorParams) {
case 0x0406:
return ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH;
}
case 85: case 85:
switch(actorParams) { switch(actorParams) {
case 1248: case 1248:

View file

@ -18,6 +18,7 @@ class Randomizer {
Randomizer(); Randomizer();
~Randomizer(); ~Randomizer();
s16 GetItemModelFromId(s16 itemId);
void LoadItemLocations(); void LoadItemLocations();
void ParseItemLocations(std::string spoilerfilename); void ParseItemLocations(std::string spoilerfilename);
GetItemID GetItemFromActor(s16 actorId, GetItemID ogItemId); GetItemID GetItemFromActor(s16 actorId, GetItemID ogItemId);

View file

@ -996,6 +996,10 @@ extern "C" int Controller_ShouldRumble(size_t i) {
return 0; return 0;
} }
extern "C" s16 GetItemModelFromId(s16 itemId) {
return OTRGlobals::Instance->gRandomizer->GetItemModelFromId(itemId);
}
extern "C" void LoadItemLocations() { extern "C" void LoadItemLocations() {
OTRGlobals::Instance->gRandomizer->LoadItemLocations(); OTRGlobals::Instance->gRandomizer->LoadItemLocations();
} }

View file

@ -346,6 +346,8 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
s16 spawnParam8000 = this->actor.params & 0x8000; s16 spawnParam8000 = this->actor.params & 0x8000;
s32 pad1; s32 pad1;
this->ogParams = this->actor.params;
this->collectibleFlag = (this->actor.params & 0x3F00) >> 8; this->collectibleFlag = (this->actor.params & 0x3F00) >> 8;
this->actor.params &= 0xFF; this->actor.params &= 0xFF;
@ -695,7 +697,7 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
} }
if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) {
getItemId = Item00_GetRandomizedItemId(this, globalCtx->sceneNum, this->actor.params); getItemId = Item00_GetRandomizedItemId(this, globalCtx->sceneNum, this->ogParams);
func_8002F554(&this->actor, globalCtx, getItemId); func_8002F554(&this->actor, globalCtx, getItemId);
} }
@ -1056,7 +1058,7 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) {
if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
getItemId = Item00_GetRandomizedItemId(this, globalCtx->sceneNum, this->actor.params); getItemId = Item00_GetRandomizedItemId(this, globalCtx->sceneNum, this->ogParams);
} }
func_8002F554(&this->actor, globalCtx, getItemId); func_8002F554(&this->actor, globalCtx, getItemId);
} }
@ -1325,6 +1327,11 @@ void EnItem00_DrawHeartContainer(EnItem00* this, GlobalContext* globalCtx) {
* Draw Function used for the Piece of Heart type of En_Item00. * Draw Function used for the Piece of Heart type of En_Item00.
*/ */
void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) {
if (gSaveContext.n64ddFlag) {
f32 mtxScale = 16.0f;
Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
GetItem_Draw(globalCtx, GetItemModelFromId(Item00_GetRandomizedItemId(this, gGlobalCtx->sceneNum, this->actor.params)));
} else {
s32 pad; s32 pad;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1658); OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1658);
@ -1333,10 +1340,12 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) {
func_8002ED80(&this->actor, globalCtx, 0); func_8002ED80(&this->actor, globalCtx, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1670), gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1670),
G_MTX_MODELVIEW | G_MTX_LOAD); G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_XLU_DISP++, gHeartPieceInteriorDL); gSPDisplayList(POLY_XLU_DISP++, gHeartPieceInteriorDL);
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1673); CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1673);
} }
}
/** /**
* Converts a given drop type ID based on link's current age, health and owned items. * Converts a given drop type ID based on link's current age, health and owned items.