mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-22 22:33:43 -07:00
Merge branch 'testing-out-item-replacement' of github.com:briaguya-ai/Shipwright into testing-out-item-replacement
This commit is contained in:
commit
8d392c5d07
19 changed files with 494 additions and 203 deletions
|
@ -117,7 +117,8 @@ static void run_as_dpi_aware(Fun f) {
|
|||
DPI_AWARENESS_CONTEXT old_awareness_context = nullptr;
|
||||
if (SetThreadDpiAwarenessContext != nullptr) {
|
||||
old_awareness_context = SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// Solution for Windows 8.1 and newer, but before Windows 10 1607.
|
||||
// SetProcessDpiAwareness must be called before any drawing related API is called.
|
||||
if (!dxgi.process_dpi_awareness_done) {
|
||||
|
@ -162,13 +163,15 @@ static void toggle_borderless_window_full_screen(bool enable, bool call_callback
|
|||
if (dxgi.last_maximized_state) {
|
||||
SetWindowPos(dxgi.h_wnd, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE);
|
||||
ShowWindow(dxgi.h_wnd, SW_MAXIMIZE);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
SetWindowPos(dxgi.h_wnd, NULL, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_FRAMECHANGED);
|
||||
ShowWindow(dxgi.h_wnd, SW_RESTORE);
|
||||
}
|
||||
|
||||
dxgi.is_full_screen = false;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// Save if window is maximized or not
|
||||
WINDOWPLACEMENT window_placement;
|
||||
window_placement.length = sizeof(WINDOWPLACEMENT);
|
||||
|
@ -212,6 +215,8 @@ static void onkeyup(WPARAM w_param, LPARAM l_param) {
|
|||
}
|
||||
}
|
||||
|
||||
extern "C" void LoadItemLocations(const char* spoilerFileName);
|
||||
|
||||
static LRESULT CALLBACK gfx_dxgi_wnd_proc(HWND h_wnd, UINT message, WPARAM w_param, LPARAM l_param) {
|
||||
SohImGui::EventImpl event_impl;
|
||||
event_impl.win32 = { h_wnd, static_cast<int>(message), static_cast<int>(w_param), static_cast<int>(l_param) };
|
||||
|
@ -227,7 +232,8 @@ static LRESULT CALLBACK gfx_dxgi_wnd_proc(HWND h_wnd, UINT message, WPARAM w_par
|
|||
if (dxgi.in_paint) {
|
||||
dxgi.recursive_paint_detected = true;
|
||||
return DefWindowProcW(h_wnd, message, w_param, l_param);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
if (dxgi.run_one_game_iter != nullptr) {
|
||||
dxgi.in_paint = true;
|
||||
dxgi.run_one_game_iter();
|
||||
|
@ -251,11 +257,17 @@ static LRESULT CALLBACK gfx_dxgi_wnd_proc(HWND h_wnd, UINT message, WPARAM w_par
|
|||
case WM_KEYUP:
|
||||
onkeyup(w_param, l_param);
|
||||
break;
|
||||
case WM_DROPFILES:
|
||||
char fileName[256];
|
||||
DragQueryFileA((HDROP)w_param, 0, fileName, 256);
|
||||
LoadItemLocations(fileName);
|
||||
break;
|
||||
case WM_SYSKEYDOWN:
|
||||
if ((w_param == VK_RETURN) && ((l_param & 1 << 30) == 0)) {
|
||||
toggle_borderless_window_full_screen(!dxgi.is_full_screen, true);
|
||||
break;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
return DefWindowProcW(h_wnd, message, w_param, l_param);
|
||||
}
|
||||
default:
|
||||
|
@ -319,6 +331,8 @@ void gfx_dxgi_init(const char *game_name, bool start_in_fullscreen) {
|
|||
if (start_in_fullscreen) {
|
||||
toggle_borderless_window_full_screen(true, false);
|
||||
}
|
||||
|
||||
DragAcceptFiles(dxgi.h_wnd, TRUE);
|
||||
}
|
||||
|
||||
static void gfx_dxgi_set_fullscreen_changed_callback(void (*on_fullscreen_changed)(bool is_now_fullscreen)) {
|
||||
|
@ -455,7 +469,8 @@ static bool gfx_dxgi_start_frame(void) {
|
|||
vsyncs_to_wait = 1;
|
||||
}
|
||||
dxgi.frame_timestamp = FRAME_INTERVAL_US_DENOMINATOR * (last_end_us + vsyncs_to_wait * estimated_vsync_interval_us);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// Drop frame
|
||||
//printf("Dropping frame\n");
|
||||
dxgi.dropped_frame = true;
|
||||
|
@ -477,7 +492,8 @@ static bool gfx_dxgi_start_frame(void) {
|
|||
}
|
||||
if (diff_left < diff_right) {
|
||||
vsyncs_to_wait = floor(vsyncs_to_wait);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
vsyncs_to_wait = ceil(vsyncs_to_wait);
|
||||
}
|
||||
if (vsyncs_to_wait == 0) {
|
||||
|
@ -493,7 +509,8 @@ static bool gfx_dxgi_start_frame(void) {
|
|||
dxgi.use_timer = true;
|
||||
}
|
||||
dxgi.length_in_vsync_frames = vsyncs_to_wait;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
dxgi.length_in_vsync_frames = 1;
|
||||
dxgi.use_timer = true;
|
||||
}
|
||||
|
@ -561,7 +578,8 @@ static void gfx_dxgi_set_frame_divisor(int divisor) {
|
|||
void gfx_dxgi_create_factory_and_device(bool debug, int d3d_version, bool (*create_device_fn)(IDXGIAdapter1* adapter, bool test_only)) {
|
||||
if (dxgi.CreateDXGIFactory2 != nullptr) {
|
||||
ThrowIfFailed(dxgi.CreateDXGIFactory2(debug ? DXGI_CREATE_FACTORY_DEBUG : 0, __uuidof(IDXGIFactory2), &dxgi.factory));
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
ThrowIfFailed(dxgi.CreateDXGIFactory1(__uuidof(IDXGIFactory2), &dxgi.factory));
|
||||
}
|
||||
|
||||
|
@ -622,7 +640,8 @@ ComPtr<IDXGISwapChain1> gfx_dxgi_create_swap_chain(IUnknown *device) {
|
|||
ThrowIfFailed(swap_chain2->SetMaximumFrameLatency(1));
|
||||
dxgi.waitable_object = swap_chain2->GetFrameLatencyWaitableObject();
|
||||
WaitForSingleObject(dxgi.waitable_object, INFINITE);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
ComPtr<IDXGIDevice1> device1;
|
||||
ThrowIfFailed(device->QueryInterface(IID_PPV_ARGS(&device1)));
|
||||
ThrowIfFailed(device1->SetMaximumFrameLatency(1));
|
||||
|
|
|
@ -105,7 +105,8 @@ static void set_fullscreen(bool on, bool call_callback) {
|
|||
window_width = mode.w;
|
||||
window_height = mode.h;
|
||||
SDL_ShowCursor(false);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
window_width = DESIRED_SCREEN_WIDTH;
|
||||
window_height = DESIRED_SCREEN_HEIGHT;
|
||||
}
|
||||
|
@ -132,6 +133,8 @@ static int frameDivisor = 1;
|
|||
static void gfx_sdl_init(const char* game_name, bool start_in_fullscreen) {
|
||||
SDL_Init(SDL_INIT_VIDEO);
|
||||
|
||||
SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
|
||||
|
||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
|
||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||
|
||||
|
@ -208,7 +211,8 @@ static void gfx_sdl_get_dimensions(uint32_t *width, uint32_t *height) {
|
|||
static int translate_scancode(int scancode) {
|
||||
if (scancode < 512) {
|
||||
return inverted_scancode_table[scancode];
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -227,8 +231,11 @@ static void gfx_sdl_onkeyup(int scancode) {
|
|||
}
|
||||
}
|
||||
|
||||
extern "C" void LoadItemLocations(const char* spoilerFileName);
|
||||
|
||||
static void gfx_sdl_handle_events(void) {
|
||||
SDL_Event event;
|
||||
char* dropped_filedir;
|
||||
while (SDL_PollEvent(&event)) {
|
||||
SohImGui::EventImpl event_impl;
|
||||
event_impl.sdl = { &event };
|
||||
|
@ -249,6 +256,11 @@ static void gfx_sdl_handle_events(void) {
|
|||
window_height = event.window.data2;
|
||||
}
|
||||
break;
|
||||
case SDL_DROPFILE:
|
||||
{
|
||||
LoadItemLocations(event.drop.file);
|
||||
break;
|
||||
}
|
||||
case SDL_QUIT:
|
||||
exit(0);
|
||||
}
|
||||
|
|
|
@ -240,6 +240,11 @@ namespace SohImGui {
|
|||
stbi_image_free(img_data);
|
||||
}
|
||||
|
||||
// thought this might be a way to work around the LoadItemLocations not defined issue
|
||||
// void LoadItemLocations(const char* spoilerFileName) {
|
||||
// CVar_SetString("gSpoilerFileName", spoilerFileName);
|
||||
// }
|
||||
|
||||
void LoadInterfaceEditor(){//This function is necessary as without it IMGui wont load the updated float array.
|
||||
hearts_colors[0] = (float)CVar_GetS32("gCCHeartsPrimR", 255)/255;
|
||||
hearts_colors[1] = (float)CVar_GetS32("gCCHeartsPrimG", 70)/255;
|
||||
|
|
|
@ -82,4 +82,5 @@ namespace SohImGui {
|
|||
void LoadInterfaceEditor();
|
||||
ImTextureID GetTextureByID(int id);
|
||||
ImTextureID GetTextureByName(const std::string& name);
|
||||
// void LoadItemLocations(const char* spoilerFileName);
|
||||
}
|
||||
|
|
|
@ -179,7 +179,8 @@ typedef struct {
|
|||
/* 0x1420 */ s16 worldMapArea;
|
||||
/* 0x1422 */ s16 sunsSongState; // controls the effects of suns song
|
||||
/* 0x1424 */ s16 healthAccumulator;
|
||||
ItemLocation itemLocations[512];
|
||||
ItemLocation itemLocations[266];
|
||||
Sprite seedIcons[5];
|
||||
} SaveContext; // size = 0x1428
|
||||
|
||||
typedef enum {
|
||||
|
|
|
@ -1,5 +1,12 @@
|
|||
#pragma once
|
||||
|
||||
typedef struct {
|
||||
char tex[512];
|
||||
uint16_t width;
|
||||
uint16_t height;
|
||||
uint8_t im_fmt;
|
||||
uint8_t im_siz;
|
||||
} Sprite;
|
||||
|
||||
typedef enum {
|
||||
LINKS_POCKET,
|
||||
|
|
|
@ -4,14 +4,83 @@
|
|||
#include <variables.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>
|
||||
#include <functions.h>
|
||||
#include <Cvar.h>
|
||||
#include <textures/icon_item_static/icon_item_static.h>
|
||||
#include <textures/icon_item_24_static/icon_item_24_static.h>
|
||||
|
||||
using json = nlohmann::json;
|
||||
|
||||
std::unordered_map<std::string, Sprite> gSeedTextures;
|
||||
|
||||
Randomizer::Randomizer() {
|
||||
//todo something?
|
||||
// this isn't as clean as i'd like it to be but it's working
|
||||
Sprite dekuStickSprite = { gHookshotIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Deku Stick"] = dekuStickSprite;
|
||||
Sprite dekuNutSprite = { gDekuNutIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Deku Nut"] = dekuNutSprite;
|
||||
Sprite bowSprite = { gFairyBowIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Bow"] = bowSprite;
|
||||
Sprite slingshotSprite = { gFairySlingshotIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Slingshot"] = slingshotSprite;
|
||||
Sprite fairyOcarinaSprite = { gFairyOcarinaIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Fairy Ocarina"] = fairyOcarinaSprite;
|
||||
Sprite bombchuSprite = { gBombchuIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Bombchu"] = bombchuSprite;
|
||||
Sprite longshotSprite = { gLongshotIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Longshot"] = longshotSprite;
|
||||
Sprite boomerangSprite = { gBoomerangIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Boomerang"] = boomerangSprite;
|
||||
Sprite lensOfTruthSprite = { gLensofTruthIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Lens of Truth"] = lensOfTruthSprite;
|
||||
Sprite magicBeansSprite = { gMagicBeansIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Beans"] = magicBeansSprite;
|
||||
Sprite megatonHammerSprite = { gMegatonHammerIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Megaton Hammer"] = megatonHammerSprite;
|
||||
Sprite fishSprite = { gFishIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Bottled Fish"] = fishSprite;
|
||||
Sprite milkSprite = { gMilkFullIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Bottled Milk"] = milkSprite;
|
||||
Sprite maskOfTruthSprite = { gMaskofTruthIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Mask of Truth"] = maskOfTruthSprite;
|
||||
Sprite soldOutSprite = { gSoldOutIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["SOLD OUT"] = soldOutSprite;
|
||||
Sprite cuccoSprite = { gCuccoIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Cucco"] = cuccoSprite;
|
||||
Sprite oddMushroomSprite = { gOddMushroomIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Mushroom"] = oddMushroomSprite;
|
||||
Sprite sawSprite = { gPoachersSawIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Saw"] = sawSprite;
|
||||
Sprite frogSprite = { gEyeBallFrogIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Frog"] = frogSprite;
|
||||
Sprite masterSwordSprite = { gMasterSwordIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Master Sword"] = masterSwordSprite;
|
||||
Sprite mirrorShieldSprite = { gMirrorShieldIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Mirror Shield"] = mirrorShieldSprite;
|
||||
Sprite kokiriTunicSprite = { gKokiriTunicIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Kokiri Tunic"] = kokiriTunicSprite;
|
||||
Sprite hoverBootsSprite = { gHoverBootsIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Hover Boots"] = hoverBootsSprite;
|
||||
Sprite silverGauntletsSprite = { gSilverGauntletsIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Silver Gauntlets"] = silverGauntletsSprite;
|
||||
Sprite goldenScaleSprite = { gGoldenScaleIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Gold Scale"] = goldenScaleSprite;
|
||||
Sprite stoneOfAgonySprite = { gStoneOfAgonyIconTex, 24, 24, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Stone of Agony"] = stoneOfAgonySprite;
|
||||
Sprite skullTokenSprite = { gGoldSkulltulaIconTex, 24, 24, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Skull Token"] = skullTokenSprite;
|
||||
Sprite heartContainerSprite = { gHeartContainerIconTex, 24, 24, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Heart Container"] = heartContainerSprite;
|
||||
Sprite bossKeySprite = { gBossKeyIconTex, 24, 24, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Boss Key"] = bossKeySprite;
|
||||
Sprite compassSprite = { gCompassIconTex, 24, 24, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Compass"] = compassSprite;
|
||||
Sprite mapSprite = { gDungeonMapIconTex, 24, 24, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Map"] = mapSprite;
|
||||
Sprite bigMagicSprite = { gBigMagicJarIconTex, 24, 24, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
gSeedTextures["Big Magic"] = bigMagicSprite;
|
||||
}
|
||||
|
||||
Randomizer::~Randomizer() {
|
||||
this->itemLocations.clear();
|
||||
}
|
||||
|
@ -643,24 +712,45 @@ s16 Randomizer::GetItemModelFromId(s16 itemId) {
|
|||
return itemIdToModel[itemId];
|
||||
}
|
||||
|
||||
void Randomizer::LoadItemLocations() {
|
||||
void Randomizer::LoadItemLocations(const char* spoilerFileName) {
|
||||
if (strcmp(spoilerFileName, "") != 0) {
|
||||
// bandaid until new save stuff happens
|
||||
ParseItemLocations("");
|
||||
ParseItemLocations(spoilerFileName);
|
||||
|
||||
for (auto itemLocation : gSaveContext.itemLocations) {
|
||||
this->itemLocations[itemLocation.check] = itemLocation.get;
|
||||
}
|
||||
} else {
|
||||
u16 index = 0;
|
||||
for (auto itemLocation : this->itemLocations) {
|
||||
gSaveContext.itemLocations[index].check = itemLocation.first;
|
||||
gSaveContext.itemLocations[index].get = itemLocation.second;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Randomizer::ParseItemLocations(std::string spoilerFileName) {
|
||||
void Randomizer::ParseItemLocations(const char* spoilerFileName) {
|
||||
// todo pull this in from cvar or something
|
||||
std::ifstream spoilerFileStream("spoiler.json");
|
||||
std::ifstream spoilerFileStream(spoilerFileName);
|
||||
if (!spoilerFileStream)
|
||||
return;
|
||||
|
||||
bool success = false;
|
||||
|
||||
try {
|
||||
json spoilerFileJson;
|
||||
spoilerFileStream >> spoilerFileJson;
|
||||
json locationsJson = spoilerFileJson["locations"];
|
||||
json hashJson = spoilerFileJson["file_hash"];
|
||||
|
||||
int index = 0;
|
||||
for (auto it = hashJson.begin(); it != hashJson.end(); ++it) {
|
||||
gSaveContext.seedIcons[index] = gSeedTextures[it.value()];
|
||||
index++;
|
||||
}
|
||||
|
||||
index = 0;
|
||||
for (auto it = locationsJson.begin(); it != locationsJson.end(); ++it) {
|
||||
if (it->is_structured()) {
|
||||
json itemJson = *it;
|
||||
|
@ -679,16 +769,33 @@ void Randomizer::ParseItemLocations(std::string spoilerFileName) {
|
|||
|
||||
index++;
|
||||
}
|
||||
|
||||
Audio_PlaySoundGeneral(NA_SE_SY_CORRECT_CHIME, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
|
||||
success = true;
|
||||
} catch (const std::exception& e) {
|
||||
Audio_PlaySoundGeneral(NA_SE_SY_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
|
||||
return;
|
||||
}
|
||||
|
||||
if (success) {
|
||||
CVar_SetS32("gRandomizer", 1);
|
||||
}
|
||||
}
|
||||
|
||||
s32 Randomizer::GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 sceneNum, s16 actorParams, s32 homePosX, s32 homePosY, s32 homePosZ) {
|
||||
if (actorId != -1) {
|
||||
s32 itemId = GetItemFromActor(actorId, ogId);
|
||||
return itemId;
|
||||
} else {
|
||||
s32 itemId = GetItemFromSceneParamsAndHomePos(sceneNum, actorParams, homePosX, homePosY, homePosZ, ogId);
|
||||
return itemId;
|
||||
}
|
||||
}
|
||||
|
||||
GetItemID Randomizer::GetItemFromActor(s16 actorId, GetItemID ogItemId) {
|
||||
return GetItemFromGet(this->itemLocations[GetCheckFromActor(actorId, ogItemId)], ogItemId);
|
||||
}
|
||||
|
||||
GetItemID Randomizer::GetItemFromSceneAndParams(s16 sceneNum, s16 actorParams, GetItemID ogItemId) {
|
||||
return GetItemFromGet(this->itemLocations[GetCheckFromSceneAndParams(sceneNum, actorParams)], ogItemId);
|
||||
}
|
||||
|
||||
GetItemID Randomizer::GetItemFromSceneParamsAndHomePos(s16 sceneNum, s16 actorParams, s32 homePosX, s32 homePosY, s32 homePosZ, GetItemID ogItemId) {
|
||||
return GetItemFromGet(this->itemLocations[GetCheckFromSceneAndParams(sceneNum, actorParams, homePosX, homePosY, homePosZ)], ogItemId);
|
||||
}
|
||||
|
@ -915,6 +1022,11 @@ RandomizerCheck Randomizer::GetCheckFromSceneAndParams(s16 sceneNum, s16 actorPa
|
|||
}
|
||||
|
||||
switch(sceneNum) {
|
||||
case 17:
|
||||
switch (actorParams) {
|
||||
case 0x1F:
|
||||
return DEKU_TREE_QUEEN_GOHMA_HEART;
|
||||
}
|
||||
case 40:
|
||||
switch(actorParams) {
|
||||
case 22944:
|
||||
|
@ -928,8 +1040,10 @@ RandomizerCheck Randomizer::GetCheckFromSceneAndParams(s16 sceneNum, s16 actorPa
|
|||
}
|
||||
case 84:
|
||||
switch (actorParams) {
|
||||
case 0x0406:
|
||||
case 1030:
|
||||
return ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH;
|
||||
case 2822:
|
||||
return ZR_NEAR_DOMAIN_FREESTANDING_POH;
|
||||
}
|
||||
case 85:
|
||||
switch(actorParams) {
|
||||
|
@ -983,7 +1097,7 @@ RandomizerCheck Randomizer::GetCheckFromSceneAndParams(s16 sceneNum, s16 actorPa
|
|||
}
|
||||
case 96:
|
||||
switch(actorParams) {
|
||||
case 6:
|
||||
case 7686:
|
||||
return DMT_FREESTANDING_POH;
|
||||
case 23201:
|
||||
return DMT_CHEST;
|
||||
|
|
|
@ -12,18 +12,18 @@ class Randomizer {
|
|||
std::unordered_map<RandomizerCheck, RandomizerGet> itemLocations;
|
||||
GetItemID GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId);
|
||||
RandomizerCheck GetCheckFromActor(s16 actorId, GetItemID ogItemId);
|
||||
RandomizerCheck GetCheckFromSceneAndParams(s16 sceneNum, s16 actorParams, s32 homePosX = 0, s32 homePosY = 0, s32 homePosZ = 0);
|
||||
RandomizerCheck GetCheckFromSceneAndParams(s16 sceneNum, s16 actorParams, s32 homePosX, s32 homePosY, s32 homePosZ);
|
||||
GetItemID GetItemFromActor(s16 actorId, GetItemID ogItemId);
|
||||
GetItemID GetItemFromSceneParamsAndHomePos(s16 sceneNum, s16 actorParams, s32 homePosX, s32 homePosY, s32 homePosZ, GetItemID ogItemId);
|
||||
|
||||
public:
|
||||
Randomizer();
|
||||
~Randomizer();
|
||||
|
||||
s16 GetItemModelFromId(s16 itemId);
|
||||
void LoadItemLocations();
|
||||
void ParseItemLocations(std::string spoilerfilename);
|
||||
GetItemID GetItemFromActor(s16 actorId, GetItemID ogItemId);
|
||||
GetItemID GetItemFromSceneAndParams(s16 sceneNum, s16 actorParams, GetItemID ogItemId);
|
||||
GetItemID GetItemFromSceneParamsAndHomePos(s16 sceneNum, s16 actorParams, s32 homePosX, s32 homePosY, s32 homePosZ, GetItemID ogItemId);
|
||||
void LoadItemLocations(const char* spoilerFileName);
|
||||
void ParseItemLocations(const char* spoilerFileName);
|
||||
s32 GetRandomizedItemId(GetItemID ogId, s16 actorId = -1, s16 sceneNum = -1, s16 actorParams = -1, s32 homePosX = 0, s32 homePosY = 0, s32 homePosZ = 0);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1000,23 +1000,24 @@ extern "C" s16 GetItemModelFromId(s16 itemId) {
|
|||
return OTRGlobals::Instance->gRandomizer->GetItemModelFromId(itemId);
|
||||
}
|
||||
|
||||
extern "C" void LoadItemLocations() {
|
||||
OTRGlobals::Instance->gRandomizer->LoadItemLocations();
|
||||
extern "C" void LoadItemLocations(const char* spoilerFileName) {
|
||||
OTRGlobals::Instance->gRandomizer->LoadItemLocations(spoilerFileName);
|
||||
}
|
||||
|
||||
extern "C" void ParseItemLocations(const char* spoilerfilename) {
|
||||
OTRGlobals::Instance->gRandomizer->ParseItemLocations(spoilerfilename);
|
||||
extern "C" void ParseItemLocations(const char* spoilerFileName) {
|
||||
OTRGlobals::Instance->gRandomizer->ParseItemLocations(spoilerFileName);
|
||||
}
|
||||
|
||||
extern "C" GetItemID GetItemFromActor(s16 actorId, GetItemID ogItemId) {
|
||||
return OTRGlobals::Instance->gRandomizer->GetItemFromActor(actorId, ogItemId);
|
||||
extern "C" s32 GetRandomizedItemId(GetItemID ogId, s16 sceneNum, s16 actorParams) {
|
||||
return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, -1, sceneNum, actorParams);
|
||||
}
|
||||
|
||||
extern "C" GetItemID GetItemFromSceneAndParams(s16 sceneNum, s16 actorParams, GetItemID ogItemId) {
|
||||
return OTRGlobals::Instance->gRandomizer->GetItemFromSceneAndParams(sceneNum, actorParams, ogItemId);
|
||||
// the lack of optional params in c is frustrating
|
||||
extern "C" s32 GetRandomizedItemIdFromActor(GetItemID ogId, s16 actorId ) {
|
||||
return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId);
|
||||
}
|
||||
|
||||
// use an explicit (s32) cast on the position values from the Vec3f when calling
|
||||
extern "C" GetItemID GetItemFromSceneParamsAndHomePos(s16 sceneNum, s16 actorParams, s32 homePosX, s32 homePosY, s32 homePosZ, GetItemID ogItemId) {
|
||||
return OTRGlobals::Instance->gRandomizer->GetItemFromSceneParamsAndHomePos(sceneNum, actorParams, homePosX, homePosY, homePosZ, ogItemId);
|
||||
extern "C" s32 GetRandomizedItemIdFromPosition(GetItemID ogId, s16 sceneNum, s16 actorParams, s32 homePosX, s32 homePosY, s32 homePosZ) {
|
||||
return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, -1, sceneNum, actorParams, homePosX, homePosY, homePosZ);
|
||||
}
|
||||
|
|
|
@ -74,9 +74,12 @@ int AudioPlayer_GetDesiredBuffered(void);
|
|||
void AudioPlayer_Play(const uint8_t* buf, uint32_t len);
|
||||
void AudioMgr_CreateNextAudioBuffer(s16* samples, u32 num_samples);
|
||||
int Controller_ShouldRumble(size_t i);
|
||||
void LoadItemLocations(const char* spoilerFileName);
|
||||
void ParseItemLocations(const char* spoilerfilename);
|
||||
GetItemID GetItemFromActor(s16 actorId, GetItemID ogItemId);
|
||||
GetItemID GetItemFromSceneAndParams(s16 sceneNum, s16 actorParams, GetItemID ogItemId);
|
||||
s32 GetRandomizedItemId(GetItemID ogId, s16 sceneNum, s16 actorParams);
|
||||
s32 GetRandomizedItemIdFromActor(GetItemID ogId, s16 actorId);
|
||||
s32 GetRandomizedItemIdFromPosition(GetItemID ogId, s16 sceneNum, s16 actorParams, s32 homePosX, s32 homePosY, s32 homePosZ);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -4,7 +4,7 @@ void TitleSetup_InitImpl(GameState* gameState) {
|
|||
osSyncPrintf("ゼルダ共通データ初期化\n"); // "Zelda common data initalization"
|
||||
SaveContext_Init();
|
||||
gameState->running = false;
|
||||
SET_NEXT_GAMESTATE(gameState, FileChoose_Init, TitleContext);
|
||||
SET_NEXT_GAMESTATE(gameState, Title_Init, TitleContext);
|
||||
}
|
||||
|
||||
void TitleSetup_Destroy(GameState* gameState) {
|
||||
|
|
|
@ -332,11 +332,6 @@ void EnItem00_SetupAction(EnItem00* this, EnItem00ActionFunc actionFunc) {
|
|||
this->actionFunc = actionFunc;
|
||||
}
|
||||
|
||||
s32 Item00_GetRandomizedItemId(EnItem00* this, s16 sceneNum, s16 actorParams) {
|
||||
s32 itemId = GetItemFromSceneAndParams(sceneNum, this->actor.params, this->getItemId);
|
||||
return itemId;
|
||||
}
|
||||
|
||||
void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
|
||||
EnItem00* this = (EnItem00*)thisx;
|
||||
s32 pad;
|
||||
|
@ -697,7 +692,7 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
|
|||
}
|
||||
|
||||
if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) {
|
||||
getItemId = Item00_GetRandomizedItemId(this, globalCtx->sceneNum, this->ogParams);
|
||||
getItemId = GetRandomizedItemId(this->getItemId, globalCtx->sceneNum, this->ogParams);
|
||||
func_8002F554(&this->actor, globalCtx, getItemId);
|
||||
}
|
||||
|
||||
|
@ -1058,7 +1053,7 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) {
|
|||
|
||||
if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) {
|
||||
if (gSaveContext.n64ddFlag) {
|
||||
getItemId = Item00_GetRandomizedItemId(this, globalCtx->sceneNum, this->ogParams);
|
||||
getItemId = GetRandomizedItemId(this->getItemId, globalCtx->sceneNum, this->ogParams);
|
||||
}
|
||||
func_8002F554(&this->actor, globalCtx, getItemId);
|
||||
}
|
||||
|
@ -1330,7 +1325,7 @@ 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)));
|
||||
GetItem_Draw(globalCtx, GetItemModelFromId(GetRandomizedItemId(this->getItemId, globalCtx->sceneNum, this->ogParams)));
|
||||
} else {
|
||||
s32 pad;
|
||||
|
||||
|
|
|
@ -193,6 +193,62 @@ void Gameplay_Destroy(GameState* thisx) {
|
|||
gGlobalCtx = NULL;
|
||||
}
|
||||
|
||||
void GiveLinksPocketMedallion(GlobalContext* globalCtx) {
|
||||
if (gSaveContext.n64ddFlag) {
|
||||
RandomizerGet get = gSaveContext.itemLocations[LINKS_POCKET].get;
|
||||
|
||||
s16 item;
|
||||
|
||||
u8 medallion = 0;
|
||||
|
||||
switch (get) {
|
||||
case FOREST_MEDALLION:
|
||||
item = ITEM_MEDALLION_FOREST;
|
||||
medallion = 1;
|
||||
break;
|
||||
case FIRE_MEDALLION:
|
||||
item = ITEM_MEDALLION_FIRE;
|
||||
medallion = 1;
|
||||
break;
|
||||
case WATER_MEDALLION:
|
||||
item = ITEM_MEDALLION_WATER;
|
||||
medallion = 1;
|
||||
break;
|
||||
case SHADOW_MEDALLION:
|
||||
item = ITEM_MEDALLION_SHADOW;
|
||||
medallion = 1;
|
||||
break;
|
||||
case SPIRIT_MEDALLION:
|
||||
item = ITEM_MEDALLION_SPIRIT;
|
||||
medallion = 1;
|
||||
break;
|
||||
case LIGHT_MEDALLION:
|
||||
item = ITEM_MEDALLION_LIGHT;
|
||||
medallion = 1;
|
||||
break;
|
||||
case KOKIRI_EMERALD:
|
||||
item = ITEM_KOKIRI_EMERALD;
|
||||
break;
|
||||
case GORON_RUBY:
|
||||
item = ITEM_GORON_RUBY;
|
||||
break;
|
||||
case ZORA_SAPPHIRE:
|
||||
item = ITEM_ZORA_SAPPHIRE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (medallion == 1) {
|
||||
gSaveContext.inventory.questItems |= gBitFlags[item - ITEM_MEDALLION_FOREST + QUEST_MEDALLION_FOREST];
|
||||
|
||||
if (item == ITEM_MEDALLION_WATER) {
|
||||
func_8006D0AC(globalCtx);
|
||||
}
|
||||
} else {
|
||||
gSaveContext.inventory.questItems |= gBitFlags[item - ITEM_KOKIRI_EMERALD + QUEST_KOKIRI_EMERALD];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Gameplay_Init(GameState* thisx) {
|
||||
GlobalContext* globalCtx = (GlobalContext*)thisx;
|
||||
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
|
||||
|
@ -207,6 +263,8 @@ void Gameplay_Init(GameState* thisx) {
|
|||
u8 tempSetupIndex;
|
||||
s32 pad[2];
|
||||
|
||||
GiveLinksPocketMedallion(globalCtx);
|
||||
|
||||
if (gSaveContext.entranceIndex == -1) {
|
||||
gSaveContext.entranceIndex = 0;
|
||||
globalCtx->state.running = false;
|
||||
|
|
|
@ -515,8 +515,13 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, GlobalContext* globalCtx) {
|
|||
Flags_SetEventChkInf(7);
|
||||
Flags_SetEventChkInf(9);
|
||||
Item_Give(globalCtx, ITEM_KOKIRI_EMERALD);
|
||||
if (gSaveContext.n64ddFlag) {
|
||||
globalCtx->nextEntranceIndex = 0x0457;
|
||||
gSaveContext.nextCutsceneIndex = 0;
|
||||
} else {
|
||||
globalCtx->nextEntranceIndex = 0xEE;
|
||||
gSaveContext.nextCutsceneIndex = 0xFFF1;
|
||||
}
|
||||
} else {
|
||||
globalCtx->nextEntranceIndex = 0x457;
|
||||
gSaveContext.nextCutsceneIndex = 0;
|
||||
|
|
|
@ -383,11 +383,6 @@ void EnBox_AppearAnimation(EnBox* this, GlobalContext* globalCtx) {
|
|||
}
|
||||
}
|
||||
|
||||
s32 EnBox_GetRandomizedItemId(s16 actorParams, s16 sceneNum) {
|
||||
s32 itemId = GetItemFromSceneAndParams(sceneNum, actorParams, actorParams >> 5 & 0x7F);
|
||||
return 0 - itemId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Chest is ready to be open
|
||||
*/
|
||||
|
@ -429,8 +424,7 @@ void EnBox_WaitOpen(EnBox* this, GlobalContext* globalCtx) {
|
|||
func_8002DBD0(&this->dyna.actor, &sp4C, &player->actor.world.pos);
|
||||
if (sp4C.z > -50.0f && sp4C.z < 0.0f && fabsf(sp4C.y) < 10.0f && fabsf(sp4C.x) < 20.0f &&
|
||||
Player_IsFacingActor(&this->dyna.actor, 0x3000, globalCtx)) {
|
||||
func_8002F554(&this->dyna.actor, globalCtx,
|
||||
EnBox_GetRandomizedItemId(this->dyna.actor.params, globalCtx->sceneNum));
|
||||
func_8002F554(&this->dyna.actor, globalCtx, 0 - GetRandomizedItemId(this->dyna.actor.params >> 5 & 0x7F, globalCtx->sceneNum, this->dyna.actor.params));
|
||||
}
|
||||
if (Flags_GetTreasure(globalCtx, this->dyna.actor.params & 0x1F)) {
|
||||
EnBox_SetupAction(this, EnBox_Open);
|
||||
|
|
|
@ -294,11 +294,6 @@ void func_80ABA244(EnNiwLady* this, GlobalContext* globalCtx) {
|
|||
}
|
||||
}
|
||||
|
||||
s32 NiwLady_GetRandomizedItemId(EnNiwLady* this, GetItemID ogId) {
|
||||
s32 itemId = GetItemFromActor(this->actor.id, ogId);
|
||||
return itemId;
|
||||
}
|
||||
|
||||
void func_80ABA654(EnNiwLady* this, GlobalContext* globalCtx) {
|
||||
if (this->unk_262 == Message_GetState(&globalCtx->msgCtx) && Message_ShouldAdvance(globalCtx)) {
|
||||
Message_CloseTextbox(globalCtx);
|
||||
|
@ -309,9 +304,8 @@ void func_80ABA654(EnNiwLady* this, GlobalContext* globalCtx) {
|
|||
if (!(gSaveContext.itemGetInf[0] & 0x1000)) {
|
||||
this->actor.parent = NULL;
|
||||
|
||||
this->getItemId = NiwLady_GetRandomizedItemId(this, GI_BOTTLE);
|
||||
|
||||
func_8002F434(&this->actor, globalCtx, NiwLady_GetRandomizedItemId(this, GI_BOTTLE), 100.0f, 50.0f);
|
||||
this->getItemId = GetRandomizedItemIdFromActor(GI_BOTTLE, this->actor.id);
|
||||
func_8002F434(&this->actor, globalCtx, GetRandomizedItemIdFromActor(GI_BOTTLE, this->actor.id), 100.0f, 50.0f); //not sure if calling again makes sense here or if we should just use this->getItemId
|
||||
this->actionFunc = func_80ABAC00;
|
||||
return;
|
||||
}
|
||||
|
@ -393,7 +387,7 @@ void func_80ABA9B8(EnNiwLady* this, GlobalContext* globalCtx) {
|
|||
case 0:
|
||||
Message_CloseTextbox(globalCtx);
|
||||
this->actor.parent = NULL;
|
||||
func_8002F434(&this->actor, globalCtx, NiwLady_GetRandomizedItemId(this, GI_POCKET_EGG), 200.0f,
|
||||
func_8002F434(&this->actor, globalCtx, GetRandomizedItemIdFromActor(GI_POCKET_EGG, this->actor.id), 200.0f,
|
||||
100.0f);
|
||||
this->actionFunc = func_80ABAC00;
|
||||
break;
|
||||
|
@ -447,7 +441,7 @@ void func_80ABAC00(EnNiwLady* this, GlobalContext* globalCtx) {
|
|||
getItemId = this->getItemId;
|
||||
if (LINK_IS_ADULT) {
|
||||
getItemId =
|
||||
!(gSaveContext.itemGetInf[2] & 0x1000) ? NiwLady_GetRandomizedItemId(this, GI_POCKET_EGG) : GI_COJIRO;
|
||||
!(gSaveContext.itemGetInf[2] & 0x1000) ? GetRandomizedItemIdFromActor(GI_POCKET_EGG, this->actor.id) : GI_COJIRO;
|
||||
}
|
||||
func_8002F434(&this->actor, globalCtx, getItemId, 200.0f, 100.0f);
|
||||
}
|
||||
|
|
|
@ -58,10 +58,15 @@ void ItemBHeart_Update(Actor* thisx, GlobalContext* globalCtx) {
|
|||
if (Actor_HasParent(&this->actor, globalCtx)) {
|
||||
Flags_SetCollectible(globalCtx, 0x1F);
|
||||
Actor_Kill(&this->actor);
|
||||
} else {
|
||||
if (gSaveContext.n64ddFlag) {
|
||||
s16 getItemId = GetRandomizedItemId(GI_HEART_CONTAINER_2, globalCtx->sceneNum, 0x1F);
|
||||
func_8002F434(&this->actor, globalCtx, getItemId, 30.0f, 40.0f);
|
||||
} else {
|
||||
func_8002F434(&this->actor, globalCtx, GI_HEART_CONTAINER_2, 30.0f, 40.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void func_80B85264(ItemBHeart* this, GlobalContext* globalCtx) {
|
||||
f32 yOffset;
|
||||
|
@ -93,6 +98,10 @@ void ItemBHeart_Draw(Actor* thisx, GlobalContext* globalCtx) {
|
|||
actorIt = actorIt->next;
|
||||
}
|
||||
|
||||
if (gSaveContext.n64ddFlag) {
|
||||
GetItem_Draw(globalCtx,
|
||||
GetItemModelFromId(GetRandomizedItemId(GI_HEART_CONTAINER_2, globalCtx->sceneNum, 0x1F)));
|
||||
} else {
|
||||
if (flag) {
|
||||
func_80093D84(globalCtx->state.gfxCtx);
|
||||
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_item_b_heart.c", 551),
|
||||
|
@ -106,6 +115,7 @@ void ItemBHeart_Draw(Actor* thisx, GlobalContext* globalCtx) {
|
|||
gSPDisplayList(POLY_OPA_DISP++, gGiHeartBorderDL);
|
||||
gSPDisplayList(POLY_OPA_DISP++, gGiHeartContainerDL);
|
||||
}
|
||||
}
|
||||
|
||||
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_item_b_heart.c", 561);
|
||||
}
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include "textures/title_static/title_static.h"
|
||||
#include "textures/parameter_static/parameter_static.h"
|
||||
#include <textures/icon_item_static/icon_item_static.h>
|
||||
|
||||
static s16 sUnused = 106;
|
||||
|
||||
|
@ -63,6 +64,7 @@ void FileChoose_InitModeUpdate(GameState* thisx) {
|
|||
this->configMode = CM_FADE_IN_START;
|
||||
this->nextTitleLabel = FS_TITLE_OPEN_FILE;
|
||||
osSyncPrintf("Sram Start─Load 》》》》》 ");
|
||||
CVar_SetS32("gRandomizer", 0);
|
||||
Sram_VerifyAndLoadAllSaves(this, &this->sramCtx);
|
||||
osSyncPrintf("終了!!!\n");
|
||||
}
|
||||
|
@ -163,6 +165,63 @@ void FileChoose_FinishFadeIn(GameState* thisx) {
|
|||
}
|
||||
}
|
||||
|
||||
Sprite sprDPad = { gHookshotIconTex, 32, 32, G_IM_FMT_RGBA, G_IM_SIZ_32b };
|
||||
|
||||
void SpriteLoad(FileChooseContext* this, Sprite* sprite) {
|
||||
OPEN_DISPS(this->state.gfxCtx, "gfx.c", 12);
|
||||
|
||||
if (sprite->im_siz == G_IM_SIZ_16b) {
|
||||
gDPLoadTextureBlock(POLY_OPA_DISP++, sprite->tex, sprite->im_fmt,
|
||||
G_IM_SIZ_16b, // @TEMP until I figure out how to use sprite->im_siz
|
||||
sprite->width, sprite->height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP,
|
||||
G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
} else {
|
||||
gDPLoadTextureBlock(POLY_OPA_DISP++, sprite->tex, sprite->im_fmt,
|
||||
G_IM_SIZ_32b, // @TEMP until I figure out how to use sprite->im_siz
|
||||
sprite->width, sprite->height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP,
|
||||
G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
}
|
||||
|
||||
CLOSE_DISPS(this->state.gfxCtx, "gfx.c", 40);
|
||||
}
|
||||
|
||||
void SpriteDraw(FileChooseContext* this, Sprite* sprite, int left, int top, int width, int height) {
|
||||
int width_factor = (1 << 10) * sprite->width / width;
|
||||
int height_factor = (1 << 10) * sprite->height / height;
|
||||
|
||||
OPEN_DISPS(this->state.gfxCtx, "gfx.c", 51);
|
||||
|
||||
gSPWideTextureRectangle(POLY_OPA_DISP++, left << 2, top << 2, (left + width) << 2, (top + height) << 2,
|
||||
G_TX_RENDERTILE,
|
||||
0, 0, width_factor, height_factor);
|
||||
|
||||
CLOSE_DISPS(this->state.gfxCtx, "gfx.c", 62);
|
||||
}
|
||||
|
||||
void DrawSeedHashSprites(FileChooseContext* this) {
|
||||
OPEN_DISPS(this->state.gfxCtx, "dpad.c", 60);
|
||||
gDPPipeSync(POLY_OPA_DISP++);
|
||||
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
||||
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF);
|
||||
|
||||
// Draw Seed Icons
|
||||
u16 xStart = 64;
|
||||
for (u8 i = 0; i < 5; i++) {
|
||||
// gSaveContext.seedIcons[i];
|
||||
// hacky check to make sure we leaded the icons
|
||||
if(gSaveContext.seedIcons[i].height) {
|
||||
SpriteLoad(this, &gSaveContext.seedIcons[i]);
|
||||
SpriteDraw(this, &gSaveContext.seedIcons[i], xStart + (40 * i), 10, 24, 24);
|
||||
}
|
||||
// SpriteLoad(this, &sprDPad);
|
||||
// SpriteDraw(this, &sprDPad, xStart + (40 * i), 10, 24, 24);
|
||||
}
|
||||
|
||||
gDPPipeSync(POLY_OPA_DISP++);
|
||||
|
||||
CLOSE_DISPS(this->state.gfxCtx, "dpad.c", 113);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the cursor and wait for the player to select a button to change menus accordingly.
|
||||
* If an empty file is selected, enter the name entry config mode.
|
||||
|
@ -814,6 +873,8 @@ void FileChoose_DrawFileInfo(GameState* thisx, s16 fileIndex, s16 isActive) {
|
|||
s16 j;
|
||||
s16 deathCountSplit[3];
|
||||
|
||||
DrawSeedHashSprites(this);
|
||||
|
||||
if (1) {}
|
||||
|
||||
OPEN_DISPS(this->state.gfxCtx, "../z_file_choose.c", 1709);
|
||||
|
@ -1458,7 +1519,6 @@ void FileChoose_LoadGame(GameState* thisx) {
|
|||
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
|
||||
gSaveContext.fileNum = this->buttonIndex;
|
||||
Sram_OpenSave(&this->sramCtx);
|
||||
LoadItemLocations();
|
||||
gSaveContext.gameMode = 0;
|
||||
SET_NEXT_GAMESTATE(&this->state, Select_Init, SelectContext);
|
||||
this->state.running = false;
|
||||
|
@ -1466,12 +1526,14 @@ void FileChoose_LoadGame(GameState* thisx) {
|
|||
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
|
||||
gSaveContext.fileNum = this->buttonIndex;
|
||||
Sram_OpenSave(&this->sramCtx);
|
||||
LoadItemLocations();
|
||||
|
||||
gSaveContext.gameMode = 0;
|
||||
SET_NEXT_GAMESTATE(&this->state, Gameplay_Init, GlobalContext);
|
||||
this->state.running = false;
|
||||
}
|
||||
|
||||
LoadItemLocations("");
|
||||
|
||||
gSaveContext.respawn[0].entranceIndex = -1;
|
||||
gSaveContext.respawnFlag = 0;
|
||||
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
|
||||
|
|
|
@ -449,7 +449,17 @@ void FileChoose_DrawNameEntry(GameState* thisx) {
|
|||
|
||||
dayTime = ((void)0, gSaveContext.dayTime);
|
||||
|
||||
ParseItemLocations("blarg");
|
||||
// hacky function for testing
|
||||
// while drag and drop is broken on linux
|
||||
// enter "rando" as file name
|
||||
if(this->fileNames[1][0] == '5' &&
|
||||
this->fileNames[1][1] == '$' &&
|
||||
this->fileNames[1][2] == '1' &&
|
||||
this->fileNames[1][3] == '\'' &&
|
||||
this->fileNames[1][4] == '2')
|
||||
{
|
||||
ParseItemLocations("spoiler.json");
|
||||
}
|
||||
|
||||
Sram_InitSave(this, &this->sramCtx);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue