mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-21 05:43:42 -07:00
Merge changes from develop-zhora
This commit is contained in:
commit
a007bfd14a
86 changed files with 2252 additions and 892 deletions
69
soh/Makefile
69
soh/Makefile
|
@ -16,26 +16,35 @@ DEBUG ?= 1
|
|||
OPTFLAGS ?= -O0
|
||||
LTO ?= 0
|
||||
|
||||
# flag to save whether the compiler being used is clang or gcc by checking CXX --version
|
||||
CXX_IS_CLANG ?= $(shell $(CXX) --version | grep -c clang)
|
||||
|
||||
WARN := \
|
||||
-Wno-return-type \
|
||||
-Wno-unused-command-line-argument \
|
||||
-Wno-implicit-function-declaration \
|
||||
-Wno-c++11-narrowing \
|
||||
-funsigned-char \
|
||||
-fno-stack-protector -fno-common -fno-zero-initialized-in-bss -fno-strict-aliasing -fno-inline-functions -fno-inline-small-functions -ffreestanding -fwrapv \
|
||||
|
||||
CXXFLAGS := $(WARN) -std=c++20 -D_GNU_SOURCE -fpermissive -no-pie -nostdlib
|
||||
CFLAGS := $(WARN) -std=c99 -D_GNU_SOURCE -no-pie -nostdlib
|
||||
LDFLAGS :=
|
||||
|
||||
ifeq ($(UNAME), Linux) #LINUX
|
||||
CXXFLAGS += -mhard-float -msse2 -mfpmath=sse
|
||||
CFLAGS += -mhard-float -msse2 -mfpmath=sse
|
||||
ifeq ($(CXX_IS_CLANG),1)
|
||||
WARN += -Wno-c++11-narrowing
|
||||
endif
|
||||
|
||||
ifeq ($(UNAME), Darwin) #APPLE
|
||||
CXXFLAGS += $(shell pkg-config --cflags sdl2) $(shell sdl2-config --cflags) $(shell pkg-config --cflags glew) -framework OpenGL
|
||||
CFLAGS += $(shell pkg-config --cflags sdl2) $(shell sdl2-config --cflags) $(shell pkg-config --cflags glew) -framework OpenGL
|
||||
CXXFLAGS := $(WARN) -std=c++20 -D_GNU_SOURCE -fpermissive -nostdlib $(shell pkg-config --cflags glew) $(shell sdl2-config --cflags)
|
||||
CFLAGS := $(WARN) -std=c99 -Wno-implicit-function-declaration -D_GNU_SOURCE -nostdlib $(shell pkg-config --cflags glew) $(shell sdl2-config --cflags)
|
||||
LDFLAGS :=
|
||||
|
||||
ifneq ($(CXX_IS_CLANG),1)
|
||||
CXXFLAGS += -no-pie
|
||||
CFLAGS += -no-pie
|
||||
endif
|
||||
|
||||
ifeq ($(UNAME), Linux)
|
||||
ifeq ($(UNAMEM), x86_64)
|
||||
CXXFLAGS += -msse2 -mfpmath=sse -mhard-float
|
||||
CFLAGS += -msse2 -mfpmath=sse -mhard-float
|
||||
endif
|
||||
|
||||
CXXFLAGS += $(shell pkg-config --cflags libpulse)
|
||||
CFLAGS += $(shell pkg-config --cflags libpulse)
|
||||
endif
|
||||
|
||||
CPPFLAGS := -MMD
|
||||
|
@ -57,11 +66,11 @@ ifneq ($(LTO),0)
|
|||
LDFLAGS += -flto
|
||||
endif
|
||||
|
||||
ifeq ($(UNAME), Linux) #LINUX
|
||||
ifeq ($(UNAME), Linux)
|
||||
TARGET := soh.elf
|
||||
endif
|
||||
|
||||
ifeq ($(UNAME), Darwin) #APPLE
|
||||
ifeq ($(UNAME), Darwin)
|
||||
TARGET := soh-$(UNAMEM)
|
||||
endif
|
||||
|
||||
|
@ -78,25 +87,15 @@ INC_DIRS := $(addprefix -I, \
|
|||
../libultraship/libultraship/Lib/Fast3D/U64/PR \
|
||||
)
|
||||
|
||||
ifeq ($(UNAME), Linux) #LINUX
|
||||
INC_DIRS += $(addprefix -I, \
|
||||
/opt/X11/include \
|
||||
)
|
||||
endif
|
||||
|
||||
LDDIRS := $(addprefix -L, \
|
||||
../libultraship/ \
|
||||
)
|
||||
|
||||
ifeq ($(UNAME), Linux) #LINUX
|
||||
LDDIRS += $(addprefix -L, \
|
||||
/opt/X11/lib \
|
||||
)
|
||||
endif
|
||||
|
||||
LDLIBS := \
|
||||
$(ZAPDUTILS) \
|
||||
$(LIBSTORM) \
|
||||
$(shell sdl2-config --libs) \
|
||||
$(shell pkg-config --libs glew) \
|
||||
$(addprefix -l, \
|
||||
dl \
|
||||
bz2 \
|
||||
|
@ -105,24 +104,16 @@ LDLIBS := \
|
|||
ultraship \
|
||||
)
|
||||
|
||||
ifeq ($(UNAME), Linux) #LINUX
|
||||
LDLIBS += \
|
||||
$(addprefix -l, \
|
||||
X11 \
|
||||
SDL2 \
|
||||
GL \
|
||||
GLEW \
|
||||
pulse \
|
||||
)
|
||||
ifeq ($(UNAME), Linux)
|
||||
LDLIBS += $(shell pkg-config --libs x11 libpulse)
|
||||
endif
|
||||
|
||||
ifeq ($(UNAME), Darwin) #APPLE
|
||||
ifeq ($(UNAME), Darwin)
|
||||
LDLIBS += \
|
||||
$(addprefix -framework , \
|
||||
OpenGL \
|
||||
Foundation \
|
||||
) \
|
||||
$(shell sdl2-config --libs) $(shell pkg-config --libs glew)
|
||||
)
|
||||
endif
|
||||
|
||||
ASSET_BIN_DIRS := $(shell find assets/* -type d -not -path "assets/xml*")
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
#ifndef COLOR_H
|
||||
#define COLOR_H
|
||||
|
||||
typedef struct {
|
||||
u8 r, g, b;
|
||||
} Color_RGB8;
|
||||
|
||||
typedef struct {
|
||||
u8 r, g, b, a;
|
||||
} Color_RGBA8;
|
||||
|
||||
// only use when necessary for alignment purposes
|
||||
typedef union {
|
||||
struct {
|
||||
u8 a, b, g, r;
|
||||
};
|
||||
u32 rgba;
|
||||
} Color_RGBA8_u32;
|
||||
|
||||
typedef struct {
|
||||
f32 r, g, b, a;
|
||||
} Color_RGBAf;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
u16 r : 5;
|
||||
u16 g : 5;
|
||||
u16 b : 5;
|
||||
u16 a : 1;
|
||||
};
|
||||
u16 rgba;
|
||||
} Color_RGBA16;
|
||||
|
||||
#endif
|
|
@ -6,6 +6,15 @@
|
|||
* Each macro packs bytes (B), halfwords (H) and words (W, for consistency) into a single word
|
||||
*/
|
||||
|
||||
#ifdef IS_BIGENDIAN
|
||||
#define CMD_BBBB(a, b, c, d) (_SHIFTL(a, 24, 8) | _SHIFTL(b, 16, 8) | _SHIFTL(c, 8, 8) | _SHIFTL(d, 0, 8))
|
||||
|
||||
#define CMD_BBH(a, b, c) (_SHIFTL(a, 24, 8) | _SHIFTL(b, 16, 8) | _SHIFTL(c, 0, 16))
|
||||
|
||||
#define CMD_HBB(a, b, c) (_SHIFTL(a, 16, 16) | _SHIFTL(b, 8, 8) | _SHIFTL(c, 0, 8))
|
||||
|
||||
#define CMD_HH(a, b) (_SHIFTL(a, 16, 16) | _SHIFTL(b, 0, 16))
|
||||
#else
|
||||
#define CMD_BBBB(a, b, c, d) (_SHIFTL(a, 0, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(c, 16, 8) | _SHIFTL(d, 24, 8))
|
||||
|
||||
#define CMD_BBH(a, b, c) (_SHIFTL(a, 0, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(c, 16, 16))
|
||||
|
@ -13,6 +22,7 @@
|
|||
#define CMD_HBB(a, b, c) (_SHIFTL(a, 0, 16) | _SHIFTL(b, 16, 8) | _SHIFTL(c, 24, 8))
|
||||
|
||||
#define CMD_HH(a, b) (_SHIFTL(a, 0, 16) | _SHIFTL(b, 16, 16))
|
||||
#endif
|
||||
|
||||
#define CMD_W(a) (a)
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef MACROS_H
|
||||
#define MACROS_H
|
||||
|
||||
#include "endianness.h"
|
||||
|
||||
#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
|
||||
#define ARRAY_COUNTU(arr) (u32)(sizeof(arr) / sizeof(arr[0]))
|
||||
|
||||
|
@ -254,12 +256,5 @@ extern GraphicsContext* __gfxCtx;
|
|||
|
||||
#define SEG_ADDR(seg, addr) (addr | (seg << 24) | 1)
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define BOMSWAP16 _byteswap_ushort
|
||||
#define BOMSWAP32 _byteswap_ulong
|
||||
#else
|
||||
#define BOMSWAP16 __builtin_bswap16
|
||||
#define BOMSWAP32 __builtin_bswap32
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
#include "ichain.h"
|
||||
#include "regs.h"
|
||||
|
||||
#if defined(_WIN64) || defined(__x86_64__) || defined(__arm64__)
|
||||
#if defined(__LP64__)
|
||||
#define _SOH64
|
||||
#endif
|
||||
|
||||
|
@ -1458,8 +1458,6 @@ typedef struct {
|
|||
/* 0x18 */ s16 (*roomCompassOffsetY)[44]; // dungeon compass icon Y offset by room
|
||||
/* 0x1C */ u8* dgnMinimapCount; // number of room minimaps
|
||||
/* 0x20 */ u16* dgnMinimapTexIndexOffset; // dungeon minimap texture index offset
|
||||
/* 0x24 */ u16* owMinimapTexSize;
|
||||
/* 0x28 */ u16* owMinimapTexOffset;
|
||||
/* 0x2C */ s16* owMinimapPosX;
|
||||
/* 0x30 */ s16* owMinimapPosY;
|
||||
/* 0x34 */ s16 (*owCompassInfo)[4]; // [X scale, Y scale, X offset, Y offset]
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef Z64_AUDIO_H
|
||||
#define Z64_AUDIO_H
|
||||
|
||||
#include "endianness.h"
|
||||
|
||||
#define MK_CMD(b0,b1,b2,b3) ((((b0) & 0xFF) << 0x18) | (((b1) & 0xFF) << 0x10) | (((b2) & 0xFF) << 0x8) | (((b3) & 0xFF) << 0))
|
||||
|
||||
#define NO_LAYER ((SequenceLayer*)(-1))
|
||||
|
@ -685,6 +687,35 @@ typedef struct {
|
|||
} AudioPreloadReq; // size = 0x14
|
||||
|
||||
typedef struct {
|
||||
#ifdef IS_BIGENDIAN
|
||||
union{
|
||||
u32 opArgs;
|
||||
struct {
|
||||
u8 op;
|
||||
u8 arg0;
|
||||
u8 arg1;
|
||||
u8 arg2;
|
||||
};
|
||||
};
|
||||
union {
|
||||
void* data;
|
||||
f32 asFloat;
|
||||
s32 asInt;
|
||||
struct {
|
||||
u16 asUShort;
|
||||
u8 pad2[2];
|
||||
};
|
||||
struct {
|
||||
s8 asSbyte;
|
||||
u8 pad1[3];
|
||||
};
|
||||
struct {
|
||||
u8 asUbyte;
|
||||
u8 pad0[3];
|
||||
};
|
||||
u32 asUInt;
|
||||
};
|
||||
#else
|
||||
union{
|
||||
u32 opArgs;
|
||||
struct {
|
||||
|
@ -712,6 +743,7 @@ typedef struct {
|
|||
};
|
||||
u32 asUInt;
|
||||
};
|
||||
#endif
|
||||
} AudioCmd;
|
||||
|
||||
typedef struct {
|
||||
|
|
|
@ -356,7 +356,20 @@ typedef struct {
|
|||
/* 0x00 */ s32 active;
|
||||
/* 0x04 */ Vec3f tip;
|
||||
/* 0x10 */ Vec3f base;
|
||||
} WeaponInfo; // size = 0x1C
|
||||
} WeaponInfo; // size = 0x1C\
|
||||
|
||||
typedef enum {
|
||||
FLAG_NONE,
|
||||
FLAG_SCENE_SWITCH,
|
||||
FLAG_SCENE_TREASURE,
|
||||
FLAG_SCENE_CLEAR,
|
||||
FLAG_SCENE_COLLECTIBLE,
|
||||
} FlagType;
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ s32 flagID; // which flag to set when Player_SetPendingFlag is called
|
||||
/* 0x04 */ FlagType flagType; // type of flag to set when Player_SetPendingFlag is called
|
||||
} PendingFlag; // size = 0x06
|
||||
|
||||
#define PLAYER_STATE1_0 (1 << 0)
|
||||
#define PLAYER_STATE1_1 (1 << 1)
|
||||
|
@ -612,6 +625,7 @@ typedef struct Player {
|
|||
/* 0x0A86 */ s8 unk_A86;
|
||||
/* 0x0A87 */ u8 unk_A87;
|
||||
/* 0x0A88 */ Vec3f unk_A88; // previous body part 0 position
|
||||
} Player; // size = 0xA94
|
||||
/* 0x0A94 */ PendingFlag pendingFlag;
|
||||
} Player; // size = 0xAA0
|
||||
|
||||
#endif
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include "ultra64.h"
|
||||
#include "z64math.h"
|
||||
#include "z64audio.h"
|
||||
#include "soh/Enhancements/randomizer/randomizerTypes.h"
|
||||
|
||||
typedef struct {
|
||||
|
@ -114,9 +115,9 @@ typedef struct {
|
|||
/* 0x0EF8 */ u16 infTable[30]; // "inf_table"
|
||||
/* 0x0F38 */ u32 worldMapAreaData; // "area_arrival"
|
||||
/* 0x0F40 */ u8 scarecrowCustomSongSet;
|
||||
/* 0x0F41 */ u8 scarecrowCustomSong[0x360];
|
||||
/* 0x0F41 */ OcarinaNote scarecrowCustomSong[108];
|
||||
/* 0x12C5 */ u8 scarecrowSpawnSongSet;
|
||||
/* 0x12C6 */ u8 scarecrowSpawnSong[0x80];
|
||||
/* 0x12C6 */ OcarinaNote scarecrowSpawnSong[16];
|
||||
/* 0x1346 */ char unk_1346[0x02];
|
||||
/* 0x1348 */ HorseData horseData;
|
||||
/* 0x1354 */ s32 fileNum; // "file_no"
|
||||
|
|
|
@ -990,7 +990,6 @@
|
|||
<ClInclude Include="soh\frame_interpolation.h" />
|
||||
<ClInclude Include="include\alloca.h" />
|
||||
<ClInclude Include="include\bgm.h" />
|
||||
<ClInclude Include="include\color.h" />
|
||||
<ClInclude Include="include\command_macros_base.h" />
|
||||
<ClInclude Include="include\fp.h" />
|
||||
<ClInclude Include="include\functions.h" />
|
||||
|
|
|
@ -82,6 +82,24 @@
|
|||
<Filter Include="Source Files\soh\Enhancements\debugger">
|
||||
<UniqueIdentifier>{04fc1c52-49ff-48e2-ae23-2c00867374f8}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\soh\Enhancements\randomizer">
|
||||
<UniqueIdentifier>{fd63976d-64b1-45ee-b3ab-530c636391c3}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\soh\Enhancements\randomizer\3drando">
|
||||
<UniqueIdentifier>{ff94f63c-a792-49af-869b-42557318a32b}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\soh\Enhancements\randomizer\3drando\hint_list">
|
||||
<UniqueIdentifier>{1ba82a8d-b7d9-4f79-b80b-389322e189bc}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\soh\Enhancements\randomizer\3drando\location_access">
|
||||
<UniqueIdentifier>{9e20d69b-6a26-48ef-9aae-09c149b2c459}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\soh\Enhancements\randomizer">
|
||||
<UniqueIdentifier>{d7b4c12f-3876-40ec-a8ec-db435513156c}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\soh\Enhancements\randomizer\3drando">
|
||||
<UniqueIdentifier>{38ae4e39-fade-4f81-bfdb-af83bf641df0}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\soh\Enhancements\custom-message">
|
||||
<UniqueIdentifier>{8f355b3b-15ba-4e0a-be8b-2a6ec0ff4ec7}</UniqueIdentifier>
|
||||
</Filter>
|
||||
|
@ -2212,172 +2230,172 @@
|
|||
<Filter>Header Files\include</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\hint_list\hint_list_exclude_dungeon.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\hint_list</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\hint_list\hint_list_exclude_overworld.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\hint_list</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\hint_list\hint_list_item.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\hint_list</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_bottom_of_the_well.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_castle_town.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_death_mountain.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_deku_tree.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_dodongos_cavern.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_fire_temple.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_forest_temple.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_ganons_castle.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_gerudo_training_grounds.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_gerudo_valley.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_hyrule_field.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_ice_cavern.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_jabujabus_belly.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_kakariko.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_lost_woods.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_shadow_temple.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_spirit_temple.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_water_temple.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access\locacc_zoras_domain.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando\location_access</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\cosmetics.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\custom_messages.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\debug.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\dungeon.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\entrance.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\fill.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\hints.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\hint_list.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\item.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\item_list.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\item_location.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\item_pool.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\location_access.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\logic.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\menu.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\music.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\patch.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\playthrough.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\preset.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\random.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\rando_main.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\settings.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\setting_descriptions.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\shops.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\sound_effects.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\spoiler_log.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\starting_inventory.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\tinyxml2.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\trial.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\3drando\utils.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\randomizer.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\randomizer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\gfx.c">
|
||||
<Filter>Header Files\soh\Enhancements</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\randomizer\randomizer_item_tracker.cpp">
|
||||
<Filter>Source Files\src</Filter>
|
||||
<Filter>Source Files\soh\Enhancements\randomizer</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="soh\Enhancements\custom_message\CustomMessageManager.cpp">
|
||||
<Filter>Source Files\soh\Enhancements\custom-message</Filter>
|
||||
|
@ -2393,9 +2411,6 @@
|
|||
<ClInclude Include="include\bgm.h">
|
||||
<Filter>Header Files\include</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="include\color.h">
|
||||
<Filter>Header Files\include</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="include\command_macros_base.h">
|
||||
<Filter>Header Files\include</Filter>
|
||||
</ClInclude>
|
||||
|
@ -3957,118 +3972,118 @@
|
|||
<Filter>Header Files\include</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\category.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\cosmetics.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\custom_messages.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\debug.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\dungeon.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\entrance.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\fill.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\hints.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\hint_list.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\item.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\item_list.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\item_location.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\item_pool.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\keys.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\location_access.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\logic.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\menu.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\music.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\patch.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\playthrough.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\pool_functions.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\preset.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\random.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\randomizer.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\rando_main.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\settings.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\setting_descriptions.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\shops.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\sound_effects.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\spoiler_log.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\starting_inventory.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\text.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\tinyxml2.h">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\trial.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\3drando\utils.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer\3drando</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\randomizerTypes.h">
|
||||
<Filter>Header Files</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\gfx.h">
|
||||
<Filter>Header Files\soh\Enhancements</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\randomizer\randomizer_item_tracker.h">
|
||||
<Filter>Source Files\src</Filter>
|
||||
<Filter>Header Files\soh\Enhancements\randomizer</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Enhancements\custom_message\CustomMessageManager.h">
|
||||
<Filter>Header Files\soh\Enhancements\custom-message</Filter>
|
||||
|
|
|
@ -6668,10 +6668,12 @@
|
|||
"$(inherited)",
|
||||
"-DENABLE_OPENGL",
|
||||
"-DNDEBUG",
|
||||
"-DSPDLOG_ACTIVE_LEVEL=0",
|
||||
);
|
||||
OTHER_CPLUSPLUSFLAGS = (
|
||||
"-DENABLE_OPENGL",
|
||||
"-DNDEBUG",
|
||||
"-DSPDLOG_ACTIVE_LEVEL=0",
|
||||
);
|
||||
OTHER_LIBTOOLFLAGS = "";
|
||||
OTHER_REZFLAGS = "";
|
||||
|
@ -6728,10 +6730,12 @@
|
|||
"$(inherited)",
|
||||
"-DENABLE_OPENGL",
|
||||
"-D_DEBUG",
|
||||
"-DSPDLOG_ACTIVE_LEVEL=0",
|
||||
);
|
||||
OTHER_CPLUSPLUSFLAGS = (
|
||||
"-DENABLE_OPENGL",
|
||||
"-D_DEBUG",
|
||||
"-DSPDLOG_ACTIVE_LEVEL=0",
|
||||
);
|
||||
OTHER_LIBTOOLFLAGS = "";
|
||||
OTHER_REZFLAGS = "";
|
||||
|
@ -6842,7 +6846,6 @@
|
|||
"-DENABLE_OPENGL",
|
||||
"-D_CRT_SECURE_NO_WARNINGS",
|
||||
"-D_CONSOLE",
|
||||
"-DSPDLOG_ACTIVE_LEVEL=0",
|
||||
"-DNDEBUG",
|
||||
);
|
||||
OTHER_LDFLAGS = (
|
||||
|
@ -7031,7 +7034,6 @@
|
|||
"-DENABLE_OPENGL",
|
||||
"-D_CRT_SECURE_NO_WARNINGS",
|
||||
"-D_CONSOLE",
|
||||
"-DSPDLOG_ACTIVE_LEVEL=0",
|
||||
"-D_DEBUG",
|
||||
);
|
||||
OTHER_LDFLAGS = (
|
||||
|
|
78
soh/soh.xcodeproj/xcshareddata/xcschemes/soh.xcscheme
Normal file
78
soh/soh.xcodeproj/xcshareddata/xcschemes/soh.xcscheme
Normal file
|
@ -0,0 +1,78 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1400"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6D85CFA44008444FB26F04BA"
|
||||
BuildableName = "soh.app"
|
||||
BlueprintName = "soh"
|
||||
ReferencedContainer = "container:soh.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6D85CFA44008444FB26F04BA"
|
||||
BuildableName = "soh.app"
|
||||
BlueprintName = "soh"
|
||||
ReferencedContainer = "container:soh.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "6D85CFA44008444FB26F04BA"
|
||||
BuildableName = "soh.app"
|
||||
BlueprintName = "soh"
|
||||
ReferencedContainer = "container:soh.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
|
@ -229,28 +229,28 @@ void Draw_Npcs(){
|
|||
ImGui::TableSetupColumn("Outer colors##Navi", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort, TablesCellsWidth/2);
|
||||
Table_InitHeader();
|
||||
Draw_HelpIcon("Inner color for Navi (idle flying around)");
|
||||
SohImGui::EnhancementColor("Navi Idle (Primary)", "gNavi_Idle_Inner_", navi_idle_i_col, ImVec4(255, 255, 255, 255), false);
|
||||
SohImGui::EnhancementColor("Navi Idle (Primary)", "gNavi_Idle_Inner", navi_idle_i_col, ImVec4(255, 255, 255, 255), false);
|
||||
Table_NextCol();
|
||||
Draw_HelpIcon("Outer color for Navi (idle flying around)");
|
||||
SohImGui::EnhancementColor("Navi Idle (Secondary)", "gNavi_Idle_Outer_", navi_idle_o_col, ImVec4(0, 0, 255, 255), false);
|
||||
SohImGui::EnhancementColor("Navi Idle (Secondary)", "gNavi_Idle_Outer", navi_idle_o_col, ImVec4(0, 0, 255, 255), false);
|
||||
Table_NextLine();
|
||||
Draw_HelpIcon("Inner color for Navi (when Navi fly around NPCs)");
|
||||
SohImGui::EnhancementColor("Navi NPC (Primary)", "gNavi_NPC_Inner_", navi_npc_i_col, ImVec4(150, 150, 255, 255), false);
|
||||
SohImGui::EnhancementColor("Navi NPC (Primary)", "gNavi_NPC_Inner", navi_npc_i_col, ImVec4(150, 150, 255, 255), false);
|
||||
Table_NextCol();
|
||||
Draw_HelpIcon("Outer color for Navi (when Navi fly around NPCs)");
|
||||
SohImGui::EnhancementColor("Navi NPC (Secondary)", "gNavi_NPC_Outer_", navi_npc_o_col, ImVec4(150, 150, 255, 255), false);
|
||||
SohImGui::EnhancementColor("Navi NPC (Secondary)", "gNavi_NPC_Outer", navi_npc_o_col, ImVec4(150, 150, 255, 255), false);
|
||||
Table_NextLine();
|
||||
Draw_HelpIcon("Inner color for Navi (when Navi fly around Enemies or Bosses)");
|
||||
SohImGui::EnhancementColor("Navi Enemy (Primary)", "gNavi_Enemy_Inner_", navi_enemy_i_col, ImVec4(255, 255, 0, 255), false);
|
||||
SohImGui::EnhancementColor("Navi Enemy", "gNavi_Enemy_Inner", navi_enemy_i_col, ImVec4(255, 255, 0, 255), false);
|
||||
Table_NextCol();
|
||||
Draw_HelpIcon("Outer color for Navi (when Navi fly around Enemies or Bosses)");
|
||||
SohImGui::EnhancementColor("Navi Enemy (Secondary)", "gNavi_Enemy_Outer_", navi_enemy_o_col, ImVec4(220, 155, 0, 255), false);
|
||||
SohImGui::EnhancementColor("Navi Enemy (Secondary)", "gNavi_Enemy_Outer", navi_enemy_o_col, ImVec4(220, 155, 0, 255), false);
|
||||
Table_NextLine();
|
||||
Draw_HelpIcon("Inner color for Navi (when Navi fly around props (signs etc))");
|
||||
SohImGui::EnhancementColor("Navi Prop (Primary)", "gNavi_Prop_Inner_", navi_prop_i_col, ImVec4(0, 255, 0, 255), false);
|
||||
SohImGui::EnhancementColor("Navi Prop (Primary)", "gNavi_Prop_Inner", navi_prop_i_col, ImVec4(0, 255, 0, 255), false);
|
||||
Table_NextCol();
|
||||
Draw_HelpIcon("Outer color for Navi (when Navi fly around props (signs etc))");
|
||||
SohImGui::EnhancementColor("Navi Prop (Secondary)", "gNavi_Prop_Outer_", navi_prop_o_col, ImVec4(0, 255, 0, 255), false);
|
||||
SohImGui::EnhancementColor("Navi Prop (Secondary)", "gNavi_Prop_Outer", navi_prop_o_col, ImVec4(0, 255, 0, 255), false);
|
||||
ImGui::EndTable();
|
||||
}
|
||||
SohImGui::EnhancementCheckbox("Custom colors for Keese", "gUseKeeseCol");
|
||||
|
|
|
@ -375,11 +375,16 @@ static bool StateSlotSelectHandler(const std::vector<std::string>& args) {
|
|||
#define VARTYPE_INTEGER 0
|
||||
#define VARTYPE_FLOAT 1
|
||||
#define VARTYPE_STRING 2
|
||||
#define VARTYPE_RGBA 3
|
||||
|
||||
static int CheckVarType(const std::string& input)
|
||||
{
|
||||
int result = VARTYPE_STRING;
|
||||
|
||||
if (input[0] == '#') {
|
||||
return VARTYPE_RGBA;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < input.size(); i++)
|
||||
{
|
||||
if (!(std::isdigit(input[i]) || input[i] == '.'))
|
||||
|
@ -407,7 +412,17 @@ static bool SetCVarHandler(const std::vector<std::string>& args) {
|
|||
if (vType == VARTYPE_STRING)
|
||||
CVar_SetString(args[1].c_str(), args[2].c_str());
|
||||
else if (vType == VARTYPE_FLOAT)
|
||||
CVar_SetFloat(args[1].c_str(), std::stof(args[2]));
|
||||
CVar_SetFloat((char*)args[1].c_str(), std::stof(args[2]));
|
||||
else if (vType == VARTYPE_RGBA)
|
||||
{
|
||||
uint32_t val = std::stoul(&args[2].c_str()[1], nullptr, 16);
|
||||
Color_RGBA8 clr;
|
||||
clr.r = val >> 24;
|
||||
clr.g = val >> 16;
|
||||
clr.b = val >> 8;
|
||||
clr.a = val & 0xFF;
|
||||
CVar_SetRGBA((char*)args[1].c_str(), clr);
|
||||
}
|
||||
else
|
||||
CVar_SetS32(args[1].c_str(), std::stoi(args[2]));
|
||||
|
||||
|
@ -426,12 +441,14 @@ static bool GetCVarHandler(const std::vector<std::string>& args) {
|
|||
|
||||
if (cvar != nullptr)
|
||||
{
|
||||
if (cvar->type == CVAR_TYPE_S32)
|
||||
if (cvar->type == CVarType::S32)
|
||||
INFO("[SOH] Variable %s is %i", args[1].c_str(), cvar->value.valueS32);
|
||||
else if (cvar->type == CVAR_TYPE_FLOAT)
|
||||
else if (cvar->type == CVarType::Float)
|
||||
INFO("[SOH] Variable %s is %f", args[1].c_str(), cvar->value.valueFloat);
|
||||
else if (cvar->type == CVAR_TYPE_STRING)
|
||||
else if (cvar->type == CVarType::String)
|
||||
INFO("[SOH] Variable %s is %s", args[1].c_str(), cvar->value.valueStr);
|
||||
else if (cvar->type == CVarType::RGBA)
|
||||
INFO("[SOH] Variable %s is %08X", args[1].c_str(), cvar->value.valueRGBA);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -508,6 +525,22 @@ void DebugConsole_LoadLegacyCVars() {
|
|||
std::vector<std::string> cfg = StringHelper::Split(line, " = ");
|
||||
if (line.empty()) continue;
|
||||
if (cfg.size() < 2) continue;
|
||||
|
||||
if (cfg[1].find("\"") == std::string::npos && (cfg[1].find("#") != std::string::npos))
|
||||
{
|
||||
std::string value(cfg[1]);
|
||||
value.erase(std::remove_if(value.begin(), value.end(), [](char c) { return c == '#'; }), value.end());
|
||||
auto splitTest = StringHelper::Split(value, "\r")[0];
|
||||
|
||||
uint32_t val = std::stoul(splitTest, nullptr, 16);
|
||||
Color_RGBA8 clr;
|
||||
clr.r = val >> 24;
|
||||
clr.g = val >> 16;
|
||||
clr.b = val >> 8;
|
||||
clr.a = val & 0xFF;
|
||||
CVar_SetRGBA(cfg[0].c_str(), clr);
|
||||
}
|
||||
|
||||
if (cfg[1].find("\"") != std::string::npos) {
|
||||
std::string value(cfg[1]);
|
||||
value.erase(std::remove(value.begin(), value.end(), '\"'), value.end());
|
||||
|
@ -534,6 +567,16 @@ void DebugConsole_LoadCVars() {
|
|||
auto value = item.value();
|
||||
switch (value.type()) {
|
||||
case nlohmann::detail::value_t::array:
|
||||
break;
|
||||
case nlohmann::detail::value_t::object:
|
||||
if (value["Type"].get<std::string>() == mercuryRGBAObjectType) {
|
||||
Color_RGBA8 clr;
|
||||
clr.r = value["R"].get<uint8_t>();
|
||||
clr.g = value["G"].get<uint8_t>();
|
||||
clr.b = value["B"].get<uint8_t>();
|
||||
clr.a = value["A"].get<uint8_t>();
|
||||
}
|
||||
|
||||
break;
|
||||
case nlohmann::detail::value_t::string:
|
||||
CVar_SetString(item.key().c_str(), value.get<std::string>().c_str());
|
||||
|
@ -565,12 +608,22 @@ void DebugConsole_SaveCVars()
|
|||
for (const auto &cvar : cvars) {
|
||||
const std::string key = StringHelper::Sprintf("CVars.%s", cvar.first.c_str());
|
||||
|
||||
if (cvar.second->type == CVAR_TYPE_STRING && cvar.second->value.valueStr != nullptr)
|
||||
if (cvar.second->type == CVarType::String && cvar.second->value.valueStr != nullptr)
|
||||
pConf->setString(key, std::string(cvar.second->value.valueStr));
|
||||
else if (cvar.second->type == CVAR_TYPE_S32)
|
||||
else if (cvar.second->type == CVarType::S32)
|
||||
pConf->setInt(key, cvar.second->value.valueS32);
|
||||
else if (cvar.second->type == CVAR_TYPE_FLOAT)
|
||||
else if (cvar.second->type == CVarType::Float)
|
||||
pConf->setFloat(key, cvar.second->value.valueFloat);
|
||||
else if (cvar.second->type == CVarType::RGBA)
|
||||
{
|
||||
auto keyStr = key.c_str();
|
||||
Color_RGBA8 clr = cvar.second->value.valueRGBA;
|
||||
pConf->setUInt(StringHelper::Sprintf("%s.R", keyStr), clr.r);
|
||||
pConf->setUInt(StringHelper::Sprintf("%s.G", keyStr), clr.r);
|
||||
pConf->setUInt(StringHelper::Sprintf("%s.B", keyStr), clr.r);
|
||||
pConf->setUInt(StringHelper::Sprintf("%s.A", keyStr), clr.r);
|
||||
pConf->setString(StringHelper::Sprintf("%s.Type", keyStr), mercuryRGBAObjectType);
|
||||
}
|
||||
}
|
||||
|
||||
pConf->save();
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
#include "ImGuiHelpers.h"
|
||||
#include "../../../../libultraship/libultraship/ImGuiImpl.h"
|
||||
|
||||
// Adds a text tooltip for the previous ImGui item
|
||||
void SetLastItemHoverText(const std::string& text) {
|
||||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::BeginTooltip();
|
||||
ImGui::Text(text.c_str());
|
||||
ImGui::Text(SohImGui::BreakTooltip(text, 60).c_str());
|
||||
ImGui::EndTooltip();
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +16,7 @@ void InsertHelpHoverText(const std::string& text) {
|
|||
ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "?");
|
||||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::BeginTooltip();
|
||||
ImGui::Text(text.c_str());
|
||||
ImGui::Text(SohImGui::BreakTooltip(text, 60).c_str());
|
||||
ImGui::EndTooltip();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1001,7 +1001,7 @@ void DrawFlagsTab() {
|
|||
|
||||
// Draws a combo that lets you choose and upgrade value from a drop-down of text values
|
||||
void DrawUpgrade(const std::string& categoryName, int32_t categoryId, const std::vector<std::string>& names) {
|
||||
ImGui::Text(categoryName.c_str());
|
||||
ImGui::Text("%s", categoryName.c_str());
|
||||
ImGui::SameLine();
|
||||
ImGui::PushID(categoryName.c_str());
|
||||
if (ImGui::BeginCombo("##upgrade", names[CUR_UPG_VALUE(categoryId)].c_str())) {
|
||||
|
@ -1435,7 +1435,7 @@ void DrawPlayerTab() {
|
|||
InsertHelpHoverText("Link's speed along the Y plane. Caps at -20");
|
||||
|
||||
ImGui::InputScalar("Wall Height", ImGuiDataType_Float, &player->wallHeight);
|
||||
InsertHelpHoverText("\"height used to determine whether link can climb or grab a ledge at the top\"");
|
||||
InsertHelpHoverText("Height used to determine whether Link can climb or grab a ledge at the top");
|
||||
|
||||
ImGui::InputScalar("Invincibility Timer", ImGuiDataType_S8, &player->invincibilityTimer);
|
||||
InsertHelpHoverText("Can't take damage while this is nonzero");
|
||||
|
|
|
@ -2102,7 +2102,7 @@ void HintTable_Init() {
|
|||
|
||||
hintTable[GANON_LINE07] = HintText::GanonLine({
|
||||
//obscure text
|
||||
Text{"What about Zelda makes you think she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the hungry,&and my castle floats.",
|
||||
Text{"What about Zelda makes you think&she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the hungry,&and my castle floats.",
|
||||
/*french*/"Zelda ne sera jamais un meilleur monarque que moi!^J'ai un château volant, mes sujets sont des belles amazones... et mes Moblins sont clairement plus puissants que jamais!",
|
||||
/*spanish*/"¿Qué te hace pensar que Zelda gobierna mejor que yo?^Yo he salvado el Rancho Lon Lon,&he alimentado a los hambrientos&y hasta hago que mi castillo flote."},
|
||||
});
|
||||
|
|
|
@ -579,7 +579,7 @@ std::string AutoFormatHintTextString(std::string unformattedHintTextString) {
|
|||
bool needsAutomaicNewlines = true;
|
||||
if (textStr == "Erreur 0x69a504:&Traduction manquante^C'est de la faute à Purple Hato!&J'vous jure!" ||
|
||||
textStr == "Mon très cher @:&Viens vite au château, je t'ai préparé&un délicieux gâteau...^À bientôt, Princesse Zelda" ||
|
||||
textStr == "What about Zelda makes you think she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the hungry,&and my castle floats." ||
|
||||
textStr == "What about Zelda makes you think&she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the hungry,&and my castle floats." ||
|
||||
textStr == "Many tricks are up my sleeve,&to save yourself&you'd better leave!" ||
|
||||
textStr == "I've learned this spell,&it's really neat,&I'll keep it later&for your treat!" ||
|
||||
textStr == "Sale petit garnement,&tu fais erreur!&C'est maintenant que marque&ta dernière heure!" ||
|
||||
|
|
|
@ -3518,21 +3518,21 @@ void DrawRandoEditor(bool& open) {
|
|||
switch (CVar_GetS32("gRandomizeForest", 1)) {
|
||||
case 1:
|
||||
InsertHelpHoverText("Mido no longer blocks the path to the Deku Tree\n"
|
||||
"The Kokiri boy no longer blocks the path\nout of the forest.");
|
||||
"The Kokiri boy no longer blocks the path out of the forest.");
|
||||
break;
|
||||
case 2:
|
||||
InsertHelpHoverText(
|
||||
"The Kokiri boy no longer blocks the path out of the forest\nMido "
|
||||
"still blocks the path to the Deku\nTree, requiring the Kokiri Sword "
|
||||
"and a Deku Shield to\naccess the Deku Tree.");
|
||||
"still blocks the path to the Deku Tree, requiring the Kokiri Sword "
|
||||
"and a Deku Shield to access the Deku Tree.");
|
||||
break;
|
||||
case 0:
|
||||
InsertHelpHoverText(
|
||||
"Beating Deku Tree is logically required to leave\nthe forest area "
|
||||
"(Kokiri Forest / Loost Woods / Sacred\nForest Meadow / Deku Tree) "
|
||||
"while the Kokiri Sword\nand a Deku Shield are required to access the "
|
||||
"Deku\nTree Items needed for this will be guaranteed\ninside the "
|
||||
"forest area.\nThis settins is incompatible with starting as adult.");
|
||||
"Beating Deku Tree is logically required to leave the forest area "
|
||||
"(Kokiri Forest / Lost Woods / Sacred Forest Meadow / Deku Tree) "
|
||||
"while the Kokiri Sword and a Deku Shield are required to access the "
|
||||
"Deku Tree\nItems needed for this will be guaranteed inside the "
|
||||
"forest area.\nThis setting is incompatible with starting as adult.");
|
||||
break;
|
||||
}
|
||||
SohImGui::EnhancementCombobox("gRandomizeForest", randoForest, 3, 1);
|
||||
|
@ -3542,13 +3542,13 @@ void DrawRandoEditor(bool& open) {
|
|||
switch (CVar_GetS32("gRandomizeKakarikoGate", 0)) {
|
||||
case 0:
|
||||
InsertHelpHoverText(
|
||||
"The gate and the Happy Mask Shop both remain\nclosed until showing "
|
||||
"Zelda's Letter to the guard\nin Kakariko.");
|
||||
"The gate and the Happy Mask Shop both remain closed until showing "
|
||||
"Zelda's Letter to the guard in Kakariko.");
|
||||
break;
|
||||
case 1:
|
||||
InsertHelpHoverText(
|
||||
"The gate is always open instead of needing\nZelda's Letter.\nThe Happy Mask Shop "
|
||||
"opens upon obtaining \n Zelda's Letter without needing to show\nit to the guard.");
|
||||
"The gate is always open instead of needing Zelda's Letter.\nThe Happy Mask Shop "
|
||||
"opens upon obtaining Zelda's Letter without needing to show it to the guard.");
|
||||
break;
|
||||
}
|
||||
SohImGui::EnhancementCombobox("gRandomizeKakarikoGate", randoKakarikoGate, 2, 1);
|
||||
|
@ -3559,16 +3559,16 @@ void DrawRandoEditor(bool& open) {
|
|||
switch (CVar_GetS32("gRandomizeDoorOfTime", 0)) {
|
||||
case 0:
|
||||
InsertHelpHoverText(
|
||||
"The Door of Time starts opened instead of needing\nto play the Song of Time.");
|
||||
"The Door of Time starts opened instead of needing to play the Song of Time.");
|
||||
break;
|
||||
case 1:
|
||||
InsertHelpHoverText(
|
||||
"Only an Ocarina and the Song of Time need to be\nfound to open the Door of Time.");
|
||||
"Only an Ocarina and the Song of Time need to be found to open the Door of Time.");
|
||||
break;
|
||||
case 2:
|
||||
InsertHelpHoverText(
|
||||
"The Ocarina of Time, the Song of Time and\nall Spiritual Stones need to "
|
||||
"be found to\nopen the Door of Time.");
|
||||
"The Ocarina of Time, the Song of Time and all Spiritual Stones need to "
|
||||
"be found to open the Door of Time.");
|
||||
break;
|
||||
}
|
||||
SohImGui::EnhancementCombobox("gRandomizeDoorOfTime", randoDoorOfTime, 3, 0);
|
||||
|
@ -3580,17 +3580,17 @@ void DrawRandoEditor(bool& open) {
|
|||
case 0:
|
||||
InsertHelpHoverText(
|
||||
"King Zora obstructs the way to Zora's Fountain.\nRuto's Letter must be "
|
||||
"shown as child in order to\nmove him from both eras.");
|
||||
"shown as child in order to move him from both eras.");
|
||||
break;
|
||||
case 1:
|
||||
InsertHelpHoverText(
|
||||
"King Zora is always moved in the adult era.\nThis means Ruto's Letter is "
|
||||
"only required to\naccess Zora's fountain as child.");
|
||||
"only required to access Zora's fountain as child.");
|
||||
break;
|
||||
case 2:
|
||||
InsertHelpHoverText(
|
||||
"King Zora starts as moved in both the child and\nadult eras.\nThis also "
|
||||
"removes Ruto's Letter from the\npool since it can't be used.");
|
||||
"King Zora starts as moved in both the child and adult eras.\nThis also "
|
||||
"removes Ruto's Letter from the pool since it can't be used.");
|
||||
break;
|
||||
}
|
||||
SohImGui::EnhancementCombobox("gRandomizeZorasFountain", randoZorasFountain, 3, 0);
|
||||
|
@ -3607,9 +3607,9 @@ void DrawRandoEditor(bool& open) {
|
|||
break;
|
||||
case 2:
|
||||
InsertHelpHoverText(
|
||||
"The carpenters are rescued from the start of the\ngame and if \"Shuffle "
|
||||
"Gerudo Card\" is disabled,\nthe player starts with the Gerudo Card in "
|
||||
"the\ninventory allowing access to Gerudo Training\nGrounds.");
|
||||
"The carpenters are rescued from the start of the game and if \"Shuffle "
|
||||
"Gerudo Card\" is disabled, the player starts with the Gerudo Card in "
|
||||
"the inventory allowing access to Gerudo Training Grounds.");
|
||||
break;
|
||||
}
|
||||
SohImGui::EnhancementCombobox("gRandomizeGerudoFortress", randoGerudoFortress, 3, 1);
|
||||
|
@ -3620,41 +3620,40 @@ void DrawRandoEditor(bool& open) {
|
|||
SohImGui::EnhancementCombobox("gRandomizeRainbowBridge", randoRainbowBridge, 7, 3);
|
||||
switch (CVar_GetS32("gRandomizeRainbowBridge", 3)) {
|
||||
case 1:
|
||||
InsertHelpHoverText("The Rainbow Bridge requires Shadow and Spirit\nMedallions as well "
|
||||
InsertHelpHoverText("The Rainbow Bridge requires Shadow and Spirit Medallions as well "
|
||||
"as Light Arrows.");
|
||||
break;
|
||||
case 2:
|
||||
InsertHelpHoverText("The Rainbow Bridge requires collecting a\nconfigurable number of "
|
||||
InsertHelpHoverText("The Rainbow Bridge requires collecting a configurable number of "
|
||||
"Spiritual Stones.");
|
||||
SohImGui::EnhancementSliderInt("Stone Count: %d", "##RandoStoneCount",
|
||||
"gRandomizeStoneCount", 0, 3, "");
|
||||
SetLastItemHoverText(
|
||||
"Sets the number of Spiritual Stones required to\nspawn the Rainbow Bridge.");
|
||||
"Sets the number of Spiritual Stones required to spawn the Rainbow Bridge.");
|
||||
break;
|
||||
case 3:
|
||||
SohImGui::EnhancementSliderInt("Medallion Count: %d", "##RandoMedallionCount",
|
||||
"gRandomizeMedallionCount", 0, 6, "", 6);
|
||||
SetLastItemHoverText(
|
||||
"The Rainbow Bridge requires collecting a\nconfigurable number of Medallions.");
|
||||
"The Rainbow Bridge requires collecting a configurable number of Medallions.");
|
||||
break;
|
||||
case 4:
|
||||
SohImGui::EnhancementSliderInt("Reward Count: %d", "##RandoRewardCount",
|
||||
"gRandomizeRewardCount", 0, 9, "");
|
||||
SetLastItemHoverText("The Rainbow Bridge requires collecting a\nconfigurable number of "
|
||||
SetLastItemHoverText("The Rainbow Bridge requires collecting a configurable number of "
|
||||
"Dungeon Rewards.");
|
||||
break;
|
||||
case 5:
|
||||
SohImGui::EnhancementSliderInt("Dungeon Count: %d", "##RandoDungeonCount",
|
||||
"gRandomizeDungeonCount", 0, 8, "");
|
||||
SetLastItemHoverText(
|
||||
"The Rainbow Bridge requires completing a\nconfigurable number of "
|
||||
"Dungeons.\n\nDungeons "
|
||||
"are considered complete when Link steps\ninto the blue warp at the end of them.");
|
||||
"The Rainbow Bridge requires completing a configurable number of Dungeons.\nDungeons "
|
||||
"are considered complete when Link steps into the blue warp at the end of them.");
|
||||
break;
|
||||
case 6:
|
||||
SohImGui::EnhancementSliderInt("Token Count: %d", "##RandoTokenCount",
|
||||
"gRandomizeTokenCount", 0, 100, "");
|
||||
SetLastItemHoverText("The Rainbow Bridge requires collecting a\nconfigurable number of "
|
||||
SetLastItemHoverText("The Rainbow Bridge requires collecting a configurable number of "
|
||||
"Gold Skulltula Tokens.");
|
||||
break;
|
||||
}
|
||||
|
@ -3663,17 +3662,17 @@ void DrawRandoEditor(bool& open) {
|
|||
// Random Ganon's Trials
|
||||
/*
|
||||
ImGui::Text("Random Ganon's Trials");
|
||||
InsertHelpHoverText("Sets a random number or required trials to enter\nGanon's Tower.");
|
||||
InsertHelpHoverText("Sets a random number or required trials to enter Ganon's Tower.");
|
||||
SohImGui::EnhancementCombobox("gRandomizeGanonTrial", randoGanonsTrial, 2, 0);
|
||||
if (CVar_GetS32("gRandomizeGanonTrial", 0) == 0) {
|
||||
*/
|
||||
//SohImGui::EnhancementSliderInt("Ganon's Trial Count: %d", "##RandoTrialCount",
|
||||
// "gRandomizeGanonTrialCount", 0, 6, "");
|
||||
//InsertHelpHoverText("Set the number of trials required to enter\nGanon's Tower.");
|
||||
//InsertHelpHoverText("Set the number of trials required to enter Ganon's Tower.");
|
||||
// RANDTODO: Switch back to slider when pre-completing some of Ganon's Trials is properly implemnted.
|
||||
SohImGui::EnhancementCheckbox("Skip Ganon's Trials", "gRandomizeGanonTrialCount");
|
||||
InsertHelpHoverText(
|
||||
"Sets whether or not Ganon's Castle Trials are required\nto enter Ganon's Tower.");
|
||||
"Sets whether or not Ganon's Castle Trials are required to enter Ganon's Tower.");
|
||||
|
||||
// }
|
||||
ImGui::Separator();
|
||||
|
@ -3692,9 +3691,9 @@ void DrawRandoEditor(bool& open) {
|
|||
// Starting Age
|
||||
// ImGui::Text("Starting Age");
|
||||
// InsertHelpHoverText(
|
||||
// "Choose which age Link will start as.\n\nStarting as adult means you start with the "
|
||||
// "Master\nSword "
|
||||
// "in your inventory.\n\nOnly the child option is compatible with Closed\nForest.");
|
||||
// "Choose which age Link will start as.\nStarting as adult means you start with the "
|
||||
// "Master Sword in your inventory.\nOnly the child option is compatible with "
|
||||
// "Closed Forest.");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeStartingAge", randoStartingAge, 3, 0);
|
||||
// ImGui::Separator();
|
||||
|
||||
|
@ -3702,31 +3701,26 @@ void DrawRandoEditor(bool& open) {
|
|||
// Shuffle Entrances
|
||||
// ImGui::Text("Shuffle Entrances");
|
||||
// InsertHelpHoverText("Shuffle where the entrances between areas lead to.\n"
|
||||
// "If turned on, select which kinds of entrances you\n"
|
||||
// "want shuffled in the options below. Note that some\n"
|
||||
// "types of entrances can have widly varying\ngeneration times.");
|
||||
// "If turned on, select which kinds of entrances you "
|
||||
// "want shuffled in the options below.\n Note that some "
|
||||
// "types of entrances can have widly varying generation times.");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeShuffleEntrances", randoShuffleEntrances, 2, 0);
|
||||
// if (CVar_GetS32("gRandomizeShuffleEntrances", 0) == 1) {
|
||||
// ImGui::Indent();
|
||||
// ImGui::Text("Shuffle Dungeons Entrances");
|
||||
// InsertHelpHoverText(
|
||||
// "Shuffle the pool of dungeon entrances, including\nBottom of the Well, Ice caven and "
|
||||
// "Gerudo\n"
|
||||
// "Training Grounds However, Ganon's Caslte is not\nshuffled.\n\nAdditionally, the "
|
||||
// "entrance "
|
||||
// "of "
|
||||
// "Deku Tree, Fire\nTemple and Bottom of the Well are opened for both\nadult and child.");
|
||||
// "Shuffle the pool of dungeon entrances, including Bottom of the Well, Ice Cavern and "
|
||||
// "Gerudo Training Grounds\nGanon's Castle is not shuffled.\nAdditionally, the entrance "
|
||||
// "of Deku Tree, Fire Temple and Bottom of the Well are open for both adult and child.");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeShuffleDungeonsEntrances",
|
||||
// randoShuffleDungeonsEntrances, 2, 0);
|
||||
// ImGui::Text("Shuffle Overworld Entrances");
|
||||
// InsertHelpHoverText(
|
||||
// "Shuffle the pool of Overworld entrances, which\ncorresponds to almost all loading "
|
||||
// "zones "
|
||||
// "between\nOverworld areas.\n\nSome entrances are unshuffled to avoid issues:\n- Hyrule "
|
||||
// "Castle "
|
||||
// "Courtyard and Garden entrance\n- Both Market Back Alley entrances\n- Gerudo Valley to "
|
||||
// "Lake "
|
||||
// "Hylia (unless entrances\nare decoupled).");
|
||||
// "Shuffle the pool of Overworld entrances, which corresponds to almost all loading "
|
||||
// "zones between Overworld areas.\nSome entrances are unshuffled to avoid issues:\n"
|
||||
// "- Hyrule Castle Courtyard and Garden entrance\n"
|
||||
// "- Both Market Back Alley entrances\n"
|
||||
// "- Gerudo Valley to Lake Hylia (unless entrances are decoupled)");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeShuffleOverworldEntrances",
|
||||
// randoShuffleOverworldEntrances, 2, 0);
|
||||
// ImGui::Text("Shuffle Interiors Entrances");
|
||||
|
@ -3735,8 +3729,8 @@ void DrawRandoEditor(bool& open) {
|
|||
// randoShuffleInteriorsEntrances, 2, 0);
|
||||
// ImGui::Text("Shuffle Grottos Entrances");
|
||||
// InsertHelpHoverText(
|
||||
// "Shuffle the pool of grotto entrances, including\nall graves, small Fairy "
|
||||
// "fountains and the Lost\nWoods Stage.");
|
||||
// "Shuffle the pool of grotto entrances, including all graves, small Fairy "
|
||||
// "fountains and the Lost Woods Stage.");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeShuffleGrottosEntrances",
|
||||
// randoShuffleGrottosEntrances, 2, 0);
|
||||
// ImGui::Unindent();
|
||||
|
@ -3747,9 +3741,8 @@ void DrawRandoEditor(bool& open) {
|
|||
// Bombchus in Logic
|
||||
// ImGui::Text("Bombchus in Logic");
|
||||
// InsertHelpHoverText(
|
||||
// "Bombchus are properly considered in logic.\nThey can be replenished in shops "
|
||||
// "or trough\nbombchu "
|
||||
// "drops, if those are enabled.\nBombchu Bowling is opened by bombchus.");
|
||||
// "Bombchus are properly considered in logic.\nThey can be replenished in shops or "
|
||||
// "through bombchu drops, if those are enabled.\nBombchu Bowling is opened by bombchus.");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeBombchusInLogic", randoBombchusInLogic, 3, 0);
|
||||
// ImGui::Separator();
|
||||
|
||||
|
@ -3759,17 +3752,17 @@ void DrawRandoEditor(bool& open) {
|
|||
// switch (CVar_GetS32("gRandomizeAmmoDrops", 0)) {
|
||||
// case 0:
|
||||
// InsertHelpHoverText(
|
||||
// "Bombs, arrows, seeds, nuts, sticks and\nmagic jars appear as normal.\n"
|
||||
// "Bombs, arrows, seeds, nuts, sticks and magic jars appear as normal.\n"
|
||||
// "Bombchus can sometimes replace bomb drops.");
|
||||
// break;
|
||||
// case 1:
|
||||
// InsertHelpHoverText(
|
||||
// "All ammo drops will be replaced by blue rupees,\nexcept for Deku Sticks.\n"
|
||||
// "All ammo drops will be replaced by blue rupees, except for Deku Sticks.\n"
|
||||
// "Ammo upgrades will only refill ammo by 10 units.");
|
||||
// break;
|
||||
// case 2:
|
||||
// InsertHelpHoverText(
|
||||
// "Bombs, arrow, seeds, nuts, sticks and\nmagic jars appear as normal.");
|
||||
// "Bombs, arrow, seeds, nuts, sticks and magic jars appear as normal.");
|
||||
// break;
|
||||
// }
|
||||
// SohImGui::EnhancementCombobox("gRandomizeAmmoDrops", randoAmmoDrops, 3, 0);
|
||||
|
@ -3819,20 +3812,19 @@ void DrawRandoEditor(bool& open) {
|
|||
switch (CVar_GetS32("gRandomizeShuffleDungeonReward", 0)) {
|
||||
case 0:
|
||||
InsertHelpHoverText(
|
||||
"Medallions and Spiritual Stones will be given as\nrewards for beating "
|
||||
"dungeons.\n\nThis "
|
||||
"setting will force Link's Pocket to be a\nMedallion or a Spiritual Stone.");
|
||||
"Medallions and Spiritual Stones will be given as rewards for beating dungeons.\n"
|
||||
"This setting will force Link's Pocket to be a Medallion or a Spiritual Stone.");
|
||||
break;
|
||||
case 1:
|
||||
InsertHelpHoverText(
|
||||
"Medallions and Spiritual Stones can only appear\ninside of dungeons.");
|
||||
"Medallions and Spiritual Stones can only appear inside of dungeons.");
|
||||
break;
|
||||
case 2:
|
||||
InsertHelpHoverText(
|
||||
"Medallions and Spiritual Stones can only appear\noutside dungeons.");
|
||||
"Medallions and Spiritual Stones can only appear outside dungeons.");
|
||||
break;
|
||||
case 3:
|
||||
InsertHelpHoverText("Medallions and Spiritual Stones can appear\nanywhere.");
|
||||
InsertHelpHoverText("Medallions and Spiritual Stones can appear anywhere.");
|
||||
break;
|
||||
}
|
||||
SohImGui::EnhancementCombobox("gRandomizeShuffleDungeonReward", randoShuffleDungeonRewards, 4,
|
||||
|
@ -3845,16 +3837,16 @@ void DrawRandoEditor(bool& open) {
|
|||
// ImGui::Text("Link's Pocket");
|
||||
// switch (CVar_GetS32("gRandomizeLinksPocket", 0)) {
|
||||
// case 0:
|
||||
// InsertHelpHoverText("Link will start with a Dungeon Reward in his\ninventory.");
|
||||
// InsertHelpHoverText("Link will start with a Dungeon Reward in his inventory.");
|
||||
// break;
|
||||
// case 1:
|
||||
// InsertHelpHoverText("Link will receive a random advancement item at the\nbeginning "
|
||||
// InsertHelpHoverText("Link will receive a random advancement item at the beginning "
|
||||
// "of the playtrough.");
|
||||
// break;
|
||||
// case 2:
|
||||
// InsertHelpHoverText(
|
||||
// "Link will recieve a random item from the item pool\nat the beginning "
|
||||
// "of the playthrought.");
|
||||
// "Link will recieve a random item from the item pool at the beginning "
|
||||
// "of the playthrough.");
|
||||
// break;
|
||||
// case 3:
|
||||
// InsertHelpHoverText("Link will start with a very useful green rupee.");
|
||||
|
@ -3869,16 +3861,15 @@ void DrawRandoEditor(bool& open) {
|
|||
ImGui::Text("Shuffle Songs");
|
||||
switch (CVar_GetS32("gRandomizeShuffleSongs", 0)) {
|
||||
case 0:
|
||||
InsertHelpHoverText("Songs will only appear at locations that normally\nteach songs.");
|
||||
InsertHelpHoverText("Songs will only appear at locations that normally teach songs.");
|
||||
break;
|
||||
case 1:
|
||||
InsertHelpHoverText("Songs appear at the end of dungeons.\nFor major dungeons, they "
|
||||
"will be at the boss "
|
||||
"heart container location.\nThe remaining 4 songs are placed "
|
||||
"at:\n- Zelda's Lullaby "
|
||||
"location\n- Ice Cavern's Serenade of Water Location\n- Bottom of "
|
||||
"the Well's Lens of "
|
||||
"Truth Location\n- Gerudo Training Ground's Ice Arrow Location.");
|
||||
"will be at the boss heart container location.\nThe remaining 4 "
|
||||
"songs are placed at:\n- Zelda's Lullaby location\n"
|
||||
"- Ice Cavern's Serenade of Water Location\n"
|
||||
"- Bottom of the Well's Lens of Truth Location\n"
|
||||
"- Gerudo Training Ground's Ice Arrow Location.");
|
||||
break;
|
||||
case 2:
|
||||
InsertHelpHoverText("Songs can appear in any location");
|
||||
|
@ -3895,32 +3886,32 @@ void DrawRandoEditor(bool& open) {
|
|||
// InsertHelpHoverText("All shop items will be the same as vanilla.");
|
||||
// break;
|
||||
// case 1:
|
||||
// InsertHelpHoverText("Vanilla shop items will be shuffled among\ndifferent shops.");
|
||||
// InsertHelpHoverText("Vanilla shop items will be shuffled among different shops.");
|
||||
// break;
|
||||
// case 2:
|
||||
// InsertHelpHoverText(
|
||||
// "Vanilla shop items will be shuffled among different shops, and each "
|
||||
// "shop will contain\n1 non-vanilla shop item.");
|
||||
// "shop will contain 1 non-vanilla shop item.");
|
||||
// break;
|
||||
// case 3:
|
||||
// InsertHelpHoverText(
|
||||
// "Vanilla shop items will be shuffled among different shops, and each "
|
||||
// "shop will contain\n2 non-vanilla shop items.");
|
||||
// "shop will contain 2 non-vanilla shop items.");
|
||||
// break;
|
||||
// case 4:
|
||||
// InsertHelpHoverText(
|
||||
// "Vanilla shop items will be shuffled among different shops, and each "
|
||||
// "shop will contain\n3 non-vanilla shop items.");
|
||||
// "shop will contain 3 non-vanilla shop items.");
|
||||
// break;
|
||||
// case 5:
|
||||
// InsertHelpHoverText(
|
||||
// "Vanilla shop items will be shuffled among different shops, and each "
|
||||
// "shop will contain\n4 non-vanilla shop items.");
|
||||
// "shop will contain 4 non-vanilla shop items.");
|
||||
// break;
|
||||
// case 6:
|
||||
// InsertHelpHoverText(
|
||||
// "Vanilla shop items will be shuffled among different shops, and each "
|
||||
// "shop will contain\n1 to 4 non-vanilla shop items.");
|
||||
// "shop will contain 1 to 4 non-vanilla shop items.");
|
||||
// break;
|
||||
// }
|
||||
// SohImGui::EnhancementCombobox("gRandomizeShopsanity", randoShopsanity, 7, 0);
|
||||
|
@ -3935,16 +3926,15 @@ void DrawRandoEditor(bool& open) {
|
|||
// break;
|
||||
// case 1:
|
||||
// InsertHelpHoverText(
|
||||
// "This only shuffles 65 location that are\nwithing dungeons, increasing the value "
|
||||
// "of "
|
||||
// "most\ndungeons and making internal dungeon exploration\nmore diverse.");
|
||||
// "This only shuffles 65 location that are within dungeons, increasing the value "
|
||||
// "of most dungeons and making internal dungeon exploration more diverse.");
|
||||
// break;
|
||||
// case 2:
|
||||
// InsertHelpHoverText(
|
||||
// "This only shuffles the 65 locations that are\noutside of dungeons.");
|
||||
// "This only shuffles the 65 locations that are outside of dungeons.");
|
||||
// break;
|
||||
// case 3:
|
||||
// InsertHelpHoverText("Effectively adds 100 new locations for items to\nappear.");
|
||||
// InsertHelpHoverText("Effectively adds 100 new locations for items to appear.");
|
||||
// break;
|
||||
// }
|
||||
// SohImGui::EnhancementCombobox("gRandomizeTokensanity", randoTokensanity, 4, 0);
|
||||
|
@ -3956,15 +3946,15 @@ void DrawRandoEditor(bool& open) {
|
|||
// switch (CVar_GetS32("gRandomizeShuffleScrubs", 0)) {
|
||||
// case 0:
|
||||
// InsertHelpHoverText(
|
||||
// "Only the 3 Scrubs that give one-time items in the\nvanilla game (PoH, "
|
||||
// "Deku Nut capacity, and Deku\nStick capacity) will have random items.");
|
||||
// "Only the 3 Scrubs that give one-time items in the vanilla game (PoH, "
|
||||
// "Deku Nut capacity, and Deku Stick capacity) will have random items.");
|
||||
// break;
|
||||
// case 1:
|
||||
// InsertHelpHoverText("All Scrub prices will be reduced to 10 rupees each.");
|
||||
// break;
|
||||
// case 2:
|
||||
// InsertHelpHoverText("All Scrub prices will be their vanilla prices.\nThis will require "
|
||||
// "spending over 1000 rupees on\nSrubs.");
|
||||
// "spending over 1000 rupees on Scrubs.");
|
||||
// break;
|
||||
// case 3:
|
||||
// InsertHelpHoverText("All Scrub prices will be between 0 to 95 rupees.\nThis will on "
|
||||
|
@ -3978,16 +3968,16 @@ void DrawRandoEditor(bool& open) {
|
|||
// // Shuffle Cows
|
||||
// ImGui::Text("Shuffle Cows");
|
||||
// InsertHelpHoverText(
|
||||
// "Enabling this will let cows give you items upon\nperforming Epona's Song in "
|
||||
// "front of them. There\nare 9 cows.");
|
||||
// "Enabling this will let cows give you items upon performing Epona's Song in "
|
||||
// "front of them. There are 9 cows.");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeShuffleCows", randoShuffleCows, 2, 0);
|
||||
// ImGui::Separator();
|
||||
|
||||
if(CVar_GetS32("gRandomizeStartingKokiriSword", 0) == 0) {
|
||||
// Shuffle Kokiri Sword
|
||||
ImGui::Text("Shuffle Kokiri Sword");
|
||||
InsertHelpHoverText("Enabling this shuffles the Kokiri Sword into the item pool.\n\nThis will "
|
||||
"require extensive use of sticks until\nthe sword is found.");
|
||||
InsertHelpHoverText("Enabling this shuffles the Kokiri Sword into the item pool.\nThis will "
|
||||
"require extensive use of sticks until the sword is found.");
|
||||
SohImGui::EnhancementCombobox("gRandomizeShuffleKokiriSword", randoShuffleKokiriSword, 2, 0);
|
||||
ImGui::Separator();
|
||||
}
|
||||
|
@ -3995,9 +3985,9 @@ void DrawRandoEditor(bool& open) {
|
|||
if(CVar_GetS32("gRandomizeStartingOcarina", 0) == 0) {
|
||||
// Shuffle Ocarinas
|
||||
ImGui::Text("Shuffle Ocarinas");
|
||||
InsertHelpHoverText("Enabling this shuffles the Fairy Ocarina and the\nOcarina of time into "
|
||||
"the item pool.\n\nThis "
|
||||
"will require finding an Ocarina before being\nable to play songs.");
|
||||
InsertHelpHoverText("Enabling this shuffles the Fairy Ocarina and the Ocarina of time into "
|
||||
"the item pool.\n"
|
||||
"This will require finding an Ocarina before being able to play songs.");
|
||||
SohImGui::EnhancementCombobox("gRandomizeShuffleOcarinas", randoShuffleOcarinas, 2, 0);
|
||||
ImGui::Separator();
|
||||
}
|
||||
|
@ -4007,11 +3997,11 @@ void DrawRandoEditor(bool& open) {
|
|||
// Shuffle Weird Egg
|
||||
ImGui::Text("Shuffle Weird Egg");
|
||||
InsertHelpHoverText(
|
||||
"Enabling this shuffles the Weird Egg from Malon\ninto the item pool.\nThis "
|
||||
"will require finding the Weird Egg to talk to\nZelda in Hyrule Castle which "
|
||||
"in turn locks\nrewards from Impa, Xaria, Malon and Talon as\nwell as the "
|
||||
"Happy Mask Sidequest. The Weird egg\nis also required for Zelda's Letter to "
|
||||
"unlock the\nKakariko Gate as child which can lock some\nprogression.");
|
||||
"Enabling this shuffles the Weird Egg from Malon into the item pool.\nThis "
|
||||
"will require finding the Weird Egg to talk to Zelda in Hyrule Castle which "
|
||||
"in turn unlocks rewards from Impa, Saria, Malon and Talon as well as the "
|
||||
"Happy Mask Sidequest.\nThe Weird egg is also required for Zelda's Letter to "
|
||||
"unlock the Kakariko Gate as child which can lock some progression.");
|
||||
SohImGui::EnhancementCombobox("gRandomizeShuffleWeirdEgg", randoShuffleWeirdEgg, 2, 0);
|
||||
ImGui::Separator();
|
||||
}
|
||||
|
@ -4019,16 +4009,16 @@ void DrawRandoEditor(bool& open) {
|
|||
// Shuffle Gerudo Membership Card
|
||||
ImGui::Text("Shuffle Gerudo Membership Card");
|
||||
InsertHelpHoverText(
|
||||
"Enabling this shuffles the Gerudo Membership Card into the\nitem pool.\n\nThe Gerudo "
|
||||
"Token is required to enter the Gerudo\nTraining Ground.");
|
||||
"Enabling this shuffles the Gerudo Membership Card into the item pool.\nThe Gerudo "
|
||||
"Token is required to enter the Gerudo Training Ground.");
|
||||
SohImGui::EnhancementCombobox("gRandomizeShuffleGerudoToken", randoShuffleGerudoToken, 2, 0);
|
||||
ImGui::Separator();
|
||||
|
||||
// todo implement magic bean 10 pack
|
||||
// // Shuffle Magic Beans
|
||||
// ImGui::Text("Shuffle Magic Beans");
|
||||
// InsertHelpHoverText("Enabling this adds a pack of 10 beans to the item\n"
|
||||
// "pool and changes the Magic Bean Salesman to sell a\n"
|
||||
// InsertHelpHoverText("Enabling this adds a pack of 10 beans to the item "
|
||||
// "pool and changes the Magic Bean Salesman to sell a "
|
||||
// "random item at a price of 60 rupees.");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeShuffleMagicBeans", randoShuffleMagicBeans, 2, 0);
|
||||
// ImGui::Separator();
|
||||
|
@ -4038,13 +4028,13 @@ void DrawRandoEditor(bool& open) {
|
|||
// ImGui::Text("Shuffle Merchants");
|
||||
// if (CVar_GetS32("gRandomizeShuffleMerchants", 0) == 0) {
|
||||
// InsertHelpHoverText(
|
||||
// "Enabling this adds a Giant's Knife and a pack\nof Bombchus to the item "
|
||||
// "pool and changes both\nMediagoron and the Haunted Wasteland "
|
||||
// "Carpet\nSalesman to sell a random item once at the price\nof 200 rupees.");
|
||||
// "Enabling this adds a Giant's Knife and a pack of Bombchus to the item "
|
||||
// "pool and changes both Mediagoron and the Haunted Wasteland "
|
||||
// "Carpet Salesman to sell a random item once at the price of 200 rupees.");
|
||||
// } else if (CVar_GetS32("gRandomizeShuffleMerchants", 0) <= 2) {
|
||||
// InsertHelpHoverText(
|
||||
// "These hints will make Medigoron and the Carpet\nsalesman tell you which item they\'re "
|
||||
// "selling.\n\nThe Clearer Hints setting will affect how they\nrefer to the item.");
|
||||
// "These hints will make Medigoron and the Carpet salesman tell you which item they're "
|
||||
// "selling.\nThe Clearer Hints setting will affect how they refer to the item.");
|
||||
// }
|
||||
// SohImGui::EnhancementCombobox("gRandomizeShuffleMerchants", randoShuffleMerchants, 3, 0);
|
||||
// ImGui::Separator();
|
||||
|
@ -4053,13 +4043,10 @@ void DrawRandoEditor(bool& open) {
|
|||
// Shuffle Adult Trade
|
||||
// ImGui::Text("Shuffle Adult Trade");
|
||||
// InsertHelpHoverText(
|
||||
// "Enabling this adds all of the adult trade quest\nitems to the pool, each of which can be "
|
||||
// "traded\nfor a unique reward You will be able to choose\nwhich of your owner adult trade "
|
||||
// "items "
|
||||
// " "
|
||||
// "is visible\nin the inventory by selecting the item and using\nthe L and R buttons If "
|
||||
// "disabled "
|
||||
// "only the Claim\nCheck will be found in the pool.");
|
||||
// "Enabling this adds all of the adult trade quest items to the pool, each of which can be "
|
||||
// "traded for a unique reward.\nYou will be able to choose which of your adult trade items "
|
||||
// "are visible in the inventory by selecting the item and using the L and R buttons.\n"
|
||||
// "If disabled only the Claim Check will be found in the pool.");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeShuffleAdultTrade", randoShuffleAdultTrade, 2, 0);
|
||||
}
|
||||
ImGui::PopItemWidth();
|
||||
|
@ -4090,26 +4077,26 @@ void DrawRandoEditor(bool& open) {
|
|||
// ImGui::Text("Maps / Compasses");
|
||||
// switch (CVar_GetS32("gRandomizeShuffleMapsAndCompasses", 0)) {
|
||||
// case 0:
|
||||
// InsertHelpHoverText("Maps and Compasses can only appear in their repsective dungeon.");
|
||||
// InsertHelpHoverText("Maps and Compasses can only appear in their respective dungeon.");
|
||||
// break;
|
||||
// case 1:
|
||||
// InsertHelpHoverText(
|
||||
// "Maps and Compasses can only appear in a dungeon\nbut not necessarily the "
|
||||
// "Maps and Compasses can only appear in a dungeon but not necessarily the "
|
||||
// "dungeon they are for.");
|
||||
// break;
|
||||
// case 2:
|
||||
// InsertHelpHoverText("Maps and Compasses can only appear outside of\ndungeons.");
|
||||
// InsertHelpHoverText("Maps and Compasses can only appear outside of dungeons.");
|
||||
// break;
|
||||
// case 3:
|
||||
// InsertHelpHoverText("Maps and Compasses can appear anywhere in the\nworld.");
|
||||
// InsertHelpHoverText("Maps and Compasses can appear anywhere in the world.");
|
||||
// break;
|
||||
// case 4:
|
||||
// InsertHelpHoverText(
|
||||
// "Maps and Compasses are given to you from the start.\nThis will add a "
|
||||
// "small amount of money and\nrefill items to the pool.");
|
||||
// "small amount of money and refill items to the pool.");
|
||||
// break;
|
||||
// case 5:
|
||||
// InsertHelpHoverText("Maps and Compasses will appear in their vanilla\nlocations.");
|
||||
// InsertHelpHoverText("Maps and Compasses will appear in their vanilla locations.");
|
||||
// break;
|
||||
// }
|
||||
// SohImGui::EnhancementCombobox("gRandomizeShuffleMapsAndCompasses", randoShuffleMapsAndCompasses,
|
||||
|
@ -4121,28 +4108,28 @@ void DrawRandoEditor(bool& open) {
|
|||
// ImGui::Text("Small Keys");
|
||||
// switch (CVar_GetS32("gRandomizeShuffleSmallKeys", 0)) {
|
||||
// case 0:
|
||||
// InsertHelpHoverText("Small Keys can only appear in their respective\ndungeon.");
|
||||
// InsertHelpHoverText("Small Keys can only appear in their respective dungeon.");
|
||||
// break;
|
||||
// case 1:
|
||||
// InsertHelpHoverText(
|
||||
// "Small Keys can only appear inside of any dungon,\nbut won't necessarily "
|
||||
// "be in the dungeon that the\nkey is for.\nA difficult mode since it is "
|
||||
// "more likely\nto need to enter a dungeon multiple times.");
|
||||
// "Small Keys can only appear inside of any dungon, but won't necessarily "
|
||||
// "be in the dungeon that the key is for.\nA difficult mode since it is "
|
||||
// "more likely to need to enter a dungeon multiple times.");
|
||||
// break;
|
||||
// case 2:
|
||||
// InsertHelpHoverText(
|
||||
// "Small Keys can only appear outside of dungeons.\nYou may need to enter a "
|
||||
// "dungeon multiple times to\ngain items to access the overworld locations "
|
||||
// "with\nthe keys required to finish a dungeon.");
|
||||
// "dungeon multiple times to gain items to access the overworld locations "
|
||||
// "with the keys required to finish a dungeon.");
|
||||
// break;
|
||||
// case 3:
|
||||
// InsertHelpHoverText(
|
||||
// "Small Keys can appear anywhere in the world.\nA difficult mode since it "
|
||||
// "is more likely to need to\nenter a dungeon multiple times.");
|
||||
// "is more likely to need to enter a dungeon multiple times.");
|
||||
// break;
|
||||
// case 4:
|
||||
// InsertHelpHoverText(
|
||||
// "Small Keys are given to you from the start so you\nwon't have to worry "
|
||||
// "Small Keys are given to you from the start so you won't have to worry "
|
||||
// "about locked doors.\nAn easier mode.");
|
||||
// break;
|
||||
// case 5:
|
||||
|
@ -4158,18 +4145,17 @@ void DrawRandoEditor(bool& open) {
|
|||
// switch (CVar_GetS32("gRandomizeShuffleGerudoFortressKeys", 0)) {
|
||||
// case 0:
|
||||
// InsertHelpHoverText(
|
||||
// "Gerudo Fortress Keys will appear in their vanilla\nlocation dropping "
|
||||
// "from fighting Gerudo "
|
||||
// "guard\nthat attack when trying to free the jailed\ncarpenters.");
|
||||
// "Gerudo Fortress Keys will appear in their vanilla location dropping from "
|
||||
// "fighting Gerudo guards that attack when trying to free the jailed carpenters.");
|
||||
// break;
|
||||
// case 1:
|
||||
// InsertHelpHoverText("Gerudo Fortress Keys can only appear inside of\ndungeons.");
|
||||
// InsertHelpHoverText("Gerudo Fortress Keys can only appear inside of dungeons.");
|
||||
// break;
|
||||
// case 2:
|
||||
// InsertHelpHoverText("Gerudo Fortress Keys can only appear outside of\ndungeons.");
|
||||
// InsertHelpHoverText("Gerudo Fortress Keys can only appear outside of dungeons.");
|
||||
// break;
|
||||
// case 3:
|
||||
// InsertHelpHoverText("Gerudo Fortress Keys can appear anywhere in the\nworld.");
|
||||
// InsertHelpHoverText("Gerudo Fortress Keys can appear anywhere in the world.");
|
||||
// break;
|
||||
// }
|
||||
// SohImGui::EnhancementCombobox("gRandomizeShuffleGerudoFortressKeys",
|
||||
|
@ -4181,28 +4167,27 @@ void DrawRandoEditor(bool& open) {
|
|||
// ImGui::Text("Boss Keys");
|
||||
// switch (CVar_GetS32("gRandomizeShuffleBossKeys", 0)) {
|
||||
// case 0:
|
||||
// InsertHelpHoverText("Boss Keys can only appear in their respective\ndungeons.");
|
||||
// InsertHelpHoverText("Boss Keys can only appear in their respective dungeons.");
|
||||
// break;
|
||||
// case 1:
|
||||
// InsertHelpHoverText(
|
||||
// "Boss Keys can only appear inside of any dungeon,\nbut won't necessarily "
|
||||
// "be in the dungon that the\nkey is for.\nA difficult mode since it is "
|
||||
// "more\nlikely to need to enter a dungeon multiple times.");
|
||||
// "Boss Keys can only appear inside of any dungeon, but won't necessarily "
|
||||
// "be in the dungon that the key is for.\nA difficult mode since it is "
|
||||
// "more likely to need to enter a dungeon multiple times.");
|
||||
// break;
|
||||
// case 2:
|
||||
// InsertHelpHoverText(
|
||||
// "Boss keys can only appear outside of dungeons.\nYou may need to enter a dungeon "
|
||||
// "without "
|
||||
// "the boss\nkey to get items required to find the key in the\noverworld.");
|
||||
// "Boss Keys can only appear outside of dungeons.\nYou may need to enter a dungeon "
|
||||
// "without the boss key to get items required to find the key in the overworld.");
|
||||
// break;
|
||||
// case 3:
|
||||
// InsertHelpHoverText(
|
||||
// "Boss key can appear anywhere in the overworld.\nA difficult mode since it "
|
||||
// "is more likely to need to\nenter a dungeon multiple times.");
|
||||
// "Boss Keys can appear anywhere in the overworld.\nA difficult mode since it "
|
||||
// "is more likely to need to enter a dungeon multiple times.");
|
||||
// break;
|
||||
// case 4:
|
||||
// InsertHelpHoverText(
|
||||
// "Boss Keys are given to you from the start so you\nwon't have to worry "
|
||||
// "Boss Keys are given to you from the start so you won't have to worry "
|
||||
// "about boss doors.\nAn easier mode.");
|
||||
// break;
|
||||
// case 5:
|
||||
|
@ -4221,80 +4206,80 @@ void DrawRandoEditor(bool& open) {
|
|||
switch (CVar_GetS32("gRandomizeShuffleGanonBossKey", 0)) {
|
||||
case 0:
|
||||
SetLastItemHoverText(
|
||||
"Ganon's Boss Key is given to you from the\nstart and you don't "
|
||||
"Ganon's Boss Key is given to you from the start and you don't "
|
||||
"have to worry about finding it.");
|
||||
break;
|
||||
case 1:
|
||||
SetLastItemHoverText("Ganon's Boss Key will appear in the vanilla\nlocation.");
|
||||
SetLastItemHoverText("Ganon's Boss Key will appear in the vanilla location.");
|
||||
break;
|
||||
case 2:
|
||||
SetLastItemHoverText("Ganon's Boss Key will appear somewhere inside\nGanon's Castle.");
|
||||
SetLastItemHoverText("Ganon's Boss Key will appear somewhere inside Ganon's Castle.");
|
||||
break;
|
||||
// case 0:
|
||||
// SetLastItemHoverText(
|
||||
// "Ganon's Castle Boss Key can only appear inside of\na dungeon, but not "
|
||||
// "Ganon's Castle Boss Key can only appear inside of a dungeon, but not "
|
||||
// "necessarily Ganon's Castle.");
|
||||
// break;
|
||||
// case 1:
|
||||
// SetLastItemHoverText("Ganon's Castle Boss Key can only appear outside of\ndungeons.");
|
||||
// SetLastItemHoverText("Ganon's Castle Boss Key can only appear outside of dungeons.");
|
||||
// break;
|
||||
// case 2:
|
||||
// SetLastItemHoverText("Ganon's Castle Boss Key can appear anywhere in the\nworld.");
|
||||
// SetLastItemHoverText("Ganon's Castle Boss Key can appear anywhere in the world.");
|
||||
// break;
|
||||
// case 3:
|
||||
// SetLastItemHoverText(
|
||||
// "These settings put the boss key on the Light Arrow\nCutscene location, "
|
||||
// "from Zelda in Temple of Time as\nadult, with differing requirements.");
|
||||
// "These settings put the boss key on the Light Arrow Cutscene location, "
|
||||
// "from Zelda in Temple of Time as adult, with differing requirements.");
|
||||
// break;
|
||||
// case 4:
|
||||
// SetLastItemHoverText("Ganon's Caslte Boss Key can appear anywhere in the\nworld.");
|
||||
// SetLastItemHoverText("Ganon's Castle Boss Key can appear anywhere in the world.");
|
||||
// break;
|
||||
// case 5:
|
||||
// SetLastItemHoverText(
|
||||
// "These settings put the boss key on the Light Arrow\nCutscene location, "
|
||||
// "from Zelda in Temple of Time as\nadult, with differing requirements.");
|
||||
// "These settings put the boss key on the Light Arrow Cutscene location, "
|
||||
// "from Zelda in Temple of Time as adult, with differing requirements.");
|
||||
// SohImGui::EnhancementSliderInt("Medallion Count: %d", "##RandoGanonMedallionCount",
|
||||
// "gRandomizeGanonMedallionCount", 0, 6, "");
|
||||
// InsertHelpHoverText(
|
||||
// "Set the number of Medallions required to trigger\nthe Light Arrow Cutscene.");
|
||||
// "Set the number of Medallions required to trigger the Light Arrow Cutscene.");
|
||||
// break;
|
||||
// case 6:
|
||||
// SetLastItemHoverText(
|
||||
// "These settings put the boss key on the Light Arrow\nCutscene location, "
|
||||
// "from Zelda in Temple of Time as\nadult, with differing requirements.");
|
||||
// "These settings put the boss key on the Light Arrow Cutscene location, "
|
||||
// "from Zelda in Temple of Time as adult, with differing requirements.");
|
||||
// SohImGui::EnhancementSliderInt("Stone Count: %d", "##RandoGanonStoneCount",
|
||||
// "gRandomizeGanonStoneCount", 0, 3, "");
|
||||
// InsertHelpHoverText("Set the number of Spiritual Stones required to trigger\nthe Light "
|
||||
// InsertHelpHoverText("Set the number of Spiritual Stones required to trigger the Light "
|
||||
// "Arrow Cutscene.");
|
||||
// break;
|
||||
// case 7:
|
||||
// SetLastItemHoverText(
|
||||
// "These settings put the boss key on the Light Arrow\nCutscene location, "
|
||||
// "from Zelda in Temple of Time as\nadult, with differing requirements.");
|
||||
// "These settings put the boss key on the Light Arrow Cutscene location, "
|
||||
// "from Zelda in Temple of Time as adult, with differing requirements.");
|
||||
// SohImGui::EnhancementSliderInt("Reward Count: %d", "##RandoGanonRewardCount",
|
||||
// "gRandomizeGanonRewardCount", 0, 9, "");
|
||||
// InsertHelpHoverText(
|
||||
// "Set the number of Dungeon Rewards (Spiritual\nStones and Medallions) "
|
||||
// "required to trigger the\nLight Arrow Cutscene.");
|
||||
// "Set the number of Dungeon Rewards (Spiritual Stones and Medallions) "
|
||||
// "required to trigger the Light Arrow Cutscene.");
|
||||
// break;
|
||||
// case 8:
|
||||
// SetLastItemHoverText(
|
||||
// "These settings put the boss key on the Light Arrow\nCutscene location, "
|
||||
// "from Zelda in Temple of Time as\nadult, with differing requirements.");
|
||||
// "These settings put the boss key on the Light Arrow Cutscene location, "
|
||||
// "from Zelda in Temple of Time as adult, with differing requirements.");
|
||||
// SohImGui::EnhancementSliderInt("MDungeon Count: %d", "##RandoGanonDungeonCount",
|
||||
// "gRandomizeGanonDungeonCount", 0, 8, "");
|
||||
// InsertHelpHoverText(
|
||||
// "Set the number of completed dungeons required to\ntrigger the Light Arrow "
|
||||
// "Cutscene.\n\nDungeons are considered complete when Link steps\ninto the "
|
||||
// "Set the number of completed dungeons required to trigger the Light Arrow "
|
||||
// "Cutscene.\nDungeons are considered complete when Link steps into the "
|
||||
// "blue warp at the end of them.");
|
||||
// break;
|
||||
// case 9:
|
||||
// SetLastItemHoverText(
|
||||
// "These settings put the boss key on the Light Arrow\nCutscene location, "
|
||||
// "from Zelda in Temple of Time as\nadult, with differing requirements.");
|
||||
// "These settings put the boss key on the Light Arrow Cutscene location, "
|
||||
// "from Zelda in Temple of Time as adult, with differing requirements.");
|
||||
// SohImGui::EnhancementSliderInt("Token Count: %d", "##RandoGanonTokenCount",
|
||||
// "gRandomizeGanonTokenCount", 0, 100, "");
|
||||
// InsertHelpHoverText("Set the number of Gold Skulltula Tokens required\nto trigger the "
|
||||
// InsertHelpHoverText("Set the number of Gold Skulltula Tokens required to trigger the "
|
||||
// "Light Arrow Cutscene.");
|
||||
// break;
|
||||
}
|
||||
|
@ -4318,82 +4303,82 @@ void DrawRandoEditor(bool& open) {
|
|||
// todo implement minigame repeat skip
|
||||
// // Skip Minigame repetition
|
||||
// SohImGui::EnhancementCheckbox("Skip Minigame Repetition", "gRandomizeSkipMinigameRepetition");
|
||||
// InsertHelpHoverText("Completing the second objective in the Dampe Race\nand Gerudo Archery on the "
|
||||
// "first attempt will give\nboth rewards at once for that minigame.");
|
||||
// InsertHelpHoverText("Completing the second objective in the Dampe Race and Gerudo Archery on the "
|
||||
// "first attempt will give both rewards at once for that minigame.");
|
||||
// ImGui::Separator();
|
||||
|
||||
// todo implement free scarecrow (is this already in?)
|
||||
// // Free scarecrow
|
||||
// SohImGui::EnhancementCheckbox("Free Scarecrow", "gRandomizeFreeScarecrow");
|
||||
// InsertHelpHoverText(
|
||||
// "Pulling the Ocarina near a spot at which\nPierre can spawn will do so, without "
|
||||
// "needing\nthe song.");
|
||||
// "Pulling the Ocarina near a spot at which Pierre can spawn will do so, without "
|
||||
// "needing the song.");
|
||||
// ImGui::Separator();
|
||||
|
||||
// todo implement skip poes (did we already?)
|
||||
// // Skip Four Poes cutscene
|
||||
// SohImGui::EnhancementCheckbox("Skip Four Poes Cutscene", "gRandomizeSkipFourPoesCutscene");
|
||||
// InsertHelpHoverText(
|
||||
// "The cutscene with the 4 poes in Forest Temple will\nbe skipped. If the cutscene "
|
||||
// "is not skipped, it can\nbe exploited to reach the basement early.");
|
||||
// "The cutscene with the 4 poes in Forest Temple will be skipped. If the cutscene "
|
||||
// "is not skipped, it can be exploited to reach the basement early.");
|
||||
// ImGui::Separator();
|
||||
|
||||
// todo implement skip lake hylia owl
|
||||
// // Skip Lake Hylia owl
|
||||
// SohImGui::EnhancementCheckbox("Skip Lake Hylia Owl Cutscene", "gRandomizeSkipLakeHyliaOwl");
|
||||
// InsertHelpHoverText(
|
||||
// "The owl flight cutscene in Lake Hylia will be\nskipped. This cutscene lets you "
|
||||
// "see what item\nis on top of the laboratory roof.");
|
||||
// "The owl flight cutscene in Lake Hylia will be skipped. This cutscene lets you "
|
||||
// "see what item is on top of the laboratory roof.");
|
||||
// ImGui::Separator();
|
||||
|
||||
// Cuccos to return
|
||||
SohImGui::EnhancementSliderInt("Cuccos to return: %d", "##RandoCuccosToReturn",
|
||||
"gRandomizeCuccosToReturn", 0, 7, "", 7);
|
||||
InsertHelpHoverText("The cucco Lady will give a reward for returning\nthis many of her cuccos to the pen.");
|
||||
InsertHelpHoverText("The cucco Lady will give a reward for returning this many of her cuccos to the pen.");
|
||||
ImGui::Separator();
|
||||
|
||||
// // Big Poe Target Count
|
||||
SohImGui::EnhancementSliderInt("Big Poe Target Count: %d", "##RandoBigPoeTargetCount",
|
||||
"gRandomizeBigPoeTargetCount", 1, 10, "", 10);
|
||||
InsertHelpHoverText("The Poe buyer will give a reward for turning in\nthe chosen number of Big Poes.");
|
||||
InsertHelpHoverText("The Poe buyer will give a reward for turning in the chosen number of Big Poes.");
|
||||
ImGui::Separator();
|
||||
|
||||
// // Skip child stealth
|
||||
SohImGui::EnhancementCheckbox("Skip Child Stealth", "gRandomizeSkipChildStealth");
|
||||
InsertHelpHoverText("The crawlspace into Hyrule Castle goes straight to\nZelda, skipping the guards.");
|
||||
InsertHelpHoverText("The crawlspace into Hyrule Castle goes straight to Zelda, skipping the guards.");
|
||||
ImGui::Separator();
|
||||
|
||||
// Skip Epona race
|
||||
SohImGui::EnhancementCheckbox("Skip Epona Race", "gRandomizeSkipEponaRace");
|
||||
InsertHelpHoverText("Epona can be summoned with Epona's Song without\nneeding to race Ingo.");
|
||||
InsertHelpHoverText("Epona can be summoned with Epona's Song without needing to race Ingo.");
|
||||
ImGui::Separator();
|
||||
|
||||
// Skip tower escape
|
||||
SohImGui::EnhancementCheckbox("Skip Tower Escape", "gRandomizeSkipTowerEscape");
|
||||
InsertHelpHoverText("The tower escape sequence between Ganondorf and\nGanon will be skipped.");
|
||||
InsertHelpHoverText("The tower escape sequence between Ganondorf and Ganon will be skipped.");
|
||||
ImGui::Separator();
|
||||
|
||||
// todo implement complete mask quest
|
||||
// // Complete Mask Quest
|
||||
// SohImGui::EnhancementCheckbox("Complete Mask Quest", "gRandomizeCompleteMaskQuest");
|
||||
// InsertHelpHoverText(
|
||||
// "Once the Happy Mask Shop is opened, all masks\nwill be available to be borrowed.");
|
||||
// "Once the Happy Mask Shop is opened, all masks will be available to be borrowed.");
|
||||
// ImGui::Separator();
|
||||
|
||||
// todo implement keep farores (in soh)
|
||||
// // Keep Farore's Wind Warp Point
|
||||
// SohImGui::EnhancementCheckbox("Keep Farore's Wind Warp Point", "gRandomizeKeepFaroresWindWarp");
|
||||
// InsertHelpHoverText(
|
||||
// "The Farore's Wind warp point will stay active\nafter having been warped to. The "
|
||||
// "old point will\nneed to be dispelled before setting a new one.");
|
||||
// "The Farore's Wind warp point will stay active after having been warped to.\nThe "
|
||||
// "old point will need to be dispelled before setting a new one.");
|
||||
// ImGui::Separator();
|
||||
|
||||
// todo implement skip song replays (in soh)
|
||||
// // Skip Song Replays
|
||||
// ImGui::Text("Skip Song Replays");
|
||||
// InsertHelpHoverText(
|
||||
// "The automatic replay after you play a song will\nbe skipped.\nYou can choose to "
|
||||
// "keep the SFX anyway, but you\nwill have control of Link during it.");
|
||||
// "The automatic replay after you play a song will be skipped.\nYou can choose to "
|
||||
// "keep the SFX anyway, but you will have control of Link during it.");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeSkipSongReplays", randoSkipSongReplays, 3, 0);
|
||||
// ImGui::Separator();
|
||||
|
||||
|
@ -4404,12 +4389,10 @@ void DrawRandoEditor(bool& open) {
|
|||
// Gossip Stone Hints
|
||||
ImGui::Text("Gossip Stone Hints");
|
||||
InsertHelpHoverText(
|
||||
"Gossip Stones can be made to give hints about\nwhere items can be found.\nDifferent settings "
|
||||
"can "
|
||||
"be chosen to decide which\nitem is needed to speak to Gossip Stones. Choosing\nto sticl with "
|
||||
"the "
|
||||
"Mask of Trutj will make the\nhints very difficult to obtain.\nHints for \"on the way of the "
|
||||
"hero\" are locations\ntaht contain items that are required to beat the\ngame.");
|
||||
"Gossip Stones can be made to give hints about where items can be found.\nDifferent settings can "
|
||||
"be chosen to decide which item is needed to speak to Gossip Stones. \nChoosing to stick with the "
|
||||
"Mask of Truth will make the hints very difficult to obtain.\nHints for \"on the way of the "
|
||||
"hero\" are locations that contain items that are required to beat the game.");
|
||||
|
||||
SohImGui::EnhancementCombobox("gRandomizeGossipStoneHints", randoGossipStoneHints, 4, 1);
|
||||
if (CVar_GetS32("gRandomizeGossipStoneHints", 1) != 0) {
|
||||
|
@ -4419,18 +4402,18 @@ void DrawRandoEditor(bool& open) {
|
|||
switch (CVar_GetS32("gRandomizeHintClarity", 2)) {
|
||||
case 0:
|
||||
InsertHelpHoverText(
|
||||
"Sets the difficulty of hints.\nObscure: Hints are unique for each thing, but\nthe "
|
||||
"Sets the difficulty of hints.\nObscure: Hints are unique for each thing, but the "
|
||||
"writing may be confusing.\nEx: Kokiri Sword > a butter knife");
|
||||
break;
|
||||
case 1:
|
||||
InsertHelpHoverText(
|
||||
"Sets the difficulty of hints.\nAmbiguous: Hints are clearly written, "
|
||||
"but may\nrefer to more than one thing.\nEx: Kokiri Sword > a sword");
|
||||
"but may refer to more than one thing.\nEx: Kokiri Sword > a sword");
|
||||
break;
|
||||
case 2:
|
||||
InsertHelpHoverText(
|
||||
"Sets the difficulty of hints.\nClear: Hints are clearly written and "
|
||||
"are unique\nfor each thing.\nEx: Kokiri Sword > the Kokiri Sword");
|
||||
"are unique for each thing.\nEx: Kokiri Sword > the Kokiri Sword");
|
||||
break;
|
||||
}
|
||||
SohImGui::EnhancementCombobox("gRandomizeHintClarity", randoHintClarity, 3, 2);
|
||||
|
@ -4466,7 +4449,7 @@ void DrawRandoEditor(bool& open) {
|
|||
// todo implement starting time
|
||||
// // Starting Time
|
||||
// ImGui::Text("Starting Time");
|
||||
// InsertHelpHoverText("Change up Link's sleep routine.");
|
||||
// InsertHelpHoverText("Change up Link's sleep routine.");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeStartingTime", randoStartingTime, 2, 0);
|
||||
// ImGui::Separator();
|
||||
|
||||
|
@ -4474,7 +4457,7 @@ void DrawRandoEditor(bool& open) {
|
|||
// // Chest Size and Color
|
||||
// ImGui::Text("Chest Size and Color");
|
||||
// InsertHelpHoverText(
|
||||
// "This option will change the appearance of all\nregular chests depending on their "
|
||||
// "This option will change the appearance of all regular chests depending on their "
|
||||
// "contents:\nMajor Items = Big Wooden Chests\nLesser Items = Small Wooden "
|
||||
// "Chests\nBoss Keys = Big Fancy Chests\nSmall Keys = Small Fancy Chests");
|
||||
// SohImGui::EnhancementCombobox("gRandomizeChestSizeAndColor", randoChestSizeAndColor, 2, 0);
|
||||
|
@ -4485,11 +4468,11 @@ void DrawRandoEditor(bool& open) {
|
|||
// switch (CVar_GetS32("gRandomize", 0)) {
|
||||
// case 0:
|
||||
// InsertHelpHoverText(
|
||||
// "All alternative traps will cause a small damage\nand no other negative effets.");
|
||||
// "All alternative traps will cause small damage and no other negative effects.");
|
||||
// break;
|
||||
// case 1:
|
||||
// InsertHelpHoverText("Some chest traps will burn your Deku Shield or\ncause a lot of damage "
|
||||
// "(with one-hit protection).");
|
||||
// InsertHelpHoverText("Some chest traps will burn your Deku Shield or cause a lot of damage "
|
||||
// "(with one-hit KO protection).");
|
||||
// break;
|
||||
// case 2:
|
||||
// InsertHelpHoverText("All traps will be the base game ice trap.");
|
||||
|
@ -4511,7 +4494,7 @@ void DrawRandoEditor(bool& open) {
|
|||
InsertHelpHoverText("Original item pool.");
|
||||
break;
|
||||
case 2:
|
||||
InsertHelpHoverText("Some excess items are removed, including health\nupgrades.");
|
||||
InsertHelpHoverText("Some excess items are removed, including health upgrades.");
|
||||
break;
|
||||
case 3:
|
||||
InsertHelpHoverText("Most excess items are removed.");
|
||||
|
@ -4531,14 +4514,14 @@ void DrawRandoEditor(bool& open) {
|
|||
break;
|
||||
case 2:
|
||||
InsertHelpHoverText(
|
||||
"Chance to add extra Ice Traps when junk items are\nadded to the item pool.");
|
||||
"Chance to add extra Ice Traps when junk items are added to the item pool.");
|
||||
break;
|
||||
case 3:
|
||||
InsertHelpHoverText("All added junk items will be Ice Traps.");
|
||||
break;
|
||||
case 4:
|
||||
InsertHelpHoverText(
|
||||
"All junk items will be replaced by Ice Traps, even\nthose in the base pool.");
|
||||
"All junk items will be replaced by Ice Traps, even those in the base pool.");
|
||||
break;
|
||||
}
|
||||
SohImGui::EnhancementCombobox("gRandomizeIceTraps", randoIceTraps, 5, 1);
|
||||
|
@ -4547,7 +4530,7 @@ void DrawRandoEditor(bool& open) {
|
|||
// todo implement double defense getitem
|
||||
// // Remove Double Defense
|
||||
// SohImGui::EnhancementCheckbox("Remove Double Defense", "gRandomizeRemoveDoubleDefense");
|
||||
// InsertHelpHoverText("If set the double defense item will be removed\nfrom the item pool for "
|
||||
// InsertHelpHoverText("If set the double defense item will be removed from the item pool for "
|
||||
// "balanced and plentiful.");
|
||||
// ImGui::Separator();
|
||||
|
||||
|
@ -4555,8 +4538,8 @@ void DrawRandoEditor(bool& open) {
|
|||
// // Prog Goron Sword
|
||||
// SohImGui::EnhancementCheckbox("Prog Goron Sword", "gRandomizeProgGoronSword");
|
||||
// InsertHelpHoverText(
|
||||
// "Giant's Knife will walays be found before Biggoron's\nSword. Medigoron only "
|
||||
// "starts selling new knives\nonce the Giant's Knife has been found\nand broken.");
|
||||
// "Giant's Knife will always be found before Biggoron's Sword.\nMedigoron only "
|
||||
// "starts selling new knives once the Giant's Knife has been found and broken.");
|
||||
// ImGui::Separator();
|
||||
ImGui::PopItemWidth();
|
||||
ImGui::EndTable();
|
||||
|
|
|
@ -985,7 +985,7 @@ void DrawItemTracker(bool& open) {
|
|||
}
|
||||
SohImGui::EnhancementCheckbox("Display \"Ammo/MaxAmo\"", "gItemTrackerAmmoDisplay");
|
||||
SohImGui::EnhancementCheckbox("Randomizer colors for Songs", "gItemTrackeSongColor");
|
||||
SohImGui::Tooltip("Will dispaly non-warp songs with randomizer\ncolors instead of pure white");
|
||||
SohImGui::Tooltip("Will display non-warp songs with randomizer colors instead of pure white");
|
||||
SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gRandoTrackIconSize", 32, 128, "");
|
||||
|
||||
SohImGui::EnhancementSliderInt("X spacing : %dpx", "##ITEMTRACKERSPACINGX", "gRandoTrackIconSpacingX", minimalSpacingX, 256,
|
||||
|
|
|
@ -17,6 +17,9 @@ void ResourceMgr_CacheDirectory(const char* resName);
|
|||
void ResourceMgr_LoadFile(const char* resName);
|
||||
char* ResourceMgr_LoadFileFromDisk(const char* filePath);
|
||||
char* ResourceMgr_LoadTexByName(char* texPath);
|
||||
uint16_t ResourceMgr_LoadTexWidthByName(char* texPath);
|
||||
uint16_t ResourceMgr_LoadTexHeightByName(char* texPath);
|
||||
uint32_t ResourceMgr_LoadTexSizeByName(char* texPath);
|
||||
char* ResourceMgr_LoadTexOrDListByName(char* filePath);
|
||||
char* ResourceMgr_LoadPlayerAnimByName(char* animPath);
|
||||
char* ResourceMgr_GetNameByCRC(uint64_t crc, char* alloc);
|
||||
|
|
|
@ -121,8 +121,7 @@ extern "C" void InitOTR() {
|
|||
|
||||
if (!t->bHasLoadError)
|
||||
{
|
||||
//uint32_t gameVersion = BitConverter::ToUInt32BE((uint8_t*)t->buffer.get(), 0);
|
||||
uint32_t gameVersion = *((uint32_t*)t->buffer.get());
|
||||
uint32_t gameVersion = LE32SWAP(*((uint32_t*)t->buffer.get()));
|
||||
OTRGlobals::Instance->context->GetResourceManager()->SetGameVersion(gameVersion);
|
||||
}
|
||||
|
||||
|
@ -457,6 +456,12 @@ extern "C" char* ResourceMgr_LoadJPEG(char* data, int dataSize)
|
|||
|
||||
extern "C" char* ResourceMgr_LoadTexByName(const char* texPath);
|
||||
|
||||
extern "C" uint16_t ResourceMgr_LoadTexWidthByName(char* texPath);
|
||||
|
||||
extern "C" uint16_t ResourceMgr_LoadTexHeightByName(char* texPath);
|
||||
|
||||
extern "C" uint32_t ResourceMgr_LoadTexSizeByName(const char* texPath);
|
||||
|
||||
extern "C" char* ResourceMgr_LoadTexOrDListByName(const char* filePath) {
|
||||
auto res = OTRGlobals::Instance->context->GetResourceManager()->LoadResource(filePath);
|
||||
|
||||
|
@ -799,8 +804,8 @@ extern "C" SoundFont* ResourceMgr_LoadAudioSoundFont(const char* path) {
|
|||
|
||||
for (size_t k = 0; k < soundFont->drums[i].env.size(); k++)
|
||||
{
|
||||
drum->envelope[k].delay = BOMSWAP16(soundFont->drums[i].env[k]->delay);
|
||||
drum->envelope[k].arg = BOMSWAP16(soundFont->drums[i].env[k]->arg);
|
||||
drum->envelope[k].delay = BE16SWAP(soundFont->drums[i].env[k]->delay);
|
||||
drum->envelope[k].arg = BE16SWAP(soundFont->drums[i].env[k]->arg);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -831,8 +836,8 @@ extern "C" SoundFont* ResourceMgr_LoadAudioSoundFont(const char* path) {
|
|||
|
||||
for (int k = 0; k < soundFont->instruments[i].env.size(); k++)
|
||||
{
|
||||
inst->envelope[k].delay = BOMSWAP16(soundFont->instruments[i].env[k]->delay);
|
||||
inst->envelope[k].arg = BOMSWAP16(soundFont->instruments[i].env[k]->arg);
|
||||
inst->envelope[k].delay = BE16SWAP(soundFont->instruments[i].env[k]->delay);
|
||||
inst->envelope[k].arg = BE16SWAP(soundFont->instruments[i].env[k]->arg);
|
||||
}
|
||||
}
|
||||
if (soundFont->instruments[i].lowNotesSound != nullptr)
|
||||
|
@ -1454,6 +1459,10 @@ extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerChec
|
|||
return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId);
|
||||
}
|
||||
|
||||
extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) {
|
||||
return gSaveContext.n64ddFlag && Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP;
|
||||
}
|
||||
|
||||
extern "C" CustomMessageEntry Randomizer_GetCustomGetItemMessage(GetItemID giid, char* buffer, const int maxBufferSize) {
|
||||
const CustomMessageEntry getItemText = CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, giid);
|
||||
return getItemText;
|
||||
|
|
|
@ -46,6 +46,9 @@ void ResourceMgr_LoadFile(const char* resName);
|
|||
char* ResourceMgr_LoadFileFromDisk(const char* filePath);
|
||||
char* ResourceMgr_LoadJPEG(char* data, int dataSize);
|
||||
char* ResourceMgr_LoadTexByName(const char* texPath);
|
||||
uint16_t ResourceMgr_LoadTexWidthByName(char* texPath);
|
||||
uint16_t ResourceMgr_LoadTexHeightByName(char* texPath);
|
||||
uint32_t ResourceMgr_LoadTexSizeByName(char* texPath);
|
||||
char* ResourceMgr_LoadTexOrDListByName(const char* filePath);
|
||||
char* ResourceMgr_LoadPlayerAnimByName(const char* animPath);
|
||||
AnimationHeaderCommon* ResourceMgr_LoadAnimByName(const char* path);
|
||||
|
@ -95,6 +98,7 @@ s16 Randomizer_GetItemModelFromId(s16 itemId);
|
|||
s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId);
|
||||
s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum);
|
||||
s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId);
|
||||
bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId);
|
||||
int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -22,7 +22,8 @@ std::filesystem::path SaveManager::GetFileName(int fileNum) {
|
|||
|
||||
SaveManager::SaveManager() {
|
||||
AddLoadFunction("base", 1, LoadBaseVersion1);
|
||||
AddSaveFunction("base", 1, SaveBase);
|
||||
AddLoadFunction("base", 2, LoadBaseVersion2);
|
||||
AddSaveFunction("base", 2, SaveBase);
|
||||
|
||||
AddLoadFunction("randomizer", 1, LoadRandomizerVersion1);
|
||||
AddSaveFunction("randomizer", 1, SaveRandomizer);
|
||||
|
@ -319,11 +320,23 @@ void SaveManager::InitFileNormal() {
|
|||
gSaveContext.worldMapAreaData = 0;
|
||||
gSaveContext.scarecrowCustomSongSet = 0;
|
||||
for (int i = 0; i < ARRAY_COUNT(gSaveContext.scarecrowCustomSong); i++) {
|
||||
gSaveContext.scarecrowCustomSong[i] = 0;
|
||||
gSaveContext.scarecrowCustomSong[i].noteIdx = 0;
|
||||
gSaveContext.scarecrowCustomSong[i].unk_01 = 0;
|
||||
gSaveContext.scarecrowCustomSong[i].unk_02 = 0;
|
||||
gSaveContext.scarecrowCustomSong[i].volume = 0;
|
||||
gSaveContext.scarecrowCustomSong[i].vibrato = 0;
|
||||
gSaveContext.scarecrowCustomSong[i].tone = 0;
|
||||
gSaveContext.scarecrowCustomSong[i].semitone = 0;
|
||||
}
|
||||
gSaveContext.scarecrowSpawnSongSet = 0;
|
||||
for (int i = 0; i < ARRAY_COUNT(gSaveContext.scarecrowSpawnSong); i++) {
|
||||
gSaveContext.scarecrowSpawnSong[i] = 0;
|
||||
gSaveContext.scarecrowSpawnSong[i].noteIdx = 0;
|
||||
gSaveContext.scarecrowSpawnSong[i].unk_01 = 0;
|
||||
gSaveContext.scarecrowSpawnSong[i].unk_02 = 0;
|
||||
gSaveContext.scarecrowSpawnSong[i].volume = 0;
|
||||
gSaveContext.scarecrowSpawnSong[i].vibrato = 0;
|
||||
gSaveContext.scarecrowSpawnSong[i].tone = 0;
|
||||
gSaveContext.scarecrowSpawnSong[i].semitone = 0;
|
||||
}
|
||||
|
||||
gSaveContext.horseData.scene = SCENE_SPOT00;
|
||||
|
@ -700,12 +713,172 @@ void SaveManager::LoadBaseVersion1() {
|
|||
});
|
||||
SaveManager::Instance->LoadData("worldMapAreaData", gSaveContext.worldMapAreaData);
|
||||
SaveManager::Instance->LoadData("scarecrowCustomSongSet", gSaveContext.scarecrowCustomSongSet);
|
||||
SaveManager::Instance->LoadArray("scarecrowCustomSong", sizeof(gSaveContext.scarecrowCustomSong), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", ((u8*)&gSaveContext.scarecrowCustomSong)[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadData("scarecrowSpawnSongSet", gSaveContext.scarecrowSpawnSongSet);
|
||||
SaveManager::Instance->LoadArray("scarecrowSpawnSong", sizeof(gSaveContext.scarecrowSpawnSong), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", ((u8*)&gSaveContext.scarecrowSpawnSong)[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadStruct("horseData", []() {
|
||||
SaveManager::Instance->LoadData("scene", gSaveContext.horseData.scene);
|
||||
SaveManager::Instance->LoadStruct("pos", []() {
|
||||
SaveManager::Instance->LoadData("x", gSaveContext.horseData.pos.x);
|
||||
SaveManager::Instance->LoadData("y", gSaveContext.horseData.pos.y);
|
||||
SaveManager::Instance->LoadData("z", gSaveContext.horseData.pos.z);
|
||||
});
|
||||
SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle);
|
||||
});
|
||||
|
||||
SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]);
|
||||
});
|
||||
|
||||
SaveManager::Instance->LoadArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone),
|
||||
[](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.trialsDone[i]); });
|
||||
}
|
||||
|
||||
void SaveManager::LoadBaseVersion2() {
|
||||
SaveManager::Instance->LoadData("entranceIndex", gSaveContext.entranceIndex);
|
||||
SaveManager::Instance->LoadData("linkAge", gSaveContext.linkAge);
|
||||
SaveManager::Instance->LoadData("cutsceneIndex", gSaveContext.cutsceneIndex);
|
||||
SaveManager::Instance->LoadData("dayTime", gSaveContext.dayTime);
|
||||
SaveManager::Instance->LoadData("nightFlag", gSaveContext.nightFlag);
|
||||
SaveManager::Instance->LoadData("totalDays", gSaveContext.totalDays);
|
||||
SaveManager::Instance->LoadData("bgsDayCount", gSaveContext.bgsDayCount);
|
||||
SaveManager::Instance->LoadData("deaths", gSaveContext.deaths);
|
||||
SaveManager::Instance->LoadArray("playerName", ARRAY_COUNT(gSaveContext.playerName), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.playerName[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadData("n64ddFlag", gSaveContext.n64ddFlag);
|
||||
SaveManager::Instance->LoadData("healthCapacity", gSaveContext.healthCapacity);
|
||||
SaveManager::Instance->LoadData("health", gSaveContext.health);
|
||||
SaveManager::Instance->LoadData("magicLevel", gSaveContext.magicLevel);
|
||||
SaveManager::Instance->LoadData("magic", gSaveContext.magic);
|
||||
SaveManager::Instance->LoadData("rupees", gSaveContext.rupees);
|
||||
SaveManager::Instance->LoadData("swordHealth", gSaveContext.swordHealth);
|
||||
SaveManager::Instance->LoadData("naviTimer", gSaveContext.naviTimer);
|
||||
SaveManager::Instance->LoadData("magicAcquired", gSaveContext.magicAcquired);
|
||||
SaveManager::Instance->LoadData("doubleMagic", gSaveContext.doubleMagic);
|
||||
SaveManager::Instance->LoadData("doubleDefense", gSaveContext.doubleDefense);
|
||||
SaveManager::Instance->LoadData("bgsFlag", gSaveContext.bgsFlag);
|
||||
SaveManager::Instance->LoadData("ocarinaGameRoundNum", gSaveContext.ocarinaGameRoundNum);
|
||||
SaveManager::Instance->LoadStruct("childEquips", []() {
|
||||
SaveManager::Instance->LoadArray("buttonItems", ARRAY_COUNT(gSaveContext.childEquips.buttonItems), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.childEquips.buttonItems[i],
|
||||
static_cast<uint8_t>(ITEM_NONE));
|
||||
});
|
||||
SaveManager::Instance->LoadArray("cButtonSlots", ARRAY_COUNT(gSaveContext.childEquips.cButtonSlots), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.childEquips.cButtonSlots[i],
|
||||
static_cast<uint8_t>(SLOT_NONE));
|
||||
});
|
||||
SaveManager::Instance->LoadData("equipment", gSaveContext.childEquips.equipment);
|
||||
});
|
||||
SaveManager::Instance->LoadStruct("adultEquips", []() {
|
||||
SaveManager::Instance->LoadArray("buttonItems", ARRAY_COUNT(gSaveContext.adultEquips.buttonItems), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.adultEquips.buttonItems[i],
|
||||
static_cast<uint8_t>(ITEM_NONE));
|
||||
});
|
||||
SaveManager::Instance->LoadArray("cButtonSlots", ARRAY_COUNT(gSaveContext.adultEquips.cButtonSlots), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.adultEquips.cButtonSlots[i],
|
||||
static_cast<uint8_t>(SLOT_NONE));
|
||||
});
|
||||
SaveManager::Instance->LoadData("equipment", gSaveContext.adultEquips.equipment);
|
||||
});
|
||||
SaveManager::Instance->LoadData("unk_54", gSaveContext.unk_54);
|
||||
SaveManager::Instance->LoadData("savedSceneNum", gSaveContext.savedSceneNum);
|
||||
SaveManager::Instance->LoadStruct("equips", []() {
|
||||
SaveManager::Instance->LoadArray("buttonItems", ARRAY_COUNT(gSaveContext.equips.buttonItems), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.equips.buttonItems[i], static_cast<uint8_t>(ITEM_NONE));
|
||||
});
|
||||
SaveManager::Instance->LoadArray("cButtonSlots", ARRAY_COUNT(gSaveContext.equips.cButtonSlots), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.equips.cButtonSlots[i], static_cast<uint8_t>(SLOT_NONE));
|
||||
});
|
||||
SaveManager::Instance->LoadData("equipment", gSaveContext.equips.equipment);
|
||||
});
|
||||
SaveManager::Instance->LoadStruct("inventory", []() {
|
||||
SaveManager::Instance->LoadArray("items", ARRAY_COUNT(gSaveContext.inventory.items), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.inventory.items[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadArray("ammo", ARRAY_COUNT(gSaveContext.inventory.ammo), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.inventory.ammo[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadData("equipment", gSaveContext.inventory.equipment);
|
||||
SaveManager::Instance->LoadData("upgrades", gSaveContext.inventory.upgrades);
|
||||
SaveManager::Instance->LoadData("questItems", gSaveContext.inventory.questItems);
|
||||
SaveManager::Instance->LoadArray("dungeonItems", ARRAY_COUNT(gSaveContext.inventory.dungeonItems), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.inventory.dungeonItems[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadArray("dungeonKeys", ARRAY_COUNT(gSaveContext.inventory.dungeonKeys), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.inventory.dungeonKeys[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadData("defenseHearts", gSaveContext.inventory.defenseHearts);
|
||||
SaveManager::Instance->LoadData("gsTokens", gSaveContext.inventory.gsTokens);
|
||||
});
|
||||
SaveManager::Instance->LoadArray("sceneFlags", ARRAY_COUNT(gSaveContext.sceneFlags), [](size_t i) {
|
||||
SaveManager::Instance->LoadStruct("", [&i]() {
|
||||
SaveManager::Instance->LoadData("chest", gSaveContext.sceneFlags[i].chest);
|
||||
SaveManager::Instance->LoadData("swch", gSaveContext.sceneFlags[i].swch);
|
||||
SaveManager::Instance->LoadData("clear", gSaveContext.sceneFlags[i].clear);
|
||||
SaveManager::Instance->LoadData("collect", gSaveContext.sceneFlags[i].collect);
|
||||
SaveManager::Instance->LoadData("unk", gSaveContext.sceneFlags[i].unk);
|
||||
SaveManager::Instance->LoadData("rooms", gSaveContext.sceneFlags[i].rooms);
|
||||
SaveManager::Instance->LoadData("floors", gSaveContext.sceneFlags[i].floors);
|
||||
});
|
||||
});
|
||||
SaveManager::Instance->LoadStruct("fw", []() {
|
||||
SaveManager::Instance->LoadStruct("pos", []() {
|
||||
SaveManager::Instance->LoadData("x", gSaveContext.fw.pos.x);
|
||||
SaveManager::Instance->LoadData("y", gSaveContext.fw.pos.y);
|
||||
SaveManager::Instance->LoadData("z", gSaveContext.fw.pos.z);
|
||||
});
|
||||
SaveManager::Instance->LoadData("yaw", gSaveContext.fw.yaw);
|
||||
SaveManager::Instance->LoadData("playerParams", gSaveContext.fw.playerParams);
|
||||
SaveManager::Instance->LoadData("entranceIndex", gSaveContext.fw.entranceIndex);
|
||||
SaveManager::Instance->LoadData("roomIndex", gSaveContext.fw.roomIndex);
|
||||
SaveManager::Instance->LoadData("set", gSaveContext.fw.set);
|
||||
SaveManager::Instance->LoadData("tempSwchFlags", gSaveContext.fw.tempSwchFlags);
|
||||
SaveManager::Instance->LoadData("tempCollectFlags", gSaveContext.fw.tempCollectFlags);
|
||||
});
|
||||
SaveManager::Instance->LoadArray("gsFlags", ARRAY_COUNT(gSaveContext.gsFlags), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.gsFlags[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadArray("highScores", ARRAY_COUNT(gSaveContext.highScores), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.highScores[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadArray("eventChkInf", ARRAY_COUNT(gSaveContext.eventChkInf), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.eventChkInf[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadArray("itemGetInf", ARRAY_COUNT(gSaveContext.itemGetInf), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.itemGetInf[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadArray("infTable", ARRAY_COUNT(gSaveContext.infTable), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.infTable[i]);
|
||||
});
|
||||
SaveManager::Instance->LoadData("worldMapAreaData", gSaveContext.worldMapAreaData);
|
||||
SaveManager::Instance->LoadData("scarecrowCustomSongSet", gSaveContext.scarecrowCustomSongSet);
|
||||
SaveManager::Instance->LoadArray("scarecrowCustomSong", ARRAY_COUNT(gSaveContext.scarecrowCustomSong), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.scarecrowCustomSong[i]);
|
||||
SaveManager::Instance->LoadStruct("", [&i]() {
|
||||
SaveManager::Instance->LoadData("noteIdx", gSaveContext.scarecrowCustomSong[i].noteIdx);
|
||||
SaveManager::Instance->LoadData("unk_01", gSaveContext.scarecrowCustomSong[i].unk_01);
|
||||
SaveManager::Instance->LoadData("unk_02", gSaveContext.scarecrowCustomSong[i].unk_02);
|
||||
SaveManager::Instance->LoadData("volume", gSaveContext.scarecrowCustomSong[i].volume);
|
||||
SaveManager::Instance->LoadData("vibrato", gSaveContext.scarecrowCustomSong[i].vibrato);
|
||||
SaveManager::Instance->LoadData("tone", gSaveContext.scarecrowCustomSong[i].tone);
|
||||
SaveManager::Instance->LoadData("semitone", gSaveContext.scarecrowCustomSong[i].semitone);
|
||||
});
|
||||
});
|
||||
SaveManager::Instance->LoadData("scarecrowSpawnSongSet", gSaveContext.scarecrowSpawnSongSet);
|
||||
SaveManager::Instance->LoadArray("scarecrowSpawnSong", ARRAY_COUNT(gSaveContext.scarecrowSpawnSong), [](size_t i) {
|
||||
SaveManager::Instance->LoadData("", gSaveContext.scarecrowSpawnSong[i]);
|
||||
SaveManager::Instance->LoadStruct("", [&i]() {
|
||||
SaveManager::Instance->LoadData("noteIdx", gSaveContext.scarecrowSpawnSong[i].noteIdx);
|
||||
SaveManager::Instance->LoadData("unk_01", gSaveContext.scarecrowSpawnSong[i].unk_01);
|
||||
SaveManager::Instance->LoadData("unk_02", gSaveContext.scarecrowSpawnSong[i].unk_02);
|
||||
SaveManager::Instance->LoadData("volume", gSaveContext.scarecrowSpawnSong[i].volume);
|
||||
SaveManager::Instance->LoadData("vibrato", gSaveContext.scarecrowSpawnSong[i].vibrato);
|
||||
SaveManager::Instance->LoadData("tone", gSaveContext.scarecrowSpawnSong[i].tone);
|
||||
SaveManager::Instance->LoadData("semitone", gSaveContext.scarecrowSpawnSong[i].semitone);
|
||||
});
|
||||
});
|
||||
SaveManager::Instance->LoadStruct("horseData", []() {
|
||||
SaveManager::Instance->LoadData("scene", gSaveContext.horseData.scene);
|
||||
|
@ -841,11 +1014,27 @@ void SaveManager::SaveBase() {
|
|||
SaveManager::Instance->SaveData("worldMapAreaData", gSaveContext.worldMapAreaData);
|
||||
SaveManager::Instance->SaveData("scarecrowCustomSongSet", gSaveContext.scarecrowCustomSongSet);
|
||||
SaveManager::Instance->SaveArray("scarecrowCustomSong", ARRAY_COUNT(gSaveContext.scarecrowCustomSong), [](size_t i) {
|
||||
SaveManager::Instance->SaveData("", gSaveContext.scarecrowCustomSong[i]);
|
||||
SaveManager::Instance->SaveStruct("", [&i]() {
|
||||
SaveManager::Instance->SaveData("noteIdx", gSaveContext.scarecrowCustomSong[i].noteIdx);
|
||||
SaveManager::Instance->SaveData("unk_01", gSaveContext.scarecrowCustomSong[i].unk_01);
|
||||
SaveManager::Instance->SaveData("unk_02", gSaveContext.scarecrowCustomSong[i].unk_02);
|
||||
SaveManager::Instance->SaveData("volume", gSaveContext.scarecrowCustomSong[i].volume);
|
||||
SaveManager::Instance->SaveData("vibrato", gSaveContext.scarecrowCustomSong[i].vibrato);
|
||||
SaveManager::Instance->SaveData("tone", gSaveContext.scarecrowCustomSong[i].tone);
|
||||
SaveManager::Instance->SaveData("semitone", gSaveContext.scarecrowCustomSong[i].semitone);
|
||||
});
|
||||
});
|
||||
SaveManager::Instance->SaveData("scarecrowSpawnSongSet", gSaveContext.scarecrowSpawnSongSet);
|
||||
SaveManager::Instance->SaveArray("scarecrowSpawnSong", ARRAY_COUNT(gSaveContext.scarecrowSpawnSong), [](size_t i) {
|
||||
SaveManager::Instance->SaveData("", gSaveContext.scarecrowSpawnSong[i]);
|
||||
SaveManager::Instance->SaveStruct("", [&i]() {
|
||||
SaveManager::Instance->SaveData("noteIdx", gSaveContext.scarecrowSpawnSong[i].noteIdx);
|
||||
SaveManager::Instance->SaveData("unk_01", gSaveContext.scarecrowSpawnSong[i].unk_01);
|
||||
SaveManager::Instance->SaveData("unk_02", gSaveContext.scarecrowSpawnSong[i].unk_02);
|
||||
SaveManager::Instance->SaveData("volume", gSaveContext.scarecrowSpawnSong[i].volume);
|
||||
SaveManager::Instance->SaveData("vibrato", gSaveContext.scarecrowSpawnSong[i].vibrato);
|
||||
SaveManager::Instance->SaveData("tone", gSaveContext.scarecrowSpawnSong[i].tone);
|
||||
SaveManager::Instance->SaveData("semitone", gSaveContext.scarecrowSpawnSong[i].semitone);
|
||||
});
|
||||
});
|
||||
SaveManager::Instance->SaveStruct("horseData", []() {
|
||||
SaveManager::Instance->SaveData("scene", gSaveContext.horseData.scene);
|
||||
|
@ -1252,13 +1441,9 @@ void CopyV0Save(SaveContext_v0& src, SaveContext& dst) {
|
|||
}
|
||||
dst.worldMapAreaData = src.worldMapAreaData;
|
||||
dst.scarecrowCustomSongSet = src.scarecrowCustomSongSet;
|
||||
for (size_t i = 0; i < ARRAY_COUNT(src.scarecrowCustomSong); i++) {
|
||||
dst.scarecrowCustomSong[i] = src.scarecrowCustomSong[i];
|
||||
}
|
||||
memcpy(&dst.scarecrowCustomSong[0], &src.scarecrowCustomSong[0], sizeof(src.scarecrowCustomSong));
|
||||
dst.scarecrowSpawnSongSet = src.scarecrowSpawnSongSet;
|
||||
for (size_t i = 0; i < ARRAY_COUNT(src.scarecrowSpawnSong); i++) {
|
||||
dst.scarecrowSpawnSong[i] = src.scarecrowSpawnSong[i];
|
||||
}
|
||||
memcpy(&dst.scarecrowSpawnSong[0], &src.scarecrowSpawnSong[0], sizeof(src.scarecrowSpawnSong));
|
||||
dst.horseData.scene = src.horseData.scene;
|
||||
dst.horseData.pos.x = src.horseData.pos.x;
|
||||
dst.horseData.pos.y = src.horseData.pos.y;
|
||||
|
|
|
@ -117,6 +117,7 @@ public:
|
|||
static void SaveRandomizer();
|
||||
|
||||
static void LoadBaseVersion1();
|
||||
static void LoadBaseVersion2();
|
||||
static void SaveBase();
|
||||
|
||||
std::vector<InitFunc> initFuncs;
|
||||
|
|
|
@ -544,10 +544,10 @@ u8 gDefaultShortNoteGateTimeTable[] = {
|
|||
};
|
||||
|
||||
AdsrEnvelope gDefaultEnvelope[] = {
|
||||
{ 0x0100, 0x007D },
|
||||
{ 0xE803, 0x007D },
|
||||
{ 0xFFFF, 0x0000 },
|
||||
{ 0x0000, 0x0000 },
|
||||
{ BE16SWAP_CONST(1), BE16SWAP_CONST(32000) },
|
||||
{ BE16SWAP_CONST(1000), BE16SWAP_CONST(32000) },
|
||||
{ BE16SWAP_CONST(-1), BE16SWAP_CONST(0) },
|
||||
{ BE16SWAP_CONST(0), BE16SWAP_CONST(0) },
|
||||
};
|
||||
|
||||
NoteSubEu gZeroNoteSub = { 0 };
|
||||
|
|
|
@ -246,7 +246,7 @@ f32 Audio_AdsrUpdate(AdsrState* adsr) {
|
|||
|
||||
retry:
|
||||
case ADSR_STATE_LOOP:
|
||||
adsr->delay = (s16)BOMSWAP16(adsr->envelope[adsr->envIndex].delay);
|
||||
adsr->delay = (s16)BE16SWAP(adsr->envelope[adsr->envIndex].delay);
|
||||
switch (adsr->delay) {
|
||||
case ADSR_DISABLE:
|
||||
adsr->action.s.state = ADSR_STATE_DISABLED;
|
||||
|
@ -255,7 +255,7 @@ f32 Audio_AdsrUpdate(AdsrState* adsr) {
|
|||
adsr->action.s.state = ADSR_STATE_HANG;
|
||||
break;
|
||||
case ADSR_GOTO:
|
||||
adsr->envIndex = (s16)BOMSWAP16(adsr->envelope[adsr->envIndex].arg);
|
||||
adsr->envIndex = (s16)BE16SWAP(adsr->envelope[adsr->envIndex].arg);
|
||||
goto retry;
|
||||
case ADSR_RESTART:
|
||||
adsr->action.s.state = ADSR_STATE_INITIAL;
|
||||
|
@ -266,7 +266,7 @@ f32 Audio_AdsrUpdate(AdsrState* adsr) {
|
|||
if (adsr->delay == 0) {
|
||||
adsr->delay = 1;
|
||||
}
|
||||
adsr->target = (s16)BOMSWAP16(adsr->envelope[adsr->envIndex].arg) / 32767.0f;
|
||||
adsr->target = (s16)BE16SWAP(adsr->envelope[adsr->envIndex].arg) / 32767.0f;
|
||||
adsr->target = adsr->target * adsr->target;
|
||||
adsr->velocity = (adsr->target - adsr->current) / adsr->delay;
|
||||
adsr->action.s.state = ADSR_STATE_FADE;
|
||||
|
|
|
@ -1340,13 +1340,13 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
|
|||
break;
|
||||
case 0xB2:
|
||||
offset = (u16)parameters[0];
|
||||
channel->unk_22 = BOMSWAP16(*(u16*)(seqPlayer->seqData + (uintptr_t)(offset + scriptState->value * 2)));
|
||||
channel->unk_22 = BE16SWAP(*(u16*)(seqPlayer->seqData + (uintptr_t)(offset + scriptState->value * 2)));
|
||||
break;
|
||||
case 0xB4:
|
||||
channel->dynTable = (void*)&seqPlayer->seqData[channel->unk_22];
|
||||
break;
|
||||
case 0xB5:
|
||||
channel->unk_22 = BOMSWAP16(((u16*)(channel->dynTable))[scriptState->value]);
|
||||
channel->unk_22 = BE16SWAP(((u16*)(channel->dynTable))[scriptState->value]);
|
||||
break;
|
||||
case 0xB6:
|
||||
scriptState->value = (*channel->dynTable)[0][scriptState->value];
|
||||
|
|
|
@ -355,36 +355,20 @@ void func_8002BF60(TargetContext* targetCtx, Actor* actor, s32 actorCategory, Gl
|
|||
}
|
||||
} else {
|
||||
if (actorCategory == ACTORCAT_PLAYER) {
|
||||
naviColor->inner.r = CVar_GetS32("gNavi_Idle_Inner_R", naviColor->inner.r);
|
||||
naviColor->inner.g = CVar_GetS32("gNavi_Idle_Inner_G", naviColor->inner.g);
|
||||
naviColor->inner.b = CVar_GetS32("gNavi_Idle_Inner_B", naviColor->inner.b);
|
||||
naviColor->outer.r = CVar_GetS32("gNavi_Idle_Outer_R", naviColor->outer.r);
|
||||
naviColor->outer.g = CVar_GetS32("gNavi_Idle_Outer_G", naviColor->outer.g);
|
||||
naviColor->outer.b = CVar_GetS32("gNavi_Idle_Outer_B", naviColor->outer.b);
|
||||
naviColor->inner = CVar_GetRGBA("gNavi_Idle_Inner", naviColor->inner);
|
||||
naviColor->outer = CVar_GetRGBA("gNavi_Idle_Outer", naviColor->outer);
|
||||
}
|
||||
if (actorCategory == ACTORCAT_NPC) {
|
||||
naviColor->inner.r = CVar_GetS32("gNavi_NPC_Inner_R", naviColor->inner.r);
|
||||
naviColor->inner.g = CVar_GetS32("gNavi_NPC_Inner_G", naviColor->inner.g);
|
||||
naviColor->inner.b = CVar_GetS32("gNavi_NPC_Inner_B", naviColor->inner.b);
|
||||
naviColor->outer.r = CVar_GetS32("gNavi_NPC_Outer_R", naviColor->outer.r);
|
||||
naviColor->outer.g = CVar_GetS32("gNavi_NPC_Outer_G", naviColor->outer.g);
|
||||
naviColor->outer.b = CVar_GetS32("gNavi_NPC_Outer_B", naviColor->outer.b);
|
||||
naviColor->inner = CVar_GetRGBA("gNavi_NPC_Inner", naviColor->inner);
|
||||
naviColor->outer = CVar_GetRGBA("gNavi_NPC_Outer", naviColor->outer);
|
||||
}
|
||||
if (actorCategory == ACTORCAT_BOSS || actorCategory == ACTORCAT_ENEMY) {
|
||||
naviColor->inner.r = CVar_GetS32("gNavi_Enemy_Inner_R", naviColor->inner.r);
|
||||
naviColor->inner.g = CVar_GetS32("gNavi_Enemy_Inner_G", naviColor->inner.g);
|
||||
naviColor->inner.b = CVar_GetS32("gNavi_Enemy_Inner_B", naviColor->inner.b);
|
||||
naviColor->outer.r = CVar_GetS32("gNavi_Enemy_Outer_R", naviColor->outer.r);
|
||||
naviColor->outer.g = CVar_GetS32("gNavi_Enemy_Outer_G", naviColor->outer.g);
|
||||
naviColor->outer.b = CVar_GetS32("gNavi_Enemy_Outer_B", naviColor->outer.b);
|
||||
naviColor->inner = CVar_GetRGBA("gNavi_Enemy_Inner", naviColor->inner);
|
||||
naviColor->outer = CVar_GetRGBA("gNavi_Enemy_Outer", naviColor->outer);
|
||||
}
|
||||
if (actorCategory == ACTORCAT_PROP) {
|
||||
naviColor->inner.r = CVar_GetS32("gNavi_Prop_Inner_R", naviColor->inner.r);
|
||||
naviColor->inner.g = CVar_GetS32("gNavi_Prop_Inner_G", naviColor->inner.g);
|
||||
naviColor->inner.b = CVar_GetS32("gNavi_Prop_Inner_B", naviColor->inner.b);
|
||||
naviColor->outer.r = CVar_GetS32("gNavi_Prop_Outer_R", naviColor->outer.r);
|
||||
naviColor->outer.g = CVar_GetS32("gNavi_Prop_Outer_G", naviColor->outer.g);
|
||||
naviColor->outer.b = CVar_GetS32("gNavi_Prop_Outer_B", naviColor->outer.b);
|
||||
naviColor->inner = CVar_GetRGBA("gNavi_Prop_Inner", naviColor->inner);
|
||||
naviColor->outer = CVar_GetRGBA("gNavi_Prop_Outer", naviColor->outer);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ void SaveContext_Init(void) {
|
|||
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
|
||||
gSaveContext.natureAmbienceId = NATURE_ID_DISABLED;
|
||||
gSaveContext.forcedSeqId = NA_BGM_GENERAL_SFX;
|
||||
gSaveContext.nextCutsceneIndex = 0xFFEF;
|
||||
gSaveContext.nextCutsceneIndex = CVar_GetS32("gBetaQuestWorld", 0xFFEF);
|
||||
gSaveContext.cutsceneTrigger = 0;
|
||||
gSaveContext.chamberCutsceneNum = 0;
|
||||
gSaveContext.nextDayTime = 0xFFFF;
|
||||
|
|
|
@ -8,7 +8,6 @@ void func_80110990(GlobalContext* globalCtx) {
|
|||
void func_801109B0(GlobalContext* globalCtx) {
|
||||
InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx;
|
||||
u32 parameterSize;
|
||||
u16 doActionOffset;
|
||||
u8 temp;
|
||||
|
||||
gSaveContext.sunsSongState = SUNSSONG_INACTIVE;
|
||||
|
@ -49,30 +48,11 @@ void func_801109B0(GlobalContext* globalCtx) {
|
|||
|
||||
ASSERT(interfaceCtx->doActionSegment != NULL);
|
||||
|
||||
if (gSaveContext.language == LANGUAGE_ENG) {
|
||||
doActionOffset = 0;
|
||||
} else if (gSaveContext.language == LANGUAGE_GER) {
|
||||
doActionOffset = 0x2B80;
|
||||
} else {
|
||||
doActionOffset = 0x5700;
|
||||
}
|
||||
uint32_t attackDoActionTexSize = ResourceMgr_LoadTexSizeByName(gAttackDoActionENGTex);
|
||||
memcpy(interfaceCtx->doActionSegment, ResourceMgr_LoadTexByName(gAttackDoActionENGTex), attackDoActionTexSize);
|
||||
memcpy(interfaceCtx->doActionSegment + (attackDoActionTexSize / 2), ResourceMgr_LoadTexByName(gCheckDoActionENGTex), attackDoActionTexSize);
|
||||
|
||||
memcpy(interfaceCtx->doActionSegment, ResourceMgr_LoadTexByName(gAttackDoActionENGTex), 0x180);
|
||||
memcpy(interfaceCtx->doActionSegment + 0x180, ResourceMgr_LoadTexByName(gCheckDoActionENGTex), 0x180);
|
||||
//DmaMgr_SendRequest1(interfaceCtx->doActionSegment, (uintptr_t)_do_action_staticSegmentRomStart + doActionOffset, 0x300,
|
||||
//__FILE__, __LINE__);
|
||||
|
||||
if (gSaveContext.language == LANGUAGE_ENG) {
|
||||
doActionOffset = 0x480;
|
||||
} else if (gSaveContext.language == LANGUAGE_GER) {
|
||||
doActionOffset = 0x3000;
|
||||
} else {
|
||||
doActionOffset = 0x5B80;
|
||||
}
|
||||
|
||||
memcpy(interfaceCtx->doActionSegment + 0x300, ResourceMgr_LoadTexByName(gReturnDoActionENGTex), 0x180);
|
||||
//DmaMgr_SendRequest1(interfaceCtx->doActionSegment + 0x300, (uintptr_t)_do_action_staticSegmentRomStart + doActionOffset,
|
||||
//0x180);
|
||||
memcpy(interfaceCtx->doActionSegment + attackDoActionTexSize, ResourceMgr_LoadTexByName(gReturnDoActionENGTex), ResourceMgr_LoadTexSizeByName(gReturnDoActionENGTex));
|
||||
|
||||
interfaceCtx->iconItemSegment = GAMESTATE_ALLOC_MC(
|
||||
&globalCtx->state, 0x1000 * ARRAY_COUNT(gSaveContext.equips.buttonItems));
|
||||
|
|
|
@ -493,7 +493,8 @@ void Cutscene_Command_Terminator(GlobalContext* globalCtx, CutsceneContext* csCt
|
|||
|
||||
// Automatically skip certain cutscenes when in rando
|
||||
// cmd->base == 33: Zelda escaping with impa cutscene
|
||||
bool randoCsSkip = (gSaveContext.n64ddFlag && cmd->base == 33);
|
||||
// cmd->base == 8: Traveling back/forward in time cutscene
|
||||
bool randoCsSkip = (gSaveContext.n64ddFlag && (cmd->base == 33 || cmd->base == 8));
|
||||
bool debugCsSkip = (CHECK_BTN_ALL(globalCtx->state.input[0].press.button, BTN_START) &&
|
||||
(gSaveContext.fileNum != 0xFEDC) && CVar_GetS32("gDebugEnabled", 0));
|
||||
|
||||
|
|
|
@ -184,16 +184,6 @@ static u16 sDgnMinimapTexIndexOffset[10] = {
|
|||
0, 13, 32, 49, 76, 114, 158, 190, 217, 227,
|
||||
};
|
||||
|
||||
static u16 sOwMinimapTexSize[24] = {
|
||||
2920, 2560, 1560, 2784, 2976, 2040, 3240, 2336, 2080, 2600, 1792, 1888,
|
||||
3400, 1792, 1888, 2040, 3120, 2304, 2176, 1888, 1560, 3240, 2600, 3400,
|
||||
};
|
||||
|
||||
static u16 sOwMinimapTexOffset[24] = {
|
||||
0x0000, 0x0B68, 0x1568, 0x1B80, 0x2660, 0x3200, 0x39F8, 0x46A0, 0x4FC0, 0x57E0, 0x6208, 0x6908,
|
||||
0x7068, 0x7DB0, 0x84B0, 0x8C10, 0x9408, 0xA038, 0xA938, 0xB1B8, 0xB918, 0xBF30, 0xCBD8, 0xD600,
|
||||
};
|
||||
|
||||
static s16 sOwMinimapPosX[24] = {
|
||||
216, 216, 218, 202, 202, 250, 216, 234, 234, 216, 234, 234,
|
||||
216, 234, 234, 250, 216, 234, 234, 234, 218, 80, 80, 216,
|
||||
|
@ -319,14 +309,13 @@ static u8 sFloorID[10][8] = {
|
|||
static s16 sSkullFloorIconY[10] = { -47, -47, -33, -47, -47, -5, -19, -47, -99, -99 };
|
||||
|
||||
MapData gMapDataTable = {
|
||||
sFloorTexIndexOffset, sBossFloor, sRoomPalette,
|
||||
sMaxPaletteCount, sPaletteRoom, sRoomCompassOffsetX,
|
||||
sRoomCompassOffsetY, sDgnMinimapCount, sDgnMinimapTexIndexOffset,
|
||||
sOwMinimapTexSize, sOwMinimapTexOffset, sOwMinimapPosX,
|
||||
sOwMinimapPosY, sOwCompassInfo, sDgnMinimapTexIndexBase,
|
||||
sDgnCompassInfo, sOwMinimapWidth, sOwMinimapHeight,
|
||||
sOwEntranceIconPosX, sOwEntranceIconPosY, sOwEntranceFlag,
|
||||
sFloorCoordY, sSwitchEntryCount, sSwitchFromRoom,
|
||||
sSwitchFromFloor, sSwitchToRoom, sFloorID,
|
||||
sSkullFloorIconY,
|
||||
sFloorTexIndexOffset, sBossFloor, sRoomPalette,
|
||||
sMaxPaletteCount, sPaletteRoom, sRoomCompassOffsetX,
|
||||
sRoomCompassOffsetY, sDgnMinimapCount, sDgnMinimapTexIndexOffset,
|
||||
sOwMinimapPosX, sOwMinimapPosY, sOwCompassInfo,
|
||||
sDgnMinimapTexIndexBase, sDgnCompassInfo, sOwMinimapWidth,
|
||||
sOwMinimapHeight, sOwEntranceIconPosX, sOwEntranceIconPosY,
|
||||
sOwEntranceFlag, sFloorCoordY, sSwitchEntryCount,
|
||||
sSwitchFromRoom, sSwitchFromFloor, sSwitchToRoom,
|
||||
sFloorID, sSkullFloorIconY,
|
||||
};
|
||||
|
|
|
@ -412,8 +412,10 @@ void Map_InitData(GlobalContext* globalCtx, s16 room) {
|
|||
//(uintptr_t)_map_grand_staticSegmentRomStart + gMapData->owMinimapTexOffset[extendedMapIndex],
|
||||
//gMapData->owMinimapTexSize[mapIndex], __FILE__, __LINE__);
|
||||
|
||||
if (sEntranceIconMapIndex < 24)
|
||||
memcpy(globalCtx->interfaceCtx.mapSegment, ResourceMgr_LoadTexByName(minimapTableOW[sEntranceIconMapIndex]), gMapData->owMinimapTexSize[mapIndex]);
|
||||
if (sEntranceIconMapIndex < 24) {
|
||||
const char* textureName = minimapTableOW[sEntranceIconMapIndex];
|
||||
memcpy(globalCtx->interfaceCtx.mapSegment, ResourceMgr_LoadTexByName(textureName), ResourceMgr_LoadTexSizeByName(textureName));
|
||||
}
|
||||
|
||||
interfaceCtx->unk_258 = mapIndex;
|
||||
break;
|
||||
|
@ -445,7 +447,8 @@ void Map_InitData(GlobalContext* globalCtx, s16 room) {
|
|||
//((gMapData->dgnMinimapTexIndexOffset[mapIndex] + room) * 0xFF0),
|
||||
//0xFF0, __FILE__, __LINE__);
|
||||
|
||||
memcpy(globalCtx->interfaceCtx.mapSegment, ResourceMgr_LoadTexByName(minimapTableDangeon[gMapData->dgnMinimapTexIndexOffset[mapIndex] + room]), 0xFF0);
|
||||
const char* textureName = minimapTableDangeon[gMapData->dgnMinimapTexIndexOffset[mapIndex] + room];
|
||||
memcpy(globalCtx->interfaceCtx.mapSegment, ResourceMgr_LoadTexByName(textureName), ResourceMgr_LoadTexSizeByName(textureName));
|
||||
|
||||
R_COMPASS_OFFSET_X = gMapData->roomCompassOffsetX[mapIndex][room];
|
||||
R_COMPASS_OFFSET_Y = gMapData->roomCompassOffsetY[mapIndex][room];
|
||||
|
|
|
@ -1196,7 +1196,7 @@ void Message_LoadItemIcon(GlobalContext* globalCtx, u16 itemId, s16 y) {
|
|||
R_TEXTBOX_ICON_YPOS = y + 6;
|
||||
R_TEXTBOX_ICON_SIZE = 32;
|
||||
memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE,
|
||||
ResourceMgr_LoadTexByName(gItemIcons[itemId]), 0x1000);
|
||||
ResourceMgr_LoadTexByName(gItemIcons[itemId]), ResourceMgr_LoadTexSizeByName(gItemIcons[itemId]));
|
||||
// "Item 32-0"
|
||||
osSyncPrintf("アイテム32-0\n");
|
||||
} else {
|
||||
|
@ -1204,7 +1204,7 @@ void Message_LoadItemIcon(GlobalContext* globalCtx, u16 itemId, s16 y) {
|
|||
R_TEXTBOX_ICON_YPOS = y + 10;
|
||||
R_TEXTBOX_ICON_SIZE = 24;
|
||||
memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE,
|
||||
ResourceMgr_LoadTexByName(gItemIcons[itemId]), 0x900);
|
||||
ResourceMgr_LoadTexByName(gItemIcons[itemId]), ResourceMgr_LoadTexSizeByName(gItemIcons[itemId]));
|
||||
// "Item 24"
|
||||
osSyncPrintf("アイテム24=%d (%d) {%d}\n", itemId, itemId - ITEM_KOKIRI_EMERALD, 84);
|
||||
}
|
||||
|
@ -1565,9 +1565,9 @@ void Message_Decode(GlobalContext* globalCtx) {
|
|||
msgCtx->textboxBackgroundUnkArg = font->msgBuf[msgCtx->msgBufPos + 3] & 0xF;
|
||||
|
||||
memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE,
|
||||
ResourceMgr_LoadTexByName(gRedMessageXLeftTex), 0x900);
|
||||
ResourceMgr_LoadTexByName(gRedMessageXLeftTex), ResourceMgr_LoadTexSizeByName(gRedMessageXLeftTex));
|
||||
memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE + 0x900,
|
||||
ResourceMgr_LoadTexByName(gRedMessageXRightTex), 0x900);
|
||||
ResourceMgr_LoadTexByName(gRedMessageXRightTex), ResourceMgr_LoadTexSizeByName(gRedMessageXRightTex));
|
||||
|
||||
msgCtx->msgBufPos += 3;
|
||||
R_TEXTBOX_BG_YPOS = R_TEXTBOX_Y + 8;
|
||||
|
@ -1688,7 +1688,8 @@ void Message_OpenText(GlobalContext* globalCtx, u16 textId) {
|
|||
// "Text Box Type"
|
||||
osSyncPrintf("吹き出し種類=%d\n", msgCtx->textBoxType);
|
||||
if (textBoxType < TEXTBOX_TYPE_NONE_BOTTOM) {
|
||||
memcpy(msgCtx->textboxSegment, ResourceMgr_LoadTexByName(msgStaticTbl[messageStaticIndices[textBoxType]]), MESSAGE_STATIC_TEX_SIZE);
|
||||
const char* textureName = msgStaticTbl[messageStaticIndices[textBoxType]];
|
||||
memcpy(msgCtx->textboxSegment, ResourceMgr_LoadTexByName(textureName), MESSAGE_STATIC_TEX_SIZE);
|
||||
if (textBoxType == TEXTBOX_TYPE_BLACK) {
|
||||
msgCtx->textboxColorRed = 0;
|
||||
msgCtx->textboxColorGreen = 0;
|
||||
|
|
|
@ -1041,18 +1041,37 @@ s32 OnePointCutscene_SetInfo(GlobalContext* globalCtx, s16 camIdx, s16 csId, Act
|
|||
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
|
||||
break;
|
||||
case 4020:
|
||||
if (CVar_GetS32("gFasterHeavyBlockLift", 0)) {
|
||||
D_8012368C[0].timerInit *= (1.0f / 3.0f);
|
||||
D_8012368C[1].timerInit *= (1.0f / 3.0f);
|
||||
D_8012368C[2].timerInit *= (1.0f / 3.0f);
|
||||
D_8012368C[3].timerInit *= (1.0f / 3.0f);
|
||||
}
|
||||
csInfo->keyFrames = D_8012368C;
|
||||
csInfo->keyFrameCnt = 4;
|
||||
|
||||
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
|
||||
break;
|
||||
case 4021:
|
||||
if (CVar_GetS32("gFasterHeavyBlockLift", 0)) {
|
||||
D_8012372C[0].timerInit *= (1.0f / 3.0f);
|
||||
D_8012372C[1].timerInit *= (1.0f / 3.0f);
|
||||
D_8012372C[2].timerInit *= (1.0f / 3.0f);
|
||||
D_8012372C[3].timerInit *= (1.0f / 3.0f);
|
||||
}
|
||||
csInfo->keyFrames = D_8012372C;
|
||||
csInfo->keyFrameCnt = 4;
|
||||
|
||||
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
|
||||
break;
|
||||
case 4022:
|
||||
if (CVar_GetS32("gFasterHeavyBlockLift", 0)) {
|
||||
D_801237CC[0].timerInit *= (1.0f / 3.0f);
|
||||
D_801237CC[1].timerInit *= (1.0f / 3.0f);
|
||||
D_801237CC[2].timerInit *= (1.0f / 3.0f);
|
||||
D_801237CC[3].timerInit *= (1.0f / 3.0f);
|
||||
D_801237CC[4].timerInit *= (1.0f / 3.0f);
|
||||
}
|
||||
csCam->timer = D_801237CC[0].timerInit + D_801237CC[3].timerInit + D_801237CC[1].timerInit +
|
||||
D_801237CC[2].timerInit + D_801237CC[4].timerInit;
|
||||
|
||||
|
|
|
@ -624,21 +624,21 @@ static OnePointCsFull D_801235C4[5] = {
|
|||
{ 0x12, 0xFF, 0x0000, 1, 0, 60.0f, 1.0f, { -1.0f, -1.0f, -1.0f }, { -1.0f, -1.0f, -1.0f } },
|
||||
};
|
||||
|
||||
static OnePointCsFull D_8012368C[4] = {
|
||||
OnePointCsFull D_8012368C[4] = {
|
||||
{ 0x0F, 0xFF, 0x0101, 10, 0, 60.0f, 1.0f, { -1110.0f, -180.0f, -840.0f }, { -985.0f, -220.0f, -840.0f } },
|
||||
{ 0x02, 0xFF, 0x0101, 70, -45, 75.0f, 1.0f, { -1060.0f, -160.0f, -840.0f }, { -1005.0f, -230.0f, -840.0f } },
|
||||
{ 0x0F, 0xFF, 0x0000, 10, -45, 75.0f, 1.0f, { -1.0f, -1.0f, -1.0f }, { -1.0f, -1.0f, -1.0f } },
|
||||
{ 0x0F, 0xFF, 0x0101, 180, 9, 80.0f, 1.0f, { -1205.0f, -175.0f, -840.0f }, { -1305.0f, -230.0f, -828.0f } },
|
||||
};
|
||||
|
||||
static OnePointCsFull D_8012372C[4] = {
|
||||
OnePointCsFull D_8012372C[4] = {
|
||||
{ 0x0F, 0xFF, 0x0142, 10, 0, 70.0f, 1.0f, { 0.0f, 80.0f, 0.0f }, { -1650.0f, 200.0f, -2920.0f } },
|
||||
{ 0x02, 0xFF, 0x0142, 110, -2, 50.0f, 0.5f, { 0.0f, 150.0f, 0.0f }, { -1320.0f, 170.0f, -2900.0f } },
|
||||
{ 0x0B, 0xFF, 0x4242, 100, 2, 70.0f, 0.1f, { 0.0f, 150.0f, 50.0f }, { -1.0f, -1.0f, -1.0f } },
|
||||
{ 0x03, 0xFF, 0x4242, 60, 2, 45.0f, 0.01f, { 0.0f, 150.0f, 50.0f }, { 0.0f, 200.0f, -80.0f } },
|
||||
};
|
||||
|
||||
static OnePointCsFull D_801237CC[5] = {
|
||||
OnePointCsFull D_801237CC[5] = {
|
||||
{ 0x8F, 0xFF, 0x4242, 20, 0, 50.0f, 1.0f, { 0.0f, 50.0f, -10.0f }, { 0.0f, 0.0f, 100.0f } },
|
||||
{ 0x0A, 0xFF, 0x0101, 80, 0, 75.0f, 1.0f, { 2900.0f, 1300.0f, 530.0f }, { 2800.0f, 1190.0f, 540.0f } },
|
||||
{ 0x0F, 0xFF, 0x0000, 10, 0, 75.0f, 1.0f, { -1.0f, -1.0f, -1.0f }, { -1.0f, -1.0f, -1.0f } },
|
||||
|
|
|
@ -10,10 +10,31 @@
|
|||
#include <assert.h>
|
||||
#endif
|
||||
|
||||
// TODO extract this information from the texture definitions themselves
|
||||
#define DO_ACTION_TEX_WIDTH 48
|
||||
#define DO_ACTION_TEX_HEIGHT 16
|
||||
#define DO_ACTION_TEX_SIZE ((DO_ACTION_TEX_WIDTH * DO_ACTION_TEX_HEIGHT) / 2) // (sizeof(gCheckDoActionENGTex))
|
||||
|
||||
static uint16_t _doActionTexWidth, _doActionTexHeight = -1;
|
||||
static uint16_t DO_ACTION_TEX_WIDTH() {
|
||||
return 48;
|
||||
|
||||
// TODO: Figure out why Ship::Texture is not returning a valid width
|
||||
if (_doActionTexWidth == -1)
|
||||
_doActionTexWidth = ResourceMgr_LoadTexWidthByName(gCheckDoActionENGTex);
|
||||
return _doActionTexWidth;
|
||||
}
|
||||
static uint16_t DO_ACTION_TEX_HEIGHT() {
|
||||
return 16;
|
||||
|
||||
// TODO: Figure out why Ship::Texture is not returning a valid height
|
||||
if (_doActionTexHeight == -1)
|
||||
_doActionTexHeight = ResourceMgr_LoadTexHeightByName(gCheckDoActionENGTex);
|
||||
return _doActionTexHeight;
|
||||
}
|
||||
|
||||
static uint32_t _doActionTexSize = -1;
|
||||
static uint32_t DO_ACTION_TEX_SIZE() {
|
||||
if (_doActionTexSize == -1)
|
||||
_doActionTexSize = ResourceMgr_LoadTexSizeByName(gCheckDoActionENGTex);
|
||||
return _doActionTexSize;
|
||||
}
|
||||
|
||||
// The button statuses include the A button when most things are only the equip item buttons
|
||||
// So, when indexing into it with a item button index, we need to adjust
|
||||
|
@ -2457,8 +2478,8 @@ void Interface_LoadActionLabel(InterfaceContext* interfaceCtx, u16 action, s16 l
|
|||
|
||||
if (action != DO_ACTION_NONE) {
|
||||
//osCreateMesgQueue(&interfaceCtx->loadQueue, &interfaceCtx->loadMsg, OS_MESG_BLOCK);
|
||||
memcpy(interfaceCtx->doActionSegment + (loadOffset * DO_ACTION_TEX_SIZE), ResourceMgr_LoadTexByName(doAction),
|
||||
DO_ACTION_TEX_SIZE);
|
||||
memcpy(interfaceCtx->doActionSegment + (loadOffset * DO_ACTION_TEX_SIZE()), ResourceMgr_LoadTexByName(doAction),
|
||||
DO_ACTION_TEX_SIZE());
|
||||
//DmaMgr_SendRequest2(&interfaceCtx->dmaRequest_160,
|
||||
//interfaceCtx->doActionSegment + (loadOffset * DO_ACTION_TEX_SIZE),
|
||||
//(uintptr_t)_do_action_staticSegmentRomStart + (action * DO_ACTION_TEX_SIZE), DO_ACTION_TEX_SIZE,
|
||||
|
@ -2467,7 +2488,7 @@ void Interface_LoadActionLabel(InterfaceContext* interfaceCtx, u16 action, s16 l
|
|||
} else {
|
||||
gSegments[7] = VIRTUAL_TO_PHYSICAL(interfaceCtx->doActionSegment);
|
||||
//func_80086D5C(SEGMENTED_TO_VIRTUAL(sDoActionTextures[loadOffset]), DO_ACTION_TEX_SIZE / 4);
|
||||
func_80086D5C(interfaceCtx->doActionSegment + (loadOffset * DO_ACTION_TEX_SIZE), DO_ACTION_TEX_SIZE / 4);
|
||||
func_80086D5C(interfaceCtx->doActionSegment + (loadOffset * DO_ACTION_TEX_SIZE()), DO_ACTION_TEX_SIZE() / 4);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2545,7 +2566,7 @@ void Interface_LoadActionLabelB(GlobalContext* globalCtx, u16 action) {
|
|||
|
||||
// OTRTODO
|
||||
osCreateMesgQueue(&interfaceCtx->loadQueue, &interfaceCtx->loadMsg, OS_MESG_BLOCK);
|
||||
memcpy(interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE, ResourceMgr_LoadTexByName(doAction), DO_ACTION_TEX_SIZE);
|
||||
memcpy(interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE(), ResourceMgr_LoadTexByName(doAction), DO_ACTION_TEX_SIZE());
|
||||
//DmaMgr_SendRequest2(&interfaceCtx->dmaRequest_160, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE,
|
||||
//(uintptr_t)_do_action_staticSegmentRomStart + (action * DO_ACTION_TEX_SIZE), DO_ACTION_TEX_SIZE, 0,
|
||||
//&interfaceCtx->loadQueue, NULL, __FILE__, __LINE__);
|
||||
|
@ -3181,7 +3202,7 @@ void func_80088B34(s16 arg0) {
|
|||
void Interface_DrawActionLabel(GraphicsContext* gfxCtx, void* texture) {
|
||||
OPEN_DISPS(gfxCtx);
|
||||
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, texture, G_IM_FMT_IA, DO_ACTION_TEX_WIDTH, DO_ACTION_TEX_HEIGHT, 0,
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, texture, G_IM_FMT_IA, DO_ACTION_TEX_WIDTH(), DO_ACTION_TEX_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);
|
||||
|
||||
|
@ -3254,8 +3275,8 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) {
|
|||
const s16 rStartLabelY_ori = R_START_LABEL_Y(gSaveContext.language)+Y_Margins_StartBtn;
|
||||
const s16 PosX_StartBtn_ori = OTRGetRectDimensionFromRightEdge(startButtonLeftPos[gSaveContext.language]+X_Margins_StartBtn);
|
||||
const s16 PosY_StartBtn_ori = 16+Y_Margins_StartBtn;
|
||||
s16 StartBTN_Label_W = DO_ACTION_TEX_WIDTH;
|
||||
s16 StartBTN_Label_H = DO_ACTION_TEX_HEIGHT;
|
||||
s16 StartBTN_Label_W = DO_ACTION_TEX_WIDTH();
|
||||
s16 StartBTN_Label_H = DO_ACTION_TEX_HEIGHT();
|
||||
int StartBTN_Label_H_Scaled = StartBTN_Label_H * 1.0f;
|
||||
int StartBTN_Label_W_Scaled = StartBTN_Label_W * 1.0f;
|
||||
int StartBTN_Label_W_factor = (1 << 10) * StartBTN_Label_W / StartBTN_Label_W_Scaled;
|
||||
|
@ -3511,10 +3532,11 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) {
|
|||
}
|
||||
doAction = newName;
|
||||
}
|
||||
memcpy(interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE * 2, ResourceMgr_LoadTexByName(doAction), DO_ACTION_TEX_SIZE);
|
||||
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE * 2, G_IM_FMT_IA,
|
||||
DO_ACTION_TEX_WIDTH, DO_ACTION_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_WRAP,
|
||||
memcpy(interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE() * 2, ResourceMgr_LoadTexByName(doAction), DO_ACTION_TEX_SIZE());
|
||||
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE() * 2, G_IM_FMT_IA,
|
||||
DO_ACTION_TEX_WIDTH(), DO_ACTION_TEX_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);
|
||||
|
||||
//const s16 rStartLabelX = OTRGetRectDimensionFromRightEdge(R_START_LABEL_X(gSaveContext.language)+Right_HUD_Margin);
|
||||
|
@ -4330,7 +4352,7 @@ void Interface_Draw(GlobalContext* globalCtx) {
|
|||
|
||||
// Invalidate Do Action textures as they may have changed
|
||||
gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->doActionSegment);
|
||||
gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE);
|
||||
gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE());
|
||||
|
||||
gSPSegment(OVERLAY_DISP++, 0x02, interfaceCtx->parameterSegment);
|
||||
gSPSegment(OVERLAY_DISP++, 0x07, interfaceCtx->doActionSegment);
|
||||
|
@ -4630,14 +4652,14 @@ void Interface_Draw(GlobalContext* globalCtx) {
|
|||
PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
|
||||
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->bAlpha);
|
||||
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE, G_IM_FMT_IA,
|
||||
DO_ACTION_TEX_WIDTH, DO_ACTION_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_WRAP,
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE(), G_IM_FMT_IA,
|
||||
DO_ACTION_TEX_WIDTH(), DO_ACTION_TEX_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);
|
||||
|
||||
R_B_LABEL_DD = (1 << 10) / (WREG(37 + gSaveContext.language) / 100.0f);
|
||||
gSPWideTextureRectangle(OVERLAY_DISP++, BbtnPosX << 2, BbtnPosY << 2,
|
||||
(BbtnPosX + DO_ACTION_TEX_WIDTH) << 2,
|
||||
(BbtnPosY + DO_ACTION_TEX_HEIGHT) << 2, G_TX_RENDERTILE, 0, 0,
|
||||
(BbtnPosX + DO_ACTION_TEX_WIDTH()) << 2,
|
||||
(BbtnPosY + DO_ACTION_TEX_HEIGHT()) << 2, G_TX_RENDERTILE, 0, 0,
|
||||
R_B_LABEL_DD, R_B_LABEL_DD);
|
||||
}
|
||||
|
||||
|
@ -4723,12 +4745,14 @@ void Interface_Draw(GlobalContext* globalCtx) {
|
|||
} else {
|
||||
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, dpadAlpha);
|
||||
}
|
||||
gDPLoadTextureBlock(OVERLAY_DISP++, ResourceMgr_LoadFileRaw("assets/ship_of_harkinian/buttons/dpad.bin"),
|
||||
G_IM_FMT_IA, G_IM_SIZ_16b, 32, 32, 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);
|
||||
gSPWideTextureRectangle(OVERLAY_DISP++, DpadPosX << 2, DpadPosY << 2,
|
||||
(DpadPosX + 32) << 2, (DpadPosY + 32) << 2,
|
||||
G_TX_RENDERTILE, 0, 0, (1 << 10), (1 << 10));
|
||||
if (fullUi) {
|
||||
gDPLoadTextureBlock(OVERLAY_DISP++, ResourceMgr_LoadFileRaw("assets/ship_of_harkinian/buttons/dpad.bin"),
|
||||
G_IM_FMT_IA, G_IM_SIZ_16b, 32, 32, 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);
|
||||
gSPWideTextureRectangle(OVERLAY_DISP++, DpadPosX << 2, DpadPosY << 2,
|
||||
(DpadPosX + 32) << 2, (DpadPosY + 32) << 2,
|
||||
G_TX_RENDERTILE, 0, 0, (1 << 10), (1 << 10));
|
||||
}
|
||||
|
||||
// DPad-Up Button Icon & Ammo Count
|
||||
if (gSaveContext.equips.buttonItems[4] < 0xF0) {
|
||||
|
@ -4846,7 +4870,7 @@ void Interface_Draw(GlobalContext* globalCtx) {
|
|||
if ((interfaceCtx->unk_1EC < 2) || (interfaceCtx->unk_1EC == 3)) {
|
||||
Interface_DrawActionLabel(globalCtx->state.gfxCtx, interfaceCtx->doActionSegment);
|
||||
} else {
|
||||
Interface_DrawActionLabel(globalCtx->state.gfxCtx, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE);
|
||||
Interface_DrawActionLabel(globalCtx->state.gfxCtx, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE());
|
||||
}
|
||||
|
||||
gDPPipeSync(OVERLAY_DISP++);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include <string.h>
|
||||
|
||||
#include "soh/Enhancements/gameconsole.h"
|
||||
|
||||
#include "../libultraship/ImGuiImpl.h"
|
||||
#include "soh/frame_interpolation.h"
|
||||
|
||||
void* D_8012D1F0 = NULL;
|
||||
|
@ -190,6 +190,7 @@ void Gameplay_Destroy(GameState* thisx) {
|
|||
KaleidoManager_Destroy();
|
||||
ZeldaArena_Cleanup();
|
||||
Fault_RemoveClient(&D_801614B8);
|
||||
disableBetaQuest();
|
||||
gGlobalCtx = NULL;
|
||||
}
|
||||
|
||||
|
@ -237,10 +238,11 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi
|
|||
if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) && LINK_IS_ADULT &&
|
||||
(gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TOKINOMA) &&
|
||||
!Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) &&
|
||||
globalCtx->sceneLoadFlag == 0 && player->getItemId == GI_NONE) {
|
||||
globalCtx->sceneLoadFlag == 0) {
|
||||
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ARROW_LIGHT);
|
||||
GiveItemWithoutActor(globalCtx, getItemId);
|
||||
Flags_SetTreasure(globalCtx, 0x1E);
|
||||
player->pendingFlag.flagID = 0x1E;
|
||||
player->pendingFlag.flagType = FLAG_SCENE_TREASURE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -260,6 +262,7 @@ void GivePlayerRandoRewardSariaGift(GlobalContext* globalCtx, RandomizerCheck ch
|
|||
void Gameplay_Init(GameState* thisx) {
|
||||
GlobalContext* globalCtx = (GlobalContext*)thisx;
|
||||
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
|
||||
enableBetaQuest();
|
||||
gGlobalCtx = globalCtx;
|
||||
//globalCtx->state.gfxCtx = NULL;
|
||||
uintptr_t zAlloc;
|
||||
|
@ -1407,7 +1410,7 @@ void Gameplay_Draw(GlobalContext* globalCtx) {
|
|||
OVERLAY_DISP = sp70;
|
||||
globalCtx->unk_121C7 = 2;
|
||||
SREG(33) |= 1;
|
||||
} else {
|
||||
} else if (R_PAUSE_MENU_MODE != 3) {
|
||||
Gameplay_Draw_DrawOverlayElements:
|
||||
if ((HREG(80) != 10) || (HREG(89) != 0)) {
|
||||
Gameplay_DrawOverlayElements(globalCtx);
|
||||
|
|
|
@ -752,18 +752,12 @@ void func_8008F470(GlobalContext* globalCtx, void** skeleton, Vec3s* jointTable,
|
|||
};
|
||||
color = &sTemp;
|
||||
if (tunic == PLAYER_TUNIC_KOKIRI && CVar_GetS32("gUseTunicsCol",0)) {
|
||||
color->r = CVar_GetS32("gTunic_Kokiri_R", sTunicColors[PLAYER_TUNIC_KOKIRI].r);
|
||||
color->g = CVar_GetS32("gTunic_Kokiri_G", sTunicColors[PLAYER_TUNIC_KOKIRI].g);
|
||||
color->b = CVar_GetS32("gTunic_Kokiri_B", sTunicColors[PLAYER_TUNIC_KOKIRI].b);
|
||||
*color = CVar_GetRGB("gTunic_Kokiri", sTunicColors[PLAYER_TUNIC_KOKIRI]);
|
||||
} else if (tunic == PLAYER_TUNIC_GORON && CVar_GetS32("gUseTunicsCol",0)) {
|
||||
color->r = CVar_GetS32("gTunic_Goron_R", sTunicColors[PLAYER_TUNIC_GORON].r);
|
||||
color->g = CVar_GetS32("gTunic_Goron_G", sTunicColors[PLAYER_TUNIC_GORON].g);
|
||||
color->b = CVar_GetS32("gTunic_Goron_B", sTunicColors[PLAYER_TUNIC_GORON].b);
|
||||
*color = CVar_GetRGB("gTunic_Goron", sTunicColors[PLAYER_TUNIC_GORON]);
|
||||
} else if (tunic == PLAYER_TUNIC_ZORA && CVar_GetS32("gUseTunicsCol",0)) {
|
||||
color->r = CVar_GetS32("gTunic_Zora_R", sTunicColors[PLAYER_TUNIC_ZORA].r);
|
||||
color->g = CVar_GetS32("gTunic_Zora_G", sTunicColors[PLAYER_TUNIC_ZORA].g);
|
||||
color->b = CVar_GetS32("gTunic_Zora_B", sTunicColors[PLAYER_TUNIC_ZORA].b);
|
||||
} else if (!CVar_GetS32("gUseTunicsCol",0)) {
|
||||
*color = CVar_GetRGB("gTunic_Zora", sTunicColors[PLAYER_TUNIC_ZORA]);
|
||||
} else if (!CVar_GetS32("gUseTunicsCol",0)){
|
||||
if (tunic >= 3) {
|
||||
color->r = sOriginalTunicColors[0].r;
|
||||
color->g = sOriginalTunicColors[0].g;
|
||||
|
|
|
@ -217,13 +217,12 @@ void func_80095D04(GlobalContext* globalCtx, Room* room, u32 flags) {
|
|||
CLOSE_DISPS(globalCtx->state.gfxCtx);
|
||||
}
|
||||
|
||||
//#define JPEG_MARKER 0xFFD8FFE0
|
||||
#define JPEG_MARKER 0xE0FFD8FF
|
||||
#define JPEG_MARKER 0xFFD8FFE0
|
||||
|
||||
s32 func_80096238(void* data) {
|
||||
OSTime time;
|
||||
|
||||
if (*(u32*)data == JPEG_MARKER)
|
||||
if (BE32SWAP(*(u32*)data) == JPEG_MARKER)
|
||||
{
|
||||
char* decodedJpeg = ResourceMgr_LoadJPEG(data, 320 * 240 * 2);
|
||||
//char* decodedJpeg = ResourceMgr_LoadJPEG(data, 480 * 240 * 2);
|
||||
|
|
|
@ -1697,7 +1697,10 @@ void BossDodongo_DrawEffects(GlobalContext* globalCtx) {
|
|||
func_80093D84(globalCtx->state.gfxCtx);
|
||||
unkMtx = &globalCtx->billboardMtxF;
|
||||
|
||||
// OTRTODO: This call causes the whole texture cache to be cleaned up, which causes an important slowdown on switch so we need to find a way to avoid it.
|
||||
#ifndef __SWITCH__
|
||||
gSPInvalidateTexCache(POLY_XLU_DISP++, 0);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < 80; i++, eff++) {
|
||||
if (eff->unk_24 == 1) {
|
||||
|
|
|
@ -1540,7 +1540,34 @@ void DemoEffect_UpdateJewelAdult(DemoEffect* this, GlobalContext* globalCtx) {
|
|||
this->jewel.timer++;
|
||||
this->actor.shape.rot.y += 0x0400;
|
||||
DemoEffect_PlayJewelSfx(this, globalCtx);
|
||||
|
||||
if (gSaveContext.n64ddFlag) {
|
||||
switch (this->jewel.type) {
|
||||
case DEMO_EFFECT_JEWEL_KOKIRI:
|
||||
if (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) {
|
||||
DemoEffect_SetJewelColor(this, 1.0f);
|
||||
} else {
|
||||
DemoEffect_SetJewelColor(this, 0.0f);
|
||||
}
|
||||
break;
|
||||
case DEMO_EFFECT_JEWEL_GORON:
|
||||
if (CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) {
|
||||
DemoEffect_SetJewelColor(this, 1.0f);
|
||||
} else {
|
||||
DemoEffect_SetJewelColor(this, 0.0f);
|
||||
}
|
||||
break;
|
||||
case DEMO_EFFECT_JEWEL_ZORA:
|
||||
if (CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE)) {
|
||||
DemoEffect_SetJewelColor(this, 1.0f);
|
||||
} else {
|
||||
DemoEffect_SetJewelColor(this, 0.0f);
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
DemoEffect_SetJewelColor(this, 1.0f);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1604,6 +1631,34 @@ void DemoEffect_UpdateJewelChild(DemoEffect* this, GlobalContext* globalCtx) {
|
|||
thisx->shape.rot.y += 0x0400;
|
||||
DemoEffect_PlayJewelSfx(this, globalCtx);
|
||||
this->effectFlags &= ~1;
|
||||
|
||||
if (gSaveContext.n64ddFlag) {
|
||||
switch (this->jewel.type) {
|
||||
case DEMO_EFFECT_JEWEL_KOKIRI:
|
||||
if (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) {
|
||||
DemoEffect_SetJewelColor(this, 1.0f);
|
||||
} else {
|
||||
DemoEffect_SetJewelColor(this, 0.0f);
|
||||
}
|
||||
break;
|
||||
case DEMO_EFFECT_JEWEL_GORON:
|
||||
if (CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) {
|
||||
DemoEffect_SetJewelColor(this, 1.0f);
|
||||
} else {
|
||||
DemoEffect_SetJewelColor(this, 0.0f);
|
||||
}
|
||||
break;
|
||||
case DEMO_EFFECT_JEWEL_ZORA:
|
||||
if (CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE)) {
|
||||
DemoEffect_SetJewelColor(this, 1.0f);
|
||||
} else {
|
||||
DemoEffect_SetJewelColor(this, 0.0f);
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// Contrary to it's adult conterpart Authenthic doesn't use DemoEffect_SetJewelColor(this, 1.0f); here
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1059,7 +1059,7 @@ void EnSkj_SetupPostSariasSong(EnSkj* this) {
|
|||
}
|
||||
|
||||
void EnSkj_ChangeModeAfterSong(EnSkj* this, GlobalContext* globalCtx) {
|
||||
if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx)) {
|
||||
if (((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx)) || Randomizer_ItemIsIceTrap(RC_LW_SKULL_KID, GI_HEART_PIECE)) {
|
||||
gSaveContext.itemGetInf[1] |= 0x40;
|
||||
EnSkj_SetNaviId(this);
|
||||
EnSkj_SetupWaitInRange(this);
|
||||
|
|
|
@ -288,14 +288,16 @@ void func_80B3CA38(EnXc* this, GlobalContext* globalCtx) {
|
|||
}
|
||||
|
||||
void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, RandomizerCheck check, int sheikType, GetItemID ogSongId) {
|
||||
if (sheik->actor.parent != NULL && sheik->actor.parent->id == GET_PLAYER(globalCtx)->actor.id &&
|
||||
Player* player = GET_PLAYER(globalCtx);
|
||||
if (sheik->actor.parent != NULL && sheik->actor.parent->id == player->actor.id &&
|
||||
!(gSaveContext.eventChkInf[5] & sheikType)) {
|
||||
gSaveContext.eventChkInf[5] |= sheikType;
|
||||
} else if (!(gSaveContext.eventChkInf[5] & sheikType)) {
|
||||
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, ogSongId);
|
||||
if (check == RC_SHEIK_AT_TEMPLE && !Flags_GetTreasure(globalCtx, 0x1F)) {
|
||||
if (func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f)) {
|
||||
Flags_SetTreasure(globalCtx, 0x1F);
|
||||
player->pendingFlag.flagID = 0x1F;
|
||||
player->pendingFlag.flagType = FLAG_SCENE_TREASURE;
|
||||
}
|
||||
} else if (check != RC_SHEIK_AT_TEMPLE) {
|
||||
func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f);
|
||||
|
|
|
@ -168,6 +168,7 @@ void func_8083CA20(GlobalContext* globalCtx, Player* this);
|
|||
void func_8083CA54(GlobalContext* globalCtx, Player* this);
|
||||
void func_8083CA9C(GlobalContext* globalCtx, Player* this);
|
||||
s32 func_8083E0FC(Player* this, GlobalContext* globalCtx);
|
||||
void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx);
|
||||
s32 func_8083E5A8(Player* this, GlobalContext* globalCtx);
|
||||
s32 func_8083EB44(Player* this, GlobalContext* globalCtx);
|
||||
s32 func_8083F7BC(Player* this, GlobalContext* globalCtx);
|
||||
|
@ -4649,7 +4650,11 @@ void func_8083A0F4(GlobalContext* globalCtx, Player* this) {
|
|||
anim = D_80853914[PLAYER_ANIMGROUP_13][this->modelAnimType];
|
||||
}
|
||||
|
||||
func_80832264(globalCtx, this, anim);
|
||||
if (CVar_GetS32("gFasterHeavyBlockLift", 0) && interactActorId == ACTOR_BG_HEAVY_BLOCK) {
|
||||
LinkAnimation_PlayOnceSetSpeed(globalCtx, &this->skelAnime, anim, 3.0f);
|
||||
} else {
|
||||
LinkAnimation_PlayOnce(globalCtx, &this->skelAnime, anim);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -6233,6 +6238,30 @@ void func_8083E4C4(GlobalContext* globalCtx, Player* this, GetItemEntry* giEntry
|
|||
func_80078884((this->getItemId < 0) ? NA_SE_SY_GET_BOXITEM : NA_SE_SY_GET_ITEM);
|
||||
}
|
||||
|
||||
// Sets a flag according to which type of flag is specified in player->pendingFlag.flagType
|
||||
// and which flag is specified in player->pendingFlag.flagID.
|
||||
void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) {
|
||||
switch (this->pendingFlag.flagType) {
|
||||
case FLAG_SCENE_CLEAR:
|
||||
Flags_SetClear(globalCtx, this->pendingFlag.flagID);
|
||||
break;
|
||||
case FLAG_SCENE_COLLECTIBLE:
|
||||
Flags_SetCollectible(globalCtx, this->pendingFlag.flagID);
|
||||
break;
|
||||
case FLAG_SCENE_SWITCH:
|
||||
Flags_SetSwitch(globalCtx, this->pendingFlag.flagID);
|
||||
break;
|
||||
case FLAG_SCENE_TREASURE:
|
||||
Flags_SetTreasure(globalCtx, this->pendingFlag.flagID);
|
||||
break;
|
||||
case FLAG_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
this->pendingFlag.flagType = FLAG_NONE;
|
||||
this->pendingFlag.flagID = 0;
|
||||
}
|
||||
|
||||
s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) {
|
||||
Actor* interactedActor;
|
||||
|
||||
|
@ -6256,6 +6285,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) {
|
|||
this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11);
|
||||
this->actor.colChkInfo.damage = 0;
|
||||
func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20);
|
||||
Player_SetPendingFlag(this, globalCtx);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -12688,6 +12718,8 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) {
|
|||
|
||||
Message_StartTextbox(globalCtx, giEntry->textId, &this->actor);
|
||||
Item_Give(globalCtx, giEntry->itemId);
|
||||
|
||||
Player_SetPendingFlag(this, globalCtx);
|
||||
|
||||
if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) ||
|
||||
((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) ||
|
||||
|
@ -13130,7 +13162,10 @@ void func_8084ECA4(Player* this, GlobalContext* globalCtx) {
|
|||
if (LinkAnimation_Update(globalCtx, &this->skelAnime)) {
|
||||
if (this->unk_84F != 0) {
|
||||
if (this->unk_850 == 0) {
|
||||
Message_StartTextbox(globalCtx, D_80854A04[this->unk_84F - 1].textId, &this->actor);
|
||||
if (CVar_GetS32("gFastDrops", 0))
|
||||
{ this->unk_84F = 0; }
|
||||
else
|
||||
{ Message_StartTextbox(globalCtx, D_80854A04[this->unk_84F - 1].textId, &this->actor); }
|
||||
Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900);
|
||||
this->unk_850 = 1;
|
||||
}
|
||||
|
@ -13166,11 +13201,13 @@ void func_8084ECA4(Player* this, GlobalContext* globalCtx) {
|
|||
if (i < 4) {
|
||||
this->unk_84F = i + 1;
|
||||
this->unk_850 = 0;
|
||||
this->stateFlags1 |= PLAYER_STATE1_28 | PLAYER_STATE1_29;
|
||||
this->interactRangeActor->parent = &this->actor;
|
||||
Player_UpdateBottleHeld(globalCtx, this, catchInfo->itemId, ABS(catchInfo->actionParam));
|
||||
func_808322D0(globalCtx, this, sp24->unk_04);
|
||||
func_80835EA4(globalCtx, 4);
|
||||
if (!CVar_GetS32("gFastDrops", 0)) {
|
||||
this->stateFlags1 |= PLAYER_STATE1_28 | PLAYER_STATE1_29;
|
||||
func_808322D0(globalCtx, this, sp24->unk_04);
|
||||
func_80835EA4(globalCtx, 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -515,12 +515,49 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
|
|||
(gEquipAgeReqs[pauseCtx->cursorY[PAUSE_EQUIP]][pauseCtx->cursorX[PAUSE_EQUIP]] ==
|
||||
((void)0, gSaveContext.linkAge))) {
|
||||
if (CHECK_BTN_ALL(input->press.button, BTN_A)) {
|
||||
|
||||
// Allow Link to remove his equipment from the equipment subscreen by toggling on/off
|
||||
// Shields will be un-equipped entirely, and tunics/boots will revert to Kokiri Tunic/Kokiri Boots
|
||||
// Only BGS/Giant's Knife is affected, and it will revert to Master Sword.
|
||||
|
||||
// If we have the feature toggled on
|
||||
if (CVar_GetS32("gEquipmentCanBeRemoved", 0)) {
|
||||
|
||||
// If we're on the "swords" section of the equipment screen AND we're on a currently-equipped BGS/Giant's Knife
|
||||
if (pauseCtx->cursorY[PAUSE_EQUIP] == 0 && pauseCtx->cursorX[PAUSE_EQUIP] == 3
|
||||
&& CUR_EQUIP_VALUE(EQUIP_SWORD) == 3 && CHECK_OWNED_EQUIP(0,1)){ // And we have the Master Sword
|
||||
Inventory_ChangeEquipment(EQUIP_SWORD, 2); // "Unequip" it by equipping Master Sword
|
||||
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER;
|
||||
gSaveContext.infTable[29] = 0;
|
||||
goto RESUME_EQUIPMENT_SWORD; // Skip to here so we don't re-equip it
|
||||
}
|
||||
|
||||
// If we're on the "shields" section of the equipment screen AND we're on a currently-equipped shield
|
||||
if (pauseCtx->cursorY[PAUSE_EQUIP] == 1 && pauseCtx->cursorX[PAUSE_EQUIP] == CUR_EQUIP_VALUE(EQUIP_SHIELD)) {
|
||||
Inventory_ChangeEquipment(EQUIP_SHIELD, 0); // Unequip it
|
||||
goto RESUME_EQUIPMENT; // Skip to here so we don't re-equip it
|
||||
}
|
||||
|
||||
// If we're on the "tunics" section of the equipment screen AND we're on a currently-equipped tunic
|
||||
if (pauseCtx->cursorY[PAUSE_EQUIP] == 2 && pauseCtx->cursorX[PAUSE_EQUIP] == CUR_EQUIP_VALUE(EQUIP_TUNIC)) {
|
||||
Inventory_ChangeEquipment(EQUIP_TUNIC, 1); // "Unequip" it (by equipping Kokiri Tunic)
|
||||
goto RESUME_EQUIPMENT; // Skip to here so we don't re-equip it
|
||||
}
|
||||
|
||||
// If we're on the "boots" section of the equipment screen AND we're on currently-equipped boots
|
||||
if (pauseCtx->cursorY[PAUSE_EQUIP] == 3 && pauseCtx->cursorX[PAUSE_EQUIP] == CUR_EQUIP_VALUE(EQUIP_BOOTS)) {
|
||||
Inventory_ChangeEquipment(EQUIP_BOOTS, 1); // "Unequip" it (by equipping Kokiri Boots)
|
||||
goto RESUME_EQUIPMENT; // Skip to here so we don't re-equip it
|
||||
}
|
||||
}
|
||||
|
||||
if (CHECK_OWNED_EQUIP(pauseCtx->cursorY[PAUSE_EQUIP], pauseCtx->cursorX[PAUSE_EQUIP] - 1)) {
|
||||
Inventory_ChangeEquipment(pauseCtx->cursorY[PAUSE_EQUIP], pauseCtx->cursorX[PAUSE_EQUIP]);
|
||||
} else {
|
||||
goto EQUIP_FAIL;
|
||||
}
|
||||
|
||||
RESUME_EQUIPMENT:
|
||||
if (pauseCtx->cursorY[PAUSE_EQUIP] == 0) {
|
||||
gSaveContext.infTable[29] = 0;
|
||||
gSaveContext.equips.buttonItems[0] = cursorItem;
|
||||
|
@ -537,7 +574,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
|
|||
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE;
|
||||
}
|
||||
}
|
||||
|
||||
RESUME_EQUIPMENT_SWORD:
|
||||
Interface_LoadItemIcon1(globalCtx, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -2110,7 +2110,8 @@ void KaleidoScope_UpdateNamePanel(GlobalContext* globalCtx) {
|
|||
sp2A += 12;
|
||||
}
|
||||
|
||||
memcpy(pauseCtx->nameSegment, ResourceMgr_LoadTexByName(mapNameTextures[sp2A]), 0x400);
|
||||
const char* textureName = mapNameTextures[sp2A];
|
||||
memcpy(pauseCtx->nameSegment, ResourceMgr_LoadTexByName(textureName), ResourceMgr_LoadTexSizeByName(textureName));
|
||||
} else {
|
||||
osSyncPrintf("zoom_name=%d\n", pauseCtx->namedItem);
|
||||
|
||||
|
@ -2123,7 +2124,8 @@ void KaleidoScope_UpdateNamePanel(GlobalContext* globalCtx) {
|
|||
|
||||
osSyncPrintf("J_N=%d point=%d\n", gSaveContext.language, sp2A);
|
||||
|
||||
memcpy(pauseCtx->nameSegment, ResourceMgr_LoadTexByName(iconNameTextures[sp2A]), 0x400);
|
||||
const char* textureName = iconNameTextures[sp2A];
|
||||
memcpy(pauseCtx->nameSegment, ResourceMgr_LoadTexByName(textureName), ResourceMgr_LoadTexSizeByName(textureName));
|
||||
}
|
||||
|
||||
pauseCtx->nameDisplayTimer = 0;
|
||||
|
@ -3224,8 +3226,12 @@ void KaleidoScope_UpdateCursorSize(PauseContext* pauseCtx) {
|
|||
void KaleidoScope_LoadDungeonMap(GlobalContext* globalCtx) {
|
||||
InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx;
|
||||
|
||||
memcpy(interfaceCtx->mapSegment, ResourceMgr_LoadTexByName(sDungeonMapTexs[R_MAP_TEX_INDEX]), 0x800);
|
||||
memcpy(interfaceCtx->mapSegment + 0x800, ResourceMgr_LoadTexByName(sDungeonMapTexs[R_MAP_TEX_INDEX + 1]), 0x800);
|
||||
char* firstTextureName = sDungeonMapTexs[R_MAP_TEX_INDEX];
|
||||
char* secondTextureName = sDungeonMapTexs[R_MAP_TEX_INDEX + 1];
|
||||
uint32_t firstTextureSize = ResourceMgr_LoadTexSizeByName(firstTextureName);
|
||||
|
||||
memcpy(interfaceCtx->mapSegment, ResourceMgr_LoadTexByName(firstTextureName), ResourceMgr_LoadTexSizeByName(firstTextureName));
|
||||
memcpy(interfaceCtx->mapSegment + (firstTextureSize / 2), ResourceMgr_LoadTexByName(secondTextureName), ResourceMgr_LoadTexSizeByName(secondTextureName));
|
||||
}
|
||||
|
||||
void KaleidoScope_UpdateDungeonMap(GlobalContext* globalCtx) {
|
||||
|
@ -3403,11 +3409,14 @@ void KaleidoScope_Update(GlobalContext* globalCtx)
|
|||
|
||||
if (((void)0, gSaveContext.worldMapArea) < 22) {
|
||||
if (gSaveContext.language == LANGUAGE_ENG) {
|
||||
memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(mapNameTextures[36 + gSaveContext.worldMapArea]), 0xA00);
|
||||
const char* textureName = mapNameTextures[36 + gSaveContext.worldMapArea];
|
||||
memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(textureName), ResourceMgr_LoadTexSizeByName(textureName));
|
||||
} else if (gSaveContext.language == LANGUAGE_GER) {
|
||||
memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(mapNameTextures[58 + gSaveContext.worldMapArea]), 0xA00);
|
||||
const char* textureName = mapNameTextures[58 + gSaveContext.worldMapArea];
|
||||
memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(textureName), ResourceMgr_LoadTexSizeByName(textureName));
|
||||
} else {
|
||||
memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(mapNameTextures[80 + gSaveContext.worldMapArea]), 0xA00);
|
||||
const char* textureName = mapNameTextures[80 + gSaveContext.worldMapArea];
|
||||
memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(textureName), ResourceMgr_LoadTexSizeByName(textureName));
|
||||
}
|
||||
}
|
||||
// OTRTODO - player on pause
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue