Merge changes from develop-zhora

This commit is contained in:
Christopher Leggett 2022-08-02 19:17:08 -04:00
commit a007bfd14a
No known key found for this signature in database
GPG key ID: 7093AE5FF7037D79
86 changed files with 2252 additions and 892 deletions

View file

@ -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*")

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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]

View file

@ -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 {

View file

@ -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

View file

@ -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"

View file

@ -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" />

View file

@ -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>

View file

@ -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 = (

View 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>

View file

@ -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");

View file

@ -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();

View file

@ -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();
}
}

View file

@ -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");

View file

@ -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."},
});

View file

@ -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!" ||

View file

@ -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();

View file

@ -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,

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -117,6 +117,7 @@ public:
static void SaveRandomizer();
static void LoadBaseVersion1();
static void LoadBaseVersion2();
static void SaveBase();
std::vector<InitFunc> initFuncs;

View file

@ -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 };

View file

@ -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;

View file

@ -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];

View file

@ -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);
}
}

View file

@ -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;

View file

@ -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));

View file

@ -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));

View file

@ -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,
};

View file

@ -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];

View file

@ -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;

View file

@ -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;

View file

@ -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 } },

View file

@ -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++);

View file

@ -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);

View file

@ -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;

View file

@ -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);

View file

@ -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) {

View file

@ -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
}
}
/**

View file

@ -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);

View file

@ -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);

View file

@ -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);
}
}
}
}

View file

@ -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);
}

View file

@ -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