mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-22 22:33:43 -07:00
Merge pull request #8 from MelonSpeedruns/testing-out-item-replacement-melon
This commit is contained in:
commit
3178a547b7
5 changed files with 166 additions and 10 deletions
|
@ -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.
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,9 +1340,11 @@ 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue