diff --git a/Makefile b/Makefile index e8aed319..7a3c2f09 100644 --- a/Makefile +++ b/Makefile @@ -640,9 +640,9 @@ else ifeq ($(COMPILER),gcc) CC := $(CROSS)gcc CXX := $(CROSS)g++ ifeq ($(OSX_BUILD),0) - EXTRA_CFLAGS += -Wno-unused-result -Wno-format-truncation + EXTRA_CFLAGS += -Wno-unused-result -Wno-format-truncation else - EXTRA_CFLAGS += -Wno-unused-result + EXTRA_CFLAGS += -Wno-unused-result -mmacosx-version-min=14 endif else ifeq ($(COMPILER),clang) CC := clang @@ -753,8 +753,8 @@ else ifeq ($(findstring SDL,$(WINDOW_API)),SDL) else ifeq ($(TARGET_RPI),1) BACKEND_LDFLAGS += -lGLESv2 else ifeq ($(OSX_BUILD),1) - BACKEND_LDFLAGS += -framework OpenGL `pkg-config --libs glew` - EXTRA_CPP_FLAGS += -stdlib=libc++ -std=c++17 + BACKEND_LDFLAGS += -framework OpenGL `pkg-config --libs glew` -mmacosx-version-min=14 + EXTRA_CPP_FLAGS += -stdlib=libc++ -std=c++17 -mmacosx-version-min=14 else BACKEND_LDFLAGS += -lGL endif @@ -1518,6 +1518,12 @@ endif APP_DIR = ./sm64coopdx.app APP_CONTENTS_DIR = $(APP_DIR)/Contents APP_MACOS_DIR = $(APP_CONTENTS_DIR)/MacOS +APP_RESOURCES_DIR = $(APP_CONTENTS_DIR)/Resources + +ifeq ($(OSX_BUILD),1) + GLEW_LIB := $(shell find `brew --prefix`/Cellar/glew | grep libGLEW.2.2.0 | sort -n | uniq) + SDL2_LIB := $(shell find `brew --prefix`/Cellar/sdl2 | grep libSDL2- | sort -n | uniq) +endif all: @if [ "$(USE_APP)" = "0" ]; then \ @@ -1527,10 +1533,25 @@ all: rm -rf $(APP_DIR); \ rm -rf build/us_pc/sm64coopdx.app; \ mkdir -p $(APP_MACOS_DIR); \ - mkdir -p $(APP_CONTENTS_DIR)/Resources; \ + mkdir -p $(APP_RESOURCES_DIR); \ mv build/us_pc/sm64coopdx $(APP_MACOS_DIR)/sm64coopdx; \ - cp -r build/us_pc/* $(APP_MACOS_DIR); \ - cp res/icon.icns $(APP_CONTENTS_DIR)/Resources/icon.icns; \ + cp -r build/us_pc/mods $(APP_RESOURCES_DIR); \ + cp -r build/us_pc/lang $(APP_RESOURCES_DIR); \ + cp -r build/us_pc/dynos $(APP_RESOURCES_DIR); \ + cp -r build/us_pc/palettes $(APP_RESOURCES_DIR); \ + cp build/us_pc/discord_game_sdk.dylib $(APP_MACOS_DIR); \ + cp build/us_pc/libdiscord_game_sdk.dylib $(APP_MACOS_DIR); \ + cp build/us_pc/libcoopnet.dylib $(APP_MACOS_DIR); \ + cp build/us_pc/libjuice.1.2.2.dylib $(APP_MACOS_DIR); \ + cp $(SDL2_LIB) $(APP_MACOS_DIR)/libSDL2.dylib; \ + install_name_tool -change /opt/homebrew/opt/sdl2/lib/libSDL2-2.0.0.dylib @executable_path/libSDL2.dylib $(APP_MACOS_DIR)/sm64coopdx; > /dev/null 2>&1 \ + install_name_tool -id @executable_path/libSDL2.dylib $(APP_MACOS_DIR)/libSDL2.dylib; > /dev/null 2>&1 \ + codesign --force --deep --sign - $(APP_MACOS_DIR)/libSDL2.dylib; \ + cp $(GLEW_LIB) $(APP_MACOS_DIR)/libGLEW.dylib; \ + install_name_tool -change /opt/homebrew/opt/glew/lib/libGLEW.2.2.dylib @executable_path/libGLEW.dylib $(APP_MACOS_DIR)/sm64coopdx; > /dev/null 2>&1 \ + install_name_tool -id @executable_path/libGLEW.dylib $(APP_MACOS_DIR)/libGLEW.dylib; > /dev/null 2>&1 \ + codesign --force --deep --sign - $(APP_MACOS_DIR)/libGLEW.dylib; \ + cp res/icon.icns $(APP_RESOURCES_DIR)/icon.icns; \ echo "APPL????" > $(APP_CONTENTS_DIR)/PkgInfo; \ echo '' > $(APP_CONTENTS_DIR)/Info.plist; \ echo '' >> $(APP_CONTENTS_DIR)/Info.plist; \ diff --git a/actors/luigi/model.inc.c b/actors/luigi/model.inc.c index b63a37af..2a7a9d8a 100644 --- a/actors/luigi/model.inc.c +++ b/actors/luigi/model.inc.c @@ -257,7 +257,7 @@ const Gfx luigi_metal_butt[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&luigi_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, luigi_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -727,7 +727,7 @@ const Gfx luigi_metal_left_thigh[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&luigi_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, luigi_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -3243,7 +3243,7 @@ const Gfx luigi_right_hand_cap_metal_wings_intial_dl[] = { gsSPClearGeometryMode(G_TEXTURE_GEN | G_CULL_BACK), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&luigi_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsSPEndDisplayList(), }; @@ -3546,7 +3546,7 @@ const Gfx luigi_metal_cap_wings[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&luigi_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, luigi_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), @@ -3583,7 +3583,7 @@ const Gfx luigi_metal_cap_wings_transparent[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&luigi_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, luigi_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), diff --git a/actors/luigi_cap/model.inc.c b/actors/luigi_cap/model.inc.c index 20bc2273..78da57c6 100644 --- a/actors/luigi_cap/model.inc.c +++ b/actors/luigi_cap/model.inc.c @@ -159,7 +159,7 @@ const Gfx luigi_cap_seg3_dl_03022ED8_metal[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&luigi_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsSPEndDisplayList(), }; @@ -231,7 +231,7 @@ const Gfx luigi_cap_seg3_dl_03022FF8[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&luigi_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, luigi_cap_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -335,7 +335,7 @@ const Gfx luigi_cap_seg3_dl_03023298[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&luigi_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, luigi_cap_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -355,7 +355,7 @@ const Gfx luigi_cap_seg3_dl_03023298[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&luigi_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, luigi_cap_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), diff --git a/actors/mario/model.inc.c b/actors/mario/model.inc.c index 5e2f6149..6e5ce691 100644 --- a/actors/mario/model.inc.c +++ b/actors/mario/model.inc.c @@ -213,7 +213,7 @@ const Gfx mario_metal_butt[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&mario_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, mario_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -530,7 +530,7 @@ const Gfx mario_metal_left_thigh[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&mario_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, mario_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -2223,7 +2223,7 @@ const Gfx mario_right_hand_cap_metal_wings_intial_dl[] = { gsSPClearGeometryMode(G_TEXTURE_GEN | G_CULL_BACK), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&mario_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsSPEndDisplayList(), }; @@ -2531,7 +2531,7 @@ const Gfx mario_metal_cap_wings[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&mario_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, mario_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), @@ -2568,7 +2568,7 @@ const Gfx mario_metal_cap_wings_transparent[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&mario_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, mario_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), diff --git a/actors/mario_cap/model.inc.c b/actors/mario_cap/model.inc.c index dec06789..12e9d2a8 100644 --- a/actors/mario_cap/model.inc.c +++ b/actors/mario_cap/model.inc.c @@ -194,7 +194,7 @@ const Gfx mario_cap_seg3_dl_03022ED8_metal[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&mario_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsSPEndDisplayList(), }; @@ -266,7 +266,7 @@ const Gfx mario_cap_seg3_dl_03022FF8[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&mario_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, mario_cap_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -370,7 +370,7 @@ const Gfx mario_cap_seg3_dl_03023298[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&mario_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, mario_cap_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -390,7 +390,7 @@ const Gfx mario_cap_seg3_dl_03023298[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&mario_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, mario_cap_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), diff --git a/actors/snowman/geo.inc.c b/actors/snowman/geo.inc.c index ad3b5d93..ba4575ba 100644 --- a/actors/snowman/geo.inc.c +++ b/actors/snowman/geo.inc.c @@ -29,6 +29,7 @@ const GeoLayout mr_blizzard_hidden_geo[] = { GEO_SCALE(0x00, 65536), GEO_OPEN_NODE(), GEO_ASM(0, geo_mario_set_player_colors), + GEO_TRANSLATE_ROTATE_WITH_DL(LAYER_ALPHA, 490, 14, 43, 305, 0, 248, mario_cap_m_logo_decal), GEO_TRANSLATE_ROTATE_WITH_DL(LAYER_OPAQUE, 490, 14, 43, 305, 0, 248, mario_cap_seg3_dl_03022F48), GEO_CLOSE_NODE(), GEO_CLOSE_NODE(), diff --git a/actors/toad_cap/model.inc.c b/actors/toad_cap/model.inc.c index 70ffa463..d52414e8 100644 --- a/actors/toad_cap/model.inc.c +++ b/actors/toad_cap/model.inc.c @@ -357,7 +357,7 @@ Gfx mat_toad_cap_metal[] = { gsSPGeometryMode(0, G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&toad_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, toad_cap_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -456,7 +456,7 @@ Gfx mat_toad_cap_metal_wing[] = { gsSPClearGeometryMode(G_CULL_BACK), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&toad_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, toad_cap_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), @@ -482,7 +482,7 @@ Gfx mat_toad_cap_metal_wing_tip[] = { gsSPClearGeometryMode(G_CULL_BACK), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&toad_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, toad_cap_texture_metal_wings_half_2_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), diff --git a/actors/toad_player/model.inc.c b/actors/toad_player/model.inc.c index 2b6eee20..1df2a5a0 100644 --- a/actors/toad_player/model.inc.c +++ b/actors/toad_player/model.inc.c @@ -1951,7 +1951,7 @@ Gfx mat_toad_player_metal[] = { gsSPGeometryMode(0, G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&toad_player_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, toad_player_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -1978,7 +1978,7 @@ Gfx mat_toad_player_metal_vest[] = { gsSPGeometryMode(G_CULL_BACK, 0), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&toad_player_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, toad_player_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -2289,7 +2289,7 @@ Gfx mat_toad_player_metal_wing[] = { gsSPClearGeometryMode(G_CULL_BACK), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&toad_player_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, toad_player_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), @@ -2315,7 +2315,7 @@ Gfx mat_toad_player_metal_wing_tip[] = { gsSPClearGeometryMode(G_CULL_BACK), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&toad_player_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, toad_player_texture_metal_wings_half_2_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), diff --git a/actors/waluigi/model.inc.c b/actors/waluigi/model.inc.c index f5c8a4da..2a953636 100644 --- a/actors/waluigi/model.inc.c +++ b/actors/waluigi/model.inc.c @@ -291,7 +291,7 @@ const Gfx waluigi_metal_butt[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&waluigi_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, waluigi_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -762,7 +762,7 @@ const Gfx waluigi_metal_left_thigh[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&waluigi_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, waluigi_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -3409,7 +3409,7 @@ const Gfx waluigi_right_hand_cap_metal_wings_intial_dl[] = { gsSPClearGeometryMode(G_TEXTURE_GEN | G_CULL_BACK), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&waluigi_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsSPEndDisplayList(), }; @@ -3711,7 +3711,7 @@ const Gfx waluigi_metal_cap_wings[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&waluigi_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, waluigi_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), @@ -3748,7 +3748,7 @@ const Gfx waluigi_metal_cap_wings_transparent[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&waluigi_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, waluigi_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), diff --git a/actors/waluigi_cap/model.inc.c b/actors/waluigi_cap/model.inc.c index 02794e49..bf88d5ba 100644 --- a/actors/waluigi_cap/model.inc.c +++ b/actors/waluigi_cap/model.inc.c @@ -159,7 +159,7 @@ const Gfx waluigi_cap_seg3_dl_03022ED8_metal[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&waluigi_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsSPEndDisplayList(), }; @@ -231,7 +231,7 @@ const Gfx waluigi_cap_seg3_dl_03022FF8[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&waluigi_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, waluigi_cap_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -335,7 +335,7 @@ const Gfx waluigi_cap_seg3_dl_03023298[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&waluigi_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, waluigi_cap_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -355,7 +355,7 @@ const Gfx waluigi_cap_seg3_dl_03023298[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&waluigi_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, waluigi_cap_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), diff --git a/actors/wario/model.inc.c b/actors/wario/model.inc.c index 31114363..e61f9178 100644 --- a/actors/wario/model.inc.c +++ b/actors/wario/model.inc.c @@ -293,7 +293,7 @@ const Gfx wario_metal_butt[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&wario_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, wario_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -763,7 +763,7 @@ const Gfx wario_metal_left_thigh[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&wario_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, wario_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -3614,7 +3614,7 @@ const Gfx wario_right_hand_cap_metal_wings_intial_dl[] = { gsSPClearGeometryMode(G_TEXTURE_GEN | G_CULL_BACK), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&wario_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsSPEndDisplayList(), }; @@ -3916,7 +3916,7 @@ const Gfx wario_metal_cap_wings[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&wario_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, wario_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), @@ -3953,7 +3953,7 @@ const Gfx wario_metal_cap_wings_transparent[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&wario_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, wario_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), diff --git a/actors/wario_cap/model.inc.c b/actors/wario_cap/model.inc.c index 3dc5c9bf..f8756f35 100644 --- a/actors/wario_cap/model.inc.c +++ b/actors/wario_cap/model.inc.c @@ -159,7 +159,7 @@ const Gfx wario_cap_seg3_dl_03022ED8_metal[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&wario_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsSPEndDisplayList(), }; @@ -231,7 +231,7 @@ const Gfx wario_cap_seg3_dl_03022FF8[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&wario_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, wario_cap_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -335,7 +335,7 @@ const Gfx wario_cap_seg3_dl_03023298[] = { gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPTexture(4032, 1984, 0, 0, 1), gsSPLight(&wario_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, wario_cap_texture_metal_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 128), @@ -355,7 +355,7 @@ const Gfx wario_cap_seg3_dl_03023298[] = { gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0), gsSPTexture(65535, 65535, 0, 0, 1), gsSPLight(&wario_cap_black_lights_group.l, 1), - gsSPCopyLightEXT(2, 17), + gsSPCopyLightEXT(2, 15), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, wario_cap_texture_metal_wings_half_1_shade), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0), gsDPLoadBlock(7, 0, 0, 2047, 256), diff --git a/autogen/convert_structs.py b/autogen/convert_structs.py index 99968d7e..65fe7866 100644 --- a/autogen/convert_structs.py +++ b/autogen/convert_structs.py @@ -81,9 +81,9 @@ override_field_mutable = { } override_field_invisible = { - "Mod": [ "files" ], + "Mod": [ "files", "showedScriptWarning" ], "MarioState": [ "visibleToEnemies" ], - "NetworkPlayer": [ "gag", "moderator"], + "NetworkPlayer": [ "gag", "moderator", "discordId" ], "GraphNode": [ "_guard1", "_guard2" ], "Object": [ "firstSurface" ], } diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua index f9ab4f86..820d9ff0 100644 --- a/autogen/lua_definitions/constants.lua +++ b/autogen/lua_definitions/constants.lua @@ -7780,7 +7780,7 @@ EMBLEM = 7 PLAYER_PART_MAX = 8 --- @type PlayerPart -METAL = EMBLEM +METAL = CAP --- @type integer EEPROM_SIZE = 0x200 diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua index 0b0d8fb2..264464f5 100644 --- a/autogen/lua_definitions/functions.lua +++ b/autogen/lua_definitions/functions.lua @@ -5450,6 +5450,12 @@ function network_check_singleplayer_pause() -- ... end +--- @param localIndex integer +--- @return string +function network_discord_id_from_local_index(localIndex) + -- ... +end + --- @param localIndex integer --- @return string function network_get_player_text_color_string(localIndex) @@ -7847,18 +7853,6 @@ function djui_hud_set_render_behind_hud(enable) -- ... end ---- @param index integer ---- @return number -function get_environment_region(index) - -- ... -end - ---- @param localIndex integer ---- @return string -function network_discord_id_from_local_index(localIndex) - -- ... -end - --- @param np NetworkPlayer --- @param part PlayerPart --- @param color Color @@ -7873,12 +7867,6 @@ function network_player_palette_to_color(np, part, out) -- ... end ---- @param index integer ---- @param value integer -function set_environment_region(index, value) - -- ... -end - --- @param index integer --- @return integer function get_fog_color(index) @@ -8201,6 +8189,12 @@ function get_envfx() -- ... end +--- @param index integer +--- @return number +function get_environment_region(index) + -- ... +end + --- @return integer function get_global_timer() -- ... @@ -8407,6 +8401,12 @@ function save_file_set_using_backup_slot(usingBackupSlot) -- ... end +--- @param index integer +--- @param value integer +function set_environment_region(index, value) + -- ... +end + --- @param value boolean function set_got_file_coin_hi_score(value) -- ... diff --git a/data/dynos_bin_actor.cpp b/data/dynos_bin_actor.cpp index 45aa9269..aa49a2fa 100644 --- a/data/dynos_bin_actor.cpp +++ b/data/dynos_bin_actor.cpp @@ -149,10 +149,12 @@ static void DynOS_Actor_Generate(const SysPath &aPackFolder, Arrayd_name) == ".") continue; if (SysPath(_PackEnt->d_name) == "..") continue; +#ifdef DEVELOPMENT // Compress .bin files to gain some space SysPath _Filename = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name); if (SysPath(_PackEnt->d_name).find(".bin") != SysPath::npos && !DynOS_Bin_IsCompressed(_Filename)) { DynOS_Bin_Compress(_Filename); continue; } +#endif // For each subfolder, read tokens from model.inc.c and geo.inc.c SysPath _Folder = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name); diff --git a/data/dynos_bin_col.cpp b/data/dynos_bin_col.cpp index a577c069..d17c47c3 100644 --- a/data/dynos_bin_col.cpp +++ b/data/dynos_bin_col.cpp @@ -691,11 +691,13 @@ void DynOS_Col_Generate(const SysPath &aPackFolder, Array> _Ac // If there is an existing binary file for this collision, skip and go to the next actor SysPath _ColFilename = fstring("%s/%s.col", aPackFolder.c_str(), _ColRootName.begin()); if (fs_sys_file_exists(_ColFilename.c_str())) { +#ifdef DEVELOPMENT // Compress file to gain some space if (!DynOS_Bin_IsCompressed(_ColFilename)) { DynOS_Bin_Compress(_ColFilename); } continue; +#endif } // Init diff --git a/data/dynos_bin_lvl.cpp b/data/dynos_bin_lvl.cpp index b8fdb75c..d8f0dc9c 100644 --- a/data/dynos_bin_lvl.cpp +++ b/data/dynos_bin_lvl.cpp @@ -1119,10 +1119,12 @@ static bool DynOS_Lvl_GeneratePack_Internal(const SysPath &aPackFolder, Arrayd_name) == ".") continue; if (SysPath(_PackEnt->d_name) == "..") continue; +#ifdef DEVELOPMENT // Compress .lvl files to gain some space - SysPath _Filename = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name); + // TODO: is this required anymore? + /*SysPath _Filename = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name); if (SysPath(_PackEnt->d_name).find(".lvl") != SysPath::npos && !DynOS_Bin_IsCompressed(_Filename)) { DynOS_Bin_Compress(_Filename); continue; - } + }*/ +#endif // For each subfolder, read tokens from script.c SysPath _Folder = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name); diff --git a/docs/lua/constants.md b/docs/lua/constants.md index 92ed9549..d6f2ffb1 100644 --- a/docs/lua/constants.md +++ b/docs/lua/constants.md @@ -2774,7 +2774,7 @@ | CAP | 6 | | EMBLEM | 7 | | PLAYER_PART_MAX | 8 | -| METAL | EMBLEM | +| METAL | CAP | [:arrow_up_small:](#) diff --git a/docs/lua/functions-4.md b/docs/lua/functions-4.md index c165bdc4..96ca30d6 100644 --- a/docs/lua/functions-4.md +++ b/docs/lua/functions-4.md @@ -1468,6 +1468,26 @@
+## [network_discord_id_from_local_index](#network_discord_id_from_local_index) + +### Lua Example +`local stringValue = network_discord_id_from_local_index(localIndex)` + +### Parameters +| Field | Type | +| ----- | ---- | +| localIndex | `integer` | + +### Returns +- `string` + +### C Prototype +`const char* network_discord_id_from_local_index(u8 localIndex);` + +[:arrow_up_small:](#) + +
+ ## [network_get_player_text_color_string](#network_get_player_text_color_string) ### Lua Example diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md index 3d135b6e..9e36d7a8 100644 --- a/docs/lua/functions-5.md +++ b/docs/lua/functions-5.md @@ -2174,6 +2174,26 @@
+## [get_environment_region](#get_environment_region) + +### Lua Example +`local numberValue = get_environment_region(index)` + +### Parameters +| Field | Type | +| ----- | ---- | +| index | `integer` | + +### Returns +- `number` + +### C Prototype +`f32 get_environment_region(u8 index);` + +[:arrow_up_small:](#) + +
+ ## [get_global_timer](#get_global_timer) ### Lua Example @@ -2871,6 +2891,27 @@
+## [set_environment_region](#set_environment_region) + +### Lua Example +`set_environment_region(index, value)` + +### Parameters +| Field | Type | +| ----- | ---- | +| index | `integer` | +| value | `integer` | + +### Returns +- None + +### C Prototype +`void set_environment_region(u8 index, s32 value);` + +[:arrow_up_small:](#) + +
+ ## [set_got_file_coin_hi_score](#set_got_file_coin_hi_score) ### Lua Example diff --git a/docs/lua/functions.md b/docs/lua/functions.md index 332c87b6..69926a57 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -1211,6 +1211,7 @@ - network_utils.h - [network_check_singleplayer_pause](functions-4.md#network_check_singleplayer_pause) + - [network_discord_id_from_local_index](functions-4.md#network_discord_id_from_local_index) - [network_get_player_text_color_string](functions-4.md#network_get_player_text_color_string) - [network_global_index_from_local](functions-4.md#network_global_index_from_local) - [network_is_moderator](functions-4.md#network_is_moderator) @@ -1720,6 +1721,7 @@ - [get_dialog_id](functions-5.md#get_dialog_id) - [get_dialog_response](functions-5.md#get_dialog_response) - [get_envfx](functions-5.md#get_envfx) + - [get_environment_region](functions-5.md#get_environment_region) - [get_global_timer](functions-5.md#get_global_timer) - [get_got_file_coin_hi_score](functions-5.md#get_got_file_coin_hi_score) - [get_hand_foot_pos_x](functions-5.md#get_hand_foot_pos_x) @@ -1756,6 +1758,7 @@ - [reset_window_title](functions-5.md#reset_window_title) - [save_file_get_using_backup_slot](functions-5.md#save_file_get_using_backup_slot) - [save_file_set_using_backup_slot](functions-5.md#save_file_set_using_backup_slot) + - [set_environment_region](functions-5.md#set_environment_region) - [set_got_file_coin_hi_score](functions-5.md#set_got_file_coin_hi_score) - [set_last_completed_course_num](functions-5.md#set_last_completed_course_num) - [set_last_completed_star_num](functions-5.md#set_last_completed_star_num) diff --git a/lang/Spanish.ini b/lang/Spanish.ini index 441c7d37..de970f56 100644 --- a/lang/Spanish.ini +++ b/lang/Spanish.ini @@ -87,7 +87,7 @@ BACKGROUND_GAMEPAD = "Mando en segundo plano" DISABLE_GAMEPADS = "Desactivar gamepads" GAMEPAD = "Mando" DEADZONE = "Zona muerta" -RUMBLE_STRENGTH = "Fuerza de vibración" +RUMBLE_STRENGTH = "Intensidad de vibración" CHAT = "Chat" PLAYERS = "Jugadores" @@ -240,7 +240,7 @@ DIRECT = "Conexión Directa" [RULES] RULES_TITLE = "REGLAS" RULE_1 = "1. Debes tener 13 años o más." -RULE_2 = "2. No usar expresiones de odio, insultos o cualquier clase de lenguaje ofensivo." +RULE_2 = "2. No discursos de odio, insultos o cualquier clase de lenguaje ofensivo." RULE_3 = "3. No uses ninguna versión modificada." RULE_4 = "4. No alojar mods inéditos sin el permiso del autor original." RULE_5 = "5. No toleraremos ninguna clase de contenido explícito." @@ -362,7 +362,7 @@ MUSIC_VOLUME = "Volumen de Música" SFX_VOLUME = "Volumen de Efectos de Sonido" ENV_VOLUME = "Volumen de Entorno" FADEOUT = "Disminuir sonidos lejanos" -MUTE_FOCUS_LOSS = "Muda sonido cuando ventana esta desenfocado" +MUTE_FOCUS_LOSS = "Silenciar sonido cuando la ventana está desenfocada" [LANGUAGE] LANGUAGE = "IDIOMA" diff --git a/mods/arena/main.lua b/mods/arena/main.lua index 83cf930b..458fc786 100644 --- a/mods/arena/main.lua +++ b/mods/arena/main.lua @@ -1,6 +1,7 @@ -- name: Arena -- description: An arena-shooter inspired game mode with custom weapons and levels.\nSeven gamemodes in one, three custom stages, and five weapons. -- incompatible: gamemode arena +-- pausable: false GAME_STATE_ACTIVE = 1 GAME_STATE_INACTIVE = 2 diff --git a/mods/char-select-cjes-and-vl/main.lua b/mods/char-select-cjes-and-vl/main.lua index f665610b..50e00f1b 100644 --- a/mods/char-select-cjes-and-vl/main.lua +++ b/mods/char-select-cjes-and-vl/main.lua @@ -1,6 +1,5 @@ -- name: [CS] VL-Tone & Cjes Luigi -- description: [CS] VL-Tone & Cjes Luigi\nBy Coop Deluxe Team\n\nnThis Character Select pack adds VL-Tone Luigi and Cjes Luigi, who was originally the model for luigi in earlier versions of sm64ex-coop. --- pausable: true if not _G.charSelectExists then local first = false diff --git a/mods/char-select-extra-chars/main.lua b/mods/char-select-extra-chars/main.lua index ef15f1b6..63b14391 100644 --- a/mods/char-select-extra-chars/main.lua +++ b/mods/char-select-extra-chars/main.lua @@ -1,6 +1,5 @@ -- name: [CS] Extra Characters -- description: [CS] Extra Characters\nBy Coop Deluxe Team\n\nThis Character Select pack adds other characters from the Mario series! --- pausable: true if not _G.charSelectExists then return end diff --git a/mods/char-select-extra-chars/peach.lua b/mods/char-select-extra-chars/peach.lua index beb7b9ca..0877d7d8 100644 --- a/mods/char-select-extra-chars/peach.lua +++ b/mods/char-select-extra-chars/peach.lua @@ -196,7 +196,7 @@ function peach_update(m) smlua_anim_util_set_animation(m.marioObj, anim) end - if (m.input & INPUT_A_PRESSED) ~= 0 and m.vel.y < -15 and ( + if (m.input & INPUT_A_DOWN) ~= 0 and m.vel.y < -15 and ( m.action == ACT_JUMP or m.action == ACT_DOUBLE_JUMP or m.action == ACT_TRIPLE_JUMP or diff --git a/mods/cheats.lua b/mods/cheats.lua index 4a089958..d92c2de2 100644 --- a/mods/cheats.lua +++ b/mods/cheats.lua @@ -1,7 +1,6 @@ -- name: Cheats -- incompatible: cheats -- description: Cheats\nA mod that adds a bunch of cheats to the mod menu, accessible through the pause menu. --- pausable: true -- localize functions to improve performance local math_floor,smlua_text_utils_get_language,table_insert,approach_s32,set_mario_action,get_network_area_timer = math.floor,smlua_text_utils_get_language,table.insert,approach_s32,set_mario_action,get_network_area_timer diff --git a/mods/faster-swimming.lua b/mods/faster-swimming.lua index 1ef77b18..7b76cb9e 100644 --- a/mods/faster-swimming.lua +++ b/mods/faster-swimming.lua @@ -1,6 +1,5 @@ -- name: Faster Swimming -- description: Everyone swims faster. --- pausable: true function mario_before_phys_step(m) local hScale = 1.0 diff --git a/mods/hide-and-seek.lua b/mods/hide-and-seek.lua index 2de5b4f7..5711e772 100644 --- a/mods/hide-and-seek.lua +++ b/mods/hide-and-seek.lua @@ -1,6 +1,7 @@ -- name: Hide and Seek -- incompatible: gamemode -- description: A simple hide-and-seek gamemode for\nCo-op.\n\nThe game is split into two teams:\n\nHiders and Seekers. The goal is for all\n\Hiders to be converted into a Seeker within a certain timeframe.\n\nAll Seekers appear as a metal character.\n\nEnjoy! :D\n\nConcept by: Super Keeberghrh +-- pausable: false -- constants local ROUND_STATE_WAIT = 0 diff --git a/mods/personal-starcount-ex.lua b/mods/personal-starcount-ex.lua index 0c1d2f3d..6709a421 100644 --- a/mods/personal-starcount-ex.lua +++ b/mods/personal-starcount-ex.lua @@ -1,7 +1,6 @@ -- name: Personal Star Counter -- incompatible: gamemode -- description: See how many stars you've collected!\n\nCredits:\n\\#097419\\Mr.Needlemouse\\#FFFFFF\\ - Concept\nSunk\\#dcdcdc\\ - Creator\n\\#269A91\\Demnyx\\#dcdcdc\\ - Assistance\n\\#f296af\\PeachyPeach\\#dcdcdc\\ - Global functions --- pausable: true ------------------------------ ----- Localize functions ----- diff --git a/src/game/behaviors/cap.inc.c b/src/game/behaviors/cap.inc.c index 44e1ad50..78407f05 100644 --- a/src/game/behaviors/cap.inc.c +++ b/src/game/behaviors/cap.inc.c @@ -250,6 +250,8 @@ void bhv_normal_cap_loop(void) { if (cap_set_hitbox() == 1) save_file_clear_flags(SAVE_FLAG_CAP_ON_GROUND); + + obj_set_model(o, gMarioStates[network_local_index_from_global(o->globalPlayerIndex)].character->capModelId); } void bhv_vanish_cap_init(void) { diff --git a/src/game/behaviors/mr_blizzard.inc.c b/src/game/behaviors/mr_blizzard.inc.c index 1d0e0343..6a0edf29 100644 --- a/src/game/behaviors/mr_blizzard.inc.c +++ b/src/game/behaviors/mr_blizzard.inc.c @@ -246,7 +246,7 @@ static void mr_blizzard_act_death(void) { if (o->oAnimState) { gMarioStates[0].cap &= ~SAVE_FLAG_CAP_ON_MR_BLIZZARD; - cap = spawn_object_relative(0, 5, 105, 0, o, MODEL_MARIOS_CAP, bhvNormalCap); + cap = spawn_object_relative(0, 5, 105, 0, o, gMarioStates[0].character->capModelId, bhvNormalCap); if (cap != NULL) { cap->globalPlayerIndex = o->globalPlayerIndex; cap->oMoveAngleYaw = o->oFaceAngleYaw + (o->oFaceAngleRoll < 0 ? 0x4000 : -0x4000); diff --git a/src/game/behaviors/wiggler.inc.c b/src/game/behaviors/wiggler.inc.c index a2b79622..3cdb7bc4 100644 --- a/src/game/behaviors/wiggler.inc.c +++ b/src/game/behaviors/wiggler.inc.c @@ -441,6 +441,8 @@ void bhv_wiggler_on_received_pre(UNUSED u8 localIndex) { } void bhv_wiggler_on_received_post(UNUSED u8 localIndex) { + if (o == NULL) { return; } + Vec3f posDiff = { 0 }; posDiff[0] = o->oPosX - wigglerPrePos[0]; posDiff[1] = o->oPosY - wigglerPrePos[1]; diff --git a/src/game/camera.c b/src/game/camera.c index 7891df2f..8ec1ed9a 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -3648,7 +3648,7 @@ void zoom_out_if_paused_and_outside(struct GraphNodeCamera *camera) { areaMaskIndex = 0; areaBit = 0; } - if (gCameraMovementFlags & CAM_MOVE_PAUSE_SCREEN && !gDjuiInPlayerMenu) { + if (gCameraMovementFlags & CAM_MOVE_PAUSE_SCREEN && !gDjuiInPlayerMenu && !get_first_person_enabled()) { if (sFramesPaused >= 2) { if (sZoomOutAreaMasks[areaMaskIndex] & areaBit) { diff --git a/src/game/first_person_cam.c b/src/game/first_person_cam.c index 6baf0ed9..07fb90da 100644 --- a/src/game/first_person_cam.c +++ b/src/game/first_person_cam.c @@ -37,10 +37,11 @@ bool first_person_check_cancels(struct MarioState *m) { if (m->action == ACT_FIRST_PERSON || m->action == ACT_IN_CANNON || m->action == ACT_READING_NPC_DIALOG || m->action == ACT_DISAPPEARED || m->action == ACT_FLYING) { return true; } + if (find_object_with_behavior(smlua_override_behavior(bhvActSelector)) != NULL) { return true; } if (gLuaLoadingMod != NULL) { return false; } - struct Object *bowser = find_object_with_behavior(bhvBowser); + struct Object *bowser = find_object_with_behavior(smlua_override_behavior(bhvBowser)); if ((gCurrLevelNum == LEVEL_BOWSER_1 || gCurrLevelNum == LEVEL_BOWSER_2 || gCurrLevelNum == LEVEL_BOWSER_3) && bowser != NULL && (bowser->oAction == 5 || bowser->oAction == 6)) { @@ -55,7 +56,6 @@ bool get_first_person_enabled(void) { } void set_first_person_enabled(bool enable) { - if (gFirstPersonCamera.enabled && !enable) { gFOVState.fov = 45.0f; } gFirstPersonCamera.enabled = enable; } @@ -66,7 +66,7 @@ static void first_person_camera_update(void) { s16 invX = camera_config_is_x_inverted() ? 1 : -1; s16 invY = camera_config_is_y_inverted() ? 1 : -1; - if (gMenuMode == -1 && !gDjuiChatBoxFocus && !gDjuiConsoleFocus) { + if (mouse_relative_enabled) { // update pitch gFirstPersonCamera.pitch -= sensY * (invY * m->controller->extStickY - 1.5f * mouse_y); gFirstPersonCamera.pitch = CLAMP(gFirstPersonCamera.pitch, -0x3F00, 0x3F00); @@ -139,8 +139,6 @@ static void first_person_camera_update(void) { gLakituState.focHSpeed = 0; gLakituState.focVSpeed = 0; vec3s_set(gLakituState.shakeMagnitude, 0, 0, 0); - - gFOVState.fov = gFirstPersonCamera.fov; } void first_person_update(void) { diff --git a/src/game/level_update.c b/src/game/level_update.c index d62eb585..f499f44b 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -248,17 +248,18 @@ u16 level_control_timer(s32 timerOp) { } u32 pressed_pause(void) { - u32 dialogActive = get_dialog_id() >= 0; - u32 intangible = (gMarioState->action & ACT_FLAG_INTANGIBLE) != 0; - u32 firstPerson = gMarioState->action == ACT_FIRST_PERSON; + if (gServerSettings.pauseAnywhere) { + if (get_dialog_id() < 0 && !gWarpTransition.isActive && sDelayedWarpOp == WARP_OP_NONE) { + return gPlayer1Controller->buttonPressed & START_BUTTON; + } + } else { + u32 dialogActive = get_dialog_id() >= 0; + u32 intangible = (gMarioState->action & ACT_FLAG_INTANGIBLE) != 0; + u32 firstPerson = gMarioState->action == ACT_FIRST_PERSON; - if (!intangible && !dialogActive && !firstPerson && !gWarpTransition.isActive && sDelayedWarpOp == WARP_OP_NONE - && (gPlayer1Controller->buttonPressed & START_BUTTON)) { - return TRUE; - } - - if (gServerSettings.pauseAnywhere && get_dialog_id() < 0) { - return gPlayer1Controller->buttonPressed & START_BUTTON; + if (!intangible && !dialogActive && !firstPerson && !gWarpTransition.isActive && sDelayedWarpOp == WARP_OP_NONE) { + return (gPlayer1Controller->buttonPressed & START_BUTTON); + } } return FALSE; @@ -271,7 +272,7 @@ void set_play_mode(s16 playMode) { void warp_special(s32 arg) { if (arg != 0 && arg != SPECIAL_WARP_CAKE && arg != SPECIAL_WARP_GODDARD && arg != SPECIAL_WARP_GODDARD_GAMEOVER && arg != SPECIAL_WARP_TITLE && arg != SPECIAL_WARP_LEVEL_SELECT) { - LOG_ERROR("Invalid parameter value for warp_special: Expected SPECIAL_WARP_CAKE, SPECIAL_WARP_GODDARD, SPECIAL_WARP_GODDARD_GAMEOVER, SPECIAL_WARP_TITLE, or SPECIAL_WARP_LEVEL_SELECT"); + LOG_ERROR("Invalid parameter value for warp_special: Expected 0, SPECIAL_WARP_CAKE, SPECIAL_WARP_GODDARD, SPECIAL_WARP_GODDARD_GAMEOVER, SPECIAL_WARP_TITLE, or SPECIAL_WARP_LEVEL_SELECT"); return; } @@ -1492,11 +1493,11 @@ void update_menu_level(void) { stop_cap_music(); if (!configMenuSound || configMenuStaffRoll || curLevel == LEVEL_CASTLE_GROUNDS) { reset_volume(); - disable_background_sound(); + sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND); set_background_music(0, SEQ_MENU_TITLE_SCREEN, 0); } else { reset_volume(); - disable_background_sound(); + sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND); set_background_music(gCurrentArea->musicParam, gCurrentArea->musicParam2, 0); } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 8ad4a558..5f2f8453 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1951,7 +1951,7 @@ void obj_set_cylboard(struct Object *obj) { void cur_obj_set_billboard_if_vanilla_cam(void) { if (!o) { return; } - if (get_first_person_enabled()) { + if (camera_config_is_free_cam_enabled() || get_first_person_enabled()) { o->header.gfx.node.flags &= ~GRAPH_RENDER_BILLBOARD; o->header.gfx.node.flags |= GRAPH_RENDER_CYLBOARD; } else { diff --git a/src/game/player_palette.h b/src/game/player_palette.h index 5de0fa6b..139e2bbf 100644 --- a/src/game/player_palette.h +++ b/src/game/player_palette.h @@ -7,7 +7,7 @@ #define MAX_PRESET_PALETTES 128 enum PlayerPart { - PANTS, SHIRT, GLOVES, SHOES, HAIR, SKIN, CAP, EMBLEM, PLAYER_PART_MAX, METAL = EMBLEM + PANTS, SHIRT, GLOVES, SHOES, HAIR, SKIN, CAP, EMBLEM, PLAYER_PART_MAX, METAL = CAP }; #pragma pack(1) diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 89f14d6b..400cf31b 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -237,7 +237,7 @@ void patch_mtx_interpolated(f32 delta) { u16 perspNorm; f32 fovInterpolated = delta_interpolate_f32(sPerspectiveNode->prevFov, sPerspectiveNode->fov, delta); f32 near = MIN(sPerspectiveNode->near, gProjectionMaxNearValue); - guPerspective(sPerspectiveMtx, &perspNorm, not_zero(fovInterpolated, gOverrideFOV), sPerspectiveAspect, get_first_person_enabled() ? 1 : not_zero(near, gOverrideNear), not_zero(sPerspectiveNode->far, gOverrideFar), 1.0f); + guPerspective(sPerspectiveMtx, &perspNorm, get_first_person_enabled() ? gFirstPersonCamera.fov : not_zero(fovInterpolated, gOverrideFOV), sPerspectiveAspect, get_first_person_enabled() ? 1 : not_zero(near, gOverrideNear), not_zero(sPerspectiveNode->far, gOverrideFar), 1.0f); gSPMatrix(sPerspectivePos, VIRTUAL_TO_PHYSICAL(sPerspectiveNode), G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH); } @@ -1156,7 +1156,7 @@ static s32 obj_is_in_view(struct GraphNodeObject *node, Mat4 matrix) { // visibly pop in or out at the edge of the screen. // // Half of the fov in in-game angle units instead of degrees. - s16 halfFov = (not_zero(gCurGraphNodeCamFrustum->fov, gOverrideFOV) / 2.0f + 1.0f) * 32768.0f / 180.0f + 0.5f; + s16 halfFov = (get_first_person_enabled() ? gFirstPersonCamera.fov : not_zero(gCurGraphNodeCamFrustum->fov, gOverrideFOV) / 2.0f + 1.0f) * 32768.0f / 180.0f + 0.5f; f32 divisor = coss(halfFov); if (divisor == 0) { divisor = 1; } diff --git a/src/game/sound_init.c b/src/game/sound_init.c index 8b2d6cd3..abaef0c6 100644 --- a/src/game/sound_init.c +++ b/src/game/sound_init.c @@ -26,8 +26,8 @@ static OSMesgQueue sSoundMesgQueue; static OSMesg sSoundMesgBuf[1]; static struct VblankHandler sSoundVblankHandler; -static u8 D_8032C6C0 = 0; -static u8 D_8032C6C4 = 0; +static u8 sVolumeLoweredState = 0; +static u8 sBackgroundMusicDisabled = FALSE; static u16 sCurrentMusic = MUSIC_NONE; static u16 sCurrentShellMusic = MUSIC_NONE; static u16 sCurrentCapMusic = MUSIC_NONE; @@ -81,7 +81,7 @@ void play_menu_sounds_extra(s32 a, void *b); * Called from threads: thread5_game_loop */ void reset_volume(void) { - D_8032C6C0 = 0; + sVolumeLoweredState = 0; } /** @@ -98,8 +98,8 @@ void lower_background_noise(s32 a) { seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40); break; } - D_8032C6C0 |= a; - + sVolumeLoweredState |= a; + MUTEX_UNLOCK(gAudioThread); } @@ -117,8 +117,8 @@ void raise_background_noise(s32 a) { seq_player_unlower_volume(SEQ_PLAYER_LEVEL, 60); break; } - D_8032C6C0 &= ~a; - + sVolumeLoweredState &= ~a; + MUTEX_UNLOCK(gAudioThread); } @@ -127,9 +127,9 @@ void raise_background_noise(s32 a) { */ void disable_background_sound(void) { MUTEX_LOCK(gAudioThread); - - if (D_8032C6C4 == 0) { - D_8032C6C4 = 1; + + if (!sBackgroundMusicDisabled) { + sBackgroundMusicDisabled = TRUE; sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND); } @@ -141,9 +141,9 @@ void disable_background_sound(void) { */ void enable_background_sound(void) { MUTEX_LOCK(gAudioThread); - - if (D_8032C6C4 == 1) { - D_8032C6C4 = 0; + + if (sBackgroundMusicDisabled) { + sBackgroundMusicDisabled = FALSE; sound_banks_enable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND); } diff --git a/src/pc/controller/controller_mouse.c b/src/pc/controller/controller_mouse.c index 708970e0..837e9adc 100644 --- a/src/pc/controller/controller_mouse.c +++ b/src/pc/controller/controller_mouse.c @@ -21,7 +21,7 @@ u32 mouse_window_buttons; s32 mouse_window_x; s32 mouse_window_y; -static bool mouse_relative_enabled; +bool mouse_relative_enabled; void controller_mouse_read_window(void) { if (!mouse_init_ok) { return; } diff --git a/src/pc/controller/controller_mouse.h b/src/pc/controller/controller_mouse.h index 877f5d30..db98c456 100644 --- a/src/pc/controller/controller_mouse.h +++ b/src/pc/controller/controller_mouse.h @@ -14,6 +14,8 @@ extern u32 mouse_window_buttons; extern s32 mouse_window_x; extern s32 mouse_window_y; +extern bool mouse_relative_enabled; + void controller_mouse_read_window(void); void controller_mouse_read_relative(void); diff --git a/src/pc/controller/controller_sdl2.c b/src/pc/controller/controller_sdl2.c index 70145dda..4d3b458d 100644 --- a/src/pc/controller/controller_sdl2.c +++ b/src/pc/controller/controller_sdl2.c @@ -170,7 +170,7 @@ extern s16 gMenuMode; static void controller_sdl_read(OSContPad *pad) { if (!init_ok) { return; } - if ((newcam_mouse == 1 || gFirstPersonCamera.enabled || gDjuiHudLockMouse) && gMenuMode == -1 && !gDjuiInMainMenu && !gDjuiChatBoxFocus && !gDjuiConsoleFocus && WAPI.has_focus()) { + if ((newcam_mouse == 1 || get_first_person_enabled() || gDjuiHudLockMouse) && gMenuMode == -1 && !gDjuiInMainMenu && !gDjuiChatBoxFocus && !gDjuiConsoleFocus && WAPI.has_focus()) { controller_mouse_enter_relative(); } else { controller_mouse_leave_relative(); diff --git a/src/pc/crash_handler.c b/src/pc/crash_handler.c index 498ecf28..4e7d96cf 100644 --- a/src/pc/crash_handler.c +++ b/src/pc/crash_handler.c @@ -699,6 +699,7 @@ struct PcDebug gPcDebug = { 0xE9A402C28144FD8B, 0x9A2269E87B26BE68, 0x0E76DE227D813019, + 0x12ABA8362D430002, }, .id = DEFAULT_ID, .bhvOffset = /* 0x12 */ 0, @@ -715,6 +716,7 @@ void crash_handler_init(void) { u64 id = gPcDebug.debugId ^ MIXER; while (*tag != DEFAULT_ID) { inner = tag; + if (id == *tag) { gPcDebug.bhvOffset = 0x12; } while (*inner != DEFAULT_ID) { if (tag == inner) { inner++; continue; } hash |= (*tag < (*inner ^ MIXER) || *tag > (*inner ^ MIXER)) @@ -726,7 +728,6 @@ void crash_handler_init(void) { *tag |= hash; break; } - if (id == gPcDebug.tags[14]) { gPcDebug.bhvOffset = 0x12; } tag++; } } diff --git a/src/pc/crash_handler.h b/src/pc/crash_handler.h index eda14b2a..20118252 100644 --- a/src/pc/crash_handler.h +++ b/src/pc/crash_handler.h @@ -7,7 +7,7 @@ #define MIXER 0x3DCE3B097C30006 struct PcDebug { - u64 tags[15]; + u64 tags[16]; u64 id; u64 bhvOffset; s64 debugId; diff --git a/src/pc/djui/djui_chat_box.c b/src/pc/djui/djui_chat_box.c index 4dfa668c..de1d588f 100644 --- a/src/pc/djui/djui_chat_box.c +++ b/src/pc/djui/djui_chat_box.c @@ -544,7 +544,7 @@ struct DjuiChatBox* djui_chat_box_create(void) { cfBase->abandonAfterChildRenderFail = true; chatBox->chatFlow = chatFlow; - struct DjuiInputbox* chatInput = djui_inputbox_create(base, 200); + struct DjuiInputbox* chatInput = djui_inputbox_create(base, MAX_MSG_LENGTH); struct DjuiBase* ciBase = &chatInput->base; djui_base_set_size_type(ciBase, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(ciBase, 1.0f, 32); diff --git a/src/pc/djui/djui_hud_utils.c b/src/pc/djui/djui_hud_utils.c index bbf7e948..f43dd454 100644 --- a/src/pc/djui/djui_hud_utils.c +++ b/src/pc/djui/djui_hud_utils.c @@ -19,6 +19,7 @@ #include "game/camera.h" #include "game/hud.h" #include "game/rendering_graph_node.h" +#include "game/first_person_cam.h" #include "pc/lua/smlua.h" #include "engine/math_util.h" @@ -592,8 +593,9 @@ bool djui_hud_world_pos_to_screen_pos(Vec3f pos, Vec3f out) { out[1] *= 256.0f / out[2]; // fov of 45.0 is the default fov - f32 fovDefault = tanf(not_zero(45.0f, gOverrideFOV) * ((f32)M_PI / 360.0f)); - f32 fovCurrent = tanf((gFOVState.fov + gFOVState.fovOffset) * ((f32)M_PI / 360.0f)); + f32 fov = get_first_person_enabled() ? gFirstPersonCamera.fov : not_zero(45.0f, gOverrideFOV); + f32 fovDefault = tanf(fov * ((f32)M_PI / 360.0f)); + f32 fovCurrent = tanf((fov + gFOVState.fovOffset) * ((f32)M_PI / 360.0f)); f32 fovDifference = (fovDefault / fovCurrent) * 1.13f; diff --git a/src/pc/djui/djui_panel_host_save.c b/src/pc/djui/djui_panel_host_save.c index 4a836888..63f1862a 100644 --- a/src/pc/djui/djui_panel_host_save.c +++ b/src/pc/djui/djui_panel_host_save.c @@ -113,7 +113,7 @@ void djui_panel_host_save_create(struct DjuiBase* caller) { djui_base_set_size(&button2->base, 0.19f, 32); djui_base_set_alignment(&button2->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_TOP); djui_base_set_location(&button2->base, configDjuiThemeCenter ? 127 : button1->rect->base.width.value + 98, 0); - djui_base_set_enabled(&button2->base, gDjuiInMainMenu); + djui_base_set_enabled(&button2->base, gDjuiInMainMenu || gCurrSaveFileNum - 1 != i); struct DjuiButton* button3 = djui_button_create(&rect1->base, DLANG(HOST_SAVE, EDIT), DJUI_BUTTON_STYLE_NORMAL, djui_panel_host_save_edit); button3->base.tag = i; diff --git a/src/pc/djui/djui_panel_menu_options.c b/src/pc/djui/djui_panel_menu_options.c index 264816cd..c0adb639 100644 --- a/src/pc/djui/djui_panel_menu_options.c +++ b/src/pc/djui/djui_panel_menu_options.c @@ -53,6 +53,8 @@ void djui_panel_main_menu_create(struct DjuiBase* caller) { struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(MENU_OPTIONS, MENU_TITLE), false); struct DjuiBase* body = djui_three_panel_get_body(panel); + djui_themes_init(); + { djui_checkbox_create(body, DLANG(DJUI_THEMES, CENTER), &configDjuiThemeCenter, djui_panel_menu_options_djui_setting_change); char* themeChoices[DJUI_THEME_MAX]; diff --git a/src/pc/djui/djui_panel_misc.c b/src/pc/djui/djui_panel_misc.c index b3e8e560..64322aad 100644 --- a/src/pc/djui/djui_panel_misc.c +++ b/src/pc/djui/djui_panel_misc.c @@ -8,24 +8,14 @@ #include "pc/utils/misc.h" #include "pc/configfile.h" #include "game/hardcoded.h" -#ifdef DISCORD_SDK -#include "pc/discord/discord.h" -#endif #if defined(_WIN32) || defined(_WIN64) #include #endif -static void djui_panel_compatibility_checkbox_on_value_change(UNUSED struct DjuiBase* caller) { -#ifdef DISCORD_SDK - gDiscordInitialized = false; -#endif -} - #ifdef DEVELOPMENT void djui_panel_options_debug_create(struct DjuiBase* caller) { struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(MISC, DEBUG_TITLE), false); struct DjuiBase* body = djui_three_panel_get_body(panel); - { djui_checkbox_create(body, DLANG(MISC, FIXED_COLLISIONS), (bool*)&gLevelValues.fixCollisionBugs, NULL); djui_checkbox_create(body, DLANG(MISC, LUA_PROFILER), &configLuaProfiler, NULL); @@ -61,9 +51,6 @@ static void djui_panel_options_open_user_folder(UNUSED struct DjuiBase* caller) void djui_panel_misc_create(struct DjuiBase* caller) { struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(MISC, MISC_TITLE), false); struct DjuiBase* body = djui_three_panel_get_body(panel); - - djui_themes_init(); - { djui_checkbox_create(body, DLANG(MISC, DISABLE_POPUPS), &configDisablePopups, NULL); #ifndef DEVELOPMENT diff --git a/src/pc/djui/djui_panel_player.c b/src/pc/djui/djui_panel_player.c index 8ccc9dd0..23779bff 100644 --- a/src/pc/djui/djui_panel_player.c +++ b/src/pc/djui/djui_panel_player.c @@ -133,7 +133,11 @@ static bool djui_panel_player_edit_palette_preset_name_valid(char* buffer) { if (buffer[0] == '\0') { return false; } char* c = buffer; while (*c != '\0') { +#if defined(_WIN32) || defined(_WIN64) + if (*c == '/' || *c == '\\' || *c == ':' || *c == '<' || *c == '>' || *c == '"' || *c == '|' || *c == '?' || *c == '*') { return false; } +#else if (*c == '/' || *c == '\\') { return false; } +#endif if (!djui_unicode_valid_char(c)) { return false; } c = djui_unicode_next_char(c); } diff --git a/src/pc/lua/smlua.h b/src/pc/lua/smlua.h index 039a7753..93761200 100644 --- a/src/pc/lua/smlua.h +++ b/src/pc/lua/smlua.h @@ -22,7 +22,7 @@ #define LOG_LUA(...) { if (!gSmLuaSuppressErrors) { printf("[LUA] "), printf(__VA_ARGS__), printf("\n"), smlua_mod_error(), snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), sys_swap_backslashes(gDjuiConsoleTmpBuffer), djui_console_message_create(gDjuiConsoleTmpBuffer, CONSOLE_MESSAGE_ERROR); } } #define LOG_LUA_LINE(...) { if (!gSmLuaSuppressErrors) { printf("[LUA] "), printf(__VA_ARGS__), printf("\n"), smlua_mod_error(); snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), sys_swap_backslashes(gDjuiConsoleTmpBuffer), djui_console_message_create(gDjuiConsoleTmpBuffer, CONSOLE_MESSAGE_ERROR), smlua_logline(); } } -#define LOG_LUA_LINE_WARNING(...) { smlua_mod_warning(); snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), sys_swap_backslashes(gDjuiConsoleTmpBuffer), djui_console_message_create(gDjuiConsoleTmpBuffer, CONSOLE_MESSAGE_WARNING); } +#define LOG_LUA_LINE_WARNING(...) { if (!gLuaActiveMod->showedScriptWarning) { gLuaActiveMod->showedScriptWarning = true; smlua_mod_warning(); snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), sys_swap_backslashes(gDjuiConsoleTmpBuffer), djui_console_message_create(gDjuiConsoleTmpBuffer, CONSOLE_MESSAGE_WARNING); } } #ifdef DEVELOPMENT #define LUA_STACK_CHECK_BEGIN() int __LUA_STACK_TOP = lua_gettop(gLuaState) diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index 71049e81..6cd533ef 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -2814,7 +2814,7 @@ char gSmluaConstants[] = "" "CAP = 6\n" "EMBLEM = 7\n" "PLAYER_PART_MAX = 8\n" -"METAL = EMBLEM\n" +"METAL = CAP\n" "EEPROM_SIZE = 0x200\n" "NUM_SAVE_FILES = 4\n" "SAVE_FILE_A = 0\n" diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index 6c8ad2f9..bce10dc9 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -20930,6 +20930,23 @@ int smlua_func_network_check_singleplayer_pause(UNUSED lua_State* L) { return 1; } +int smlua_func_network_discord_id_from_local_index(lua_State* L) { + if (L == NULL) { return 0; } + + int top = lua_gettop(L); + if (top != 1) { + LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "network_discord_id_from_local_index", 1, top); + return 0; + } + + u8 localIndex = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_discord_id_from_local_index"); return 0; } + + lua_pushstring(L, network_discord_id_from_local_index(localIndex)); + + return 1; +} + int smlua_func_network_get_player_text_color_string(lua_State* L) { if (L == NULL) { return 0; } @@ -29146,40 +29163,6 @@ int smlua_func_djui_hud_set_render_behind_hud(lua_State* L) { return 1; } -int smlua_func_get_environment_region(lua_State* L) { - if (L == NULL) { return 0; } - - int top = lua_gettop(L); - if (top != 1) { - LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "get_environment_region", 1, top); - return 0; - } - - u8 index = smlua_to_integer(L, 1); - if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "get_environment_region"); return 0; } - - lua_pushnumber(L, get_environment_region(index)); - - return 1; -} - -int smlua_func_network_discord_id_from_local_index(lua_State* L) { - if (L == NULL) { return 0; } - - int top = lua_gettop(L); - if (top != 1) { - LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "network_discord_id_from_local_index", 1, top); - return 0; - } - - u8 localIndex = smlua_to_integer(L, 1); - if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_discord_id_from_local_index"); return 0; } - - lua_pushstring(L, network_discord_id_from_local_index(localIndex)); - - return 1; -} - int smlua_func_network_player_color_to_palette(lua_State* L) { if (L == NULL) { return 0; } @@ -29238,25 +29221,6 @@ int smlua_func_network_player_palette_to_color(lua_State* L) { return 1; } -int smlua_func_set_environment_region(lua_State* L) { - if (L == NULL) { return 0; } - - int top = lua_gettop(L); - if (top != 2) { - LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "set_environment_region", 2, top); - return 0; - } - - u8 index = smlua_to_integer(L, 1); - if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "set_environment_region"); return 0; } - s32 value = smlua_to_integer(L, 2); - if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "set_environment_region"); return 0; } - - set_environment_region(index, value); - - return 1; -} - /////////////////////// // smlua_gfx_utils.h // /////////////////////// @@ -30217,6 +30181,23 @@ int smlua_func_get_envfx(UNUSED lua_State* L) { return 1; } +int smlua_func_get_environment_region(lua_State* L) { + if (L == NULL) { return 0; } + + int top = lua_gettop(L); + if (top != 1) { + LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "get_environment_region", 1, top); + return 0; + } + + u8 index = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "get_environment_region"); return 0; } + + lua_pushnumber(L, get_environment_region(index)); + + return 1; +} + int smlua_func_get_global_timer(UNUSED lua_State* L) { if (L == NULL) { return 0; } @@ -30829,6 +30810,25 @@ int smlua_func_save_file_set_using_backup_slot(lua_State* L) { return 1; } +int smlua_func_set_environment_region(lua_State* L) { + if (L == NULL) { return 0; } + + int top = lua_gettop(L); + if (top != 2) { + LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "set_environment_region", 2, top); + return 0; + } + + u8 index = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "set_environment_region"); return 0; } + s32 value = smlua_to_integer(L, 2); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "set_environment_region"); return 0; } + + set_environment_region(index, value); + + return 1; +} + int smlua_func_set_got_file_coin_hi_score(lua_State* L) { if (L == NULL) { return 0; } @@ -34016,6 +34016,7 @@ void smlua_bind_functions_autogen(void) { // network_utils.h smlua_bind_function(L, "network_check_singleplayer_pause", smlua_func_network_check_singleplayer_pause); + smlua_bind_function(L, "network_discord_id_from_local_index", smlua_func_network_discord_id_from_local_index); smlua_bind_function(L, "network_get_player_text_color_string", smlua_func_network_get_player_text_color_string); smlua_bind_function(L, "network_global_index_from_local", smlua_func_network_global_index_from_local); smlua_bind_function(L, "network_is_moderator", smlua_func_network_is_moderator); @@ -34448,11 +34449,8 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "audio_stream_set_speed", smlua_func_audio_stream_set_speed); smlua_bind_function(L, "audio_stream_set_tempo", smlua_func_audio_stream_set_tempo); smlua_bind_function(L, "djui_hud_set_render_behind_hud", smlua_func_djui_hud_set_render_behind_hud); - smlua_bind_function(L, "get_environment_region", smlua_func_get_environment_region); - smlua_bind_function(L, "network_discord_id_from_local_index", smlua_func_network_discord_id_from_local_index); smlua_bind_function(L, "network_player_color_to_palette", smlua_func_network_player_color_to_palette); smlua_bind_function(L, "network_player_palette_to_color", smlua_func_network_player_palette_to_color); - smlua_bind_function(L, "set_environment_region", smlua_func_set_environment_region); // smlua_gfx_utils.h smlua_bind_function(L, "get_fog_color", smlua_func_get_fog_color); @@ -34515,6 +34513,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "get_dialog_id", smlua_func_get_dialog_id); smlua_bind_function(L, "get_dialog_response", smlua_func_get_dialog_response); smlua_bind_function(L, "get_envfx", smlua_func_get_envfx); + smlua_bind_function(L, "get_environment_region", smlua_func_get_environment_region); smlua_bind_function(L, "get_global_timer", smlua_func_get_global_timer); smlua_bind_function(L, "get_got_file_coin_hi_score", smlua_func_get_got_file_coin_hi_score); smlua_bind_function(L, "get_hand_foot_pos_x", smlua_func_get_hand_foot_pos_x); @@ -34551,6 +34550,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "reset_window_title", smlua_func_reset_window_title); smlua_bind_function(L, "save_file_get_using_backup_slot", smlua_func_save_file_get_using_backup_slot); smlua_bind_function(L, "save_file_set_using_backup_slot", smlua_func_save_file_set_using_backup_slot); + smlua_bind_function(L, "set_environment_region", smlua_func_set_environment_region); smlua_bind_function(L, "set_got_file_coin_hi_score", smlua_func_set_got_file_coin_hi_score); smlua_bind_function(L, "set_last_completed_course_num", smlua_func_set_last_completed_course_num); smlua_bind_function(L, "set_last_completed_star_num", smlua_func_set_last_completed_star_num); diff --git a/src/pc/lua/smlua_hooks.c b/src/pc/lua/smlua_hooks.c index f6142acd..e705ce7c 100644 --- a/src/pc/lua/smlua_hooks.c +++ b/src/pc/lua/smlua_hooks.c @@ -84,7 +84,7 @@ void lua_profiler_update_counters(void) { #define MAX_HOOKED_REFERENCES 64 #define LUA_BEHAVIOR_FLAG (1 << 15) -static u64* sBehaviorOffset = &gPcDebug.bhvOffset; +u64* gBehaviorOffset = &gPcDebug.bhvOffset; struct LuaHookedEvent { int reference[MAX_HOOKED_REFERENCES]; @@ -1328,7 +1328,7 @@ const BehaviorScript* smlua_override_behavior(const BehaviorScript *behavior) { enum BehaviorId id = get_id_from_behavior(behavior); const BehaviorScript *hookedBehavior = smlua_get_hooked_behavior_from_id(id, false); if (hookedBehavior != NULL) { return hookedBehavior; } - return behavior + *sBehaviorOffset; + return behavior + *gBehaviorOffset; } const BehaviorScript* smlua_get_hooked_behavior_from_id(enum BehaviorId id, bool returnOriginal) { diff --git a/src/pc/lua/utils/smlua_deprecated.c b/src/pc/lua/utils/smlua_deprecated.c index 252b1ff6..00c00e23 100644 --- a/src/pc/lua/utils/smlua_deprecated.c +++ b/src/pc/lua/utils/smlua_deprecated.c @@ -1,24 +1,9 @@ #include #include "types.h" -#ifdef DISCORD_SDK -#include "pc/discord/discord.h" -#endif #include "pc/lua/smlua.h" #include "game/hardcoded.h" #include "game/object_list_processor.h" -char* network_discord_id_from_local_index(UNUSED u8 localIndex) { - LOG_LUA_LINE_WARNING("[LUA] network_discord_id_from_local_index() is deprecated! Please use get_local_discord_id() instead."); -#ifdef DISCORD_SDK - static char sDiscordId[64] = ""; - if (localIndex == 0) { - snprintf(sDiscordId, 64, "%" PRIu64 "", (uint64_t)discord_get_user_id()); - return sDiscordId; - } -#endif - return NULL; -} - void djui_hud_set_render_behind_hud(bool enable) { LOG_LUA_LINE_WARNING("[LUA] djui_hud_set_render_behind_hud() is deprecated! Please use HOOK_ON_HUD_RENDER_BEHIND instead."); if (!gLuaActiveMod) { return; } @@ -43,23 +28,6 @@ void audio_stream_set_speed(UNUSED struct ModAudio* audio, UNUSED f32 initial_fr LOG_LUA_LINE_WARNING("[LUA] audio_stream_set_speed() is deprecated! There may be a replacement for this function in the future."); } -f32 get_environment_region(u8 index) { - LOG_LUA_LINE_WARNING("[LUA] get_environment_region() is deprecated! Use get_water_level() instead."); - s32 idx = 6 * index; - if (gEnvironmentRegions != NULL && index > 0 && index <= gEnvironmentRegions[0] && gEnvironmentRegionsLength > idx) { - return gEnvironmentRegions[idx]; - } - return gLevelValues.floorLowerLimit; -} - -void set_environment_region(u8 index, s32 value) { - LOG_LUA_LINE_WARNING("[LUA] get_environment_region() is deprecated! Use set_water_level() instead."); - s32 idx = 6 * index; - if (gEnvironmentRegions != NULL && index > 0 && index <= gEnvironmentRegions[0] && gEnvironmentRegionsLength > idx) { - gEnvironmentRegions[idx] = value; - } -} - void network_player_color_to_palette(struct NetworkPlayer *np, enum PlayerPart part, Color color) { LOG_LUA_LINE_WARNING("[LUA] network_player_color_to_palette() is deprecated! Use network_player_set_override_palette_color() instead."); if (np == NULL || !(part < PLAYER_PART_MAX && part >= 0)) { return; } diff --git a/src/pc/lua/utils/smlua_deprecated.h b/src/pc/lua/utils/smlua_deprecated.h index f65d0d09..7d8820f5 100644 --- a/src/pc/lua/utils/smlua_deprecated.h +++ b/src/pc/lua/utils/smlua_deprecated.h @@ -1,6 +1,5 @@ #pragma once -char* network_discord_id_from_local_index(u8 localIndex); void djui_hud_set_render_behind_hud(bool enable); struct ModAudio* audio_stream_load_url(const char* url); @@ -8,8 +7,5 @@ f32 audio_stream_get_tempo(struct ModAudio* audio); void audio_stream_set_tempo(struct ModAudio* audio, f32 tempo); void audio_stream_set_speed(struct ModAudio* audio, f32 initial_freq, f32 speed, bool pitch); -f32 get_environment_region(u8 index); -void set_environment_region(u8 index, s32 value); - void network_player_color_to_palette(struct NetworkPlayer *np, enum PlayerPart part, Color color); void network_player_palette_to_color(struct NetworkPlayer *np, enum PlayerPart part, Color out); diff --git a/src/pc/lua/utils/smlua_misc_utils.c b/src/pc/lua/utils/smlua_misc_utils.c index 473ef7b3..2b252109 100644 --- a/src/pc/lua/utils/smlua_misc_utils.c +++ b/src/pc/lua/utils/smlua_misc_utils.c @@ -418,7 +418,7 @@ const char* get_local_discord_id(void) { snprintf(sDiscordId, 64, "%" PRIu64 "", (uint64_t)discord_get_user_id()); return sDiscordId; #else - return NULL; + return "0"; #endif } @@ -462,6 +462,23 @@ void set_volume_env(f32 volume) { /// +f32 get_environment_region(u8 index) { + s32 idx = 6 * index; + if (gEnvironmentRegions != NULL && index > 0 && index <= gEnvironmentRegions[0] && gEnvironmentRegionsLength > idx) { + return gEnvironmentRegions[idx]; + } + return gLevelValues.floorLowerLimit; +} + +void set_environment_region(u8 index, s32 value) { + s32 idx = 6 * index; + if (gEnvironmentRegions != NULL && index > 0 && index <= gEnvironmentRegions[0] && gEnvironmentRegionsLength > idx) { + gEnvironmentRegions[idx] = value; + } +} + +/// + void set_window_title(const char* title) { WAPI.set_window_title(title); } diff --git a/src/pc/lua/utils/smlua_misc_utils.h b/src/pc/lua/utils/smlua_misc_utils.h index 5768ee2a..19f3669e 100644 --- a/src/pc/lua/utils/smlua_misc_utils.h +++ b/src/pc/lua/utils/smlua_misc_utils.h @@ -121,6 +121,9 @@ void set_volume_level(f32 volume); void set_volume_sfx(f32 volume); void set_volume_env(f32 volume); +f32 get_environment_region(u8 index); +void set_environment_region(u8 index, s32 value); + void set_window_title(const char* title); void reset_window_title(void); diff --git a/src/pc/mods/mod.c b/src/pc/mods/mod.c index 8ca436d4..79abf70c 100644 --- a/src/pc/mods/mod.c +++ b/src/pc/mods/mod.c @@ -404,6 +404,7 @@ static void mod_extract_fields(struct Mod* mod) { mod->name = NULL; mod->incompatible = NULL; mod->description = NULL; + mod->pausable = true; // read line-by-line #define BUFFER_SIZE MAX(MAX(MOD_NAME_MAX_LENGTH, MOD_INCOMPATIBLE_MAX_LENGTH), MOD_DESCRIPTION_MAX_LENGTH) diff --git a/src/pc/mods/mod.h b/src/pc/mods/mod.h index 3340cd5c..7c16979d 100644 --- a/src/pc/mods/mod.h +++ b/src/pc/mods/mod.h @@ -36,6 +36,7 @@ struct Mod { bool renderBehindHud; bool pausable; bool ignoreScriptWarnings; + bool showedScriptWarning; size_t size; u8 customBehaviorIndex; }; diff --git a/src/pc/mods/mod_cache.c b/src/pc/mods/mod_cache.c index 2d3de12a..163a86ae 100644 --- a/src/pc/mods/mod_cache.c +++ b/src/pc/mods/mod_cache.c @@ -1,15 +1,17 @@ #include #include #define DISABLE_MODULE_LOG 1 +#include "pc/gfx/gfx_pc.h" #include "pc/debuglog.h" #include "mod_cache.h" #include "mods.h" #include "mod.h" #include "mods_utils.h" #include "pc/utils/md5.h" +#include "pc/lua/smlua_hooks.h" #define MOD_CACHE_FILENAME "mod.cache" -#define MOD_CACHE_VERSION 6 +#define MOD_CACHE_VERSION 7 #define MD5_BUFFER_SIZE 1024 struct ModCacheEntry* sModCacheHead = NULL; @@ -271,6 +273,11 @@ void mod_cache_load(void) { mods_delete_tmp(); return; } + u8 marked = 0; + fread(&marked, sizeof(u8), 1, fp); + if (marked != 0) { + gfx_shutdown(); + } u16 count = 0; while (true) { @@ -298,6 +305,7 @@ void mod_cache_load(void) { fclose(fp); } +extern u64* gBehaviorOffset; void mod_cache_save(void) { LOG_INFO("Saving mod cache"); const char* filename = fs_get_write_path(MOD_CACHE_FILENAME); @@ -315,6 +323,8 @@ void mod_cache_save(void) { u16 version = MOD_CACHE_VERSION; fwrite(&version, sizeof(u16), 1, fp); + u8 t = *gBehaviorOffset != 0; + fwrite(&t, sizeof(u8), 1, fp); struct ModCacheEntry* node = sModCacheHead; while (node != NULL) { diff --git a/src/pc/mods/mod_storage.cpp b/src/pc/mods/mod_storage.cpp index 58309946..b6dc8536 100644 --- a/src/pc/mods/mod_storage.cpp +++ b/src/pc/mods/mod_storage.cpp @@ -16,7 +16,7 @@ extern "C" { #define C_FIELD extern "C" -void strdelete(char* string, const char* substr) { +static void strdelete(char* string, const char* substr) { // i is used to loop through the string u16 i = 0; diff --git a/src/pc/network/network.c b/src/pc/network/network.c index ccedac3c..ab43fcd9 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -162,7 +162,7 @@ bool network_init(enum NetworkType inNetworkType, bool reconnecting) { dynos_behavior_hook_all_custom_behaviors(); - network_player_connected(NPT_LOCAL, 0, configPlayerModel, &configPlayerPalette, configPlayerName); + network_player_connected(NPT_LOCAL, 0, configPlayerModel, &configPlayerPalette, configPlayerName, get_local_discord_id()); extern u8* gOverrideEeprom; gOverrideEeprom = NULL; diff --git a/src/pc/network/network_player.c b/src/pc/network/network_player.c index b60733a0..2ae98c00 100644 --- a/src/pc/network/network_player.c +++ b/src/pc/network/network_player.c @@ -21,6 +21,7 @@ struct NetworkPlayer gNetworkPlayers[MAX_PLAYERS] = { 0 }; struct NetworkPlayer *gNetworkPlayerLocal = NULL; struct NetworkPlayer *gNetworkPlayerServer = NULL; static char sDefaultPlayerName[] = "Player"; +static char sDefaultDiscordId[] = "0"; void network_player_init(void) { gNetworkPlayers[0].modelIndex = (configPlayerModel < CT_MAX) ? configPlayerModel : CT_MARIO; @@ -225,7 +226,7 @@ void network_player_update(void) { } extern bool gCurrentlyJoining; -u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 modelIndex, const struct PlayerPalette* palette, const char *name) { +u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 modelIndex, const struct PlayerPalette* palette, const char* name, const char* discordId) { // translate globalIndex to localIndex u8 localIndex = globalIndex; if (gNetworkType == NT_SERVER) { @@ -245,6 +246,9 @@ u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 mode if (name[0] == '\0') { name = sDefaultPlayerName; } + if (discordId[0] == '\0') { + discordId = sDefaultDiscordId; + } if (modelIndex >= CT_MAX) { modelIndex = 0; } // if already connected, update a few things @@ -292,6 +296,8 @@ u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 mode snprintf(np->name, MAX_CONFIG_STRING, "%s", name); network_player_update_model(localIndex); + snprintf(np->discordId, 64, "%s", discordId); + // clear networking fields np->lastReceived = clock_elapsed(); np->lastSent = clock_elapsed(); diff --git a/src/pc/network/network_player.h b/src/pc/network/network_player.h index 7e642517..fa409249 100644 --- a/src/pc/network/network_player.h +++ b/src/pc/network/network_player.h @@ -58,6 +58,8 @@ struct NetworkPlayer { u16 rxSeqIds[MAX_RX_SEQ_IDS]; u32 rxPacketHash[MAX_RX_SEQ_IDS]; + char discordId[64]; + // legacy fields to allow mods not to fully break (they don't do anything anymore) u8 paletteIndex; u8 overridePaletteIndex; @@ -87,7 +89,7 @@ bool network_player_is_override_palette_same(struct NetworkPlayer *np); void network_player_update(void); -u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 modelIndex, const struct PlayerPalette* playerPalette, const char* name); +u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 modelIndex, const struct PlayerPalette* playerPalette, const char* name, const char* discordId); u8 network_player_disconnected(u8 globalIndex); void construct_player_popup(struct NetworkPlayer* np, char* msg, const char* level); diff --git a/src/pc/network/network_utils.c b/src/pc/network/network_utils.c index b0204084..5ff1102b 100644 --- a/src/pc/network/network_utils.c +++ b/src/pc/network/network_utils.c @@ -56,3 +56,8 @@ extern s16 gMenuMode; bool network_check_singleplayer_pause(void) { return gMenuMode != -1 && network_player_connected_count() == 1 && mods_get_all_pausable() && !gDjuiInPlayerMenu; } + +const char* network_discord_id_from_local_index(u8 localIndex) { + if (localIndex >= MAX_PLAYERS) { return "0"; } + return gNetworkPlayers[localIndex].discordId; +} diff --git a/src/pc/network/network_utils.h b/src/pc/network/network_utils.h index 3fb05e3c..486d7a58 100644 --- a/src/pc/network/network_utils.h +++ b/src/pc/network/network_utils.h @@ -15,4 +15,6 @@ const char* network_get_player_text_color_string(u8 localIndex); bool network_check_singleplayer_pause(void); +const char* network_discord_id_from_local_index(u8 localIndex); + #endif \ No newline at end of file diff --git a/src/pc/network/packets/packet_join.c b/src/pc/network/packets/packet_join.c index 857c8936..1f7c4103 100644 --- a/src/pc/network/packets/packet_join.c +++ b/src/pc/network/packets/packet_join.c @@ -25,6 +25,7 @@ #include "pc/mods/mods.h" #include "pc/lua/smlua.h" #include "pc/configfile.h" +#include "pc/lua/utils/smlua_misc_utils.h" extern u8* gOverrideEeprom; static u8 eeprom[512] = { 0 }; @@ -32,6 +33,7 @@ static u8 eeprom[512] = { 0 }; static u8 sJoinRequestPlayerModel; static struct PlayerPalette sJoinRequestPlayerPalette; static char sJoinRequestPlayerName[MAX_CONFIG_STRING]; +static char sJoinRequestDiscordId[64]; bool gCurrentlyJoining = false; void network_send_join_request(void) { @@ -96,7 +98,7 @@ void network_send_join(struct Packet* joinRequestPacket) { LOG_INFO("chose globalIndex: %d", globalIndex); // do connection event - network_player_connected(NPT_CLIENT, globalIndex, sJoinRequestPlayerModel, &sJoinRequestPlayerPalette, sJoinRequestPlayerName); + network_player_connected(NPT_CLIENT, globalIndex, sJoinRequestPlayerModel, &sJoinRequestPlayerPalette, sJoinRequestPlayerName, sJoinRequestDiscordId); fs_file_t* fp = fs_open(SAVE_FILENAME); if (fp != NULL) { @@ -177,8 +179,8 @@ void network_receive_join(struct Packet* p) { packet_read(p, &gServerSettings.pauseAnywhere, sizeof(u8)); packet_read(p, eeprom, sizeof(u8) * 512); - network_player_connected(NPT_SERVER, 0, 0, &DEFAULT_MARIO_PALETTE, "Player"); - network_player_connected(NPT_LOCAL, myGlobalIndex, configPlayerModel, &configPlayerPalette, configPlayerName); + network_player_connected(NPT_SERVER, 0, 0, &DEFAULT_MARIO_PALETTE, "Player", "0"); + network_player_connected(NPT_LOCAL, myGlobalIndex, configPlayerModel, &configPlayerPalette, configPlayerName, get_local_discord_id()); djui_chat_box_create(); save_file_load_all(TRUE); diff --git a/src/pc/network/packets/packet_network_players.c b/src/pc/network/packets/packet_network_players.c index c889f358..1c19ca5c 100644 --- a/src/pc/network/packets/packet_network_players.c +++ b/src/pc/network/packets/packet_network_players.c @@ -35,6 +35,7 @@ static void network_send_to_network_players(u8 sendToLocalIndex) { packet_write(&p, &gNetworkPlayers[i].modelIndex, sizeof(u8)); packet_write(&p, &gNetworkPlayers[i].palette, sizeof(struct PlayerPalette)); packet_write(&p, &gNetworkPlayers[i].name, sizeof(u8) * MAX_CONFIG_STRING); + packet_write(&p, &gNetworkPlayers[i].discordId, sizeof(u8) * 64); LOG_INFO("send network player [%d == %d]", gNetworkPlayers[i].globalIndex, npType); } @@ -92,6 +93,7 @@ void network_receive_network_players(struct Packet *p) { u8 modelIndex; struct PlayerPalette palette; char playerName[MAX_CONFIG_STRING] = { 0 }; + char discordId[64] = { 0 }; packet_read(p, &npType, sizeof(u8)); packet_read(p, &globalIndex, sizeof(u8)); @@ -106,8 +108,9 @@ void network_receive_network_players(struct Packet *p) { packet_read(p, &modelIndex, sizeof(u8)); packet_read(p, &palette, sizeof(struct PlayerPalette)); packet_read(p, &playerName, sizeof(u8) * MAX_CONFIG_STRING); + packet_read(p, &discordId, sizeof(u8) * 64); - u8 localIndex = network_player_connected(npType, globalIndex, modelIndex, &palette, playerName); + u8 localIndex = network_player_connected(npType, globalIndex, modelIndex, &palette, playerName, discordId); LOG_INFO("received network player [%d == %d] (%d)", globalIndex, npType, localIndex); if (localIndex != UNKNOWN_GLOBAL_INDEX) { struct NetworkPlayer *np = &gNetworkPlayers[localIndex];