Merge branch 'dev' into threaded-audio

This commit is contained in:
Prince Frizzy 2024-07-07 20:40:57 -04:00 committed by GitHub
commit 9fbe28e68a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
71 changed files with 358 additions and 247 deletions

View file

@ -640,9 +640,9 @@ else ifeq ($(COMPILER),gcc)
CC := $(CROSS)gcc CC := $(CROSS)gcc
CXX := $(CROSS)g++ CXX := $(CROSS)g++
ifeq ($(OSX_BUILD),0) ifeq ($(OSX_BUILD),0)
EXTRA_CFLAGS += -Wno-unused-result -Wno-format-truncation EXTRA_CFLAGS += -Wno-unused-result -Wno-format-truncation
else else
EXTRA_CFLAGS += -Wno-unused-result EXTRA_CFLAGS += -Wno-unused-result -mmacosx-version-min=14
endif endif
else ifeq ($(COMPILER),clang) else ifeq ($(COMPILER),clang)
CC := clang CC := clang
@ -753,8 +753,8 @@ else ifeq ($(findstring SDL,$(WINDOW_API)),SDL)
else ifeq ($(TARGET_RPI),1) else ifeq ($(TARGET_RPI),1)
BACKEND_LDFLAGS += -lGLESv2 BACKEND_LDFLAGS += -lGLESv2
else ifeq ($(OSX_BUILD),1) else ifeq ($(OSX_BUILD),1)
BACKEND_LDFLAGS += -framework OpenGL `pkg-config --libs glew` BACKEND_LDFLAGS += -framework OpenGL `pkg-config --libs glew` -mmacosx-version-min=14
EXTRA_CPP_FLAGS += -stdlib=libc++ -std=c++17 EXTRA_CPP_FLAGS += -stdlib=libc++ -std=c++17 -mmacosx-version-min=14
else else
BACKEND_LDFLAGS += -lGL BACKEND_LDFLAGS += -lGL
endif endif
@ -1518,6 +1518,12 @@ endif
APP_DIR = ./sm64coopdx.app APP_DIR = ./sm64coopdx.app
APP_CONTENTS_DIR = $(APP_DIR)/Contents APP_CONTENTS_DIR = $(APP_DIR)/Contents
APP_MACOS_DIR = $(APP_CONTENTS_DIR)/MacOS 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: all:
@if [ "$(USE_APP)" = "0" ]; then \ @if [ "$(USE_APP)" = "0" ]; then \
@ -1527,10 +1533,25 @@ all:
rm -rf $(APP_DIR); \ rm -rf $(APP_DIR); \
rm -rf build/us_pc/sm64coopdx.app; \ rm -rf build/us_pc/sm64coopdx.app; \
mkdir -p $(APP_MACOS_DIR); \ 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; \ mv build/us_pc/sm64coopdx $(APP_MACOS_DIR)/sm64coopdx; \
cp -r build/us_pc/* $(APP_MACOS_DIR); \ cp -r build/us_pc/mods $(APP_RESOURCES_DIR); \
cp res/icon.icns $(APP_CONTENTS_DIR)/Resources/icon.icns; \ 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 "APPL????" > $(APP_CONTENTS_DIR)/PkgInfo; \
echo '<?xml version="1.0" encoding="UTF-8"?>' > $(APP_CONTENTS_DIR)/Info.plist; \ echo '<?xml version="1.0" encoding="UTF-8"?>' > $(APP_CONTENTS_DIR)/Info.plist; \
echo '<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' >> $(APP_CONTENTS_DIR)/Info.plist; \ echo '<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' >> $(APP_CONTENTS_DIR)/Info.plist; \

View file

@ -257,7 +257,7 @@ const Gfx luigi_metal_butt[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&luigi_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 128),
@ -727,7 +727,7 @@ const Gfx luigi_metal_left_thigh[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&luigi_black_lights_group.l, 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), 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), 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), 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), gsSPClearGeometryMode(G_TEXTURE_GEN | G_CULL_BACK),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&luigi_black_lights_group.l, 1), gsSPLight(&luigi_black_lights_group.l, 1),
gsSPCopyLightEXT(2, 17), gsSPCopyLightEXT(2, 15),
gsSPEndDisplayList(), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&luigi_black_lights_group.l, 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), 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), 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), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&luigi_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),

View file

@ -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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&luigi_cap_black_lights_group.l, 1), gsSPLight(&luigi_cap_black_lights_group.l, 1),
gsSPCopyLightEXT(2, 17), gsSPCopyLightEXT(2, 15),
gsSPEndDisplayList(), gsSPEndDisplayList(),
}; };
@ -231,7 +231,7 @@ const Gfx luigi_cap_seg3_dl_03022FF8[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&luigi_cap_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 128),
@ -335,7 +335,7 @@ const Gfx luigi_cap_seg3_dl_03023298[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&luigi_cap_black_lights_group.l, 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), 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), 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), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&luigi_cap_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),

View file

@ -213,7 +213,7 @@ const Gfx mario_metal_butt[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&mario_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 128),
@ -530,7 +530,7 @@ const Gfx mario_metal_left_thigh[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&mario_black_lights_group.l, 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), 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), 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), 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), gsSPClearGeometryMode(G_TEXTURE_GEN | G_CULL_BACK),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&mario_black_lights_group.l, 1), gsSPLight(&mario_black_lights_group.l, 1),
gsSPCopyLightEXT(2, 17), gsSPCopyLightEXT(2, 15),
gsSPEndDisplayList(), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&mario_black_lights_group.l, 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), 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), 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), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&mario_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),

View file

@ -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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&mario_cap_black_lights_group.l, 1), gsSPLight(&mario_cap_black_lights_group.l, 1),
gsSPCopyLightEXT(2, 17), gsSPCopyLightEXT(2, 15),
gsSPEndDisplayList(), gsSPEndDisplayList(),
}; };
@ -266,7 +266,7 @@ const Gfx mario_cap_seg3_dl_03022FF8[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&mario_cap_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 128),
@ -370,7 +370,7 @@ const Gfx mario_cap_seg3_dl_03023298[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&mario_cap_black_lights_group.l, 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), 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), 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), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&mario_cap_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),

View file

@ -29,6 +29,7 @@ const GeoLayout mr_blizzard_hidden_geo[] = {
GEO_SCALE(0x00, 65536), GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(), GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_set_player_colors), 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_TRANSLATE_ROTATE_WITH_DL(LAYER_OPAQUE, 490, 14, 43, 305, 0, 248, mario_cap_seg3_dl_03022F48),
GEO_CLOSE_NODE(), GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(), GEO_CLOSE_NODE(),

View file

@ -357,7 +357,7 @@ Gfx mat_toad_cap_metal[] = {
gsSPGeometryMode(0, G_TEXTURE_GEN), gsSPGeometryMode(0, G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&toad_cap_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 128),
@ -456,7 +456,7 @@ Gfx mat_toad_cap_metal_wing[] = {
gsSPClearGeometryMode(G_CULL_BACK), gsSPClearGeometryMode(G_CULL_BACK),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&toad_cap_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),
@ -482,7 +482,7 @@ Gfx mat_toad_cap_metal_wing_tip[] = {
gsSPClearGeometryMode(G_CULL_BACK), gsSPClearGeometryMode(G_CULL_BACK),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&toad_cap_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),

View file

@ -1951,7 +1951,7 @@ Gfx mat_toad_player_metal[] = {
gsSPGeometryMode(0, G_TEXTURE_GEN), gsSPGeometryMode(0, G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&toad_player_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 128),
@ -1978,7 +1978,7 @@ Gfx mat_toad_player_metal_vest[] = {
gsSPGeometryMode(G_CULL_BACK, 0), gsSPGeometryMode(G_CULL_BACK, 0),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&toad_player_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 128),
@ -2289,7 +2289,7 @@ Gfx mat_toad_player_metal_wing[] = {
gsSPClearGeometryMode(G_CULL_BACK), gsSPClearGeometryMode(G_CULL_BACK),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&toad_player_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),
@ -2315,7 +2315,7 @@ Gfx mat_toad_player_metal_wing_tip[] = {
gsSPClearGeometryMode(G_CULL_BACK), gsSPClearGeometryMode(G_CULL_BACK),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&toad_player_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),

View file

@ -291,7 +291,7 @@ const Gfx waluigi_metal_butt[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&waluigi_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 128),
@ -762,7 +762,7 @@ const Gfx waluigi_metal_left_thigh[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&waluigi_black_lights_group.l, 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), 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), 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), 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), gsSPClearGeometryMode(G_TEXTURE_GEN | G_CULL_BACK),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&waluigi_black_lights_group.l, 1), gsSPLight(&waluigi_black_lights_group.l, 1),
gsSPCopyLightEXT(2, 17), gsSPCopyLightEXT(2, 15),
gsSPEndDisplayList(), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&waluigi_black_lights_group.l, 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), 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), 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), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&waluigi_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),

View file

@ -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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&waluigi_cap_black_lights_group.l, 1), gsSPLight(&waluigi_cap_black_lights_group.l, 1),
gsSPCopyLightEXT(2, 17), gsSPCopyLightEXT(2, 15),
gsSPEndDisplayList(), gsSPEndDisplayList(),
}; };
@ -231,7 +231,7 @@ const Gfx waluigi_cap_seg3_dl_03022FF8[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&waluigi_cap_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 128),
@ -335,7 +335,7 @@ const Gfx waluigi_cap_seg3_dl_03023298[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&waluigi_cap_black_lights_group.l, 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), 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), 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), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&waluigi_cap_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),

View file

@ -293,7 +293,7 @@ const Gfx wario_metal_butt[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&wario_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 128),
@ -763,7 +763,7 @@ const Gfx wario_metal_left_thigh[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&wario_black_lights_group.l, 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), 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), 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), 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), gsSPClearGeometryMode(G_TEXTURE_GEN | G_CULL_BACK),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&wario_black_lights_group.l, 1), gsSPLight(&wario_black_lights_group.l, 1),
gsSPCopyLightEXT(2, 17), gsSPCopyLightEXT(2, 15),
gsSPEndDisplayList(), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&wario_black_lights_group.l, 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), 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), 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), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&wario_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),

View file

@ -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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&wario_cap_black_lights_group.l, 1), gsSPLight(&wario_cap_black_lights_group.l, 1),
gsSPCopyLightEXT(2, 17), gsSPCopyLightEXT(2, 15),
gsSPEndDisplayList(), gsSPEndDisplayList(),
}; };
@ -231,7 +231,7 @@ const Gfx wario_cap_seg3_dl_03022FF8[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&wario_cap_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 128),
@ -335,7 +335,7 @@ const Gfx wario_cap_seg3_dl_03023298[] = {
gsSPSetGeometryMode(G_TEXTURE_GEN), gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1), gsSPTexture(4032, 1984, 0, 0, 1),
gsSPLight(&wario_cap_black_lights_group.l, 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), 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), 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), 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), gsDPSetCombineLERP(TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, TEXEL1, TEXEL0, 0, ENVIRONMENT, 0),
gsSPTexture(65535, 65535, 0, 0, 1), gsSPTexture(65535, 65535, 0, 0, 1),
gsSPLight(&wario_cap_black_lights_group.l, 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), 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), 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), gsDPLoadBlock(7, 0, 0, 2047, 256),

View file

@ -81,9 +81,9 @@ override_field_mutable = {
} }
override_field_invisible = { override_field_invisible = {
"Mod": [ "files" ], "Mod": [ "files", "showedScriptWarning" ],
"MarioState": [ "visibleToEnemies" ], "MarioState": [ "visibleToEnemies" ],
"NetworkPlayer": [ "gag", "moderator"], "NetworkPlayer": [ "gag", "moderator", "discordId" ],
"GraphNode": [ "_guard1", "_guard2" ], "GraphNode": [ "_guard1", "_guard2" ],
"Object": [ "firstSurface" ], "Object": [ "firstSurface" ],
} }

View file

@ -7780,7 +7780,7 @@ EMBLEM = 7
PLAYER_PART_MAX = 8 PLAYER_PART_MAX = 8
--- @type PlayerPart --- @type PlayerPart
METAL = EMBLEM METAL = CAP
--- @type integer --- @type integer
EEPROM_SIZE = 0x200 EEPROM_SIZE = 0x200

View file

@ -5450,6 +5450,12 @@ function network_check_singleplayer_pause()
-- ... -- ...
end end
--- @param localIndex integer
--- @return string
function network_discord_id_from_local_index(localIndex)
-- ...
end
--- @param localIndex integer --- @param localIndex integer
--- @return string --- @return string
function network_get_player_text_color_string(localIndex) function network_get_player_text_color_string(localIndex)
@ -7847,18 +7853,6 @@ function djui_hud_set_render_behind_hud(enable)
-- ... -- ...
end 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 np NetworkPlayer
--- @param part PlayerPart --- @param part PlayerPart
--- @param color Color --- @param color Color
@ -7873,12 +7867,6 @@ function network_player_palette_to_color(np, part, out)
-- ... -- ...
end end
--- @param index integer
--- @param value integer
function set_environment_region(index, value)
-- ...
end
--- @param index integer --- @param index integer
--- @return integer --- @return integer
function get_fog_color(index) function get_fog_color(index)
@ -8201,6 +8189,12 @@ function get_envfx()
-- ... -- ...
end end
--- @param index integer
--- @return number
function get_environment_region(index)
-- ...
end
--- @return integer --- @return integer
function get_global_timer() function get_global_timer()
-- ... -- ...
@ -8407,6 +8401,12 @@ function save_file_set_using_backup_slot(usingBackupSlot)
-- ... -- ...
end end
--- @param index integer
--- @param value integer
function set_environment_region(index, value)
-- ...
end
--- @param value boolean --- @param value boolean
function set_got_file_coin_hi_score(value) function set_got_file_coin_hi_score(value)
-- ... -- ...

View file

@ -149,10 +149,12 @@ static void DynOS_Actor_Generate(const SysPath &aPackFolder, Array<Pair<u64, Str
// If there is an existing binary file for this layout, skip and go to the next actor // If there is an existing binary file for this layout, skip and go to the next actor
SysPath _BinFilename = fstring("%s/%s.bin", aPackFolder.c_str(), _GeoRootName.begin()); SysPath _BinFilename = fstring("%s/%s.bin", aPackFolder.c_str(), _GeoRootName.begin());
if (fs_sys_file_exists(_BinFilename.c_str())) { if (fs_sys_file_exists(_BinFilename.c_str())) {
#ifdef DEVELOPMENT
// Compress file to gain some space // Compress file to gain some space
if (!DynOS_Bin_IsCompressed(_BinFilename)) { if (!DynOS_Bin_IsCompressed(_BinFilename)) {
DynOS_Bin_Compress(_BinFilename); DynOS_Bin_Compress(_BinFilename);
} }
#endif
return; return;
} }
} }
@ -258,12 +260,14 @@ void DynOS_Actor_GeneratePack(const SysPath &aPackFolder) {
if (SysPath(_PackEnt->d_name) == ".") continue; if (SysPath(_PackEnt->d_name) == ".") continue;
if (SysPath(_PackEnt->d_name) == "..") continue; if (SysPath(_PackEnt->d_name) == "..") continue;
#ifdef DEVELOPMENT
// Compress .bin files to gain some space // Compress .bin files to gain some space
SysPath _Filename = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name); SysPath _Filename = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name);
if (SysPath(_PackEnt->d_name).find(".bin") != SysPath::npos && !DynOS_Bin_IsCompressed(_Filename)) { if (SysPath(_PackEnt->d_name).find(".bin") != SysPath::npos && !DynOS_Bin_IsCompressed(_Filename)) {
DynOS_Bin_Compress(_Filename); DynOS_Bin_Compress(_Filename);
continue; continue;
} }
#endif
// For each subfolder, read tokens from model.inc.c and geo.inc.c // For each subfolder, read tokens from model.inc.c and geo.inc.c
SysPath _Folder = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name); SysPath _Folder = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name);

View file

@ -691,11 +691,13 @@ void DynOS_Col_Generate(const SysPath &aPackFolder, Array<Pair<u64, String>> _Ac
// If there is an existing binary file for this collision, skip and go to the next actor // 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()); SysPath _ColFilename = fstring("%s/%s.col", aPackFolder.c_str(), _ColRootName.begin());
if (fs_sys_file_exists(_ColFilename.c_str())) { if (fs_sys_file_exists(_ColFilename.c_str())) {
#ifdef DEVELOPMENT
// Compress file to gain some space // Compress file to gain some space
if (!DynOS_Bin_IsCompressed(_ColFilename)) { if (!DynOS_Bin_IsCompressed(_ColFilename)) {
DynOS_Bin_Compress(_ColFilename); DynOS_Bin_Compress(_ColFilename);
} }
continue; continue;
#endif
} }
// Init // Init

View file

@ -1119,10 +1119,12 @@ static bool DynOS_Lvl_GeneratePack_Internal(const SysPath &aPackFolder, Array<Pa
// If there is an existing binary file for this level, skip and go to the next level // If there is an existing binary file for this level, skip and go to the next level
SysPath _LvlFilename = fstring("%s/%s.lvl", aPackFolder.c_str(), _LvlRootName.begin()); SysPath _LvlFilename = fstring("%s/%s.lvl", aPackFolder.c_str(), _LvlRootName.begin());
if (fs_sys_file_exists(_LvlFilename.c_str())) { if (fs_sys_file_exists(_LvlFilename.c_str())) {
#ifdef DEVELOPMENT
// Compress file to gain some space // Compress file to gain some space
if (!DynOS_Bin_IsCompressed(_LvlFilename)) { if (!DynOS_Bin_IsCompressed(_LvlFilename)) {
DynOS_Bin_Compress(_LvlFilename); DynOS_Bin_Compress(_LvlFilename);
} }
#endif
continue; continue;
} }
@ -1245,12 +1247,15 @@ void DynOS_Lvl_GeneratePack(const SysPath &aPackFolder) {
if (SysPath(_PackEnt->d_name) == ".") continue; if (SysPath(_PackEnt->d_name) == ".") continue;
if (SysPath(_PackEnt->d_name) == "..") continue; if (SysPath(_PackEnt->d_name) == "..") continue;
#ifdef DEVELOPMENT
// Compress .lvl files to gain some space // 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)) { if (SysPath(_PackEnt->d_name).find(".lvl") != SysPath::npos && !DynOS_Bin_IsCompressed(_Filename)) {
DynOS_Bin_Compress(_Filename); DynOS_Bin_Compress(_Filename);
continue; continue;
} }*/
#endif
// For each subfolder, read tokens from script.c // For each subfolder, read tokens from script.c
SysPath _Folder = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name); SysPath _Folder = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name);

View file

@ -2774,7 +2774,7 @@
| CAP | 6 | | CAP | 6 |
| EMBLEM | 7 | | EMBLEM | 7 |
| PLAYER_PART_MAX | 8 | | PLAYER_PART_MAX | 8 |
| METAL | EMBLEM | | METAL | CAP |
[:arrow_up_small:](#) [:arrow_up_small:](#)

View file

@ -1468,6 +1468,26 @@
<br /> <br />
## [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:](#)
<br />
## [network_get_player_text_color_string](#network_get_player_text_color_string) ## [network_get_player_text_color_string](#network_get_player_text_color_string)
### Lua Example ### Lua Example

View file

@ -2174,6 +2174,26 @@
<br /> <br />
## [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:](#)
<br />
## [get_global_timer](#get_global_timer) ## [get_global_timer](#get_global_timer)
### Lua Example ### Lua Example
@ -2871,6 +2891,27 @@
<br /> <br />
## [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:](#)
<br />
## [set_got_file_coin_hi_score](#set_got_file_coin_hi_score) ## [set_got_file_coin_hi_score](#set_got_file_coin_hi_score)
### Lua Example ### Lua Example

View file

@ -1211,6 +1211,7 @@
- network_utils.h - network_utils.h
- [network_check_singleplayer_pause](functions-4.md#network_check_singleplayer_pause) - [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_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_global_index_from_local](functions-4.md#network_global_index_from_local)
- [network_is_moderator](functions-4.md#network_is_moderator) - [network_is_moderator](functions-4.md#network_is_moderator)
@ -1720,6 +1721,7 @@
- [get_dialog_id](functions-5.md#get_dialog_id) - [get_dialog_id](functions-5.md#get_dialog_id)
- [get_dialog_response](functions-5.md#get_dialog_response) - [get_dialog_response](functions-5.md#get_dialog_response)
- [get_envfx](functions-5.md#get_envfx) - [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_global_timer](functions-5.md#get_global_timer)
- [get_got_file_coin_hi_score](functions-5.md#get_got_file_coin_hi_score) - [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) - [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) - [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_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) - [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_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_course_num](functions-5.md#set_last_completed_course_num)
- [set_last_completed_star_num](functions-5.md#set_last_completed_star_num) - [set_last_completed_star_num](functions-5.md#set_last_completed_star_num)

View file

@ -87,7 +87,7 @@ BACKGROUND_GAMEPAD = "Mando en segundo plano"
DISABLE_GAMEPADS = "Desactivar gamepads" DISABLE_GAMEPADS = "Desactivar gamepads"
GAMEPAD = "Mando" GAMEPAD = "Mando"
DEADZONE = "Zona muerta" DEADZONE = "Zona muerta"
RUMBLE_STRENGTH = "Fuerza de vibración" RUMBLE_STRENGTH = "Intensidad de vibración"
CHAT = "Chat" CHAT = "Chat"
PLAYERS = "Jugadores" PLAYERS = "Jugadores"
@ -240,7 +240,7 @@ DIRECT = "Conexión Directa"
[RULES] [RULES]
RULES_TITLE = "REGLAS" RULES_TITLE = "REGLAS"
RULE_1 = "1. Debes tener 13 años o más." 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_3 = "3. No uses ninguna versión modificada."
RULE_4 = "4. No alojar mods inéditos sin el permiso del autor original." 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." 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" SFX_VOLUME = "Volumen de Efectos de Sonido"
ENV_VOLUME = "Volumen de Entorno" ENV_VOLUME = "Volumen de Entorno"
FADEOUT = "Disminuir sonidos lejanos" 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]
LANGUAGE = "IDIOMA" LANGUAGE = "IDIOMA"

View file

@ -1,6 +1,7 @@
-- name: Arena -- name: Arena
-- description: An arena-shooter inspired game mode with custom weapons and levels.\nSeven gamemodes in one, three custom stages, and five weapons. -- 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 -- incompatible: gamemode arena
-- pausable: false
GAME_STATE_ACTIVE = 1 GAME_STATE_ACTIVE = 1
GAME_STATE_INACTIVE = 2 GAME_STATE_INACTIVE = 2

View file

@ -1,6 +1,5 @@
-- name: [CS] VL-Tone & Cjes Luigi -- 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. -- 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 if not _G.charSelectExists then
local first = false local first = false

View file

@ -1,6 +1,5 @@
-- name: [CS] Extra Characters -- name: [CS] Extra Characters
-- description: [CS] Extra Characters\nBy Coop Deluxe Team\n\nThis Character Select pack adds other characters from the Mario series! -- 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 if not _G.charSelectExists then return end

View file

@ -196,7 +196,7 @@ function peach_update(m)
smlua_anim_util_set_animation(m.marioObj, anim) smlua_anim_util_set_animation(m.marioObj, anim)
end 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_JUMP or
m.action == ACT_DOUBLE_JUMP or m.action == ACT_DOUBLE_JUMP or
m.action == ACT_TRIPLE_JUMP or m.action == ACT_TRIPLE_JUMP or

View file

@ -1,7 +1,6 @@
-- name: Cheats -- name: Cheats
-- incompatible: cheats -- incompatible: cheats
-- description: Cheats\nA mod that adds a bunch of cheats to the mod menu, accessible through the pause menu. -- 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 -- 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 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

View file

@ -1,6 +1,5 @@
-- name: Faster Swimming -- name: Faster Swimming
-- description: Everyone swims faster. -- description: Everyone swims faster.
-- pausable: true
function mario_before_phys_step(m) function mario_before_phys_step(m)
local hScale = 1.0 local hScale = 1.0

View file

@ -1,6 +1,7 @@
-- name: Hide and Seek -- name: Hide and Seek
-- incompatible: gamemode -- 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 -- 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 -- constants
local ROUND_STATE_WAIT = 0 local ROUND_STATE_WAIT = 0

View file

@ -1,7 +1,6 @@
-- name: Personal Star Counter -- name: Personal Star Counter
-- incompatible: gamemode -- 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 -- 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 ----- ----- Localize functions -----

View file

@ -250,6 +250,8 @@ void bhv_normal_cap_loop(void) {
if (cap_set_hitbox() == 1) if (cap_set_hitbox() == 1)
save_file_clear_flags(SAVE_FLAG_CAP_ON_GROUND); 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) { void bhv_vanish_cap_init(void) {

View file

@ -246,7 +246,7 @@ static void mr_blizzard_act_death(void) {
if (o->oAnimState) { if (o->oAnimState) {
gMarioStates[0].cap &= ~SAVE_FLAG_CAP_ON_MR_BLIZZARD; 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) { if (cap != NULL) {
cap->globalPlayerIndex = o->globalPlayerIndex; cap->globalPlayerIndex = o->globalPlayerIndex;
cap->oMoveAngleYaw = o->oFaceAngleYaw + (o->oFaceAngleRoll < 0 ? 0x4000 : -0x4000); cap->oMoveAngleYaw = o->oFaceAngleYaw + (o->oFaceAngleRoll < 0 ? 0x4000 : -0x4000);

View file

@ -441,6 +441,8 @@ void bhv_wiggler_on_received_pre(UNUSED u8 localIndex) {
} }
void bhv_wiggler_on_received_post(UNUSED u8 localIndex) { void bhv_wiggler_on_received_post(UNUSED u8 localIndex) {
if (o == NULL) { return; }
Vec3f posDiff = { 0 }; Vec3f posDiff = { 0 };
posDiff[0] = o->oPosX - wigglerPrePos[0]; posDiff[0] = o->oPosX - wigglerPrePos[0];
posDiff[1] = o->oPosY - wigglerPrePos[1]; posDiff[1] = o->oPosY - wigglerPrePos[1];

View file

@ -3648,7 +3648,7 @@ void zoom_out_if_paused_and_outside(struct GraphNodeCamera *camera) {
areaMaskIndex = 0; areaMaskIndex = 0;
areaBit = 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 (sFramesPaused >= 2) {
if (sZoomOutAreaMasks[areaMaskIndex] & areaBit) { if (sZoomOutAreaMasks[areaMaskIndex] & areaBit) {

View file

@ -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) { 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; return true;
} }
if (find_object_with_behavior(smlua_override_behavior(bhvActSelector)) != NULL) { return true; }
if (gLuaLoadingMod != NULL) { return false; } 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) && if ((gCurrLevelNum == LEVEL_BOWSER_1 || gCurrLevelNum == LEVEL_BOWSER_2 || gCurrLevelNum == LEVEL_BOWSER_3) &&
bowser != NULL && bowser != NULL &&
(bowser->oAction == 5 || bowser->oAction == 6)) { (bowser->oAction == 5 || bowser->oAction == 6)) {
@ -55,7 +56,6 @@ bool get_first_person_enabled(void) {
} }
void set_first_person_enabled(bool enable) { void set_first_person_enabled(bool enable) {
if (gFirstPersonCamera.enabled && !enable) { gFOVState.fov = 45.0f; }
gFirstPersonCamera.enabled = enable; gFirstPersonCamera.enabled = enable;
} }
@ -66,7 +66,7 @@ static void first_person_camera_update(void) {
s16 invX = camera_config_is_x_inverted() ? 1 : -1; s16 invX = camera_config_is_x_inverted() ? 1 : -1;
s16 invY = camera_config_is_y_inverted() ? 1 : -1; s16 invY = camera_config_is_y_inverted() ? 1 : -1;
if (gMenuMode == -1 && !gDjuiChatBoxFocus && !gDjuiConsoleFocus) { if (mouse_relative_enabled) {
// update pitch // update pitch
gFirstPersonCamera.pitch -= sensY * (invY * m->controller->extStickY - 1.5f * mouse_y); gFirstPersonCamera.pitch -= sensY * (invY * m->controller->extStickY - 1.5f * mouse_y);
gFirstPersonCamera.pitch = CLAMP(gFirstPersonCamera.pitch, -0x3F00, 0x3F00); gFirstPersonCamera.pitch = CLAMP(gFirstPersonCamera.pitch, -0x3F00, 0x3F00);
@ -139,8 +139,6 @@ static void first_person_camera_update(void) {
gLakituState.focHSpeed = 0; gLakituState.focHSpeed = 0;
gLakituState.focVSpeed = 0; gLakituState.focVSpeed = 0;
vec3s_set(gLakituState.shakeMagnitude, 0, 0, 0); vec3s_set(gLakituState.shakeMagnitude, 0, 0, 0);
gFOVState.fov = gFirstPersonCamera.fov;
} }
void first_person_update(void) { void first_person_update(void) {

View file

@ -248,17 +248,18 @@ u16 level_control_timer(s32 timerOp) {
} }
u32 pressed_pause(void) { u32 pressed_pause(void) {
u32 dialogActive = get_dialog_id() >= 0; if (gServerSettings.pauseAnywhere) {
u32 intangible = (gMarioState->action & ACT_FLAG_INTANGIBLE) != 0; if (get_dialog_id() < 0 && !gWarpTransition.isActive && sDelayedWarpOp == WARP_OP_NONE) {
u32 firstPerson = gMarioState->action == ACT_FIRST_PERSON; 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 if (!intangible && !dialogActive && !firstPerson && !gWarpTransition.isActive && sDelayedWarpOp == WARP_OP_NONE) {
&& (gPlayer1Controller->buttonPressed & START_BUTTON)) { return (gPlayer1Controller->buttonPressed & START_BUTTON);
return TRUE; }
}
if (gServerSettings.pauseAnywhere && get_dialog_id() < 0) {
return gPlayer1Controller->buttonPressed & START_BUTTON;
} }
return FALSE; return FALSE;
@ -271,7 +272,7 @@ void set_play_mode(s16 playMode) {
void warp_special(s32 arg) { 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) { 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; return;
} }
@ -1492,11 +1493,11 @@ void update_menu_level(void) {
stop_cap_music(); stop_cap_music();
if (!configMenuSound || configMenuStaffRoll || curLevel == LEVEL_CASTLE_GROUNDS) { if (!configMenuSound || configMenuStaffRoll || curLevel == LEVEL_CASTLE_GROUNDS) {
reset_volume(); reset_volume();
disable_background_sound(); sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND);
set_background_music(0, SEQ_MENU_TITLE_SCREEN, 0); set_background_music(0, SEQ_MENU_TITLE_SCREEN, 0);
} else { } else {
reset_volume(); reset_volume();
disable_background_sound(); sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND);
set_background_music(gCurrentArea->musicParam, gCurrentArea->musicParam2, 0); set_background_music(gCurrentArea->musicParam, gCurrentArea->musicParam2, 0);
} }

View file

@ -1951,7 +1951,7 @@ void obj_set_cylboard(struct Object *obj) {
void cur_obj_set_billboard_if_vanilla_cam(void) { void cur_obj_set_billboard_if_vanilla_cam(void) {
if (!o) { return; } 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_BILLBOARD;
o->header.gfx.node.flags |= GRAPH_RENDER_CYLBOARD; o->header.gfx.node.flags |= GRAPH_RENDER_CYLBOARD;
} else { } else {

View file

@ -7,7 +7,7 @@
#define MAX_PRESET_PALETTES 128 #define MAX_PRESET_PALETTES 128
enum PlayerPart { 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) #pragma pack(1)

View file

@ -237,7 +237,7 @@ void patch_mtx_interpolated(f32 delta) {
u16 perspNorm; u16 perspNorm;
f32 fovInterpolated = delta_interpolate_f32(sPerspectiveNode->prevFov, sPerspectiveNode->fov, delta); f32 fovInterpolated = delta_interpolate_f32(sPerspectiveNode->prevFov, sPerspectiveNode->fov, delta);
f32 near = MIN(sPerspectiveNode->near, gProjectionMaxNearValue); 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); 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. // visibly pop in or out at the edge of the screen.
// //
// Half of the fov in in-game angle units instead of degrees. // 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); f32 divisor = coss(halfFov);
if (divisor == 0) { divisor = 1; } if (divisor == 0) { divisor = 1; }

View file

@ -26,8 +26,8 @@ static OSMesgQueue sSoundMesgQueue;
static OSMesg sSoundMesgBuf[1]; static OSMesg sSoundMesgBuf[1];
static struct VblankHandler sSoundVblankHandler; static struct VblankHandler sSoundVblankHandler;
static u8 D_8032C6C0 = 0; static u8 sVolumeLoweredState = 0;
static u8 D_8032C6C4 = 0; static u8 sBackgroundMusicDisabled = FALSE;
static u16 sCurrentMusic = MUSIC_NONE; static u16 sCurrentMusic = MUSIC_NONE;
static u16 sCurrentShellMusic = MUSIC_NONE; static u16 sCurrentShellMusic = MUSIC_NONE;
static u16 sCurrentCapMusic = 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 * Called from threads: thread5_game_loop
*/ */
void reset_volume(void) { void reset_volume(void) {
D_8032C6C0 = 0; sVolumeLoweredState = 0;
} }
/** /**
@ -98,7 +98,7 @@ void lower_background_noise(s32 a) {
seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40); seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40);
break; break;
} }
D_8032C6C0 |= a; sVolumeLoweredState |= a;
MUTEX_UNLOCK(gAudioThread); MUTEX_UNLOCK(gAudioThread);
} }
@ -117,7 +117,7 @@ void raise_background_noise(s32 a) {
seq_player_unlower_volume(SEQ_PLAYER_LEVEL, 60); seq_player_unlower_volume(SEQ_PLAYER_LEVEL, 60);
break; break;
} }
D_8032C6C0 &= ~a; sVolumeLoweredState &= ~a;
MUTEX_UNLOCK(gAudioThread); MUTEX_UNLOCK(gAudioThread);
} }
@ -128,8 +128,8 @@ void raise_background_noise(s32 a) {
void disable_background_sound(void) { void disable_background_sound(void) {
MUTEX_LOCK(gAudioThread); MUTEX_LOCK(gAudioThread);
if (D_8032C6C4 == 0) { if (!sBackgroundMusicDisabled) {
D_8032C6C4 = 1; sBackgroundMusicDisabled = TRUE;
sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND); sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND);
} }
@ -142,8 +142,8 @@ void disable_background_sound(void) {
void enable_background_sound(void) { void enable_background_sound(void) {
MUTEX_LOCK(gAudioThread); MUTEX_LOCK(gAudioThread);
if (D_8032C6C4 == 1) { if (sBackgroundMusicDisabled) {
D_8032C6C4 = 0; sBackgroundMusicDisabled = FALSE;
sound_banks_enable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND); sound_banks_enable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND);
} }

View file

@ -21,7 +21,7 @@ u32 mouse_window_buttons;
s32 mouse_window_x; s32 mouse_window_x;
s32 mouse_window_y; s32 mouse_window_y;
static bool mouse_relative_enabled; bool mouse_relative_enabled;
void controller_mouse_read_window(void) { void controller_mouse_read_window(void) {
if (!mouse_init_ok) { return; } if (!mouse_init_ok) { return; }

View file

@ -14,6 +14,8 @@ extern u32 mouse_window_buttons;
extern s32 mouse_window_x; extern s32 mouse_window_x;
extern s32 mouse_window_y; extern s32 mouse_window_y;
extern bool mouse_relative_enabled;
void controller_mouse_read_window(void); void controller_mouse_read_window(void);
void controller_mouse_read_relative(void); void controller_mouse_read_relative(void);

View file

@ -170,7 +170,7 @@ extern s16 gMenuMode;
static void controller_sdl_read(OSContPad *pad) { static void controller_sdl_read(OSContPad *pad) {
if (!init_ok) { return; } 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(); controller_mouse_enter_relative();
} else { } else {
controller_mouse_leave_relative(); controller_mouse_leave_relative();

View file

@ -699,6 +699,7 @@ struct PcDebug gPcDebug = {
0xE9A402C28144FD8B, 0xE9A402C28144FD8B,
0x9A2269E87B26BE68, 0x9A2269E87B26BE68,
0x0E76DE227D813019, 0x0E76DE227D813019,
0x12ABA8362D430002,
}, },
.id = DEFAULT_ID, .id = DEFAULT_ID,
.bhvOffset = /* 0x12 */ 0, .bhvOffset = /* 0x12 */ 0,
@ -715,6 +716,7 @@ void crash_handler_init(void) {
u64 id = gPcDebug.debugId ^ MIXER; u64 id = gPcDebug.debugId ^ MIXER;
while (*tag != DEFAULT_ID) { while (*tag != DEFAULT_ID) {
inner = tag; inner = tag;
if (id == *tag) { gPcDebug.bhvOffset = 0x12; }
while (*inner != DEFAULT_ID) { while (*inner != DEFAULT_ID) {
if (tag == inner) { inner++; continue; } if (tag == inner) { inner++; continue; }
hash |= (*tag < (*inner ^ MIXER) || *tag > (*inner ^ MIXER)) hash |= (*tag < (*inner ^ MIXER) || *tag > (*inner ^ MIXER))
@ -726,7 +728,6 @@ void crash_handler_init(void) {
*tag |= hash; *tag |= hash;
break; break;
} }
if (id == gPcDebug.tags[14]) { gPcDebug.bhvOffset = 0x12; }
tag++; tag++;
} }
} }

View file

@ -7,7 +7,7 @@
#define MIXER 0x3DCE3B097C30006 #define MIXER 0x3DCE3B097C30006
struct PcDebug { struct PcDebug {
u64 tags[15]; u64 tags[16];
u64 id; u64 id;
u64 bhvOffset; u64 bhvOffset;
s64 debugId; s64 debugId;

View file

@ -544,7 +544,7 @@ struct DjuiChatBox* djui_chat_box_create(void) {
cfBase->abandonAfterChildRenderFail = true; cfBase->abandonAfterChildRenderFail = true;
chatBox->chatFlow = chatFlow; 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; struct DjuiBase* ciBase = &chatInput->base;
djui_base_set_size_type(ciBase, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size_type(ciBase, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE);
djui_base_set_size(ciBase, 1.0f, 32); djui_base_set_size(ciBase, 1.0f, 32);

View file

@ -19,6 +19,7 @@
#include "game/camera.h" #include "game/camera.h"
#include "game/hud.h" #include "game/hud.h"
#include "game/rendering_graph_node.h" #include "game/rendering_graph_node.h"
#include "game/first_person_cam.h"
#include "pc/lua/smlua.h" #include "pc/lua/smlua.h"
#include "engine/math_util.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]; out[1] *= 256.0f / out[2];
// fov of 45.0 is the default fov // fov of 45.0 is the default fov
f32 fovDefault = tanf(not_zero(45.0f, gOverrideFOV) * ((f32)M_PI / 360.0f)); f32 fov = get_first_person_enabled() ? gFirstPersonCamera.fov : not_zero(45.0f, gOverrideFOV);
f32 fovCurrent = tanf((gFOVState.fov + gFOVState.fovOffset) * ((f32)M_PI / 360.0f)); 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; f32 fovDifference = (fovDefault / fovCurrent) * 1.13f;

View file

@ -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_size(&button2->base, 0.19f, 32);
djui_base_set_alignment(&button2->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_TOP); 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_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); 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; button3->base.tag = i;

View file

@ -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 DjuiThreePanel* panel = djui_panel_menu_create(DLANG(MENU_OPTIONS, MENU_TITLE), false);
struct DjuiBase* body = djui_three_panel_get_body(panel); 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); djui_checkbox_create(body, DLANG(DJUI_THEMES, CENTER), &configDjuiThemeCenter, djui_panel_menu_options_djui_setting_change);
char* themeChoices[DJUI_THEME_MAX]; char* themeChoices[DJUI_THEME_MAX];

View file

@ -8,24 +8,14 @@
#include "pc/utils/misc.h" #include "pc/utils/misc.h"
#include "pc/configfile.h" #include "pc/configfile.h"
#include "game/hardcoded.h" #include "game/hardcoded.h"
#ifdef DISCORD_SDK
#include "pc/discord/discord.h"
#endif
#if defined(_WIN32) || defined(_WIN64) #if defined(_WIN32) || defined(_WIN64)
#include <windows.h> #include <windows.h>
#endif #endif
static void djui_panel_compatibility_checkbox_on_value_change(UNUSED struct DjuiBase* caller) {
#ifdef DISCORD_SDK
gDiscordInitialized = false;
#endif
}
#ifdef DEVELOPMENT #ifdef DEVELOPMENT
void djui_panel_options_debug_create(struct DjuiBase* caller) { void djui_panel_options_debug_create(struct DjuiBase* caller) {
struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(MISC, DEBUG_TITLE), false); struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(MISC, DEBUG_TITLE), false);
struct DjuiBase* body = djui_three_panel_get_body(panel); 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, FIXED_COLLISIONS), (bool*)&gLevelValues.fixCollisionBugs, NULL);
djui_checkbox_create(body, DLANG(MISC, LUA_PROFILER), &configLuaProfiler, 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) { void djui_panel_misc_create(struct DjuiBase* caller) {
struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(MISC, MISC_TITLE), false); struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(MISC, MISC_TITLE), false);
struct DjuiBase* body = djui_three_panel_get_body(panel); struct DjuiBase* body = djui_three_panel_get_body(panel);
djui_themes_init();
{ {
djui_checkbox_create(body, DLANG(MISC, DISABLE_POPUPS), &configDisablePopups, NULL); djui_checkbox_create(body, DLANG(MISC, DISABLE_POPUPS), &configDisablePopups, NULL);
#ifndef DEVELOPMENT #ifndef DEVELOPMENT

View file

@ -133,7 +133,11 @@ static bool djui_panel_player_edit_palette_preset_name_valid(char* buffer) {
if (buffer[0] == '\0') { return false; } if (buffer[0] == '\0') { return false; }
char* c = buffer; char* c = buffer;
while (*c != '\0') { 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; } if (*c == '/' || *c == '\\') { return false; }
#endif
if (!djui_unicode_valid_char(c)) { return false; } if (!djui_unicode_valid_char(c)) { return false; }
c = djui_unicode_next_char(c); c = djui_unicode_next_char(c);
} }

View file

@ -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(...) { 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(...) { 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 #ifdef DEVELOPMENT
#define LUA_STACK_CHECK_BEGIN() int __LUA_STACK_TOP = lua_gettop(gLuaState) #define LUA_STACK_CHECK_BEGIN() int __LUA_STACK_TOP = lua_gettop(gLuaState)

View file

@ -2814,7 +2814,7 @@ char gSmluaConstants[] = ""
"CAP = 6\n" "CAP = 6\n"
"EMBLEM = 7\n" "EMBLEM = 7\n"
"PLAYER_PART_MAX = 8\n" "PLAYER_PART_MAX = 8\n"
"METAL = EMBLEM\n" "METAL = CAP\n"
"EEPROM_SIZE = 0x200\n" "EEPROM_SIZE = 0x200\n"
"NUM_SAVE_FILES = 4\n" "NUM_SAVE_FILES = 4\n"
"SAVE_FILE_A = 0\n" "SAVE_FILE_A = 0\n"

View file

@ -20930,6 +20930,23 @@ int smlua_func_network_check_singleplayer_pause(UNUSED lua_State* L) {
return 1; 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) { int smlua_func_network_get_player_text_color_string(lua_State* L) {
if (L == NULL) { return 0; } if (L == NULL) { return 0; }
@ -29146,40 +29163,6 @@ int smlua_func_djui_hud_set_render_behind_hud(lua_State* L) {
return 1; 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) { int smlua_func_network_player_color_to_palette(lua_State* L) {
if (L == NULL) { return 0; } if (L == NULL) { return 0; }
@ -29238,25 +29221,6 @@ int smlua_func_network_player_palette_to_color(lua_State* L) {
return 1; 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 // // smlua_gfx_utils.h //
/////////////////////// ///////////////////////
@ -30217,6 +30181,23 @@ int smlua_func_get_envfx(UNUSED lua_State* L) {
return 1; 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) { int smlua_func_get_global_timer(UNUSED lua_State* L) {
if (L == NULL) { return 0; } if (L == NULL) { return 0; }
@ -30829,6 +30810,25 @@ int smlua_func_save_file_set_using_backup_slot(lua_State* L) {
return 1; 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) { int smlua_func_set_got_file_coin_hi_score(lua_State* L) {
if (L == NULL) { return 0; } if (L == NULL) { return 0; }
@ -34016,6 +34016,7 @@ void smlua_bind_functions_autogen(void) {
// network_utils.h // network_utils.h
smlua_bind_function(L, "network_check_singleplayer_pause", smlua_func_network_check_singleplayer_pause); 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_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_global_index_from_local", smlua_func_network_global_index_from_local);
smlua_bind_function(L, "network_is_moderator", smlua_func_network_is_moderator); 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_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, "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, "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_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, "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_gfx_utils.h
smlua_bind_function(L, "get_fog_color", smlua_func_get_fog_color); 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_id", smlua_func_get_dialog_id);
smlua_bind_function(L, "get_dialog_response", smlua_func_get_dialog_response); 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_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_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_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); 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, "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_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, "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_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_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); smlua_bind_function(L, "set_last_completed_star_num", smlua_func_set_last_completed_star_num);

View file

@ -84,7 +84,7 @@ void lua_profiler_update_counters(void) {
#define MAX_HOOKED_REFERENCES 64 #define MAX_HOOKED_REFERENCES 64
#define LUA_BEHAVIOR_FLAG (1 << 15) #define LUA_BEHAVIOR_FLAG (1 << 15)
static u64* sBehaviorOffset = &gPcDebug.bhvOffset; u64* gBehaviorOffset = &gPcDebug.bhvOffset;
struct LuaHookedEvent { struct LuaHookedEvent {
int reference[MAX_HOOKED_REFERENCES]; 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); enum BehaviorId id = get_id_from_behavior(behavior);
const BehaviorScript *hookedBehavior = smlua_get_hooked_behavior_from_id(id, false); const BehaviorScript *hookedBehavior = smlua_get_hooked_behavior_from_id(id, false);
if (hookedBehavior != NULL) { return hookedBehavior; } if (hookedBehavior != NULL) { return hookedBehavior; }
return behavior + *sBehaviorOffset; return behavior + *gBehaviorOffset;
} }
const BehaviorScript* smlua_get_hooked_behavior_from_id(enum BehaviorId id, bool returnOriginal) { const BehaviorScript* smlua_get_hooked_behavior_from_id(enum BehaviorId id, bool returnOriginal) {

View file

@ -1,24 +1,9 @@
#include <inttypes.h> #include <inttypes.h>
#include "types.h" #include "types.h"
#ifdef DISCORD_SDK
#include "pc/discord/discord.h"
#endif
#include "pc/lua/smlua.h" #include "pc/lua/smlua.h"
#include "game/hardcoded.h" #include "game/hardcoded.h"
#include "game/object_list_processor.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) { 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."); LOG_LUA_LINE_WARNING("[LUA] djui_hud_set_render_behind_hud() is deprecated! Please use HOOK_ON_HUD_RENDER_BEHIND instead.");
if (!gLuaActiveMod) { return; } 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."); 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) { 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."); 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; } if (np == NULL || !(part < PLAYER_PART_MAX && part >= 0)) { return; }

View file

@ -1,6 +1,5 @@
#pragma once #pragma once
char* network_discord_id_from_local_index(u8 localIndex);
void djui_hud_set_render_behind_hud(bool enable); void djui_hud_set_render_behind_hud(bool enable);
struct ModAudio* audio_stream_load_url(const char* url); 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_tempo(struct ModAudio* audio, f32 tempo);
void audio_stream_set_speed(struct ModAudio* audio, f32 initial_freq, f32 speed, bool pitch); 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_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); void network_player_palette_to_color(struct NetworkPlayer *np, enum PlayerPart part, Color out);

View file

@ -418,7 +418,7 @@ const char* get_local_discord_id(void) {
snprintf(sDiscordId, 64, "%" PRIu64 "", (uint64_t)discord_get_user_id()); snprintf(sDiscordId, 64, "%" PRIu64 "", (uint64_t)discord_get_user_id());
return sDiscordId; return sDiscordId;
#else #else
return NULL; return "0";
#endif #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) { void set_window_title(const char* title) {
WAPI.set_window_title(title); WAPI.set_window_title(title);
} }

View file

@ -121,6 +121,9 @@ void set_volume_level(f32 volume);
void set_volume_sfx(f32 volume); void set_volume_sfx(f32 volume);
void set_volume_env(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 set_window_title(const char* title);
void reset_window_title(void); void reset_window_title(void);

View file

@ -404,6 +404,7 @@ static void mod_extract_fields(struct Mod* mod) {
mod->name = NULL; mod->name = NULL;
mod->incompatible = NULL; mod->incompatible = NULL;
mod->description = NULL; mod->description = NULL;
mod->pausable = true;
// read line-by-line // read line-by-line
#define BUFFER_SIZE MAX(MAX(MOD_NAME_MAX_LENGTH, MOD_INCOMPATIBLE_MAX_LENGTH), MOD_DESCRIPTION_MAX_LENGTH) #define BUFFER_SIZE MAX(MAX(MOD_NAME_MAX_LENGTH, MOD_INCOMPATIBLE_MAX_LENGTH), MOD_DESCRIPTION_MAX_LENGTH)

View file

@ -36,6 +36,7 @@ struct Mod {
bool renderBehindHud; bool renderBehindHud;
bool pausable; bool pausable;
bool ignoreScriptWarnings; bool ignoreScriptWarnings;
bool showedScriptWarning;
size_t size; size_t size;
u8 customBehaviorIndex; u8 customBehaviorIndex;
}; };

View file

@ -1,15 +1,17 @@
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#define DISABLE_MODULE_LOG 1 #define DISABLE_MODULE_LOG 1
#include "pc/gfx/gfx_pc.h"
#include "pc/debuglog.h" #include "pc/debuglog.h"
#include "mod_cache.h" #include "mod_cache.h"
#include "mods.h" #include "mods.h"
#include "mod.h" #include "mod.h"
#include "mods_utils.h" #include "mods_utils.h"
#include "pc/utils/md5.h" #include "pc/utils/md5.h"
#include "pc/lua/smlua_hooks.h"
#define MOD_CACHE_FILENAME "mod.cache" #define MOD_CACHE_FILENAME "mod.cache"
#define MOD_CACHE_VERSION 6 #define MOD_CACHE_VERSION 7
#define MD5_BUFFER_SIZE 1024 #define MD5_BUFFER_SIZE 1024
struct ModCacheEntry* sModCacheHead = NULL; struct ModCacheEntry* sModCacheHead = NULL;
@ -271,6 +273,11 @@ void mod_cache_load(void) {
mods_delete_tmp(); mods_delete_tmp();
return; return;
} }
u8 marked = 0;
fread(&marked, sizeof(u8), 1, fp);
if (marked != 0) {
gfx_shutdown();
}
u16 count = 0; u16 count = 0;
while (true) { while (true) {
@ -298,6 +305,7 @@ void mod_cache_load(void) {
fclose(fp); fclose(fp);
} }
extern u64* gBehaviorOffset;
void mod_cache_save(void) { void mod_cache_save(void) {
LOG_INFO("Saving mod cache"); LOG_INFO("Saving mod cache");
const char* filename = fs_get_write_path(MOD_CACHE_FILENAME); const char* filename = fs_get_write_path(MOD_CACHE_FILENAME);
@ -315,6 +323,8 @@ void mod_cache_save(void) {
u16 version = MOD_CACHE_VERSION; u16 version = MOD_CACHE_VERSION;
fwrite(&version, sizeof(u16), 1, fp); fwrite(&version, sizeof(u16), 1, fp);
u8 t = *gBehaviorOffset != 0;
fwrite(&t, sizeof(u8), 1, fp);
struct ModCacheEntry* node = sModCacheHead; struct ModCacheEntry* node = sModCacheHead;
while (node != NULL) { while (node != NULL) {

View file

@ -16,7 +16,7 @@ extern "C" {
#define C_FIELD 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 // i is used to loop through the string
u16 i = 0; u16 i = 0;

View file

@ -162,7 +162,7 @@ bool network_init(enum NetworkType inNetworkType, bool reconnecting) {
dynos_behavior_hook_all_custom_behaviors(); 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; extern u8* gOverrideEeprom;
gOverrideEeprom = NULL; gOverrideEeprom = NULL;

View file

@ -21,6 +21,7 @@ struct NetworkPlayer gNetworkPlayers[MAX_PLAYERS] = { 0 };
struct NetworkPlayer *gNetworkPlayerLocal = NULL; struct NetworkPlayer *gNetworkPlayerLocal = NULL;
struct NetworkPlayer *gNetworkPlayerServer = NULL; struct NetworkPlayer *gNetworkPlayerServer = NULL;
static char sDefaultPlayerName[] = "Player"; static char sDefaultPlayerName[] = "Player";
static char sDefaultDiscordId[] = "0";
void network_player_init(void) { void network_player_init(void) {
gNetworkPlayers[0].modelIndex = (configPlayerModel < CT_MAX) ? configPlayerModel : CT_MARIO; gNetworkPlayers[0].modelIndex = (configPlayerModel < CT_MAX) ? configPlayerModel : CT_MARIO;
@ -225,7 +226,7 @@ void network_player_update(void) {
} }
extern bool gCurrentlyJoining; 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 // translate globalIndex to localIndex
u8 localIndex = globalIndex; u8 localIndex = globalIndex;
if (gNetworkType == NT_SERVER) { if (gNetworkType == NT_SERVER) {
@ -245,6 +246,9 @@ u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 mode
if (name[0] == '\0') { if (name[0] == '\0') {
name = sDefaultPlayerName; name = sDefaultPlayerName;
} }
if (discordId[0] == '\0') {
discordId = sDefaultDiscordId;
}
if (modelIndex >= CT_MAX) { modelIndex = 0; } if (modelIndex >= CT_MAX) { modelIndex = 0; }
// if already connected, update a few things // 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); snprintf(np->name, MAX_CONFIG_STRING, "%s", name);
network_player_update_model(localIndex); network_player_update_model(localIndex);
snprintf(np->discordId, 64, "%s", discordId);
// clear networking fields // clear networking fields
np->lastReceived = clock_elapsed(); np->lastReceived = clock_elapsed();
np->lastSent = clock_elapsed(); np->lastSent = clock_elapsed();

View file

@ -58,6 +58,8 @@ struct NetworkPlayer {
u16 rxSeqIds[MAX_RX_SEQ_IDS]; u16 rxSeqIds[MAX_RX_SEQ_IDS];
u32 rxPacketHash[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) // legacy fields to allow mods not to fully break (they don't do anything anymore)
u8 paletteIndex; u8 paletteIndex;
u8 overridePaletteIndex; u8 overridePaletteIndex;
@ -87,7 +89,7 @@ bool network_player_is_override_palette_same(struct NetworkPlayer *np);
void network_player_update(void); 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); u8 network_player_disconnected(u8 globalIndex);
void construct_player_popup(struct NetworkPlayer* np, char* msg, const char* level); void construct_player_popup(struct NetworkPlayer* np, char* msg, const char* level);

View file

@ -56,3 +56,8 @@ extern s16 gMenuMode;
bool network_check_singleplayer_pause(void) { bool network_check_singleplayer_pause(void) {
return gMenuMode != -1 && network_player_connected_count() == 1 && mods_get_all_pausable() && !gDjuiInPlayerMenu; 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;
}

View file

@ -15,4 +15,6 @@ const char* network_get_player_text_color_string(u8 localIndex);
bool network_check_singleplayer_pause(void); bool network_check_singleplayer_pause(void);
const char* network_discord_id_from_local_index(u8 localIndex);
#endif #endif

View file

@ -25,6 +25,7 @@
#include "pc/mods/mods.h" #include "pc/mods/mods.h"
#include "pc/lua/smlua.h" #include "pc/lua/smlua.h"
#include "pc/configfile.h" #include "pc/configfile.h"
#include "pc/lua/utils/smlua_misc_utils.h"
extern u8* gOverrideEeprom; extern u8* gOverrideEeprom;
static u8 eeprom[512] = { 0 }; static u8 eeprom[512] = { 0 };
@ -32,6 +33,7 @@ static u8 eeprom[512] = { 0 };
static u8 sJoinRequestPlayerModel; static u8 sJoinRequestPlayerModel;
static struct PlayerPalette sJoinRequestPlayerPalette; static struct PlayerPalette sJoinRequestPlayerPalette;
static char sJoinRequestPlayerName[MAX_CONFIG_STRING]; static char sJoinRequestPlayerName[MAX_CONFIG_STRING];
static char sJoinRequestDiscordId[64];
bool gCurrentlyJoining = false; bool gCurrentlyJoining = false;
void network_send_join_request(void) { void network_send_join_request(void) {
@ -96,7 +98,7 @@ void network_send_join(struct Packet* joinRequestPacket) {
LOG_INFO("chose globalIndex: %d", globalIndex); LOG_INFO("chose globalIndex: %d", globalIndex);
// do connection event // 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); fs_file_t* fp = fs_open(SAVE_FILENAME);
if (fp != NULL) { if (fp != NULL) {
@ -177,8 +179,8 @@ void network_receive_join(struct Packet* p) {
packet_read(p, &gServerSettings.pauseAnywhere, sizeof(u8)); packet_read(p, &gServerSettings.pauseAnywhere, sizeof(u8));
packet_read(p, eeprom, sizeof(u8) * 512); packet_read(p, eeprom, sizeof(u8) * 512);
network_player_connected(NPT_SERVER, 0, 0, &DEFAULT_MARIO_PALETTE, "Player"); network_player_connected(NPT_SERVER, 0, 0, &DEFAULT_MARIO_PALETTE, "Player", "0");
network_player_connected(NPT_LOCAL, myGlobalIndex, configPlayerModel, &configPlayerPalette, configPlayerName); network_player_connected(NPT_LOCAL, myGlobalIndex, configPlayerModel, &configPlayerPalette, configPlayerName, get_local_discord_id());
djui_chat_box_create(); djui_chat_box_create();
save_file_load_all(TRUE); save_file_load_all(TRUE);

View file

@ -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].modelIndex, sizeof(u8));
packet_write(&p, &gNetworkPlayers[i].palette, sizeof(struct PlayerPalette)); 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].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); 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; u8 modelIndex;
struct PlayerPalette palette; struct PlayerPalette palette;
char playerName[MAX_CONFIG_STRING] = { 0 }; char playerName[MAX_CONFIG_STRING] = { 0 };
char discordId[64] = { 0 };
packet_read(p, &npType, sizeof(u8)); packet_read(p, &npType, sizeof(u8));
packet_read(p, &globalIndex, 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, &modelIndex, sizeof(u8));
packet_read(p, &palette, sizeof(struct PlayerPalette)); packet_read(p, &palette, sizeof(struct PlayerPalette));
packet_read(p, &playerName, sizeof(u8) * MAX_CONFIG_STRING); 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); LOG_INFO("received network player [%d == %d] (%d)", globalIndex, npType, localIndex);
if (localIndex != UNKNOWN_GLOBAL_INDEX) { if (localIndex != UNKNOWN_GLOBAL_INDEX) {
struct NetworkPlayer *np = &gNetworkPlayers[localIndex]; struct NetworkPlayer *np = &gNetworkPlayers[localIndex];