mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	Palette system overhaul and preset rewrite
This commit is contained in:
		
							parent
							
								
									0d71c6c12f
								
							
						
					
					
						commit
						ceb7aa4649
					
				
					 94 changed files with 2303 additions and 1171 deletions
				
			
		
							
								
								
									
										10
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -598,6 +598,11 @@ MOD_DIR := mods | |||
| # Remove old mod dir
 | ||||
| _ := $(shell $(PYTHON) $(TOOLS_DIR)/remove_built_in_mods.py) | ||||
| 
 | ||||
| PALETTES_DIR := palettes | ||||
| 
 | ||||
| # Remove old palettes dir
 | ||||
| _ := $(shell rm -rf ./$(BUILD_DIR)/$(PALETTES_DIR)) | ||||
| 
 | ||||
| # Automatic dependency files
 | ||||
| DEP_FILES := $(O_FILES:.o=.d) $(ULTRA_O_FILES:.o=.d) $(GODDARD_O_FILES:.o=.d) $(BUILD_DIR)/$(LD_SCRIPT).d | ||||
| 
 | ||||
|  | @ -1130,6 +1135,9 @@ $(BUILD_DIR)/$(LANG_DIR): | |||
| $(BUILD_DIR)/$(MOD_DIR): | ||||
| 	$(CP) -f -r $(MOD_DIR) $(BUILD_DIR) | ||||
| 
 | ||||
| $(BUILD_DIR)/$(PALETTES_DIR): | ||||
| 	@$(CP) -f -r $(PALETTES_DIR) $(BUILD_DIR) | ||||
| 
 | ||||
| # Extra object file dependencies
 | ||||
| 
 | ||||
| ifeq ($(TARGET_N64),1) | ||||
|  | @ -1475,7 +1483,7 @@ ifeq ($(TARGET_N64),1) | |||
|   $(BUILD_DIR)/$(TARGET).objdump: $(ELF) | ||||
| 	$(OBJDUMP) -D $< > $@ | ||||
| else | ||||
|   $(EXE): $(O_FILES) $(MIO0_FILES:.mio0=.o) $(ULTRA_O_FILES) $(GODDARD_O_FILES) $(BUILD_DIR)/$(RPC_LIBS) $(BUILD_DIR)/$(DISCORD_SDK_LIBS) $(BUILD_DIR)/$(COOPNET_LIBS) $(BUILD_DIR)/$(LANG_DIR) $(BUILD_DIR)/$(MOD_DIR) | ||||
|   $(EXE): $(O_FILES) $(MIO0_FILES:.mio0=.o) $(ULTRA_O_FILES) $(GODDARD_O_FILES) $(BUILD_DIR)/$(RPC_LIBS) $(BUILD_DIR)/$(DISCORD_SDK_LIBS) $(BUILD_DIR)/$(COOPNET_LIBS) $(BUILD_DIR)/$(LANG_DIR) $(BUILD_DIR)/$(MOD_DIR) $(BUILD_DIR)/$(PALETTES_DIR) | ||||
| 	@$(PRINT) "$(GREEN)Linking executable: $(BLUE)$@ $(NO_COL)\n" | ||||
| 	$(V)$(LD) $(PROF_FLAGS) -L $(BUILD_DIR) -o $@ $(O_FILES) $(ULTRA_O_FILES) $(GODDARD_O_FILES) $(LDFLAGS) | ||||
| endif | ||||
|  |  | |||
|  | @ -1996,7 +1996,7 @@ const Gfx luigi_l_logo_decal[] = { | |||
|     gsSPTexture(65535, 65535, 0, 0, 1), | ||||
|     gsDPSetPrimColor(0, 0, 127, 127, 127, 255), | ||||
|     gsSPLight(&luigi_black_lights_group.l, 1), | ||||
|     gsSPCopyLightEXT(2, 5), | ||||
|     gsSPCopyLightEXT(2, 17), | ||||
|     gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, luigi_texture_l_logo), | ||||
|     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, 1023, 256), | ||||
|  | @ -3519,7 +3519,7 @@ const Gfx luigi_right_hand_cap_decal[] = { | |||
|     gsSPTexture(65535, 65535, 0, 0, 1), | ||||
|     gsDPSetPrimColor(0, 0, 127, 127, 127, 255), | ||||
|     gsSPLight(&luigi_black_lights_group.l, 1), | ||||
|     gsSPCopyLightEXT(2, 5), | ||||
|     gsSPCopyLightEXT(2, 17), | ||||
|     gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, luigi_texture_l_logo), | ||||
|     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, 1023, 256), | ||||
|  |  | |||
|  | @ -192,7 +192,7 @@ const Gfx luigi_cap_l_logo_decal[] = { | |||
|     gsSPTexture(65535, 65535, 0, 0, 1), | ||||
|     gsDPSetPrimColor(0, 0, 127, 127, 127, 255), | ||||
|     gsSPLight(&luigi_cap_black_lights_group.l, 1), | ||||
|     gsSPCopyLightEXT(2, 5), | ||||
|     gsSPCopyLightEXT(2, 17), | ||||
|     gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, luigi_cap_texture_l_logo), | ||||
|     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, 1023, 256), | ||||
|  |  | |||
|  | @ -1109,7 +1109,7 @@ const Gfx mario_m_logo_decal[] = { | |||
|     gsSPTexture(65535, 65535, 0, 0, 1), | ||||
|     gsDPSetPrimColor(0, 0, 127, 127, 127, 255), | ||||
|     gsSPLight(&mario_black_lights_group.l, 1), | ||||
|     gsSPCopyLightEXT(2, 5), | ||||
|     gsSPCopyLightEXT(2, 17), | ||||
| 
 | ||||
|     gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, mario_texture_m_logo), | ||||
|     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), | ||||
|  | @ -2098,7 +2098,7 @@ const Gfx mario_right_hand_cap_decal[] = { | |||
|     gsSPTexture(65535, 65535, 0, 0, 1), | ||||
|     gsDPSetPrimColor(0, 0, 127, 127, 127, 255), | ||||
|     gsSPLight(&mario_black_lights_group.l, 1), | ||||
|     gsSPCopyLightEXT(2, 5), | ||||
|     gsSPCopyLightEXT(2, 17), | ||||
|     gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, mario_texture_m_logo), | ||||
|     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, 1023, 256), | ||||
|  |  | |||
|  | @ -209,7 +209,7 @@ const Gfx mario_cap_m_logo_decal[] = { | |||
|     gsSPTexture(65535, 65535, 0, 0, 1), | ||||
|     gsDPSetPrimColor(0, 0, 127, 127, 127, 255), | ||||
|     gsSPLight(&mario_cap_black_lights_group.l, 1), | ||||
|     gsSPCopyLightEXT(2, 5), | ||||
|     gsSPCopyLightEXT(2, 17), | ||||
|     gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, mario_cap_texture_m_logo), | ||||
|     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, 1023, 256), | ||||
|  |  | |||
|  | @ -44,7 +44,8 @@ in_files = [ | |||
|     "src/game/envfx_snow.h", | ||||
|     "src/pc/mods/mod_storage.h", | ||||
|     "src/game/first_person_cam.h", | ||||
|     "src/pc/djui/djui_console.h" | ||||
|     "src/pc/djui/djui_console.h", | ||||
|     "src/game/player_palette.h" | ||||
| ] | ||||
| 
 | ||||
| exclude_constants = { | ||||
|  |  | |||
|  | @ -6,27 +6,28 @@ from extract_object_fields import * | |||
| from common import * | ||||
| 
 | ||||
| in_files = [ | ||||
|     'include/types.h', | ||||
|     'src/game/area.h', | ||||
|     'src/game/camera.h', | ||||
|     'src/game/characters.h', | ||||
|     'src/engine/surface_collision.h', | ||||
|     'src/pc/network/network_player.h', | ||||
|     'src/pc/djui/djui_hud_utils.h', | ||||
|     'src/game/object_helpers.h', | ||||
|     'src/game/mario_step.h', | ||||
|     'src/pc/lua/utils/smlua_anim_utils.h', | ||||
|     'src/pc/lua/utils/smlua_misc_utils.h', | ||||
|     'src/pc/lua/utils/smlua_collision_utils.h', | ||||
|     'src/pc/lua/utils/smlua_level_utils.h', | ||||
|     'src/game/spawn_sound.h', | ||||
|     'src/pc/network/network.h', | ||||
|     'src/game/hardcoded.h', | ||||
|     'src/pc/mods/mod.h', | ||||
|     'src/pc/lua/utils/smlua_audio_utils.h', | ||||
|     'src/game/paintings.h', | ||||
|     'src/pc/djui/djui_types.h', | ||||
|     'src/game/first_person_cam.h' | ||||
|     "include/types.h", | ||||
|     "src/game/area.h", | ||||
|     "src/game/camera.h", | ||||
|     "src/game/characters.h", | ||||
|     "src/engine/surface_collision.h", | ||||
|     "src/pc/network/network_player.h", | ||||
|     "src/pc/djui/djui_hud_utils.h", | ||||
|     "src/game/object_helpers.h", | ||||
|     "src/game/mario_step.h", | ||||
|     "src/pc/lua/utils/smlua_anim_utils.h", | ||||
|     "src/pc/lua/utils/smlua_misc_utils.h", | ||||
|     "src/pc/lua/utils/smlua_collision_utils.h", | ||||
|     "src/pc/lua/utils/smlua_level_utils.h", | ||||
|     "src/game/spawn_sound.h", | ||||
|     "src/pc/network/network.h", | ||||
|     "src/game/hardcoded.h", | ||||
|     "src/pc/mods/mod.h", | ||||
|     "src/pc/lua/utils/smlua_audio_utils.h", | ||||
|     "src/game/paintings.h", | ||||
|     "src/pc/djui/djui_types.h", | ||||
|     "src/game/first_person_cam.h", | ||||
|     "src/game/player_palette.h" | ||||
| ] | ||||
| 
 | ||||
| out_filename_c = 'src/pc/lua/smlua_cobject_autogen.c' | ||||
|  | @ -122,8 +123,9 @@ override_field_version_excludes = { | |||
| } | ||||
| 
 | ||||
| override_allowed_structs = { | ||||
|     "src/pc/network/network.h": [ 'ServerSettings', 'NametagsSettings' ], | ||||
|     "src/pc/djui/djui_types.h": [ 'DjuiColor' ], | ||||
|     "src/pc/network/network.h": [ "ServerSettings", "NametagsSettings" ], | ||||
|     "src/pc/djui/djui_types.h": [ "DjuiColor" ], | ||||
|     "src/game/player_palette.h": [ "PlayerPalette" ] | ||||
| } | ||||
| 
 | ||||
| sLuaManuallyDefinedStructs = [{ | ||||
|  |  | |||
|  | @ -396,6 +396,35 @@ COURSE_COUNT = 25 | |||
| COURSE_MIN = 1 | ||||
| 
 | ||||
| 
 | ||||
| ------------------------------ | ||||
| -- player palette functions -- | ||||
| ------------------------------ | ||||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @param part PlayerPart | ||||
| --- @return Color | ||||
| function network_player_get_palette_color(np, part) | ||||
|     local color = { | ||||
|         r = network_player_get_palette_color_channel(np, part, 0), | ||||
|         g = network_player_get_palette_color_channel(np, part, 1), | ||||
|         b = network_player_get_palette_color_channel(np, part, 2) | ||||
|     } | ||||
|     return color | ||||
| end | ||||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @param part PlayerPart | ||||
| --- @return Color | ||||
| function network_player_get_override_palette_color(np, part) | ||||
|     local color = { | ||||
|         r = network_player_get_override_palette_color_channel(np, part, 0), | ||||
|         g = network_player_get_override_palette_color_channel(np, part, 1), | ||||
|         b = network_player_get_override_palette_color_channel(np, part, 2) | ||||
|     } | ||||
|     return color | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| ----------------- | ||||
| -- legacy font -- | ||||
| ----------------- | ||||
|  |  | |||
|  | @ -398,6 +398,35 @@ COURSE_COUNT = 25 | |||
| COURSE_MIN = 1 | ||||
| 
 | ||||
| 
 | ||||
| ------------------------------ | ||||
| -- player palette functions -- | ||||
| ------------------------------ | ||||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @param part PlayerPart | ||||
| --- @return Color | ||||
| function network_player_get_palette_color(np, part) | ||||
|     local color = { | ||||
|         r = network_player_get_palette_color_channel(np, part, 0), | ||||
|         g = network_player_get_palette_color_channel(np, part, 1), | ||||
|         b = network_player_get_palette_color_channel(np, part, 2) | ||||
|     } | ||||
|     return color | ||||
| end | ||||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @param part PlayerPart | ||||
| --- @return Color | ||||
| function network_player_get_override_palette_color(np, part) | ||||
|     local color = { | ||||
|         r = network_player_get_override_palette_color_channel(np, part, 0), | ||||
|         g = network_player_get_override_palette_color_channel(np, part, 1), | ||||
|         b = network_player_get_override_palette_color_channel(np, part, 2) | ||||
|     } | ||||
|     return color | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| ----------------- | ||||
| -- legacy font -- | ||||
| ----------------- | ||||
|  | @ -2780,178 +2809,6 @@ CT_WARIO = 4 | |||
| --- @type CharacterType | ||||
| CT_MAX = 5 | ||||
| 
 | ||||
| --- @class PalettePreset | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_MARIO = 0 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_LUIGI = 1 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_TOAD = 2 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_WARIO = 3 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_WALUIGI = 4 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_TOADETTE = 5 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_YOSHI = 6 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_BUCKEN_BERRY = 7 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_ALA_GOLD = 8 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_FIRE_MARIO = 9 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_FIRE_LUIGI = 10 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_ICE_MARIO = 11 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_ICE_LUIGI = 12 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_TOADSWORTH = 13 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_PEACH = 14 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_DAISY = 15 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_WARIO_WOODS = 16 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_GB = 17 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_N64 = 18 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_SNES = 19 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_SWITCH = 20 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_CLOVER = 21 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_COBALT = 22 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_RUBY = 23 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_FURY = 24 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_HOT_PINK = 25 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_NICE_PINK = 26 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_SEAFOAM = 27 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_LILAC = 28 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_COPPER = 29 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_AZURE = 30 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_BURGUNDY = 31 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_MINT = 32 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_ORANGE = 33 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_ARCTIC = 34 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_BLACK = 35 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_BUBBLEGUM = 36 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_BUSY_BEE = 37 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_FORTRESS = 38 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_BLUEBERRY_PIE = 39 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_RASPBERRY = 40 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_COFFEE = 41 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_MARGIN = 42 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_PUMPKIN = 43 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_SOIL = 44 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_CREVASE = 45 | ||||
| 
 | ||||
| --- @type PalettePreset | ||||
| PALETTE_PRESET_MAX = 46 | ||||
| 
 | ||||
| --- @class PlayerPart | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| PANTS = 0 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| SHIRT = 1 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| GLOVES = 2 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| SHOES = 3 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| HAIR = 4 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| SKIN = 5 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| CAP = 6 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| PLAYER_PART_MAX = 7 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| METAL = CAP | ||||
| 
 | ||||
| --- @class DialogId | ||||
| 
 | ||||
| --- @type DialogId | ||||
|  | @ -7887,6 +7744,41 @@ Y_BUTTON = CONT_Y | |||
| --- @type integer | ||||
| Z_TRIG = CONT_G | ||||
| 
 | ||||
| --- @type integer | ||||
| MAX_PRESET_PALETTES = 128 | ||||
| 
 | ||||
| --- @class PlayerPart | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| PANTS = 0 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| SHIRT = 1 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| GLOVES = 2 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| SHOES = 3 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| HAIR = 4 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| SKIN = 5 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| CAP = 6 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| EMBLEM = 7 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| PLAYER_PART_MAX = 8 | ||||
| 
 | ||||
| --- @type PlayerPart | ||||
| METAL = CAP | ||||
| 
 | ||||
| --- @type integer | ||||
| EEPROM_SIZE = 0x200 | ||||
| 
 | ||||
|  |  | |||
|  | @ -6110,14 +6110,6 @@ function get_network_player_smallest_global() | |||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @param part PlayerPart | ||||
| --- @param color Color | ||||
| --- @return nil | ||||
| function network_player_color_to_palette(np, part, color) | ||||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @return integer | ||||
| function network_player_connected_count() | ||||
|     -- ... | ||||
|  | @ -6131,9 +6123,29 @@ end | |||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @param part PlayerPart | ||||
| --- @param out Color | ||||
| --- @param index integer | ||||
| --- @return integer | ||||
| function network_player_get_override_palette_color_channel(np, part, index) | ||||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @param part PlayerPart | ||||
| --- @param index integer | ||||
| --- @return integer | ||||
| function network_player_get_palette_color_channel(np, part, index) | ||||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @return boolean | ||||
| function network_player_is_override_palette_same(np) | ||||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @return nil | ||||
| function network_player_palette_to_color(np, part, out) | ||||
| function network_player_reset_override_palette_color(np) | ||||
|     -- ... | ||||
| end | ||||
| 
 | ||||
|  | @ -6148,6 +6160,14 @@ function network_player_set_description(np, description, r, g, b, a) | |||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @param part PlayerPart | ||||
| --- @param color Color | ||||
| --- @return nil | ||||
| function network_player_set_override_palette_color(np, part, color) | ||||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @return boolean | ||||
| function network_check_singleplayer_pause() | ||||
|     -- ... | ||||
|  | @ -8629,6 +8649,22 @@ function network_discord_id_from_local_index(localIndex) | |||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @param part PlayerPart | ||||
| --- @param color Color | ||||
| --- @return nil | ||||
| function network_player_color_to_palette(np, part, color) | ||||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @param np NetworkPlayer | ||||
| --- @param part PlayerPart | ||||
| --- @param out Color | ||||
| --- @return nil | ||||
| function network_player_palette_to_color(np, part, out) | ||||
|     -- ... | ||||
| end | ||||
| 
 | ||||
| --- @param index integer | ||||
| --- @param value integer | ||||
| --- @return nil | ||||
|  |  | |||
|  | @ -345,6 +345,7 @@ s64 DynOS_Gfx_ParseGfxConstants(const String& _Arg, bool* found) { | |||
|     gfx_constant(HAIR); | ||||
|     gfx_constant(SKIN); | ||||
|     gfx_constant(CAP); | ||||
|     gfx_constant(EMBLEM); | ||||
|     gfx_constant(METAL); | ||||
| 
 | ||||
|     // Extended
 | ||||
|  |  | |||
|  | @ -9,8 +9,6 @@ | |||
| - [characters.h](#charactersh) | ||||
|     - [enum CharacterSound](#enum-CharacterSound) | ||||
|     - [enum CharacterType](#enum-CharacterType) | ||||
|     - [enum PalettePreset](#enum-PalettePreset) | ||||
|     - [enum PlayerPart](#enum-PlayerPart) | ||||
| - [dialog_ids.h](#dialog_idsh) | ||||
|     - [enum DialogId](#enum-DialogId) | ||||
| - [djui_console.h](#djui_consoleh) | ||||
|  | @ -55,6 +53,8 @@ | |||
| - [object_list_processor.h](#object_list_processorh) | ||||
|     - [enum ObjectList](#enum-ObjectList) | ||||
| - [os_cont.h](#os_conth) | ||||
| - [player_palette.h](#player_paletteh) | ||||
|     - [enum PlayerPart](#enum-PlayerPart) | ||||
| - [save_file.h](#save_fileh) | ||||
|     - [enum SaveFileIndex](#enum-SaveFileIndex) | ||||
| - [seq_ids.h](#seq_idsh) | ||||
|  | @ -900,70 +900,6 @@ | |||
| | CT_WARIO | 4 | | ||||
| | CT_MAX | 5 | | ||||
| 
 | ||||
| ### [enum PalettePreset](#PalettePreset) | ||||
| | Identifier | Value | | ||||
| | :--------- | :---- | | ||||
| | PALETTE_MARIO | 0 | | ||||
| | PALETTE_LUIGI | 1 | | ||||
| | PALETTE_TOAD | 2 | | ||||
| | PALETTE_WARIO | 3 | | ||||
| | PALETTE_WALUIGI | 4 | | ||||
| | PALETTE_TOADETTE | 5 | | ||||
| | PALETTE_YOSHI | 6 | | ||||
| | PALETTE_BUCKEN_BERRY | 7 | | ||||
| | PALETTE_ALA_GOLD | 8 | | ||||
| | PALETTE_FIRE_MARIO | 9 | | ||||
| | PALETTE_FIRE_LUIGI | 10 | | ||||
| | PALETTE_ICE_MARIO | 11 | | ||||
| | PALETTE_ICE_LUIGI | 12 | | ||||
| | PALETTE_TOADSWORTH | 13 | | ||||
| | PALETTE_PEACH | 14 | | ||||
| | PALETTE_DAISY | 15 | | ||||
| | PALETTE_WARIO_WOODS | 16 | | ||||
| | PALETTE_GB | 17 | | ||||
| | PALETTE_N64 | 18 | | ||||
| | PALETTE_SNES | 19 | | ||||
| | PALETTE_SWITCH | 20 | | ||||
| | PALETTE_CLOVER | 21 | | ||||
| | PALETTE_COBALT | 22 | | ||||
| | PALETTE_RUBY | 23 | | ||||
| | PALETTE_FURY | 24 | | ||||
| | PALETTE_HOT_PINK | 25 | | ||||
| | PALETTE_NICE_PINK | 26 | | ||||
| | PALETTE_SEAFOAM | 27 | | ||||
| | PALETTE_LILAC | 28 | | ||||
| | PALETTE_COPPER | 29 | | ||||
| | PALETTE_AZURE | 30 | | ||||
| | PALETTE_BURGUNDY | 31 | | ||||
| | PALETTE_MINT | 32 | | ||||
| | PALETTE_ORANGE | 33 | | ||||
| | PALETTE_ARCTIC | 34 | | ||||
| | PALETTE_BLACK | 35 | | ||||
| | PALETTE_BUBBLEGUM | 36 | | ||||
| | PALETTE_BUSY_BEE | 37 | | ||||
| | PALETTE_FORTRESS | 38 | | ||||
| | PALETTE_BLUEBERRY_PIE | 39 | | ||||
| | PALETTE_RASPBERRY | 40 | | ||||
| | PALETTE_COFFEE | 41 | | ||||
| | PALETTE_MARGIN | 42 | | ||||
| | PALETTE_PUMPKIN | 43 | | ||||
| | PALETTE_SOIL | 44 | | ||||
| | PALETTE_CREVASE | 45 | | ||||
| | PALETTE_PRESET_MAX | 46 | | ||||
| 
 | ||||
| ### [enum PlayerPart](#PlayerPart) | ||||
| | Identifier | Value | | ||||
| | :--------- | :---- | | ||||
| | PANTS | 0 | | ||||
| | SHIRT | 1 | | ||||
| | GLOVES | 2 | | ||||
| | SHOES | 3 | | ||||
| | HAIR | 4 | | ||||
| | SKIN | 5 | | ||||
| | CAP | 6 | | ||||
| | PLAYER_PART_MAX | 7 | | ||||
| | METAL | CAP | | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
|  | @ -2821,6 +2757,27 @@ | |||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [player_palette.h](#player_palette.h) | ||||
| - MAX_PRESET_PALETTES | ||||
| 
 | ||||
| ### [enum PlayerPart](#PlayerPart) | ||||
| | Identifier | Value | | ||||
| | :--------- | :---- | | ||||
| | PANTS | 0 | | ||||
| | SHIRT | 1 | | ||||
| | GLOVES | 2 | | ||||
| | SHOES | 3 | | ||||
| | HAIR | 4 | | ||||
| | SKIN | 5 | | ||||
| | CAP | 6 | | ||||
| | EMBLEM | 7 | | ||||
| | PLAYER_PART_MAX | 8 | | ||||
| | METAL | CAP | | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [save_file.h](#save_file.h) | ||||
| - EEPROM_SIZE | ||||
| - NUM_SAVE_FILES | ||||
|  |  | |||
|  | @ -1275,28 +1275,6 @@ | |||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [network_player_color_to_palette](#network_player_color_to_palette) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `network_player_color_to_palette(np, part, color)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | np | [NetworkPlayer](structs.md#NetworkPlayer) | | ||||
| | part | [enum PlayerPart](constants.md#enum-PlayerPart) | | ||||
| | color | `Color` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void network_player_color_to_palette(struct NetworkPlayer *np, enum PlayerPart part, Color color);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [network_player_connected_count](#network_player_connected_count) | ||||
| 
 | ||||
| ### Lua Example | ||||
|  | @ -1335,23 +1313,85 @@ | |||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [network_player_palette_to_color](#network_player_palette_to_color) | ||||
| ## [network_player_get_override_palette_color_channel](#network_player_get_override_palette_color_channel) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `network_player_palette_to_color(np, part, out)` | ||||
| `local integerValue = network_player_get_override_palette_color_channel(np, part, index)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | np | [NetworkPlayer](structs.md#NetworkPlayer) | | ||||
| | part | [enum PlayerPart](constants.md#enum-PlayerPart) | | ||||
| | out | `Color` | | ||||
| | index | `integer` | | ||||
| 
 | ||||
| ### Returns | ||||
| - `integer` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `u8 network_player_get_override_palette_color_channel(struct NetworkPlayer *np, enum PlayerPart part, u8 index);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [network_player_get_palette_color_channel](#network_player_get_palette_color_channel) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local integerValue = network_player_get_palette_color_channel(np, part, index)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | np | [NetworkPlayer](structs.md#NetworkPlayer) | | ||||
| | part | [enum PlayerPart](constants.md#enum-PlayerPart) | | ||||
| | index | `integer` | | ||||
| 
 | ||||
| ### Returns | ||||
| - `integer` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `u8 network_player_get_palette_color_channel(struct NetworkPlayer *np, enum PlayerPart part, u8 index);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [network_player_is_override_palette_same](#network_player_is_override_palette_same) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local booleanValue = network_player_is_override_palette_same(np)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | np | [NetworkPlayer](structs.md#NetworkPlayer) | | ||||
| 
 | ||||
| ### Returns | ||||
| - `boolean` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `bool network_player_is_override_palette_same(struct NetworkPlayer *np);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [network_player_reset_override_palette_color](#network_player_reset_override_palette_color) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `network_player_reset_override_palette_color(np)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | np | [NetworkPlayer](structs.md#NetworkPlayer) | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void network_player_palette_to_color(struct NetworkPlayer *np, enum PlayerPart part, Color out);` | ||||
| `void network_player_reset_override_palette_color(struct NetworkPlayer *np);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
|  | @ -1382,6 +1422,28 @@ | |||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [network_player_set_override_palette_color](#network_player_set_override_palette_color) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `network_player_set_override_palette_color(np, part, color)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | np | [NetworkPlayer](structs.md#NetworkPlayer) | | ||||
| | part | [enum PlayerPart](constants.md#enum-PlayerPart) | | ||||
| | color | `Color` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void network_player_set_override_palette_color(struct NetworkPlayer *np, enum PlayerPart part, Color color);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| --- | ||||
| # functions from network_utils.h | ||||
| 
 | ||||
|  | @ -8378,401 +8440,6 @@ | |||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| --- | ||||
| # functions from smlua_audio_utils.h | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| 
 | ||||
| ## [audio_sample_destroy](#audio_sample_destroy) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_sample_destroy(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_sample_destroy(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_sample_load](#audio_sample_load) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local ModAudioValue = audio_sample_load(filename)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | filename | `string` | | ||||
| 
 | ||||
| ### Returns | ||||
| [ModAudio](structs.md#ModAudio) | ||||
| 
 | ||||
| ### C Prototype | ||||
| `struct ModAudio* audio_sample_load(const char* filename);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_sample_play](#audio_sample_play) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_sample_play(audio, position, volume)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | position | [Vec3f](structs.md#Vec3f) | | ||||
| | volume | `number` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_sample_play(struct ModAudio* audio, Vec3f position, f32 volume);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_sample_stop](#audio_sample_stop) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_sample_stop(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_sample_stop(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_destroy](#audio_stream_destroy) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_destroy(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_destroy(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_get_frequency](#audio_stream_get_frequency) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local numberValue = audio_stream_get_frequency(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - `number` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `f32 audio_stream_get_frequency(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_get_looping](#audio_stream_get_looping) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local booleanValue = audio_stream_get_looping(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - `boolean` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `bool audio_stream_get_looping(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_get_position](#audio_stream_get_position) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local numberValue = audio_stream_get_position(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - `number` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `f32 audio_stream_get_position(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_get_volume](#audio_stream_get_volume) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local numberValue = audio_stream_get_volume(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - `number` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `f32 audio_stream_get_volume(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_load](#audio_stream_load) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local ModAudioValue = audio_stream_load(filename)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | filename | `string` | | ||||
| 
 | ||||
| ### Returns | ||||
| [ModAudio](structs.md#ModAudio) | ||||
| 
 | ||||
| ### C Prototype | ||||
| `struct ModAudio* audio_stream_load(const char* filename);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_pause](#audio_stream_pause) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_pause(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_pause(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_play](#audio_stream_play) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_play(audio, restart, volume)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | restart | `boolean` | | ||||
| | volume | `number` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_play(struct ModAudio* audio, bool restart, f32 volume);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_set_frequency](#audio_stream_set_frequency) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_set_frequency(audio, freq)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | freq | `number` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_set_frequency(struct ModAudio* audio, f32 freq);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_set_looping](#audio_stream_set_looping) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_set_looping(audio, looping)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | looping | `boolean` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_set_looping(struct ModAudio* audio, bool looping);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_set_position](#audio_stream_set_position) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_set_position(audio, pos)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | pos | `number` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_set_position(struct ModAudio* audio, f32 pos);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_set_volume](#audio_stream_set_volume) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_set_volume(audio, volume)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | volume | `number` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_set_volume(struct ModAudio* audio, f32 volume);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_stop](#audio_stream_stop) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_stop(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_stop(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [smlua_audio_utils_replace_sequence](#smlua_audio_utils_replace_sequence) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `smlua_audio_utils_replace_sequence(sequenceId, bankId, defaultVolume, m64Name)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | sequenceId | `integer` | | ||||
| | bankId | `integer` | | ||||
| | defaultVolume | `integer` | | ||||
| | m64Name | `string` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void smlua_audio_utils_replace_sequence(u8 sequenceId, u8 bankId, u8 defaultVolume, const char* m64Name);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [smlua_audio_utils_reset_all](#smlua_audio_utils_reset_all) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `smlua_audio_utils_reset_all()` | ||||
| 
 | ||||
| ### Parameters | ||||
| - None | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void smlua_audio_utils_reset_all(void);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| --- | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,6 +5,401 @@ | |||
| [< prev](functions-4.md) | [1](functions.md) | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | 5] | ||||
| 
 | ||||
| 
 | ||||
| --- | ||||
| # functions from smlua_audio_utils.h | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| 
 | ||||
| ## [audio_sample_destroy](#audio_sample_destroy) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_sample_destroy(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_sample_destroy(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_sample_load](#audio_sample_load) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local ModAudioValue = audio_sample_load(filename)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | filename | `string` | | ||||
| 
 | ||||
| ### Returns | ||||
| [ModAudio](structs.md#ModAudio) | ||||
| 
 | ||||
| ### C Prototype | ||||
| `struct ModAudio* audio_sample_load(const char* filename);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_sample_play](#audio_sample_play) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_sample_play(audio, position, volume)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | position | [Vec3f](structs.md#Vec3f) | | ||||
| | volume | `number` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_sample_play(struct ModAudio* audio, Vec3f position, f32 volume);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_sample_stop](#audio_sample_stop) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_sample_stop(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_sample_stop(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_destroy](#audio_stream_destroy) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_destroy(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_destroy(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_get_frequency](#audio_stream_get_frequency) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local numberValue = audio_stream_get_frequency(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - `number` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `f32 audio_stream_get_frequency(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_get_looping](#audio_stream_get_looping) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local booleanValue = audio_stream_get_looping(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - `boolean` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `bool audio_stream_get_looping(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_get_position](#audio_stream_get_position) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local numberValue = audio_stream_get_position(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - `number` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `f32 audio_stream_get_position(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_get_volume](#audio_stream_get_volume) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local numberValue = audio_stream_get_volume(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - `number` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `f32 audio_stream_get_volume(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_load](#audio_stream_load) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `local ModAudioValue = audio_stream_load(filename)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | filename | `string` | | ||||
| 
 | ||||
| ### Returns | ||||
| [ModAudio](structs.md#ModAudio) | ||||
| 
 | ||||
| ### C Prototype | ||||
| `struct ModAudio* audio_stream_load(const char* filename);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_pause](#audio_stream_pause) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_pause(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_pause(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_play](#audio_stream_play) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_play(audio, restart, volume)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | restart | `boolean` | | ||||
| | volume | `number` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_play(struct ModAudio* audio, bool restart, f32 volume);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_set_frequency](#audio_stream_set_frequency) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_set_frequency(audio, freq)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | freq | `number` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_set_frequency(struct ModAudio* audio, f32 freq);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_set_looping](#audio_stream_set_looping) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_set_looping(audio, looping)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | looping | `boolean` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_set_looping(struct ModAudio* audio, bool looping);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_set_position](#audio_stream_set_position) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_set_position(audio, pos)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | pos | `number` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_set_position(struct ModAudio* audio, f32 pos);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_set_volume](#audio_stream_set_volume) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_set_volume(audio, volume)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| | volume | `number` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_set_volume(struct ModAudio* audio, f32 volume);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [audio_stream_stop](#audio_stream_stop) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `audio_stream_stop(audio)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | audio | [ModAudio](structs.md#ModAudio) | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void audio_stream_stop(struct ModAudio* audio);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [smlua_audio_utils_replace_sequence](#smlua_audio_utils_replace_sequence) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `smlua_audio_utils_replace_sequence(sequenceId, bankId, defaultVolume, m64Name)` | ||||
| 
 | ||||
| ### Parameters | ||||
| | Field | Type | | ||||
| | ----- | ---- | | ||||
| | sequenceId | `integer` | | ||||
| | bankId | `integer` | | ||||
| | defaultVolume | `integer` | | ||||
| | m64Name | `string` | | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void smlua_audio_utils_replace_sequence(u8 sequenceId, u8 bankId, u8 defaultVolume, const char* m64Name);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| ## [smlua_audio_utils_reset_all](#smlua_audio_utils_reset_all) | ||||
| 
 | ||||
| ### Lua Example | ||||
| `smlua_audio_utils_reset_all()` | ||||
| 
 | ||||
| ### Parameters | ||||
| - None | ||||
| 
 | ||||
| ### Returns | ||||
| - None | ||||
| 
 | ||||
| ### C Prototype | ||||
| `void smlua_audio_utils_reset_all(void);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| --- | ||||
| # functions from smlua_collision_utils.h | ||||
| 
 | ||||
|  |  | |||
|  | @ -1180,11 +1180,14 @@ | |||
|    - [get_network_player_from_area](functions-4.md#get_network_player_from_area) | ||||
|    - [get_network_player_from_level](functions-4.md#get_network_player_from_level) | ||||
|    - [get_network_player_smallest_global](functions-4.md#get_network_player_smallest_global) | ||||
|    - [network_player_color_to_palette](functions-4.md#network_player_color_to_palette) | ||||
|    - [network_player_connected_count](functions-4.md#network_player_connected_count) | ||||
|    - [network_player_from_global_index](functions-4.md#network_player_from_global_index) | ||||
|    - [network_player_palette_to_color](functions-4.md#network_player_palette_to_color) | ||||
|    - [network_player_get_override_palette_color_channel](functions-4.md#network_player_get_override_palette_color_channel) | ||||
|    - [network_player_get_palette_color_channel](functions-4.md#network_player_get_palette_color_channel) | ||||
|    - [network_player_is_override_palette_same](functions-4.md#network_player_is_override_palette_same) | ||||
|    - [network_player_reset_override_palette_color](functions-4.md#network_player_reset_override_palette_color) | ||||
|    - [network_player_set_description](functions-4.md#network_player_set_description) | ||||
|    - [network_player_set_override_palette_color](functions-4.md#network_player_set_override_palette_color) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
|  | @ -1563,25 +1566,25 @@ | |||
| <br /> | ||||
| 
 | ||||
| - smlua_audio_utils.h | ||||
|    - [audio_sample_destroy](functions-4.md#audio_sample_destroy) | ||||
|    - [audio_sample_load](functions-4.md#audio_sample_load) | ||||
|    - [audio_sample_play](functions-4.md#audio_sample_play) | ||||
|    - [audio_sample_stop](functions-4.md#audio_sample_stop) | ||||
|    - [audio_stream_destroy](functions-4.md#audio_stream_destroy) | ||||
|    - [audio_stream_get_frequency](functions-4.md#audio_stream_get_frequency) | ||||
|    - [audio_stream_get_looping](functions-4.md#audio_stream_get_looping) | ||||
|    - [audio_stream_get_position](functions-4.md#audio_stream_get_position) | ||||
|    - [audio_stream_get_volume](functions-4.md#audio_stream_get_volume) | ||||
|    - [audio_stream_load](functions-4.md#audio_stream_load) | ||||
|    - [audio_stream_pause](functions-4.md#audio_stream_pause) | ||||
|    - [audio_stream_play](functions-4.md#audio_stream_play) | ||||
|    - [audio_stream_set_frequency](functions-4.md#audio_stream_set_frequency) | ||||
|    - [audio_stream_set_looping](functions-4.md#audio_stream_set_looping) | ||||
|    - [audio_stream_set_position](functions-4.md#audio_stream_set_position) | ||||
|    - [audio_stream_set_volume](functions-4.md#audio_stream_set_volume) | ||||
|    - [audio_stream_stop](functions-4.md#audio_stream_stop) | ||||
|    - [smlua_audio_utils_replace_sequence](functions-4.md#smlua_audio_utils_replace_sequence) | ||||
|    - [smlua_audio_utils_reset_all](functions-4.md#smlua_audio_utils_reset_all) | ||||
|    - [audio_sample_destroy](functions-5.md#audio_sample_destroy) | ||||
|    - [audio_sample_load](functions-5.md#audio_sample_load) | ||||
|    - [audio_sample_play](functions-5.md#audio_sample_play) | ||||
|    - [audio_sample_stop](functions-5.md#audio_sample_stop) | ||||
|    - [audio_stream_destroy](functions-5.md#audio_stream_destroy) | ||||
|    - [audio_stream_get_frequency](functions-5.md#audio_stream_get_frequency) | ||||
|    - [audio_stream_get_looping](functions-5.md#audio_stream_get_looping) | ||||
|    - [audio_stream_get_position](functions-5.md#audio_stream_get_position) | ||||
|    - [audio_stream_get_volume](functions-5.md#audio_stream_get_volume) | ||||
|    - [audio_stream_load](functions-5.md#audio_stream_load) | ||||
|    - [audio_stream_pause](functions-5.md#audio_stream_pause) | ||||
|    - [audio_stream_play](functions-5.md#audio_stream_play) | ||||
|    - [audio_stream_set_frequency](functions-5.md#audio_stream_set_frequency) | ||||
|    - [audio_stream_set_looping](functions-5.md#audio_stream_set_looping) | ||||
|    - [audio_stream_set_position](functions-5.md#audio_stream_set_position) | ||||
|    - [audio_stream_set_volume](functions-5.md#audio_stream_set_volume) | ||||
|    - [audio_stream_stop](functions-5.md#audio_stream_stop) | ||||
|    - [smlua_audio_utils_replace_sequence](functions-5.md#smlua_audio_utils_replace_sequence) | ||||
|    - [smlua_audio_utils_reset_all](functions-5.md#smlua_audio_utils_reset_all) | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| #ifndef STDDEF_H | ||||
| #define STDDEF_H | ||||
| 
 | ||||
| #include "PR/ultratypes.h" | ||||
| #include <PR/ultratypes.h> | ||||
| 
 | ||||
| #ifndef offsetof | ||||
| #define offsetof(st, m) ((size_t)&(((st *)0)->m)) | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| #ifndef STRING_H | ||||
| #define STRING_H | ||||
| 
 | ||||
| #include "PR/ultratypes.h" | ||||
| #include <PR/ultratypes.h> | ||||
| 
 | ||||
| void *memcpy(void *dst, const void *src, size_t size); | ||||
| size_t strlen(const char *str); | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ DIED = "@ umřel" | |||
| DEBUG_FLY = "@ vstoupil do stavu volného letu" | ||||
| IMPORT_MOD_SUCCESS = "\\#a0ffa0\\Importován mod\n\\#dcdcdc\\'@'" | ||||
| IMPORT_DYNOS_SUCCESS = "\\#a0ffa0\\Importován DynOS pack\n\\#dcdcdc\\'@'" | ||||
| IMPORT_PALETTE_SUCCESS = "\\#a0ffa0\\Importované přednastavení palety\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL = "\\#ffa0a0\\Chyba importu modu nebo DynOS packu\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL_INGAME = "\\#ffa0a0\\Nelze importovat mod, protože jste ve hře" | ||||
| COOPNET_CONNECTION_FAILED = "\\#ffa0a0\\Nezdařilo se připojit na CoopNet!" | ||||
|  | @ -314,6 +315,7 @@ SHOES = "Boty" | |||
| HAIR = "Vlasy" | ||||
| SKIN = "Kůže" | ||||
| CAP = "Čepice" | ||||
| EMBLEM = "Symbol" | ||||
| PALETTE = "BARVY" | ||||
| PART = "Část" | ||||
| HEX_CODE = "Hex Kód" | ||||
|  | @ -325,6 +327,9 @@ NAME = "Jméno" | |||
| MODEL = "Model" | ||||
| PALETTE_PRESET = "Přednastavení barev" | ||||
| EDIT_PALETTE = "Upravit barvy" | ||||
| PRESET_NAME = "Název" | ||||
| DELETE_PRESET = "Smazat" | ||||
| SAVE_PRESET = "Uložit" | ||||
| 
 | ||||
| [PALETTE] | ||||
| MARIO = "Mario" | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ DIED = "@ is dood gegaan." | |||
| DEBUG_FLY = "@ is in debug vrij vliegen gegaan." | ||||
| IMPORT_MOD_SUCCESS = "\\#a0ffa0\\Geimporteerd mod\n\\#dcdcdc\\'@'" | ||||
| IMPORT_DYNOS_SUCCESS = "\\#a0ffa0\\Geimporteerd DynOS pack\n\\#dcdcdc\\'@'" | ||||
| IMPORT_PALETTE_SUCCESS = "\\#a0ffa0\\Geïmporteerd paletvoorinstelling\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL = "\\#ffa0a0\\gefaalt om \n\\#dcdcdc\\'@' te importeren." | ||||
| IMPORT_FAIL_INGAME = "\\#ffa0a0\\Kan niet importen in een spel." | ||||
| COOPNET_CONNECTION_FAILED = "\\#ffa0a0\\Kon niet met CoopNet verbinden." | ||||
|  | @ -314,6 +315,7 @@ SHOES = "Schoenen" | |||
| HAIR = "Haar" | ||||
| SKIN = "Huid" | ||||
| CAP = "Hoed" | ||||
| EMBLEM = "Embleem" | ||||
| PALETTE = "PALET" | ||||
| PART = "Deel" | ||||
| HEX_CODE = "Hex-Code" | ||||
|  | @ -325,6 +327,9 @@ NAME = "Naam" | |||
| MODEL = "Model" | ||||
| PALETTE_PRESET = "Palet voor-instelling" | ||||
| EDIT_PALETTE = "Bewerk Palet" | ||||
| PRESET_NAME = "Naam" | ||||
| DELETE_PRESET = "Verwijderen" | ||||
| SAVE_PRESET = "Opslaan" | ||||
| 
 | ||||
| [PALETTE] | ||||
| MARIO = "Mario" | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ DIED = "@ died" | |||
| DEBUG_FLY = "@ entered debug free-fly mode" | ||||
| IMPORT_MOD_SUCCESS = "\\#a0ffa0\\Imported mod\n\\#dcdcdc\\'@'" | ||||
| IMPORT_DYNOS_SUCCESS = "\\#a0ffa0\\Imported DynOS pack\n\\#dcdcdc\\'@'" | ||||
| IMPORT_PALETTE_SUCCESS = "\\#a0ffa0\\Imported palette preset\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL = "\\#ffa0a0\\Failed to import\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL_INGAME = "\\#ffa0a0\\Can not import while in-game" | ||||
| COOPNET_CONNECTION_FAILED = "\\#ffa0a0\\Could not connect to CoopNet!" | ||||
|  | @ -314,6 +315,7 @@ SHOES = "Shoes" | |||
| HAIR = "Hair" | ||||
| SKIN = "Skin" | ||||
| CAP = "Cap" | ||||
| EMBLEM = "Emblem" | ||||
| PALETTE = "PALETTE" | ||||
| PART = "Part" | ||||
| HEX_CODE = "Hex Code" | ||||
|  | @ -322,9 +324,12 @@ GREEN = "Green" | |||
| BLUE = "Blue" | ||||
| PLAYER = "Player" | ||||
| NAME = "Name" | ||||
| MODEL = "Model" | ||||
| MODEL = "Character" | ||||
| PALETTE_PRESET = "Palette Preset" | ||||
| EDIT_PALETTE = "Edit Palette" | ||||
| PRESET_NAME = "Preset Name" | ||||
| DELETE_PRESET = "Delete Preset" | ||||
| SAVE_PRESET = "Save Preset" | ||||
| 
 | ||||
| [PALETTE] | ||||
| MARIO = "Mario" | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ DIED = "@ est mort" | |||
| DEBUG_FLY = "@ a activé le mode vol (débug) " | ||||
| IMPORT_MOD_SUCCESS = "\\#a0ffa0\\Le mod\n\\#dcdcdc\\'@'\\#a0ffa0\\\na été importé." | ||||
| IMPORT_DYNOS_SUCCESS = "\\#a0ffa0\\Le pack DynOS\n\\#dcdcdc\\'@'\n\\#a0ffa0\\a été importé." | ||||
| IMPORT_PALETTE_SUCCESS = "\\#a0ffa0\\Préréglage de palette importé\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL = "\\#ffa0a0\\L'importation de\n\\#dcdcdc\\'@'\\#ffa0a0\\\na échoué." | ||||
| IMPORT_FAIL_INGAME = "\\#ffa0a0\\L'importation ne peut pas se faire pendant la partie." | ||||
| COOPNET_CONNECTION_FAILED = "\\#ffa0a0\\La connexion à CoopNet a échouée!" | ||||
|  | @ -314,6 +315,7 @@ SHOES = "Chaussures" | |||
| HAIR = "Cheveux" | ||||
| SKIN = "Peau" | ||||
| CAP = "Casquette" | ||||
| EMBLEM = "Emblème" | ||||
| PALETTE = "PALETTE" | ||||
| PART = "Partie du corps" | ||||
| HEX_CODE = "Code Couleur" | ||||
|  | @ -325,6 +327,9 @@ NAME = "Pseudo" | |||
| MODEL = "Personnage" | ||||
| PALETTE_PRESET = "Palettes par défaut" | ||||
| EDIT_PALETTE = "Modifier la palette" | ||||
| PRESET_NAME = "Nom" | ||||
| DELETE_PRESET = "Supprimer" | ||||
| SAVE_PRESET = "Enregistrer" | ||||
| 
 | ||||
| [PALETTE] | ||||
| MARIO = "Mario" | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ DIED = "@ ist gestorben." | |||
| DEBUG_FLY = "@ hat den Debug-Free-Fly-Modus aktiviert." | ||||
| IMPORT_MOD_SUCCESS = "\\#a0ffa0\\Mod importiert\n\\#dcdcdc\\'@'" | ||||
| IMPORT_DYNOS_SUCCESS = "\\#a0ffa0\\DynOS-Paket importiert\n\\#dcdcdc\\'@'" | ||||
| IMPORT_PALETTE_SUCCESS = "\\#a0ffa0\\Importiertes Paletten-Voreinstellung\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL = "\\#ffa0a0\\Import fehlgeschlagen für\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL_INGAME = "\\#ffa0a0\\Kann nicht im Spiel importieren." | ||||
| COOPNET_CONNECTION_FAILED = "\\#ffa0a0\\Verbindung zu CoopNet fehlgeschlagen!" | ||||
|  | @ -314,6 +315,7 @@ SHOES = "Schuhe" | |||
| HAIR = "Haar" | ||||
| SKIN = "Haut" | ||||
| CAP = "Mütze" | ||||
| EMBLEM = "Emblem" | ||||
| PALETTE = "PALETTE" | ||||
| PART = "Teil" | ||||
| HEX_CODE = "Hex-Code" | ||||
|  | @ -325,6 +327,9 @@ NAME = "Name" | |||
| MODEL = "Modell" | ||||
| PALETTE_PRESET = "Palette-Vorlage" | ||||
| EDIT_PALETTE = "Palette bearbeiten" | ||||
| PRESET_NAME = "Name" | ||||
| DELETE_PRESET = "Löschen" | ||||
| SAVE_PRESET = "Speichern" | ||||
| 
 | ||||
| [PALETTE] | ||||
| MARIO = "Mario" | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ DIED = "@ è morto" | |||
| DEBUG_FLY = "@ è entrato nello stato di debug di volo libero" | ||||
| IMPORT_MOD_SUCCESS = "\\#a0ffa0\\importata la mod\n\\#dcdcdc\\'@'" | ||||
| IMPORT_DYNOS_SUCCESS = "\\#a0ffa0\\Importato il pacchetto DynOS\n\\#dcdcdc\\'@'" | ||||
| IMPORT_PALETTE_SUCCESS = "\\#a0ffa0\\Preimpostazione di palette importata\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL = "\\#ffa0a0\\Impossibile importare\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL_INGAME = "\\#ffa0a0\\Impossibile importare durante la partita" | ||||
| COOPNET_CONNECTION_FAILED = "\\#ffa0a0\\Could not connect to CoopNet!" | ||||
|  | @ -312,6 +313,7 @@ SHOES = "Scarpe" | |||
| HAIR = "Capelli" | ||||
| SKIN = "Pelle" | ||||
| CAP = "Cappello" | ||||
| EMBLEM = "Emblema" | ||||
| PALETTE = "PALETTE" | ||||
| PART = "Parte" | ||||
| HEX_CODE = "codice Hex" | ||||
|  | @ -323,6 +325,9 @@ NAME = "Nome" | |||
| MODEL = "Modello" | ||||
| PALETTE_PRESET = "Opzioni Palette" | ||||
| EDIT_PALETTE = "Modifica Palette" | ||||
| PRESET_NAME = "Nome" | ||||
| DELETE_PRESET = "Eliminare" | ||||
| SAVE_PRESET = "Salvare" | ||||
| 
 | ||||
| [PALETTE] | ||||
| MARIO = "Mario" | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ DIED = "Gracz @ umarl" | |||
| DEBUG_FLY = "Gracz @ wszedl w debugowy stan latania" | ||||
| IMPORT_MOD_SUCCESS = "\\#a0ffa0\\Zaimportowano mod\n\\#c8c8c8\\'@'" | ||||
| IMPORT_DYNOS_SUCCESS = "\\#a0ffa0\\Zaimportowano paczke DynOS\n\\#c8c8c8\\'@'" | ||||
| IMPORT_PALETTE_SUCCESS = "\\#a0ffa0\\Zaimportowany preset palety\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL = "\\#ffa0a0\\Nie udalo sie zaimportowac\n\\#c8c8c8\\'@'" | ||||
| IMPORT_FAIL_INGAME = "\\#ffa0a0\\Nie mozna importowac podczas gry" | ||||
| COOPNET_CONNECTION_FAILED = "\\#ffa0a0\\Nie udalo sie polaczyc z CoopNetem!" | ||||
|  | @ -314,6 +315,7 @@ SHOES = "Buty" | |||
| HAIR = "Wlosy" | ||||
| SKIN = "Skora" | ||||
| CAP = "Czapka" | ||||
| EMBLEM = "Godło" | ||||
| PALETTE = "PALETA" | ||||
| PART = "Czesc" | ||||
| HEX_CODE = "Kod Hex" | ||||
|  | @ -325,6 +327,9 @@ NAME = "Nazwa" | |||
| MODEL = "Model" | ||||
| PALETTE_PRESET = "Preset Palety" | ||||
| EDIT_PALETTE = "Edytuj Palete" | ||||
| PRESET_NAME = "Nazwa presetu" | ||||
| DELETE_PRESET = "Usuń preset" | ||||
| SAVE_PRESET = "Zapisz preset" | ||||
| 
 | ||||
| [PALETTE] | ||||
| MARIO = "Mario" | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ DIED = "@ morreu" | |||
| DEBUG_FLY = "@ entrou no estado de debug para voar" | ||||
| IMPORT_MOD_SUCCESS = "\\#dcdcdc\\'@'\n\\#a0ffa0\\Mod importado" | ||||
| IMPORT_DYNOS_SUCCESS = "\\#a0ffa0\\Pacote DynOS\n\\#dcdcdc\\'@'\\#a0ffa0\\\nimportado" | ||||
| IMPORT_PALETTE_SUCCESS = "\\#a0ffa0\\Predefinição de paleta importada\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL = "\\#ffa0a0\\Falha ao importar\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL_INGAME = "\\#ffa0a0\\Falha ao importar durante o jogo" | ||||
| COOPNET_CONNECTION_FAILED = "\\#ffa0a0\\Não foi possível se conectar ao CoopNet!" | ||||
|  | @ -314,6 +315,7 @@ SHOES = "Sapatos" | |||
| HAIR = "Cabelo" | ||||
| SKIN = "Pele" | ||||
| CAP = "Chapéu" | ||||
| EMBLEM = "Emblema" | ||||
| PALETTE = "PALETA" | ||||
| PART = "Parte" | ||||
| HEX_CODE = "Código hexadecimal" | ||||
|  | @ -325,6 +327,9 @@ NAME = "Nome" | |||
| MODEL = "Modelo" | ||||
| PALETTE_PRESET = "Predefinição de paleta" | ||||
| EDIT_PALETTE = "Editar paleta" | ||||
| PRESET_NAME = "Nome" | ||||
| DELETE_PRESET = "Excluir" | ||||
| SAVE_PRESET = "Salvar" | ||||
| 
 | ||||
| [PALETTE] | ||||
| MARIO = "Mario" | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ DIED = "@ умер" | |||
| DEBUG_FLY = "@ вошел в состояние свободного полета отладки" | ||||
| IMPORT_MOD_SUCCESS = "\\#a0ffa0\\Импортирован мод\n\\#dcdcdc\\'@'" | ||||
| IMPORT_DYNOS_SUCCESS = "\\#a0ffa0\\Импортированнан пакет DynOS\n\\#dcdcdc\\'@'" | ||||
| IMPORT_PALETTE_SUCCESS = "\\#a0ffa0\\Импортированный предустановленный набор палитр\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL = "\\#ffa0a0\\Не удалось импортировать\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL_INGAME = "\\#ffa0a0\\Невозможно импортировать во время игры" | ||||
| COOPNET_CONNECTION_FAILED = "\\#ffa0a0\\Не удалось установить соединение с CoopNet!" | ||||
|  | @ -313,6 +314,7 @@ SHOES = "Обувь" | |||
| HAIR = "Волосы" | ||||
| SKIN = "Кожа" | ||||
| CAP = "Кепка" | ||||
| EMBLEM = "Логотип" | ||||
| PALETTE = "PALETTE" | ||||
| PART = "Часть" | ||||
| HEX_CODE = "HEX код" | ||||
|  | @ -324,6 +326,9 @@ NAME = "Имя" | |||
| MODEL = "Модель" | ||||
| PALETTE_PRESET = "Предустановка палитры" | ||||
| EDIT_PALETTE = "Редактировать палитру" | ||||
| PRESET_NAME = "Имя" | ||||
| DELETE_PRESET = "Удалить" | ||||
| SAVE_PRESET = "Сохранить" | ||||
| 
 | ||||
| [PALETTE] | ||||
| MARIO = "Марио" | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ DIED = "@ ha muerto." | |||
| DEBUG_FLY = "@ Está en estado de vuelo libre debug." | ||||
| IMPORT_MOD_SUCCESS = "El mod \\#dcdcdc\\'@'\\#a0ffa0\\\nha sido importado con éxito." | ||||
| IMPORT_DYNOS_SUCCESS = "El pack de DynOS \\#dcdcdc\\'@'\\#a0ffa0\\\nha sido importado con éxito." | ||||
| IMPORT_PALETTE_SUCCESS = "\\#a0ffa0\\Ajuste preestablecido de paleta importado\n\\#dcdcdc\\'@'" | ||||
| IMPORT_FAIL = "\n\\#ffa0a0\\Error al importar el archivo. \\#dcdcdc\\\n'@'" | ||||
| IMPORT_FAIL_INGAME = "\\#ffa0a0\\No se pueden importar archivos\nen medio de una partida." | ||||
| COOPNET_CONNECTION_FAILED = "\\#ffa0a0\\¡No se ha podido conectar a CoopNet!" | ||||
|  | @ -314,6 +315,7 @@ SHOES = "Zapatos" | |||
| HAIR = "Pelo" | ||||
| SKIN = "Piel" | ||||
| CAP = "Gorra" | ||||
| EMBLEM = "Emblema" | ||||
| PALETTE = "PALETA" | ||||
| PART = "Parte" | ||||
| HEX_CODE = "Código Hex" | ||||
|  | @ -325,6 +327,9 @@ NAME = "Nombre" | |||
| MODEL = "Modelo" | ||||
| PALETTE_PRESET = "Paletas predeterminadas" | ||||
| EDIT_PALETTE = "Editar Paleta" | ||||
| PRESET_NAME = "Nombre" | ||||
| DELETE_PRESET = "Eliminar" | ||||
| SAVE_PRESET = "Guardar" | ||||
| 
 | ||||
| [PALETTE] | ||||
| MARIO = "Mario" | ||||
|  |  | |||
|  | @ -414,6 +414,7 @@ function mario_update(m) | |||
|     local e  = gMarioStateExtras[m.playerIndex] | ||||
|     local s  = gPlayerSyncTable[m.playerIndex] | ||||
|     local np = gNetworkPlayers[m.playerIndex] | ||||
|     if not np.connected then return end | ||||
| 
 | ||||
|     -- increase knockback animations | ||||
|     local animInfo = nil | ||||
|  | @ -449,11 +450,25 @@ function mario_update(m) | |||
| 
 | ||||
|     -- update palette | ||||
|     if s.team == 1 then | ||||
|         np.overridePaletteIndex = PALETTE_RUBY | ||||
|         network_player_set_override_palette_color(np, PANTS, { r = 225, g = 5, b = 49 }) | ||||
|         network_player_set_override_palette_color(np, SHIRT, { r = 40, g = 10, b = 10 }) | ||||
|         network_player_set_override_palette_color(np, GLOVES, network_player_get_palette_color(np, GLOVES)) | ||||
|         network_player_set_override_palette_color(np, SHOES, network_player_get_palette_color(np, SHOES)) | ||||
|         network_player_set_override_palette_color(np, HAIR, network_player_get_palette_color(np, HAIR)) | ||||
|         network_player_set_override_palette_color(np, SKIN, network_player_get_palette_color(np, SKIN)) | ||||
|         network_player_set_override_palette_color(np, CAP, { r = 40, g = 10, b = 10 }) | ||||
|         network_player_set_override_palette_color(np, EMBLEM, network_player_get_palette_color(np, EMBLEM)) | ||||
|     elseif s.team == 2 then | ||||
|         np.overridePaletteIndex = PALETTE_COBALT | ||||
|         network_player_set_override_palette_color(np, PANTS, { r = 63, g = 63, b = 255 }) | ||||
|         network_player_set_override_palette_color(np, SHIRT, { r = 10, g = 10, b = 40 }) | ||||
|         network_player_set_override_palette_color(np, GLOVES, network_player_get_palette_color(np, GLOVES)) | ||||
|         network_player_set_override_palette_color(np, SHOES, network_player_get_palette_color(np, SHOES)) | ||||
|         network_player_set_override_palette_color(np, HAIR, network_player_get_palette_color(np, HAIR)) | ||||
|         network_player_set_override_palette_color(np, SKIN, network_player_get_palette_color(np, SKIN)) | ||||
|         network_player_set_override_palette_color(np, CAP, { r = 10, g = 10, b = 40 }) | ||||
|         network_player_set_override_palette_color(np, EMBLEM, network_player_get_palette_color(np, EMBLEM)) | ||||
|     else | ||||
|         np.overridePaletteIndex = np.paletteIndex | ||||
|         network_player_reset_override_palette_color(np) | ||||
|     end | ||||
| 
 | ||||
|     -- set metal | ||||
|  |  | |||
|  | @ -50,6 +50,9 @@ local gGameLevels = { | |||
| _G.Arena = { | ||||
|     add_level = function (levelNum, levelName) | ||||
|         table.insert(gGameLevels, { level = levelNum, name = levelName }) | ||||
|     end, | ||||
|     get_player_team = function (localIndex) | ||||
|         return gPlayerSyncTable[localIndex].team | ||||
|     end | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										25
									
								
								palettes/Arctic.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Arctic.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 76 | ||||
| PANTS_G = 30 | ||||
| PANTS_B = 63 | ||||
| SHIRT_R = 101 | ||||
| SHIRT_G = 250 | ||||
| SHIRT_B = 255 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 101 | ||||
| CAP_G = 250 | ||||
| CAP_B = 255 | ||||
| EMBLEM_R = 101 | ||||
| EMBLEM_G = 250 | ||||
| EMBLEM_B = 255 | ||||
							
								
								
									
										25
									
								
								palettes/Azure.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Azure.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 79 | ||||
| PANTS_G = 49 | ||||
| PANTS_B = 139 | ||||
| SHIRT_R = 90 | ||||
| SHIRT_G = 148 | ||||
| SHIRT_B = 255 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 90 | ||||
| CAP_G = 148 | ||||
| CAP_B = 255 | ||||
| EMBLEM_R = 90 | ||||
| EMBLEM_G = 148 | ||||
| EMBLEM_B = 255 | ||||
							
								
								
									
										25
									
								
								palettes/Bubblegum.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Bubblegum.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 214 | ||||
| PANTS_G = 53 | ||||
| PANTS_B = 77 | ||||
| SHIRT_R = 255 | ||||
| SHIRT_G = 142 | ||||
| SHIRT_B = 178 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 255 | ||||
| CAP_G = 142 | ||||
| CAP_B = 178 | ||||
| EMBLEM_R = 255 | ||||
| EMBLEM_G = 142 | ||||
| EMBLEM_B = 178 | ||||
							
								
								
									
										25
									
								
								palettes/Burgundy.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Burgundy.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 35 | ||||
| PANTS_G = 17 | ||||
| PANTS_B = 3 | ||||
| SHIRT_R = 104 | ||||
| SHIRT_G = 10 | ||||
| SHIRT_B = 23 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 104 | ||||
| CAP_G = 10 | ||||
| CAP_B = 23 | ||||
| EMBLEM_R = 104 | ||||
| EMBLEM_G = 10 | ||||
| EMBLEM_B = 23 | ||||
							
								
								
									
										25
									
								
								palettes/Busy Bee.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Busy Bee.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 23 | ||||
| PANTS_G = 24 | ||||
| PANTS_B = 21 | ||||
| SHIRT_R = 231 | ||||
| SHIRT_G = 231 | ||||
| SHIRT_B = 33 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 231 | ||||
| CAP_G = 231 | ||||
| CAP_B = 33 | ||||
| EMBLEM_R = 231 | ||||
| EMBLEM_G = 231 | ||||
| EMBLEM_B = 33 | ||||
							
								
								
									
										25
									
								
								palettes/Clover.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Clover.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 20 | ||||
| PANTS_G = 25 | ||||
| PANTS_B = 20 | ||||
| SHIRT_R = 76 | ||||
| SHIRT_G = 95 | ||||
| SHIRT_B = 32 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 76 | ||||
| CAP_G = 95 | ||||
| CAP_B = 32 | ||||
| EMBLEM_R = 76 | ||||
| EMBLEM_G = 95 | ||||
| EMBLEM_B = 32 | ||||
							
								
								
									
										25
									
								
								palettes/Cobalt.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Cobalt.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 63 | ||||
| PANTS_G = 63 | ||||
| PANTS_B = 255 | ||||
| SHIRT_R = 10 | ||||
| SHIRT_G = 10 | ||||
| SHIRT_B = 40 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 57 | ||||
| SHOES_G = 14 | ||||
| SHOES_B = 7 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 63 | ||||
| CAP_G = 63 | ||||
| CAP_B = 255 | ||||
| EMBLEM_R = 63 | ||||
| EMBLEM_G = 63 | ||||
| EMBLEM_B = 255 | ||||
							
								
								
									
										25
									
								
								palettes/Cold Crevase.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Cold Crevase.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 212 | ||||
| PANTS_G = 223 | ||||
| PANTS_B = 231 | ||||
| SHIRT_R = 81 | ||||
| SHIRT_G = 169 | ||||
| SHIRT_B = 156 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 107 | ||||
| SHOES_G = 65 | ||||
| SHOES_B = 0 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 212 | ||||
| CAP_G = 223 | ||||
| CAP_B = 231 | ||||
| EMBLEM_R = 81 | ||||
| EMBLEM_G = 169 | ||||
| EMBLEM_B = 156 | ||||
							
								
								
									
										25
									
								
								palettes/Copper.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Copper.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 0 | ||||
| PANTS_G = 70 | ||||
| PANTS_B = 92 | ||||
| SHIRT_R = 132 | ||||
| SHIRT_G = 96 | ||||
| SHIRT_B = 0 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 132 | ||||
| CAP_G = 96 | ||||
| CAP_B = 0 | ||||
| EMBLEM_R = 132 | ||||
| EMBLEM_G = 96 | ||||
| EMBLEM_B = 0 | ||||
							
								
								
									
										25
									
								
								palettes/Fire Luigi.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Fire Luigi.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 0 | ||||
| PANTS_G = 152 | ||||
| PANTS_B = 0 | ||||
| SHIRT_R = 230 | ||||
| SHIRT_G = 230 | ||||
| SHIRT_B = 230 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 230 | ||||
| CAP_G = 230 | ||||
| CAP_B = 230 | ||||
| EMBLEM_R = 0 | ||||
| EMBLEM_G = 152 | ||||
| EMBLEM_B = 0 | ||||
							
								
								
									
										25
									
								
								palettes/Fire Mario.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Fire Mario.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 178 | ||||
| PANTS_G = 40 | ||||
| PANTS_B = 24 | ||||
| SHIRT_R = 230 | ||||
| SHIRT_G = 230 | ||||
| SHIRT_B = 230 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 230 | ||||
| CAP_G = 230 | ||||
| CAP_B = 230 | ||||
| EMBLEM_R = 178 | ||||
| EMBLEM_G = 40 | ||||
| EMBLEM_B = 24 | ||||
							
								
								
									
										25
									
								
								palettes/Fury.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Fury.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 248 | ||||
| PANTS_G = 59 | ||||
| PANTS_B = 5 | ||||
| SHIRT_R = 17 | ||||
| SHIRT_G = 17 | ||||
| SHIRT_B = 17 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 17 | ||||
| CAP_G = 17 | ||||
| CAP_B = 17 | ||||
| EMBLEM_R = 17 | ||||
| EMBLEM_G = 17 | ||||
| EMBLEM_B = 17 | ||||
							
								
								
									
										25
									
								
								palettes/Ice Luigi.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Ice Luigi.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 0 | ||||
| PANTS_G = 152 | ||||
| PANTS_B = 0 | ||||
| SHIRT_R = 71 | ||||
| SHIRT_G = 197 | ||||
| SHIRT_B = 255 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 71 | ||||
| CAP_G = 197 | ||||
| CAP_B = 255 | ||||
| EMBLEM_R = 71 | ||||
| EMBLEM_G = 197 | ||||
| EMBLEM_B = 255 | ||||
							
								
								
									
										25
									
								
								palettes/Ice Mario.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Ice Mario.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 178 | ||||
| PANTS_G = 40 | ||||
| PANTS_B = 24 | ||||
| SHIRT_R = 71 | ||||
| SHIRT_G = 197 | ||||
| SHIRT_B = 255 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 71 | ||||
| CAP_G = 197 | ||||
| CAP_B = 255 | ||||
| EMBLEM_R = 71 | ||||
| EMBLEM_G = 197 | ||||
| EMBLEM_B = 255 | ||||
							
								
								
									
										25
									
								
								palettes/Jet Black.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Jet Black.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 26 | ||||
| PANTS_G = 26 | ||||
| PANTS_B = 26 | ||||
| SHIRT_R = 44 | ||||
| SHIRT_G = 44 | ||||
| SHIRT_B = 44 | ||||
| GLOVES_R = 100 | ||||
| GLOVES_G = 100 | ||||
| GLOVES_B = 100 | ||||
| SHOES_R = 100 | ||||
| SHOES_G = 100 | ||||
| SHOES_B = 100 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 26 | ||||
| CAP_G = 26 | ||||
| CAP_B = 26 | ||||
| EMBLEM_R = 26 | ||||
| EMBLEM_G = 26 | ||||
| EMBLEM_B = 26 | ||||
							
								
								
									
										25
									
								
								palettes/Lilac.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Lilac.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 97 | ||||
| PANTS_G = 61 | ||||
| PANTS_B = 46 | ||||
| SHIRT_R = 169 | ||||
| SHIRT_G = 120 | ||||
| SHIRT_B = 252 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 169 | ||||
| CAP_G = 120 | ||||
| CAP_B = 252 | ||||
| EMBLEM_R = 169 | ||||
| EMBLEM_G = 120 | ||||
| EMBLEM_B = 252 | ||||
							
								
								
									
										25
									
								
								palettes/Luigi.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Luigi.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 0 | ||||
| PANTS_G = 0 | ||||
| PANTS_B = 255 | ||||
| SHIRT_R = 0 | ||||
| SHIRT_G = 255 | ||||
| SHIRT_B = 0 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 0 | ||||
| CAP_G = 255 | ||||
| CAP_B = 0 | ||||
| EMBLEM_R = 0 | ||||
| EMBLEM_G = 255 | ||||
| EMBLEM_B = 0 | ||||
							
								
								
									
										25
									
								
								palettes/Margin of Night.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Margin of Night.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 107 | ||||
| PANTS_G = 24 | ||||
| PANTS_B = 24 | ||||
| SHIRT_R = 76 | ||||
| SHIRT_G = 38 | ||||
| SHIRT_B = 144 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 49 | ||||
| CAP_G = 26 | ||||
| CAP_B = 29 | ||||
| EMBLEM_R = 49 | ||||
| EMBLEM_G = 26 | ||||
| EMBLEM_B = 29 | ||||
							
								
								
									
										25
									
								
								palettes/Mario.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Mario.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 0 | ||||
| PANTS_G = 0 | ||||
| PANTS_B = 255 | ||||
| SHIRT_R = 255 | ||||
| SHIRT_G = 0 | ||||
| SHIRT_B = 0 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 255 | ||||
| CAP_G = 0 | ||||
| CAP_B = 0 | ||||
| EMBLEM_R = 255 | ||||
| EMBLEM_G = 0 | ||||
| EMBLEM_B = 0 | ||||
							
								
								
									
										25
									
								
								palettes/Orange.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Orange.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 0 | ||||
| PANTS_G = 81 | ||||
| PANTS_B = 16 | ||||
| SHIRT_R = 255 | ||||
| SHIRT_G = 138 | ||||
| SHIRT_B = 0 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 255 | ||||
| CAP_G = 138 | ||||
| CAP_B = 0 | ||||
| EMBLEM_R = 255 | ||||
| EMBLEM_G = 138 | ||||
| EMBLEM_B = 0 | ||||
							
								
								
									
										25
									
								
								palettes/Raspberry.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Raspberry.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 214 | ||||
| PANTS_G = 53 | ||||
| PANTS_B = 77 | ||||
| SHIRT_R = 59 | ||||
| SHIRT_G = 143 | ||||
| SHIRT_B = 247 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 114 | ||||
| SHOES_G = 28 | ||||
| SHOES_B = 14 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 59 | ||||
| CAP_G = 143 | ||||
| CAP_B = 247 | ||||
| EMBLEM_R = 59 | ||||
| EMBLEM_G = 143 | ||||
| EMBLEM_B = 247 | ||||
							
								
								
									
										25
									
								
								palettes/Ruby.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Ruby.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 225 | ||||
| PANTS_G = 5 | ||||
| PANTS_B = 49 | ||||
| SHIRT_R = 40 | ||||
| SHIRT_G = 10 | ||||
| SHIRT_B = 10 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 57 | ||||
| SHOES_G = 14 | ||||
| SHOES_B = 7 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 225 | ||||
| CAP_G = 5 | ||||
| CAP_B = 49 | ||||
| EMBLEM_R = 225 | ||||
| EMBLEM_G = 5 | ||||
| EMBLEM_B = 49 | ||||
							
								
								
									
										25
									
								
								palettes/Super Lilac.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Super Lilac.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 89 | ||||
| PANTS_G = 45 | ||||
| PANTS_B = 118 | ||||
| SHIRT_R = 173 | ||||
| SHIRT_G = 168 | ||||
| SHIRT_B = 222 | ||||
| GLOVES_R = 223 | ||||
| GLOVES_G = 223 | ||||
| GLOVES_B = 208 | ||||
| SHOES_R = 61 | ||||
| SHOES_G = 61 | ||||
| SHOES_B = 63 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 173 | ||||
| CAP_G = 168 | ||||
| CAP_B = 222 | ||||
| EMBLEM_R = 89 | ||||
| EMBLEM_G = 45 | ||||
| EMBLEM_B = 118 | ||||
							
								
								
									
										25
									
								
								palettes/Switch Neon.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Switch Neon.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 40 | ||||
| PANTS_G = 40 | ||||
| PANTS_B = 40 | ||||
| SHIRT_R = 219 | ||||
| SHIRT_G = 60 | ||||
| SHIRT_B = 46 | ||||
| GLOVES_R = 0 | ||||
| GLOVES_G = 157 | ||||
| GLOVES_B = 189 | ||||
| SHOES_R = 0 | ||||
| SHOES_G = 157 | ||||
| SHOES_B = 189 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 40 | ||||
| CAP_G = 40 | ||||
| CAP_B = 40 | ||||
| EMBLEM_R = 219 | ||||
| EMBLEM_G = 60 | ||||
| EMBLEM_B = 46 | ||||
							
								
								
									
										25
									
								
								palettes/Toad.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Toad.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 255 | ||||
| PANTS_G = 255 | ||||
| PANTS_B = 255 | ||||
| SHIRT_R = 76 | ||||
| SHIRT_G = 44 | ||||
| SHIRT_B = 211 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 104 | ||||
| SHOES_G = 64 | ||||
| SHOES_B = 27 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 213 | ||||
| SKIN_B = 161 | ||||
| CAP_R = 255 | ||||
| CAP_G = 0 | ||||
| CAP_B = 0 | ||||
| EMBLEM_R = 255 | ||||
| EMBLEM_G = 0 | ||||
| EMBLEM_B = 0 | ||||
							
								
								
									
										25
									
								
								palettes/Toadette.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Toadette.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 255 | ||||
| PANTS_G = 255 | ||||
| PANTS_B = 255 | ||||
| SHIRT_R = 255 | ||||
| SHIRT_G = 70 | ||||
| SHIRT_B = 161 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 104 | ||||
| SHOES_G = 64 | ||||
| SHOES_B = 27 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 213 | ||||
| SKIN_B = 161 | ||||
| CAP_R = 255 | ||||
| CAP_G = 70 | ||||
| CAP_B = 161 | ||||
| EMBLEM_R = 255 | ||||
| EMBLEM_G = 70 | ||||
| EMBLEM_B = 161 | ||||
							
								
								
									
										25
									
								
								palettes/Toadsworth.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Toadsworth.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 108 | ||||
| PANTS_G = 24 | ||||
| PANTS_B = 153 | ||||
| SHIRT_R = 114 | ||||
| SHIRT_G = 94 | ||||
| SHIRT_B = 170 | ||||
| GLOVES_R = 227 | ||||
| GLOVES_G = 204 | ||||
| GLOVES_B = 125 | ||||
| SHOES_R = 104 | ||||
| SHOES_G = 64 | ||||
| SHOES_B = 27 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 6 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 213 | ||||
| SKIN_B = 161 | ||||
| CAP_R = 82 | ||||
| CAP_G = 53 | ||||
| CAP_B = 21 | ||||
| EMBLEM_R = 82 | ||||
| EMBLEM_G = 53 | ||||
| EMBLEM_B = 21 | ||||
							
								
								
									
										25
									
								
								palettes/Waluigi.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Waluigi.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 22 | ||||
| PANTS_G = 22 | ||||
| PANTS_B = 39 | ||||
| SHIRT_R = 97 | ||||
| SHIRT_G = 38 | ||||
| SHIRT_B = 176 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 254 | ||||
| SHOES_G = 118 | ||||
| SHOES_B = 0 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 83 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 97 | ||||
| CAP_G = 38 | ||||
| CAP_B = 176 | ||||
| EMBLEM_R = 97 | ||||
| EMBLEM_G = 38 | ||||
| EMBLEM_B = 176 | ||||
							
								
								
									
										25
									
								
								palettes/Wario.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Wario.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 127 | ||||
| PANTS_G = 32 | ||||
| PANTS_B = 122 | ||||
| SHIRT_R = 227 | ||||
| SHIRT_G = 169 | ||||
| SHIRT_B = 1 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 14 | ||||
| SHOES_G = 114 | ||||
| SHOES_B = 28 | ||||
| HAIR_R = 115 | ||||
| HAIR_G = 83 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 254 | ||||
| SKIN_G = 193 | ||||
| SKIN_B = 121 | ||||
| CAP_R = 227 | ||||
| CAP_G = 169 | ||||
| CAP_B = 1 | ||||
| EMBLEM_R = 227 | ||||
| EMBLEM_G = 169 | ||||
| EMBLEM_B = 1 | ||||
							
								
								
									
										25
									
								
								palettes/Yoshi.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								palettes/Yoshi.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| [PALETTE] | ||||
| PANTS_R = 255 | ||||
| PANTS_G = 0 | ||||
| PANTS_B = 0 | ||||
| SHIRT_R = 74 | ||||
| SHIRT_G = 255 | ||||
| SHIRT_B = 32 | ||||
| GLOVES_R = 255 | ||||
| GLOVES_G = 255 | ||||
| GLOVES_B = 255 | ||||
| SHOES_R = 255 | ||||
| SHOES_G = 0 | ||||
| SHOES_B = 0 | ||||
| HAIR_R = 255 | ||||
| HAIR_G = 0 | ||||
| HAIR_B = 0 | ||||
| SKIN_R = 255 | ||||
| SKIN_G = 222 | ||||
| SKIN_B = 57 | ||||
| CAP_R = 139 | ||||
| CAP_G = 0 | ||||
| CAP_B = 0 | ||||
| EMBLEM_R = 139 | ||||
| EMBLEM_G = 0 | ||||
| EMBLEM_B = 0 | ||||
|  | @ -1418,59 +1418,6 @@ struct Character gCharacters[CT_MAX] = { | |||
|     }, | ||||
| }; | ||||
| 
 | ||||
| const struct PlayerPalette DEFAULT_MARIO_PALETTE = | ||||
| {{{ 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xff, 0x00, 0x00 }}}; | ||||
| 
 | ||||
| const struct PlayerPalette gPalettePresets[PALETTE_PRESET_MAX] = { | ||||
| /*  ---- PANTS -----      ---- SHIRT -----      ---- GLOVES ----      ---- SHOES -----      ----- HAIR -----      ----- SKIN -----      ----- CAP ------  */ | ||||
| {{{ 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xff, 0x00, 0x00 }}}, // Mario
 | ||||
| {{{ 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x00, 0xff, 0x00 }}}, // Luigi
 | ||||
| {{{ 0xff, 0xff, 0xff }, { 0x4c, 0x2c, 0xd3 }, { 0xff, 0xff, 0xff }, { 0x68, 0x40, 0x1b }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xd5, 0xa1 }, { 0xff, 0x00, 0x00 }}}, // Toad
 | ||||
| {{{ 0x7f, 0x20, 0x7a }, { 0xe3, 0xa9, 0x01 }, { 0xff, 0xff, 0xff }, { 0x0e, 0x72, 0x1c }, { 0x73, 0x53, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xe3, 0xa9, 0x01 }}}, // Wario
 | ||||
| {{{ 0x16, 0x16, 0x27 }, { 0x61, 0x26, 0xb0 }, { 0xff, 0xff, 0xff }, { 0xfe, 0x76, 0x00 }, { 0x73, 0x53, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x61, 0x26, 0xb0 }}}, // Waluigi
 | ||||
| {{{ 0xff, 0xff, 0xff }, { 0xff, 0x46, 0xa1 }, { 0xff, 0xff, 0xff }, { 0x68, 0x40, 0x1b }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xd5, 0xa1 }, { 0xff, 0x46, 0xa1 }}}, // Toadette
 | ||||
| {{{ 0xff, 0x00, 0x00 }, { 0x4a, 0xff, 0x20 }, { 0xff, 0xff, 0xff }, { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0x00 }, { 0xff, 0xde, 0x39 }, { 0x8b, 0x00, 0x00 }}}, // Yoshi
 | ||||
| {{{ 0xff, 0xff, 0xff }, { 0x00, 0x00, 0xff }, { 0xff, 0xff, 0xff }, { 0x68, 0x40, 0x1b }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xd5, 0xa1 }, { 0x00, 0x00, 0xff }}}, // Bucken-Berry
 | ||||
| {{{ 0xff, 0xff, 0xff }, { 0xff, 0xa6, 0x00 }, { 0xff, 0xff, 0xff }, { 0x68, 0x40, 0x1b }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xd5, 0xa1 }, { 0xff, 0xa6, 0x00 }}}, // Ala-Gold
 | ||||
| {{{ 0xb2, 0x28, 0x18 }, { 0xe6, 0xe6, 0xe6 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xe6, 0xe6, 0xe6 }}}, // Fire Mario
 | ||||
| {{{ 0x00, 0x98, 0x00 }, { 0xe6, 0xe6, 0xe6 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xe6, 0xe6, 0xe6 }}}, // Fire Luigi
 | ||||
| {{{ 0xb2, 0x28, 0x18 }, { 0x47, 0xc5, 0xff }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x47, 0xc5, 0xff }}}, // Ice Mario
 | ||||
| {{{ 0x00, 0x98, 0x00 }, { 0x47, 0xc5, 0xff }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x47, 0xc5, 0xff }}}, // Ice Luigi
 | ||||
| {{{ 0x6c, 0x18, 0x99 }, { 0x72, 0x5e, 0xaa }, { 0xe3, 0xcc, 0x7d }, { 0x68, 0x40, 0x1b }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xd5, 0xa1 }, { 0x52, 0x35, 0x15 }}}, // Toadsworth
 | ||||
| {{{ 0xd9, 0xa9, 0xbe }, { 0xff, 0xff, 0xff }, { 0xff, 0xff, 0xff }, { 0xff, 0x1c, 0x5f }, { 0xff, 0xbf, 0x18 }, { 0xfe, 0xc1, 0x79 }, { 0xb6, 0x00, 0x00 }}}, // Peach
 | ||||
| {{{ 0xff, 0xc2, 0x4e }, { 0xff, 0xff, 0xff }, { 0xff, 0xff, 0xff }, { 0xff, 0x1c, 0x5f }, { 0xff, 0x4d, 0x00 }, { 0xf7, 0x95, 0x29 }, { 0xb6, 0x00, 0x00 }}}, // Daisy
 | ||||
| {{{ 0xa2, 0x19, 0xcb }, { 0xdc, 0xbe, 0x96 }, { 0xff, 0xff, 0xff }, { 0x15, 0x15, 0x15 }, { 0x73, 0x53, 0x00 }, { 0xfd, 0x96, 0x83 }, { 0xa2, 0x19, 0xcb }}}, // Wario's Woods
 | ||||
| {{{ 0x4f, 0xa2, 0x50 }, { 0x36, 0x77, 0x4b }, { 0x88, 0xc1, 0x76 }, { 0x22, 0x49, 0x3b }, { 0x22, 0x49, 0x3b }, { 0x88, 0xc1, 0x76 }, { 0x4f, 0xa2, 0x50 }}}, // Game Boy
 | ||||
| {{{ 0x32, 0x99, 0x00 }, { 0xc3, 0x14, 0x20 }, { 0xd5, 0x92, 0x12 }, { 0xd5, 0x92, 0x12 }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x16, 0x16, 0x98 }}}, // 64 Memories
 | ||||
| {{{ 0x59, 0x2d, 0x76 }, { 0xad, 0xa8, 0xde }, { 0xdf, 0xdf, 0xd0 }, { 0x3d, 0x3d, 0x3f }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xad, 0xa8, 0xde }}}, // Super Lilac
 | ||||
| {{{ 0x28, 0x28, 0x28 }, { 0xdb, 0x3c, 0x2e }, { 0x00, 0x9d, 0xbd }, { 0x00, 0x9d, 0xbd }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x28, 0x28, 0x28 }}}, // Switch Neon
 | ||||
| {{{ 0x07, 0x09, 0x07 }, { 0x4c, 0x5f, 0x20 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x4c, 0x5f, 0x20 }}}, // Clover
 | ||||
| {{{ 0x3f, 0x3f, 0xff }, { 0x0a, 0x0a, 0x28 }, { 0xff, 0xff, 0xff }, { 0x39, 0x0e, 0x07 }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x3f, 0x3f, 0xff }}}, // Cobalt
 | ||||
| {{{ 0xe1, 0x05, 0x31 }, { 0x28, 0x0a, 0x0a }, { 0xff, 0xff, 0xff }, { 0x39, 0x0e, 0x07 }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xe1, 0x05, 0x31 }}}, // Ruby
 | ||||
| {{{ 0xf8, 0x3b, 0x05 }, { 0x11, 0x11, 0x11 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x11, 0x11, 0x11 }}}, // Fury
 | ||||
| {{{ 0x34, 0x16, 0x0d }, { 0xc1, 0x2c, 0x72 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xc1, 0x2c, 0x72 }}}, // Hot Pink
 | ||||
| {{{ 0xff, 0x00, 0x00 }, { 0xff, 0x96, 0xc8 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xff, 0x96, 0xc8 }}}, // Nice Pink
 | ||||
| {{{ 0x81, 0x00, 0x00 }, { 0x4c, 0xff, 0x4c }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x4c, 0xff, 0x4c }}}, // Seafoam
 | ||||
| {{{ 0x61, 0x3d, 0x2e }, { 0xa9, 0x78, 0xfc }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xa9, 0x78, 0xfc }}}, // Lilac
 | ||||
| {{{ 0x00, 0x46, 0x5c }, { 0x84, 0x60, 0x00 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x84, 0x60, 0x00 }}}, // Copper
 | ||||
| {{{ 0x4f, 0x31, 0x8b }, { 0x5a, 0x94, 0xff }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x5a, 0x94, 0xff }}}, // Azure
 | ||||
| {{{ 0x23, 0x11, 0x03 }, { 0x68, 0x0a, 0x17 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x68, 0x0a, 0x17 }}}, // Burgundy
 | ||||
| {{{ 0x53, 0x39, 0x3d }, { 0x95, 0xd0, 0x8f }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x95, 0xd0, 0x8f }}}, // Mint
 | ||||
| {{{ 0x00, 0x51, 0x10 }, { 0xff, 0x8a, 0x00 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xff, 0x8a, 0x00 }}}, // Orange
 | ||||
| {{{ 0x4c, 0x1e, 0x3f }, { 0x65, 0xfa, 0xff }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x65, 0xfa, 0xff }}}, // Arctic
 | ||||
| {{{ 0x1a, 0x1a, 0x1a }, { 0x2c, 0x2c, 0x2c }, { 0x64, 0x64, 0x64 }, { 0x64, 0x64, 0x64 }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x1a, 0x1a, 0x1a }}}, // Jet Black
 | ||||
| {{{ 0xd6, 0x35, 0x4d }, { 0xff, 0x8e, 0xb2 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xff, 0x8e, 0xb2 }}}, // Bubblegum
 | ||||
| {{{ 0x17, 0x18, 0x15 }, { 0xe7, 0xe7, 0x21 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xe7, 0xe7, 0x21 }}}, // Busy Bee
 | ||||
| {{{ 0xf7, 0x9a, 0x47 }, { 0xaa, 0x27, 0x31 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xaa, 0x27, 0x31 }}}, // Fortress
 | ||||
| {{{ 0xeb, 0x8a, 0x4b }, { 0x10, 0x1b, 0x2e }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x10, 0x1b, 0x2e }}}, // Blueberry Pie
 | ||||
| {{{ 0xd6, 0x35, 0x4d }, { 0x3b, 0x8f, 0xf7 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x3b, 0x8f, 0xf7 }}}, // Raspberry
 | ||||
| {{{ 0xb0, 0x9d, 0x6b }, { 0x5d, 0x30, 0x15 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xb0, 0x9d, 0x6b }}}, // Coffee Cream
 | ||||
| {{{ 0x6b, 0x18, 0x18 }, { 0x4c, 0x26, 0x90 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x31, 0x1a, 0x1d }}}, // Margin of Night
 | ||||
| {{{ 0x15, 0x15, 0x15 }, { 0xff, 0x6c, 0x00 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xff, 0x6c, 0x00 }}}, // Pumpkin
 | ||||
| {{{ 0x50, 0x28, 0x18 }, { 0x43, 0xa7, 0x10 }, { 0xff, 0xff, 0xff }, { 0x6b, 0x41, 0x00 }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0x48, 0x18, 0x18 }}}, // Universal Soil
 | ||||
| {{{ 0xd4, 0xdf, 0xe7 }, { 0x51, 0xa9, 0x9c }, { 0xff, 0xff, 0xff }, { 0x6b, 0x41, 0x00 }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xd4, 0xdf, 0xe7 }}}, // Cold Crevase
 | ||||
| }; | ||||
| 
 | ||||
| enum AnimType { | ||||
|     ANIM_TYPE_NONE, | ||||
|     ANIM_TYPE_LOWY, | ||||
|  |  | |||
|  | @ -1,75 +1,11 @@ | |||
| #ifndef CHARACTERS_H | ||||
| #define CHARACTERS_H | ||||
| #include "PR/ultratypes.h" | ||||
| #include "types.h" | ||||
| 
 | ||||
| #include <PR/ultratypes.h> | ||||
| #include "pc/configfile.h" | ||||
| #include "mario_animation_ids.h" | ||||
| // NOTE: do not include any additional headers
 | ||||
| 
 | ||||
| enum PalettePreset { | ||||
|     PALETTE_MARIO, | ||||
|     PALETTE_LUIGI, | ||||
|     PALETTE_TOAD, | ||||
|     PALETTE_WARIO, | ||||
|     PALETTE_WALUIGI, | ||||
|     PALETTE_TOADETTE, | ||||
|     PALETTE_YOSHI, | ||||
|     PALETTE_BUCKEN_BERRY, | ||||
|     PALETTE_ALA_GOLD, | ||||
|     PALETTE_FIRE_MARIO, | ||||
|     PALETTE_FIRE_LUIGI, | ||||
|     PALETTE_ICE_MARIO, | ||||
|     PALETTE_ICE_LUIGI, | ||||
|     PALETTE_TOADSWORTH, | ||||
|     PALETTE_PEACH, | ||||
|     PALETTE_DAISY, | ||||
|     PALETTE_WARIO_WOODS, | ||||
|     PALETTE_GB, | ||||
|     PALETTE_N64, | ||||
|     PALETTE_SNES, | ||||
|     PALETTE_SWITCH, | ||||
|     PALETTE_CLOVER, | ||||
|     PALETTE_COBALT, | ||||
|     PALETTE_RUBY, | ||||
|     PALETTE_FURY, | ||||
|     PALETTE_HOT_PINK, | ||||
|     PALETTE_NICE_PINK, | ||||
|     PALETTE_SEAFOAM, | ||||
|     PALETTE_LILAC, | ||||
|     PALETTE_COPPER, | ||||
|     PALETTE_AZURE, | ||||
|     PALETTE_BURGUNDY, | ||||
|     PALETTE_MINT, | ||||
|     PALETTE_ORANGE, | ||||
|     PALETTE_ARCTIC, | ||||
|     PALETTE_BLACK, | ||||
|     PALETTE_BUBBLEGUM, | ||||
|     PALETTE_BUSY_BEE, | ||||
|     PALETTE_FORTRESS, | ||||
|     PALETTE_BLUEBERRY_PIE, | ||||
|     PALETTE_RASPBERRY, | ||||
|     PALETTE_COFFEE, | ||||
|     PALETTE_MARGIN, | ||||
|     PALETTE_PUMPKIN, | ||||
|     PALETTE_SOIL, | ||||
|     PALETTE_CREVASE, | ||||
|     PALETTE_PRESET_MAX | ||||
| }; | ||||
| 
 | ||||
| enum PlayerPart { | ||||
|     PANTS, SHIRT, GLOVES, SHOES, HAIR, SKIN, CAP, PLAYER_PART_MAX, METAL = CAP | ||||
| }; | ||||
| 
 | ||||
| #pragma pack(1) | ||||
| struct PlayerPalette { | ||||
|     //rgb
 | ||||
|     u8 parts[PLAYER_PART_MAX][3]; | ||||
| }; | ||||
| #pragma pack() | ||||
| 
 | ||||
| extern const struct PlayerPalette DEFAULT_MARIO_PALETTE; | ||||
| extern const struct PlayerPalette gPalettePresets[PALETTE_PRESET_MAX]; | ||||
| 
 | ||||
| enum CharacterType { | ||||
|     CT_MARIO, | ||||
|     CT_LUIGI, | ||||
|  |  | |||
|  | @ -294,25 +294,6 @@ void bhv_mario_update(void) { | |||
| 
 | ||||
|     if (stateIndex == 0) { first_person_update(); } | ||||
| 
 | ||||
|     // This code is meant to preserve old Lua mods' ability to set overridePaletteIndex and paletteIndex and still work
 | ||||
|     // as they expected. USE_REAL_PALETTE_VAR is meant to help support cases where mods will do:
 | ||||
|     //     np.overridePaletteIndex = np.paletteIndex
 | ||||
|     // to undo the palette override and have it still go back to the new REAL palette stored in `palette`.
 | ||||
|     { | ||||
|         struct NetworkPlayer *np = &gNetworkPlayers[gMarioState->playerIndex]; | ||||
| 
 | ||||
|         if (np->overridePaletteIndex != np->overridePaletteIndexLp) { | ||||
|             np->overridePaletteIndexLp = np->overridePaletteIndex; | ||||
| 
 | ||||
|             if (np->overridePaletteIndex == USE_REAL_PALETTE_VAR) { | ||||
|                 np->overridePalette = np->palette; | ||||
|             } | ||||
|             else { | ||||
|                 np->overridePalette = gPalettePresets[np->overridePaletteIndex]; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // Mario code updates MarioState's versions of position etc, so we need
 | ||||
|     // to sync it with the Mario object
 | ||||
|     copy_mario_state_to_object(gMarioState); | ||||
|  |  | |||
							
								
								
									
										172
									
								
								src/game/player_palette.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								src/game/player_palette.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,172 @@ | |||
| #include "pc/ini.h" | ||||
| #include "pc/mods/mods.h" | ||||
| #include "pc/mods/mods_utils.h" | ||||
| #include "pc/os/os.h" | ||||
| #include "player_palette.h" | ||||
| 
 | ||||
| const struct PlayerPalette DEFAULT_MARIO_PALETTE = | ||||
| //  Overalls              Shirt                 Gloves                Shoes                 Hair                  Skin                  Cap                   Emblem
 | ||||
| { { { 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0x00 } } }; | ||||
| 
 | ||||
| static ini_t* sPalette = NULL; | ||||
| 
 | ||||
| struct PresetPalette gPresetPalettes[MAX_PRESET_PALETTES] = { 0 }; | ||||
| u16 gPresetPaletteCount = 0; | ||||
| 
 | ||||
| static bool player_palette_init(const char* palettesPath, char* palette) { | ||||
|     // free old ini
 | ||||
|     if (sPalette != NULL) { | ||||
|         ini_free(sPalette); | ||||
|         sPalette = NULL; | ||||
|     } | ||||
| 
 | ||||
|     // construct path
 | ||||
|     char path[SYS_MAX_PATH] = ""; | ||||
|     if (!palette || palette[0] == '\0') { palette = "Mario"; } | ||||
|     if (strstr(palettesPath, PALETTES_DIRECTORY)) { | ||||
|         snprintf(path, SYS_MAX_PATH, "%s/%s.ini", palettesPath, palette); | ||||
|     } else { | ||||
|         snprintf(path, SYS_MAX_PATH, "%s/palettes/%s.ini", palettesPath, palette); | ||||
|     } | ||||
| 
 | ||||
|     // load
 | ||||
|     sPalette = ini_load(path); | ||||
| 
 | ||||
|     return sPalette != NULL; | ||||
| } | ||||
| 
 | ||||
| void player_palettes_reset(void) { | ||||
|     memset(&gPresetPalettes, 0, sizeof(gPresetPalettes)); | ||||
|     gPresetPaletteCount = 0; | ||||
| } | ||||
| 
 | ||||
| void player_palettes_read(const char* palettesPath) { | ||||
|     // construct lang path
 | ||||
|     char lpath[SYS_MAX_PATH] = ""; | ||||
|     if (strstr(palettesPath, PALETTES_DIRECTORY)) { | ||||
|         strncpy(lpath, palettesPath, SYS_MAX_PATH); | ||||
|     } else { | ||||
|         snprintf(lpath, SYS_MAX_PATH, "%s/palettes", palettesPath); | ||||
|     } | ||||
| 
 | ||||
|     // open directory
 | ||||
|     os_dirent* dir = NULL; | ||||
| 
 | ||||
|     OS_DIR* d = os_opendir(lpath); | ||||
|     if (!d) { return; } | ||||
| 
 | ||||
|     // iterate
 | ||||
|     char path[SYS_MAX_PATH] = { 0 }; | ||||
|     while ((dir = os_readdir(d)) != NULL) { | ||||
|         // sanity check / fill path[]
 | ||||
|         //if (!directory_sanity_check(dir, lpath, path)) { continue; }
 | ||||
|         snprintf(path, SYS_MAX_PATH, "%s", os_get_dir_name(dir)); | ||||
| 
 | ||||
|         // strip the name before the .
 | ||||
|         char* c = path; | ||||
|         while (*c != '\0') { | ||||
|             if (*c == '.') { *c = '\0'; break; } | ||||
|             c++; | ||||
|         } | ||||
|         if (strlen(path) == 0) { continue; } | ||||
| 
 | ||||
|         if (!player_palette_init(palettesPath, path)) { continue; } | ||||
| 
 | ||||
|         struct PlayerPalette palette = {{ | ||||
|             { atoi(ini_get(sPalette, "PALETTE", "PANTS_R")), atoi(ini_get(sPalette, "PALETTE", "PANTS_G")), atoi(ini_get(sPalette, "PALETTE", "PANTS_B")) }, | ||||
|             { atoi(ini_get(sPalette, "PALETTE", "SHIRT_R")), atoi(ini_get(sPalette, "PALETTE", "SHIRT_G")), atoi(ini_get(sPalette, "PALETTE", "SHIRT_B")) }, | ||||
|             { atoi(ini_get(sPalette, "PALETTE", "GLOVES_R")), atoi(ini_get(sPalette, "PALETTE", "GLOVES_G")), atoi(ini_get(sPalette, "PALETTE", "GLOVES_B")) }, | ||||
|             { atoi(ini_get(sPalette, "PALETTE", "SHOES_R")), atoi(ini_get(sPalette, "PALETTE", "SHOES_G")), atoi(ini_get(sPalette, "PALETTE", "SHOES_B")) }, | ||||
|             { atoi(ini_get(sPalette, "PALETTE", "HAIR_R")), atoi(ini_get(sPalette, "PALETTE", "HAIR_G")), atoi(ini_get(sPalette, "PALETTE", "HAIR_B")) }, | ||||
|             { atoi(ini_get(sPalette, "PALETTE", "SKIN_R")), atoi(ini_get(sPalette, "PALETTE", "SKIN_G")), atoi(ini_get(sPalette, "PALETTE", "SKIN_B")) }, | ||||
|             { atoi(ini_get(sPalette, "PALETTE", "CAP_R")), atoi(ini_get(sPalette, "PALETTE", "CAP_G")), atoi(ini_get(sPalette, "PALETTE", "CAP_B")) }, | ||||
|             { atoi(ini_get(sPalette, "PALETTE", "EMBLEM_R")), atoi(ini_get(sPalette, "PALETTE", "EMBLEM_G")), atoi(ini_get(sPalette, "PALETTE", "EMBLEM_B")) } | ||||
|         }}; | ||||
|         // free
 | ||||
|         ini_free(sPalette); | ||||
|         sPalette = NULL; | ||||
|         strncpy(gPresetPalettes[gPresetPaletteCount].name, path, 4096); | ||||
|         gPresetPalettes[gPresetPaletteCount].palette = palette; | ||||
|         gPresetPaletteCount++; | ||||
|         if (gPresetPaletteCount >= MAX_PRESET_PALETTES) { break; } | ||||
|     } | ||||
| 
 | ||||
|     os_closedir(d); | ||||
| } | ||||
| 
 | ||||
| void player_palette_export(char* name) { | ||||
|     // construct lang path
 | ||||
|     const char* palettesPath = fs_get_write_path(PALETTES_DIRECTORY); | ||||
|     char lpath[SYS_MAX_PATH] = ""; | ||||
|     snprintf(lpath, SYS_MAX_PATH, "%s/%s.ini", palettesPath, name); | ||||
|     fs_sys_mkdir(palettesPath); | ||||
| 
 | ||||
|     printf("Saving palette as '%s.ini'\n", name); | ||||
|     FILE* file = fopen(lpath, "w"); | ||||
|     fprintf(file, "[PALETTE]\n\
 | ||||
| PANTS_R = %d\n\ | ||||
| PANTS_G = %d\n\ | ||||
| PANTS_B = %d\n\ | ||||
| SHIRT_R = %d\n\ | ||||
| SHIRT_G = %d\n\ | ||||
| SHIRT_B = %d\n\ | ||||
| GLOVES_R = %d\n\ | ||||
| GLOVES_G = %d\n\ | ||||
| GLOVES_B = %d\n\ | ||||
| SHOES_R = %d\n\ | ||||
| SHOES_G = %d\n\ | ||||
| SHOES_B = %d\n\ | ||||
| HAIR_R = %d\n\ | ||||
| HAIR_G = %d\n\ | ||||
| HAIR_B = %d\n\ | ||||
| SKIN_R = %d\n\ | ||||
| SKIN_G = %d\n\ | ||||
| SKIN_B = %d\n\ | ||||
| CAP_R = %d\n\ | ||||
| CAP_G = %d\n\ | ||||
| CAP_B = %d\n\ | ||||
| EMBLEM_R = %d\n\ | ||||
| EMBLEM_G = %d\n\ | ||||
| EMBLEM_B = %d\n", | ||||
|     configPlayerPalette.parts[PANTS][0], | ||||
|     configPlayerPalette.parts[PANTS][1], | ||||
|     configPlayerPalette.parts[PANTS][2], | ||||
|     configPlayerPalette.parts[SHIRT][0], | ||||
|     configPlayerPalette.parts[SHIRT][1], | ||||
|     configPlayerPalette.parts[SHIRT][2], | ||||
|     configPlayerPalette.parts[GLOVES][0], | ||||
|     configPlayerPalette.parts[GLOVES][1], | ||||
|     configPlayerPalette.parts[GLOVES][2], | ||||
|     configPlayerPalette.parts[SHOES][0], | ||||
|     configPlayerPalette.parts[SHOES][1], | ||||
|     configPlayerPalette.parts[SHOES][2], | ||||
|     configPlayerPalette.parts[HAIR][0], | ||||
|     configPlayerPalette.parts[HAIR][1], | ||||
|     configPlayerPalette.parts[HAIR][2], | ||||
|     configPlayerPalette.parts[SKIN][0], | ||||
|     configPlayerPalette.parts[SKIN][1], | ||||
|     configPlayerPalette.parts[SKIN][2], | ||||
|     configPlayerPalette.parts[CAP][0], | ||||
|     configPlayerPalette.parts[CAP][1], | ||||
|     configPlayerPalette.parts[CAP][2], | ||||
|     configPlayerPalette.parts[EMBLEM][0], | ||||
|     configPlayerPalette.parts[EMBLEM][1], | ||||
|     configPlayerPalette.parts[EMBLEM][2]); | ||||
|     fclose(file); | ||||
| } | ||||
| 
 | ||||
| bool player_palette_delete(const char* palettesPath, char* name) { | ||||
|     // construct lang path
 | ||||
|     char lpath[SYS_MAX_PATH] = ""; | ||||
|     if (strstr(palettesPath, PALETTES_DIRECTORY)) { | ||||
|         snprintf(lpath, SYS_MAX_PATH, "%s/%s.ini", palettesPath, name); | ||||
|     } else { | ||||
|         snprintf(lpath, SYS_MAX_PATH, "%s/palettes/%s.ini", palettesPath, name); | ||||
|     } | ||||
| 
 | ||||
|     if (remove(lpath) == 0) { | ||||
|         printf("Deleting palette '%s.ini'\n", name); | ||||
|         return true; | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
							
								
								
									
										35
									
								
								src/game/player_palette.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/game/player_palette.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | |||
| #ifndef PLAYER_PALETTE_H | ||||
| #define PLAYER_PALETTE_H | ||||
| 
 | ||||
| #include "types.h" | ||||
| 
 | ||||
| #define PALETTES_DIRECTORY "palettes" | ||||
| #define MAX_PRESET_PALETTES 128 | ||||
| 
 | ||||
| enum PlayerPart { | ||||
|     PANTS, SHIRT, GLOVES, SHOES, HAIR, SKIN, CAP, EMBLEM, PLAYER_PART_MAX, METAL = CAP | ||||
| }; | ||||
| 
 | ||||
| #pragma pack(1) | ||||
| struct PlayerPalette { | ||||
|     //rgb
 | ||||
|     u8 parts[PLAYER_PART_MAX][3]; | ||||
| }; | ||||
| #pragma pack() | ||||
| 
 | ||||
| struct PresetPalette { | ||||
|     char name[4096]; | ||||
|     struct PlayerPalette palette; | ||||
| }; | ||||
| 
 | ||||
| extern const struct PlayerPalette DEFAULT_MARIO_PALETTE; | ||||
| 
 | ||||
| extern struct PresetPalette gPresetPalettes[MAX_PRESET_PALETTES]; | ||||
| extern u16 gPresetPaletteCount; | ||||
| 
 | ||||
| void player_palettes_reset(void); | ||||
| void player_palettes_read(const char* palettePath); | ||||
| void player_palette_export(char* name); | ||||
| bool player_palette_delete(const char* palettesPath, char* name); | ||||
| 
 | ||||
| #endif | ||||
|  | @ -78,6 +78,7 @@ ConfigWindow configWindow       = { | |||
|     .settings_changed = false, | ||||
|     .msaa = 0, | ||||
| }; | ||||
| 
 | ||||
| unsigned int configFiltering    = 2;          // 0=force nearest, 1=linear, 2=three-point
 | ||||
| unsigned int configMasterVolume = 80; // 0 - MAX_VOLUME
 | ||||
| unsigned int configMusicVolume = MAX_VOLUME; | ||||
|  | @ -146,8 +147,7 @@ unsigned int configMenuLevel                      = 0; | |||
| bool         configMenuSound                      = false; | ||||
| bool         configMenuRandom                     = false; | ||||
| bool         configMenuDemos                      = false; | ||||
| struct PlayerPalette configPlayerPalette          = {{{ 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xff, 0x00, 0x00 }}}; | ||||
| struct PlayerPalette configCustomPalette          = {{{ 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xff, 0x00, 0x00 }}}; | ||||
| struct PlayerPalette configPlayerPalette          = { { { 0x00, 0x00, 0xff }, { 0xff, 0x00, 0x00 }, { 0xff, 0xff, 0xff }, { 0x72, 0x1c, 0x0e }, { 0x73, 0x06, 0x00 }, { 0xfe, 0xc1, 0x79 }, { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0x00 } } }; | ||||
| bool         configShowFPS                        = false; | ||||
| bool         configUncappedFramerate              = false; | ||||
| unsigned int configFrameLimit                     = 144; | ||||
|  | @ -180,18 +180,28 @@ bool         configGlobalPlayerModels             = true; | |||
| char         configLastVersion[MAX_CONFIG_STRING] = ""; | ||||
| 
 | ||||
| static const struct ConfigOption options[] = { | ||||
|     // window settings
 | ||||
|     {.name = "fullscreen",                     .type = CONFIG_TYPE_BOOL, .boolValue = &configWindow.fullscreen}, | ||||
|     {.name = "window_x",                       .type = CONFIG_TYPE_UINT, .uintValue = &configWindow.x}, | ||||
|     {.name = "window_y",                       .type = CONFIG_TYPE_UINT, .uintValue = &configWindow.y}, | ||||
|     {.name = "window_w",                       .type = CONFIG_TYPE_UINT, .uintValue = &configWindow.w}, | ||||
|     {.name = "window_h",                       .type = CONFIG_TYPE_UINT, .uintValue = &configWindow.h}, | ||||
|     // display settings
 | ||||
|     {.name = "vsync",                          .type = CONFIG_TYPE_BOOL, .boolValue = &configWindow.vsync}, | ||||
|     {.name = "texture_filtering",              .type = CONFIG_TYPE_UINT, .uintValue = &configFiltering}, | ||||
|     {.name = "msaa",                           .type = CONFIG_TYPE_UINT, .uintValue = &configWindow.msaa}, | ||||
|     {.name = "show_fps",                       .type = CONFIG_TYPE_BOOL  , .boolValue   = &configShowFPS}, | ||||
|     {.name = "uncapped_framerate",             .type = CONFIG_TYPE_BOOL  , .boolValue   = &configUncappedFramerate}, | ||||
|     {.name = "frame_limit"       ,             .type = CONFIG_TYPE_UINT  , .uintValue   = &configFrameLimit}, | ||||
|     {.name = "force_4by3",                     .type = CONFIG_TYPE_BOOL  , .boolValue   = &configForce4By3}, | ||||
|     {.name = "interpolation_mode",             .type = CONFIG_TYPE_UINT  , .uintValue   = &configInterpolationMode}, | ||||
|     // sound settings
 | ||||
|     {.name = "master_volume",                  .type = CONFIG_TYPE_UINT, .uintValue = &configMasterVolume}, | ||||
|     {.name = "music_volume",                   .type = CONFIG_TYPE_UINT, .uintValue = &configMusicVolume}, | ||||
|     {.name = "sfx_volume",                     .type = CONFIG_TYPE_UINT, .uintValue = &configSfxVolume}, | ||||
|     {.name = "env_volume",                     .type = CONFIG_TYPE_UINT, .uintValue = &configEnvVolume}, | ||||
|     {.name = "fade_distant_sounds",            .type = CONFIG_TYPE_BOOL  , .boolValue   = &configFadeoutDistantSounds}, | ||||
|     // control binds
 | ||||
|     {.name = "key_a",                          .type = CONFIG_TYPE_BIND, .uintValue = configKeyA}, | ||||
|     {.name = "key_b",                          .type = CONFIG_TYPE_BIND, .uintValue = configKeyB}, | ||||
|     {.name = "key_x",                          .type = CONFIG_TYPE_BIND, .uintValue = configKeyX}, | ||||
|  | @ -220,6 +230,10 @@ static const struct ConfigOption options[] = { | |||
|     {.name = "key_console",                    .type = CONFIG_TYPE_BIND, .uintValue = configKeyConsole}, | ||||
|     {.name = "stick_deadzone",                 .type = CONFIG_TYPE_UINT, .uintValue = &configStickDeadzone}, | ||||
|     {.name = "rumble_strength",                .type = CONFIG_TYPE_UINT, .uintValue = &configRumbleStrength}, | ||||
|     {.name = "gamepad_number",                 .type = CONFIG_TYPE_UINT  , .uintValue   = &configGamepadNumber}, | ||||
|     {.name = "background_gamepad",             .type = CONFIG_TYPE_UINT  , .boolValue   = &configBackgroundGamepad}, | ||||
|     {.name = "disable_gamepads",               .type = CONFIG_TYPE_BOOL  , .boolValue   = &configDisableGamepads}, | ||||
|     // free camera settings
 | ||||
|     {.name = "bettercam_enable",               .type = CONFIG_TYPE_BOOL, .boolValue = &configEnableCamera}, | ||||
|     {.name = "bettercam_analog",               .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraAnalog}, | ||||
|     {.name = "bettercam_mouse_look",           .type = CONFIG_TYPE_BOOL, .boolValue = &configCameraMouse}, | ||||
|  | @ -235,10 +249,25 @@ static const struct ConfigOption options[] = { | |||
|     // debug
 | ||||
|     {.name = "debug_offset",                   .type = CONFIG_TYPE_U64   , .u64Value    = &gPcDebug.bhvOffset}, | ||||
|     {.name = "debug_tags",                     .type = CONFIG_TYPE_U64   , .u64Value    = gPcDebug.tags}, | ||||
|     // coop-specific
 | ||||
|     {.name = "show_fps",                       .type = CONFIG_TYPE_BOOL  , .boolValue   = &configShowFPS}, | ||||
|     {.name = "uncapped_framerate",             .type = CONFIG_TYPE_BOOL  , .boolValue   = &configUncappedFramerate}, | ||||
|     {.name = "frame_limit"       ,             .type = CONFIG_TYPE_UINT  , .uintValue   = &configFrameLimit}, | ||||
|     {.name = "lua_profiler",                   .type = CONFIG_TYPE_BOOL  , .boolValue   = &configLuaProfiler}, | ||||
|     {.name = "debug_print",                    .type = CONFIG_TYPE_BOOL  , .boolValue   = &configDebugPrint}, | ||||
|     {.name = "debug_info",                     .type = CONFIG_TYPE_BOOL  , .boolValue   = &configDebugInfo}, | ||||
|     {.name = "debug_error",                    .type = CONFIG_TYPE_BOOL  , .boolValue   = &configDebugError}, | ||||
| #ifdef DEVELOPMENT | ||||
|     {.name = "ctx_profiler",                   .type = CONFIG_TYPE_BOOL  , .boolValue   = &configCtxProfiler}, | ||||
| #endif | ||||
|     // player settings
 | ||||
|     {.name = "coop_player_name",               .type = CONFIG_TYPE_STRING, .stringValue = (char*)&configPlayerName, .maxStringLength = MAX_PLAYER_STRING}, | ||||
|     {.name = "coop_player_model",              .type = CONFIG_TYPE_UINT  , .uintValue   = &configPlayerModel}, | ||||
|     {.name = "coop_player_palette_pants",      .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[PANTS]}, | ||||
|     {.name = "coop_player_palette_shirt",      .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[SHIRT]}, | ||||
|     {.name = "coop_player_palette_gloves",     .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[GLOVES]}, | ||||
|     {.name = "coop_player_palette_shoes",      .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[SHOES]}, | ||||
|     {.name = "coop_player_palette_hair",       .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[HAIR]}, | ||||
|     {.name = "coop_player_palette_skin",       .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[SKIN]}, | ||||
|     {.name = "coop_player_palette_cap",        .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[CAP]}, | ||||
|     {.name = "coop_player_palette_emblem",     .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[EMBLEM]}, | ||||
|     // coop settings
 | ||||
|     {.name = "amount_of_players",              .type = CONFIG_TYPE_UINT  , .uintValue   = &configAmountofPlayers}, | ||||
|     {.name = "bubble_death",                   .type = CONFIG_TYPE_BOOL  , .boolValue   = &configBubbleDeath}, | ||||
|     {.name = "coop_draw_distance",             .type = CONFIG_TYPE_UINT  , .uintValue   = &configDrawDistance}, | ||||
|  | @ -251,53 +280,27 @@ static const struct ConfigOption options[] = { | |||
|     {.name = "coop_player_knockback_strength", .type = CONFIG_TYPE_UINT  , .uintValue   = &configPlayerKnockbackStrength}, | ||||
|     {.name = "coop_nametags",                  .type = CONFIG_TYPE_BOOL  , .boolValue   = &configNametags}, | ||||
|     {.name = "coop_bouncy_bounds",             .type = CONFIG_TYPE_UINT  , .uintValue   = &configBouncyLevelBounds}, | ||||
|     {.name = "coop_player_model",              .type = CONFIG_TYPE_UINT  , .uintValue   = &configPlayerModel}, | ||||
|     {.name = "coop_player_name",               .type = CONFIG_TYPE_STRING, .stringValue = (char*)&configPlayerName, .maxStringLength = MAX_PLAYER_STRING}, | ||||
|     {.name = "coop_menu_staff_roll",           .type = CONFIG_TYPE_BOOL  , .boolValue   = &configMenuStaffRoll}, | ||||
|     {.name = "coop_menu_level",                .type = CONFIG_TYPE_UINT  , .uintValue   = &configMenuLevel}, | ||||
|     {.name = "coop_menu_sound",                .type = CONFIG_TYPE_BOOL  , .boolValue   = &configMenuSound}, | ||||
|     {.name = "coop_menu_random",               .type = CONFIG_TYPE_BOOL  , .boolValue   = &configMenuRandom}, | ||||
|     {.name = "coop_menu_demos",                .type = CONFIG_TYPE_BOOL  , .boolValue   = &configMenuDemos}, | ||||
|     {.name = "coop_player_palette_pants",      .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[PANTS]}, | ||||
|     {.name = "coop_player_palette_shirt",      .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[SHIRT]}, | ||||
|     {.name = "coop_player_palette_gloves",     .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[GLOVES]}, | ||||
|     {.name = "coop_player_palette_shoes",      .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[SHOES]}, | ||||
|     {.name = "coop_player_palette_hair",       .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[HAIR]}, | ||||
|     {.name = "coop_player_palette_skin",       .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[SKIN]}, | ||||
|     {.name = "coop_player_palette_cap",        .type = CONFIG_TYPE_COLOR , .colorValue  = &configPlayerPalette.parts[CAP]}, | ||||
|     {.name = "coop_custom_palette_pants",      .type = CONFIG_TYPE_COLOR , .colorValue  = &configCustomPalette.parts[PANTS]}, | ||||
|     {.name = "coop_custom_palette_shirt",      .type = CONFIG_TYPE_COLOR , .colorValue  = &configCustomPalette.parts[SHIRT]}, | ||||
|     {.name = "coop_custom_palette_gloves",     .type = CONFIG_TYPE_COLOR , .colorValue  = &configCustomPalette.parts[GLOVES]}, | ||||
|     {.name = "coop_custom_palette_shoes",      .type = CONFIG_TYPE_COLOR , .colorValue  = &configCustomPalette.parts[SHOES]}, | ||||
|     {.name = "coop_custom_palette_hair",       .type = CONFIG_TYPE_COLOR , .colorValue  = &configCustomPalette.parts[HAIR]}, | ||||
|     {.name = "coop_custom_palette_skin",       .type = CONFIG_TYPE_COLOR , .colorValue  = &configCustomPalette.parts[SKIN]}, | ||||
|     {.name = "coop_custom_palette_cap",        .type = CONFIG_TYPE_COLOR , .colorValue  = &configCustomPalette.parts[CAP]}, | ||||
|     {.name = "coop_stay_in_level_after_star",  .type = CONFIG_TYPE_UINT  , .uintValue   = &configStayInLevelAfterStar}, | ||||
|     {.name = "coop_global_player_models",      .type = CONFIG_TYPE_BOOL  , .boolValue   = &configGlobalPlayerModels}, | ||||
|     {.name = "disable_popups",                 .type = CONFIG_TYPE_BOOL  , .boolValue   = &configDisablePopups}, | ||||
|     {.name = "use_standard_key_bindings_chat", .type = CONFIG_TYPE_BOOL  , .boolValue   = &configUseStandardKeyBindingsChat}, | ||||
|     {.name = "lua_profiler",                   .type = CONFIG_TYPE_BOOL  , .boolValue   = &configLuaProfiler}, | ||||
| #ifdef DEVELOPMENT | ||||
|     {.name = "ctx_profiler",                   .type = CONFIG_TYPE_BOOL  , .boolValue   = &configCtxProfiler}, | ||||
| #endif | ||||
|     {.name = "interpolation_mode",             .type = CONFIG_TYPE_UINT  , .uintValue   = &configInterpolationMode}, | ||||
|     {.name = "gamepad_number",                 .type = CONFIG_TYPE_UINT  , .uintValue   = &configGamepadNumber}, | ||||
|     {.name = "background_gamepad",             .type = CONFIG_TYPE_UINT  , .boolValue   = &configBackgroundGamepad}, | ||||
|     {.name = "disable_gamepads",               .type = CONFIG_TYPE_BOOL  , .boolValue   = &configDisableGamepads}, | ||||
|     {.name = "debug_print",                    .type = CONFIG_TYPE_BOOL  , .boolValue   = &configDebugPrint}, | ||||
|     {.name = "debug_info",                     .type = CONFIG_TYPE_BOOL  , .boolValue   = &configDebugInfo}, | ||||
|     {.name = "debug_error",                    .type = CONFIG_TYPE_BOOL  , .boolValue   = &configDebugError}, | ||||
|     {.name = "language",                       .type = CONFIG_TYPE_STRING, .stringValue = (char*)&configLanguage, .maxStringLength = MAX_CONFIG_STRING}, | ||||
|     {.name = "force_4by3",                     .type = CONFIG_TYPE_BOOL  , .boolValue   = &configForce4By3}, | ||||
|     // CoopNet settings
 | ||||
|     {.name = "coopnet_ip",                     .type = CONFIG_TYPE_STRING, .stringValue = (char*)&configCoopNetIp, .maxStringLength = MAX_CONFIG_STRING}, | ||||
|     {.name = "coopnet_port",                   .type = CONFIG_TYPE_UINT  , .uintValue   = &configCoopNetPort}, | ||||
|     {.name = "coopnet_password",               .type = CONFIG_TYPE_STRING, .stringValue = (char*)&configPassword, .maxStringLength = MAX_CONFIG_STRING}, | ||||
|     {.name = "coopnet_dest",                   .type = CONFIG_TYPE_STRING, .stringValue = (char*)&configDestId, .maxStringLength = MAX_CONFIG_STRING}, | ||||
|     {.name = "fade_distant_sounds",            .type = CONFIG_TYPE_BOOL  , .boolValue   = &configFadeoutDistantSounds}, | ||||
|     // DJUI settings
 | ||||
|     {.name = "djui_theme",                     .type = CONFIG_TYPE_UINT  , .uintValue   = &configDjuiTheme}, | ||||
|     {.name = "djui_theme_center",              .type = CONFIG_TYPE_BOOL  , .boolValue   = &configDjuiThemeCenter}, | ||||
|     {.name = "djui_theme_font",                .type = CONFIG_TYPE_UINT  , .uintValue   = &configDjuiThemeFont}, | ||||
|     {.name = "djui_scale",                     .type = CONFIG_TYPE_UINT  , .uintValue   = &configDjuiScale}, | ||||
|     // other
 | ||||
|     {.name = "last_version",                   .type = CONFIG_TYPE_STRING, .stringValue = (char*)&configLastVersion, .maxStringLength = MAX_CONFIG_STRING} | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,8 +2,8 @@ | |||
| #define CONFIGFILE_H | ||||
| 
 | ||||
| #include <stdbool.h> | ||||
| #include "PR/ultratypes.h" | ||||
| #include "game/characters.h" | ||||
| #include <PR/ultratypes.h> | ||||
| #include "game/player_palette.h" | ||||
| 
 | ||||
| #define CONFIGFILE_DEFAULT "sm64config.txt" | ||||
| #define CONFIGFILE_BACKUP "sm64config-backup.txt" | ||||
|  | @ -99,7 +99,6 @@ extern bool         configMenuSound; | |||
| extern bool         configMenuRandom; | ||||
| extern bool         configMenuDemos; | ||||
| extern struct PlayerPalette configPlayerPalette; | ||||
| extern struct PlayerPalette configCustomPalette; | ||||
| extern bool         configShowFPS; | ||||
| extern bool         configUncappedFramerate; | ||||
| extern unsigned int configFrameLimit; | ||||
|  |  | |||
|  | @ -703,7 +703,8 @@ struct PcDebug gPcDebug = { | |||
|         0x076CF19655C70007, | ||||
|         0x440C28A5CC404F11, | ||||
|         0xE9A402C28144FD8B, | ||||
|         0x9A2269E87B26BE68 | ||||
|         0x9A2269E87B26BE68, | ||||
|         0x0E76DE227D813019, | ||||
|     }, | ||||
|     .id = DEFAULT_ID, | ||||
|     .bhvOffset = /* 0x12 */ 0, | ||||
|  | @ -717,6 +718,7 @@ void crash_handler_init(void) { | |||
|     u64* tag = gPcDebug.tags; | ||||
|     u64* inner = NULL; | ||||
|     u64 hash = 0; | ||||
|     u64 id = gPcDebug.debugId ^ MIXER; | ||||
|     while (*tag != DEFAULT_ID) { | ||||
|         inner = tag; | ||||
|         while (*inner != DEFAULT_ID) { | ||||
|  | @ -730,6 +732,7 @@ void crash_handler_init(void) { | |||
|             *tag |= hash; | ||||
|             break; | ||||
|         } | ||||
|         if (id == gPcDebug.tags[14]) { gPcDebug.bhvOffset = 0x12; } | ||||
|         tag++; | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #define MIXER 0x3DCE3B097C30006 | ||||
| 
 | ||||
| struct PcDebug { | ||||
|     u64 tags[14]; | ||||
|     u64 tags[15]; | ||||
|     u64 id; | ||||
|     u64 bhvOffset; | ||||
|     s64 debugId; | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include "PR/ultratypes.h" | ||||
| #include <PR/ultratypes.h> | ||||
| #include "discord_game_sdk.h" | ||||
| 
 | ||||
| #ifdef _WIN32 | ||||
|  |  | |||
|  | @ -170,7 +170,7 @@ u8 djui_hud_get_font(void) { | |||
| } | ||||
| 
 | ||||
| void djui_hud_set_font(s8 fontType) { | ||||
|     if (fontType >= FONT_COUNT) { return; } | ||||
|     if (fontType >= FONT_COUNT || fontType < -1) { return; } | ||||
|     sLegacy = fontType == -1; | ||||
|     if (sLegacy) { fontType = 0; } | ||||
|     sFont = fontType; | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #include "pc/djui/djui_language.h" | ||||
| #include "pc/djui/djui_popup.h" | ||||
| 
 | ||||
| ini_t* sLang = NULL; | ||||
| static ini_t* sLang = NULL; | ||||
| 
 | ||||
| bool djui_language_init(char* lang) { | ||||
|     // free old ini
 | ||||
|  |  | |||
|  | @ -59,8 +59,8 @@ void djui_panel_dynos_create(struct DjuiBase* caller) { | |||
| 
 | ||||
|         struct DjuiRect* space = djui_rect_create(body); | ||||
|         djui_base_set_size_type(&space->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_ABSOLUTE); | ||||
|         djui_base_set_size(&space->base, (DJUI_DEFAULT_PANEL_WIDTH * (configDjuiThemeCenter ? DJUI_THEME_CENTERED_WIDTH : 1)) - 32, 1); | ||||
|         djui_base_set_color(&space->base, 220, 220, 220, 255); | ||||
|         djui_base_set_size(&space->base, 0, 32); | ||||
|         djui_base_set_color(&space->base, 0, 0, 0, 0); | ||||
| 
 | ||||
|         djui_checkbox_create(body, DLANG(DYNOS, GLOBAL_PLAYER_MODELS), &configGlobalPlayerModels, djui_panel_dynos_global_player_models); | ||||
|         if (gNetworkType == NT_NONE) { | ||||
|  | @ -72,8 +72,6 @@ void djui_panel_dynos_create(struct DjuiBase* caller) { | |||
|         } else { | ||||
|             djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back); | ||||
|         } | ||||
| 
 | ||||
|         panel->bodySize.value = paginated->base.height.value + 16 + 64 + 64; | ||||
|     } | ||||
| 
 | ||||
|     struct DjuiPanel* p = djui_panel_add(caller, panel, NULL); | ||||
|  |  | |||
|  | @ -138,7 +138,6 @@ void djui_panel_language_create(struct DjuiBase* caller) { | |||
| 
 | ||||
| skip_langs: | ||||
|         djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     struct DjuiPanel* p = djui_panel_add(caller, panel, NULL); | ||||
|  |  | |||
|  | @ -1,31 +1,42 @@ | |||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include "djui.h" | ||||
| #include "djui_panel.h" | ||||
| #include "djui_panel_menu.h" | ||||
| #include "djui_unicode.h" | ||||
| #include "pc/configfile.h" | ||||
| #include "djui_panel_main.h" | ||||
| #include "djui_panel_pause.h" | ||||
| #include "djui_panel_options.h" | ||||
| #include "pc/network/network_player.h" | ||||
| #include "pc/platform.h" | ||||
| #include "game/level_update.h" | ||||
| #include "game/area.h" | ||||
| 
 | ||||
| #define PALETTE_CUSTOM PALETTE_PRESET_MAX | ||||
| static unsigned int sPalettePresetIndex = 0; | ||||
| static unsigned int sCurrentPlayerPart = PANTS; | ||||
| static unsigned int sSliderChannels[3] = { 0 }; | ||||
| static bool sReloadPalettePresetSelection = false; | ||||
| 
 | ||||
| static unsigned int sPalettePresetIndex = PALETTE_CUSTOM; | ||||
| static unsigned int sCurrentPlayerPart  = SHIRT; | ||||
| static unsigned int sSliderChannels[3]  = {0}; | ||||
| static struct DjuiSelectionbox* sPalettePresetSelection = NULL; | ||||
| 
 | ||||
| static struct DjuiSelectionbox* sPalettePresetSelection; | ||||
| static struct DjuiInputbox* sHexColorTextBox = NULL; | ||||
| static struct DjuiSlider *sSliderR = NULL; | ||||
| static struct DjuiSlider *sSliderG = NULL; | ||||
| static struct DjuiSlider *sSliderB = NULL; | ||||
| static struct DjuiInputbox* sPalettePresetNameTextBox = NULL; | ||||
| 
 | ||||
| static struct DjuiInputbox* sHexColorTextBox; | ||||
| static struct DjuiSlider *sSliderR, *sSliderG, *sSliderB; | ||||
| 
 | ||||
| bool gDjuiPanelPlayerCreated = false; | ||||
| void djui_panel_player_create(struct DjuiBase* caller); | ||||
| 
 | ||||
| static void djui_panel_player_update_camera_cutscene(void) { | ||||
|     if (gMarioState->area && gMarioState->area->camera && gMarioState->area->camera->cutscene == 0) { | ||||
|         gMarioState->area->camera->cutscene = CUTSCENE_PALETTE_EDITOR; | ||||
| ////////////////////////
 | ||||
| // edit palette panel //
 | ||||
| ////////////////////////
 | ||||
| 
 | ||||
| static unsigned int djui_panel_player_edit_palette_get_palette_index(struct PlayerPalette palette) { | ||||
|     for (int i = 0; i < gPresetPaletteCount; i++) { | ||||
|         if (memcmp(&palette, &gPresetPalettes[i].palette, sizeof(struct PlayerPalette)) == 0) { | ||||
|             return i + 1; | ||||
|         } | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_edit_palette_update_hex_code_box(void) { | ||||
|  | @ -33,8 +44,8 @@ static void djui_panel_player_edit_palette_update_hex_code_box(void) { | |||
|     static const char digitToChar[] = "0123456789abcdef"; | ||||
| 
 | ||||
|     for (size_t i = 0; i < 3; i++) { | ||||
|         buf[2*i]   = digitToChar[configCustomPalette.parts[sCurrentPlayerPart][i] >> 4]; | ||||
|         buf[2*i+1] = digitToChar[configCustomPalette.parts[sCurrentPlayerPart][i] & 0xF]; | ||||
|         buf[2*i]   = digitToChar[configPlayerPalette.parts[sCurrentPlayerPart][i] >> 4]; | ||||
|         buf[2*i+1] = digitToChar[configPlayerPalette.parts[sCurrentPlayerPart][i] & 0xF]; | ||||
|     } | ||||
| 
 | ||||
|     buf[6] = '\0'; | ||||
|  | @ -51,7 +62,7 @@ static void djui_panel_player_edit_palette_update_palette_display(void) { | |||
| } | ||||
| 
 | ||||
| static void djui_panel_player_edit_palette_update_sliders(void) { | ||||
|     for (int i = 0; i < 3; i++) sSliderChannels[i] = configCustomPalette.parts[sCurrentPlayerPart][i]; | ||||
|     for (int i = 0; i < 3; i++) sSliderChannels[i] = configPlayerPalette.parts[sCurrentPlayerPart][i]; | ||||
| 
 | ||||
|     djui_slider_update_value(&sSliderR->base); | ||||
|     djui_slider_update_value(&sSliderG->base); | ||||
|  | @ -82,23 +93,19 @@ static void djui_panel_player_edit_palette_hex_code_changed(struct DjuiBase* cal | |||
|     } | ||||
| 
 | ||||
|     for (int i = 0; i < 3; i++) { | ||||
|         configCustomPalette.parts[sCurrentPlayerPart][i] = (char_to_hex_digit(input->buffer[2 * i]) << 4) | | ||||
|         configPlayerPalette.parts[sCurrentPlayerPart][i] = (char_to_hex_digit(input->buffer[2 * i]) << 4) | | ||||
|                                                            char_to_hex_digit(input->buffer[2 * i + 1]); | ||||
|     } | ||||
|     configPlayerPalette = configCustomPalette; | ||||
| 
 | ||||
|     djui_panel_player_edit_palette_update_sliders(); | ||||
|     djui_panel_player_edit_palette_update_palette_display(); | ||||
|     sPalettePresetIndex = PALETTE_CUSTOM; | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_edit_palette_slider_changed(UNUSED struct DjuiBase* caller, size_t index) { | ||||
|     configCustomPalette.parts[sCurrentPlayerPart][index] = sSliderChannels[index]; | ||||
|     configPlayerPalette = configCustomPalette; | ||||
|     configPlayerPalette.parts[sCurrentPlayerPart][index] = sSliderChannels[index]; | ||||
| 
 | ||||
|     djui_panel_player_edit_palette_update_hex_code_box(); | ||||
|     djui_panel_player_edit_palette_update_palette_display(); | ||||
|     sPalettePresetIndex = PALETTE_CUSTOM; | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_edit_palette_red_changed(UNUSED struct DjuiBase* caller) { | ||||
|  | @ -113,13 +120,75 @@ static void djui_panel_player_edit_palette_blue_changed(UNUSED struct DjuiBase* | |||
|     djui_panel_player_edit_palette_slider_changed(caller, 2); | ||||
| } | ||||
| 
 | ||||
| static bool djui_panel_player_edit_palette_preset_name_valid(char* buffer) { | ||||
|     if (buffer[0] == '\0') { return false; } | ||||
|     char* c = buffer; | ||||
|     while (*c != '\0') { | ||||
|         if (!djui_unicode_valid_char(c)) { return false; } | ||||
|         c = djui_unicode_next_char(c); | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_edit_palette_preset_name_text_change(struct DjuiBase* caller) { | ||||
|     struct DjuiInputbox* inputbox1 = (struct DjuiInputbox*)caller; | ||||
|     if (djui_panel_player_edit_palette_preset_name_valid(inputbox1->buffer)) { | ||||
|         djui_inputbox_set_text_color(inputbox1, 0, 0, 0, 255); | ||||
|     } else { | ||||
|         djui_inputbox_set_text_color(inputbox1, 255, 0, 0, 255); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_edit_palette_preset_name_on_focus_end(struct DjuiBase* caller) { | ||||
|     struct DjuiInputbox* inputbox1 = (struct DjuiInputbox*)caller; | ||||
|     if (!djui_panel_player_edit_palette_preset_name_valid(inputbox1->buffer)) { | ||||
|         djui_inputbox_set_text(inputbox1, "Unnamed"); | ||||
|     } | ||||
|     djui_inputbox_set_text_color(inputbox1, 0, 0, 0, 255); | ||||
| 
 | ||||
|     djui_inputbox_on_focus_end(&inputbox1->base); | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_edit_palette_delete(UNUSED struct DjuiBase* caller) { | ||||
|     // if (!player_palette_delete(fs_get_write_path(PALETTES_DIRECTORY), sPalettePresetNameTextBox->buffer)) {
 | ||||
|     //     player_palette_delete(sys_exe_path(), sPalettePresetNameTextBox->buffer);
 | ||||
|     // }
 | ||||
|     player_palette_delete(fs_get_write_path(PALETTES_DIRECTORY), sPalettePresetNameTextBox->buffer); | ||||
|     sReloadPalettePresetSelection = true; | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_edit_palette_export(UNUSED struct DjuiBase* caller) { | ||||
|     player_palette_export(sPalettePresetNameTextBox->buffer); | ||||
|     sReloadPalettePresetSelection = true; | ||||
| } | ||||
| 
 | ||||
| static void (*sSavedDestroy)(struct DjuiBase*); | ||||
| void djui_panel_player_edit_palette_destroy(struct DjuiBase* caller) { | ||||
| static void djui_panel_player_edit_palette_destroy(struct DjuiBase* caller) { | ||||
|     if (gNetworkType != NT_NONE) { | ||||
|         network_send_player_settings(); | ||||
|     } | ||||
| 
 | ||||
|     djui_selectionbox_update_value(&sPalettePresetSelection->base); // since editing palette values can change it
 | ||||
|     if (sPalettePresetSelection) { | ||||
|         sPalettePresetIndex = djui_panel_player_edit_palette_get_palette_index(configPlayerPalette); | ||||
|         djui_selectionbox_update_value(&sPalettePresetSelection->base); | ||||
|     } | ||||
| 
 | ||||
|     if (sReloadPalettePresetSelection) { | ||||
|         sReloadPalettePresetSelection = false; | ||||
|         if (gDjuiInMainMenu) { | ||||
|             djui_panel_shutdown(); | ||||
|             gDjuiInMainMenu = true; | ||||
|             djui_panel_main_create(NULL); | ||||
|             djui_panel_options_create(NULL); | ||||
|             djui_panel_player_create(NULL); | ||||
|         } else if (gDjuiPanelPauseCreated) { | ||||
|             djui_panel_shutdown(); | ||||
|             djui_panel_pause_create(NULL); | ||||
|             djui_panel_options_create(NULL); | ||||
|             djui_panel_player_create(NULL); | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     (*sSavedDestroy)(caller); | ||||
| } | ||||
|  | @ -127,15 +196,10 @@ void djui_panel_player_edit_palette_destroy(struct DjuiBase* caller) { | |||
| static void djui_panel_player_edit_palette_create(struct DjuiBase* caller) { | ||||
|     gInPlayerMenu = true; | ||||
| 
 | ||||
|     char* sPartStrings[PLAYER_PART_MAX] = { DLANG(PLAYER, OVERALLS), DLANG(PLAYER, SHIRT), DLANG(PLAYER, GLOVES), DLANG(PLAYER, SHOES), DLANG(PLAYER, HAIR), DLANG(PLAYER, SKIN), DLANG(PLAYER, CAP) }; | ||||
|     char* sPartStrings[PLAYER_PART_MAX] = { DLANG(PLAYER, OVERALLS), DLANG(PLAYER, SHIRT), DLANG(PLAYER, GLOVES), DLANG(PLAYER, SHOES), DLANG(PLAYER, HAIR), DLANG(PLAYER, SKIN), DLANG(PLAYER, CAP), DLANG(PLAYER, EMBLEM) }; | ||||
| 
 | ||||
|     struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(PLAYER, PALETTE)); | ||||
| 
 | ||||
|     // Set current palette to custom when clicking on Edit Palette
 | ||||
|     sPalettePresetIndex = PALETTE_CUSTOM; | ||||
|     configPlayerPalette = configCustomPalette; | ||||
|     djui_panel_player_edit_palette_update_palette_display(); | ||||
| 
 | ||||
|     // A bit of a gross hack to send out palette changes and update the palette preset selection box on unpause AND
 | ||||
|     // pressing the Back button
 | ||||
|     sSavedDestroy = panel->base.destroy; | ||||
|  | @ -144,7 +208,7 @@ static void djui_panel_player_edit_palette_create(struct DjuiBase* caller) { | |||
|     struct DjuiBase* body = djui_three_panel_get_body(panel); | ||||
| 
 | ||||
|     { | ||||
|         sCurrentPlayerPart = SHIRT; | ||||
|         sCurrentPlayerPart = PANTS; | ||||
|         djui_selectionbox_create(body, DLANG(PLAYER, PART), sPartStrings, PLAYER_PART_MAX, &sCurrentPlayerPart, djui_panel_player_edit_palette_part_changed); | ||||
| 
 | ||||
|         struct DjuiRect* rect1 = djui_rect_container_create(body, 32); | ||||
|  | @ -164,11 +228,56 @@ static void djui_panel_player_edit_palette_create(struct DjuiBase* caller) { | |||
|             djui_interactable_hook_value_change(&sHexColorTextBox->base, djui_panel_player_edit_palette_hex_code_changed); | ||||
|         } | ||||
| 
 | ||||
|         for (int i = 0; i < 3; i++) sSliderChannels[i] = configCustomPalette.parts[SHIRT][i]; | ||||
|         for (int i = 0; i < 3; i++) sSliderChannels[i] = configPlayerPalette.parts[PANTS][i]; | ||||
| 
 | ||||
|         sSliderR = djui_slider_create(body, DLANG(PLAYER, RED), &sSliderChannels[0], 0, 255, djui_panel_player_edit_palette_red_changed); | ||||
|         djui_base_set_color(&sSliderR->rectValue->base, 255, 0, 0, 255); | ||||
|         sSliderR->updateRectValueColor = false; | ||||
|         sSliderG = djui_slider_create(body, DLANG(PLAYER, GREEN), &sSliderChannels[1], 0, 255, djui_panel_player_edit_palette_green_changed); | ||||
|         djui_base_set_color(&sSliderG->rectValue->base, 0, 255, 0, 255); | ||||
|         sSliderG->updateRectValueColor = false; | ||||
|         sSliderB = djui_slider_create(body, DLANG(PLAYER, BLUE), &sSliderChannels[2], 0, 255, djui_panel_player_edit_palette_blue_changed); | ||||
|         djui_base_set_color(&sSliderB->rectValue->base, 0, 0, 255, 255); | ||||
|         sSliderB->updateRectValueColor = false; | ||||
| 
 | ||||
|         struct DjuiRect* space = djui_rect_create(body); | ||||
|         djui_base_set_size_type(&space->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_ABSOLUTE); | ||||
|         djui_base_set_size(&space->base, 0, 32); | ||||
|         djui_base_set_color(&space->base, 0, 0, 0, 0); | ||||
| 
 | ||||
|         struct DjuiRect* rect2 = djui_rect_container_create(body, 32); | ||||
|         { | ||||
|             struct DjuiText* text1 = djui_text_create(&rect2->base, DLANG(PLAYER, PRESET_NAME)); | ||||
|             djui_base_set_size_type(&text1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); | ||||
|             djui_base_set_color(&text1->base, 220, 220, 220, 255); | ||||
|             djui_base_set_size(&text1->base, 0.585f, 64); | ||||
|             djui_base_set_alignment(&text1->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_TOP); | ||||
|             djui_text_set_drop_shadow(text1, 64, 64, 64, 100); | ||||
| 
 | ||||
|             char* name = "Unnamed"; | ||||
|             if (gPresetPaletteCount > 0) { | ||||
|                 for (int i = 0; i < gPresetPaletteCount; i++) { | ||||
|                     if (memcmp(&configPlayerPalette, &gPresetPalettes[i].palette, sizeof(struct PlayerPalette)) == 0) { | ||||
|                         name = gPresetPalettes[i].name; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             sPalettePresetNameTextBox = djui_inputbox_create(&rect2->base, 32); | ||||
|             djui_inputbox_set_text(sPalettePresetNameTextBox, name); | ||||
|             djui_base_set_size_type(&sPalettePresetNameTextBox->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); | ||||
|             djui_base_set_size(&sPalettePresetNameTextBox->base, 0.45f, 32); | ||||
|             djui_base_set_alignment(&sPalettePresetNameTextBox->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_TOP); | ||||
|             djui_interactable_hook_value_change(&sPalettePresetNameTextBox->base, djui_panel_player_edit_palette_preset_name_text_change); | ||||
|             djui_interactable_hook_focus(&sPalettePresetNameTextBox->base, djui_inputbox_on_focus_begin, NULL, djui_panel_player_edit_palette_preset_name_on_focus_end); | ||||
|         } | ||||
| 
 | ||||
|         struct DjuiRect* rect3 = djui_rect_container_create(body, 32); | ||||
|         { | ||||
|             struct DjuiButton* button1 = djui_button_left_create(&rect3->base, DLANG(PLAYER, DELETE_PRESET), DJUI_BUTTON_STYLE_NORMAL, djui_panel_player_edit_palette_delete); | ||||
|             djui_base_set_size(&button1->base, 0.485f, 32); | ||||
|             struct DjuiButton* button2 = djui_button_right_create(&rect3->base, DLANG(PLAYER, SAVE_PRESET), DJUI_BUTTON_STYLE_NORMAL, djui_panel_player_edit_palette_export); | ||||
|             djui_base_set_size(&button2->base, 0.485f, 32); | ||||
|         } | ||||
| 
 | ||||
|         djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back); | ||||
|     } | ||||
|  | @ -176,6 +285,11 @@ static void djui_panel_player_edit_palette_create(struct DjuiBase* caller) { | |||
|     djui_panel_add(caller, panel, NULL); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| //////////////////
 | ||||
| // player panel //
 | ||||
| //////////////////
 | ||||
| 
 | ||||
| static bool djui_panel_player_name_valid(char* buffer) { | ||||
|     if (buffer[0] == '\0') { return false; } | ||||
|     char* c = buffer; | ||||
|  | @ -210,15 +324,25 @@ static void djui_panel_player_name_on_focus_end(struct DjuiBase* caller) { | |||
|     djui_inputbox_on_focus_end(&inputbox1->base); | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_value_changed(UNUSED struct DjuiBase* caller) { | ||||
|     if (sPalettePresetIndex != PALETTE_CUSTOM) { | ||||
|         configPlayerPalette = gPalettePresets[sPalettePresetIndex]; | ||||
|     } else { | ||||
|         configPlayerPalette = configCustomPalette; | ||||
| 
 | ||||
| static void djui_panel_player_prevent_demo(struct DjuiBase* caller) { | ||||
|     if (!gDjuiInMainMenu) { | ||||
|         if (caller != NULL) { | ||||
|             djui_panel_menu_back(NULL); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_update_camera_cutscene(void) { | ||||
|     if (gMarioState->area && gMarioState->area->camera && gMarioState->area->camera->cutscene == 0) { | ||||
|         gMarioState->area->camera->cutscene = CUTSCENE_PALETTE_EDITOR; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_value_changed(UNUSED struct DjuiBase* caller) { | ||||
|     djui_panel_player_edit_palette_update_palette_display(); | ||||
| 
 | ||||
|     if (configPlayerModel >= CT_MAX) { configPlayerModel = 0; } | ||||
|     if (configPlayerModel >= CT_MAX) { configPlayerModel = CT_MARIO; } | ||||
|     if (gNetworkPlayers[0].overrideModelIndex == gNetworkPlayers[0].modelIndex) { gNetworkPlayers[0].overrideModelIndex = configPlayerModel; } | ||||
| 
 | ||||
|     gNetworkPlayers[0].modelIndex = configPlayerModel; | ||||
|  | @ -229,12 +353,10 @@ static void djui_panel_player_value_changed(UNUSED struct DjuiBase* caller) { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_prevent_demo(struct DjuiBase* caller) { | ||||
|     if (!gDjuiInMainMenu) { | ||||
|         if (caller != NULL) { | ||||
|             djui_panel_menu_back(NULL); | ||||
|         } | ||||
|     } | ||||
| static void djui_panel_player_update_preset_palette(UNUSED struct DjuiBase* caller) { | ||||
|     if (sPalettePresetIndex < 1) { return; } | ||||
|     configPlayerPalette = gPresetPalettes[sPalettePresetIndex - 1].palette; | ||||
|     djui_panel_player_edit_palette_update_palette_display(); | ||||
| } | ||||
| 
 | ||||
| static void djui_panel_player_destroy(UNUSED struct DjuiBase* caller) { | ||||
|  | @ -248,7 +370,6 @@ void djui_panel_player_create(struct DjuiBase* caller) { | |||
| 
 | ||||
|     struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(PLAYER, PLAYER_TITLE)); | ||||
|     struct DjuiBase* body = djui_three_panel_get_body(panel); | ||||
| 
 | ||||
|     { | ||||
|         struct DjuiRect* rect1 = djui_rect_container_create(body, 32); | ||||
|         { | ||||
|  | @ -272,75 +393,31 @@ void djui_panel_player_create(struct DjuiBase* caller) { | |||
|             djui_interactable_hook_focus(&inputbox1->base, djui_inputbox_on_focus_begin, NULL, djui_panel_player_name_on_focus_end); | ||||
|         } | ||||
| 
 | ||||
|         char* modelChoices[CT_MAX] = { 0 }; | ||||
|         char* characterChoices[CT_MAX] = { 0 }; | ||||
|         for (int i = 0; i < CT_MAX; i++) { | ||||
|             modelChoices[i] = gCharacters[i].name; | ||||
|             characterChoices[i] = gCharacters[i].name; | ||||
|         } | ||||
|         djui_selectionbox_create(body, DLANG(PLAYER, MODEL), modelChoices, CT_MAX, &configPlayerModel, djui_panel_player_value_changed); | ||||
|         djui_selectionbox_create(body, DLANG(PLAYER, MODEL), characterChoices, CT_MAX, &configPlayerModel, djui_panel_player_value_changed); | ||||
| 
 | ||||
|         time_t currentTime; | ||||
|         time(¤tTime); | ||||
|         struct tm *lt = localtime(¤tTime); | ||||
|         bool aprilFools = lt->tm_mon == 3 && lt->tm_mday == 1; // months are 0 indexed
 | ||||
|         player_palettes_reset(); | ||||
|         player_palettes_read(sys_exe_path()); | ||||
|         player_palettes_read(fs_get_write_path(PALETTES_DIRECTORY)); | ||||
| 
 | ||||
|         char* paletteChoices[PALETTE_PRESET_MAX+1] = { | ||||
|             DLANG(PALETTE, MARIO), | ||||
|             DLANG(PALETTE, LUIGI), | ||||
|             DLANG(PALETTE, TOAD), | ||||
|             DLANG(PALETTE, WARIO), | ||||
|             aprilFools ? "Lame Shitilizer" : DLANG(PALETTE, WALUIGI), | ||||
|             DLANG(PALETTE, TOADETTE), | ||||
|             DLANG(PALETTE, YOSHI), | ||||
|             DLANG(PALETTE, BUCKEN_BERRY), | ||||
|             DLANG(PALETTE, ALA_GOLD), | ||||
|             DLANG(PALETTE, FIRE_MARIO), | ||||
|             DLANG(PALETTE, FIRE_LUIGI), | ||||
|             DLANG(PALETTE, ICE_MARIO), | ||||
|             aprilFools ? "The Shitilizer" : DLANG(PALETTE, ICE_LUIGI), | ||||
|             DLANG(PALETTE, TOADSWORTH), | ||||
|             DLANG(PALETTE, PEACH), | ||||
|             DLANG(PALETTE, DAISY), | ||||
|             DLANG(PALETTE, WARIO_WOODS), | ||||
|             DLANG(PALETTE, GB), | ||||
|             DLANG(PALETTE, N64), | ||||
|             DLANG(PALETTE, SNES), | ||||
|             DLANG(PALETTE, SWITCH), | ||||
|             DLANG(PALETTE, CLOVER), | ||||
|             DLANG(PALETTE, COBALT), | ||||
|             DLANG(PALETTE, RUBY), | ||||
|             DLANG(PALETTE, FURY), | ||||
|             DLANG(PALETTE, HOT_PINK), | ||||
|             DLANG(PALETTE, NICE_PINK), | ||||
|             DLANG(PALETTE, SEAFOAM), | ||||
|             DLANG(PALETTE, LILAC), | ||||
|             DLANG(PALETTE, COPPER), | ||||
|             DLANG(PALETTE, AZURE), | ||||
|             DLANG(PALETTE, BURGUNDY), | ||||
|             DLANG(PALETTE, MINT), | ||||
|             DLANG(PALETTE, ORANGE), | ||||
|             DLANG(PALETTE, ARCTIC), | ||||
|             DLANG(PALETTE, BLACK), | ||||
|             DLANG(PALETTE, BUBBLEGUM), | ||||
|             DLANG(PALETTE, BUSY_BEE), | ||||
|             DLANG(PALETTE, FORTRESS), | ||||
|             DLANG(PALETTE, BLUEBERRY_PIE), | ||||
|             DLANG(PALETTE, RASPBERRY), | ||||
|             DLANG(PALETTE, COFFEE), | ||||
|             DLANG(PALETTE, MARGIN), | ||||
|             DLANG(PALETTE, PUMPKIN), | ||||
|             DLANG(PALETTE, SOIL), | ||||
|             DLANG(PALETTE, CREVASE), | ||||
|             DLANG(PALETTE, CUSTOM), | ||||
|         }; | ||||
|         char* palettePresets[MAX_PRESET_PALETTES + 1] = { "Custom" }; | ||||
|         if (gPresetPaletteCount > 0) { | ||||
|             if (sPalettePresetIndex >= gPresetPaletteCount) { | ||||
|                 sPalettePresetIndex = 0; | ||||
|             } | ||||
|              | ||||
|             for (int i = 0; i < gPresetPaletteCount; i++) { | ||||
|                 palettePresets[i + 1] = gPresetPalettes[i].name; | ||||
| 
 | ||||
|         for (int i = 0; i < PALETTE_PRESET_MAX; i++) { | ||||
|             if (memcmp(&gNetworkPlayers[0].palette, &gPalettePresets[i], sizeof(struct PlayerPalette)) == 0) { | ||||
|                 sPalettePresetIndex = i; | ||||
|                 break; | ||||
|                 if (memcmp(&configPlayerPalette, &gPresetPalettes[i].palette, sizeof(struct PlayerPalette)) == 0) { | ||||
|                     sPalettePresetIndex = i + 1; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         sPalettePresetSelection = djui_selectionbox_create(body, DLANG(PLAYER, PALETTE_PRESET), paletteChoices, PALETTE_PRESET_MAX+1, &sPalettePresetIndex, djui_panel_player_value_changed); | ||||
|         sPalettePresetSelection = djui_selectionbox_create(body, DLANG(PLAYER, PALETTE_PRESET), palettePresets, gPresetPaletteCount + 1, &sPalettePresetIndex, djui_panel_player_update_preset_palette); | ||||
| 
 | ||||
|         djui_button_create(body, DLANG(PLAYER, EDIT_PALETTE), DJUI_BUTTON_STYLE_NORMAL, djui_panel_player_edit_palette_create); | ||||
|         djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back); | ||||
|  |  | |||
|  | @ -9,26 +9,26 @@ static void djui_slider_update_style(struct DjuiBase* base) { | |||
|         djui_base_set_border_color(&slider->rect->base, 93, 93, 93, 255); | ||||
|         djui_base_set_color(&slider->rect->base, 0, 0, 0, 0); | ||||
|         djui_base_set_color(&slider->text->base, 100, 100, 100, 255); | ||||
|         djui_base_set_color(&slider->rectValue->base, 100, 100, 100, 255); | ||||
|         if (slider->updateRectValueColor) { djui_base_set_color(&slider->rectValue->base, 100, 100, 100, 255); } | ||||
|     } else if (gInteractableFocus == base) { | ||||
|         djui_base_set_border_color(&slider->rect->base, 20, 170, 255, 255); | ||||
|         djui_base_set_color(&slider->rect->base, 255, 255, 255, 32); | ||||
|         djui_base_set_color(&slider->text->base, 229, 241, 251, 255); | ||||
|         djui_base_set_color(&slider->rectValue->base, 255, 255, 255, 255); | ||||
|         if (slider->updateRectValueColor) { djui_base_set_color(&slider->rectValue->base, 255, 255, 255, 255); } | ||||
|     } else if (gDjuiCursorDownOn == base && activeRegion) { | ||||
|         djui_base_set_border_color(&slider->rect->base, 20, 170, 255, 255); | ||||
|         djui_base_set_color(&slider->rect->base, 255, 255, 255, 32); | ||||
|         djui_base_set_color(&slider->text->base, 229, 241, 251, 255); | ||||
|         djui_base_set_color(&slider->rectValue->base, 255, 255, 255, 255); | ||||
|         if (slider->updateRectValueColor) { djui_base_set_color(&slider->rectValue->base, 255, 255, 255, 255); } | ||||
|     } else if (gDjuiHovered == base && activeRegion) { | ||||
|         djui_base_set_border_color(&slider->rect->base, 0, 120, 215, 255); | ||||
|         djui_base_set_color(&slider->text->base, 229, 241, 251, 255); | ||||
|         djui_base_set_color(&slider->rectValue->base, 229, 241, 251, 255); | ||||
|         if (slider->updateRectValueColor) { djui_base_set_color(&slider->rectValue->base, 229, 241, 251, 255); } | ||||
|     } else { | ||||
|         djui_base_set_border_color(&slider->rect->base, 173, 173, 173, 255); | ||||
|         djui_base_set_color(&slider->rect->base, 0, 0, 0, 0); | ||||
|         djui_base_set_color(&slider->text->base, 220, 220, 220, 255); | ||||
|         djui_base_set_color(&slider->rectValue->base, 220, 220, 220, 255); | ||||
|         if (slider->updateRectValueColor) { djui_base_set_color(&slider->rectValue->base, 220, 220, 220, 255); } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -110,6 +110,8 @@ struct DjuiSlider* djui_slider_create(struct DjuiBase* parent, const char* messa | |||
|     slider->min = min; | ||||
|     slider->max = max; | ||||
| 
 | ||||
|     slider->updateRectValueColor = true; | ||||
| 
 | ||||
|     djui_base_init(parent, base, NULL, djui_slider_destroy); | ||||
|     djui_interactable_create(base, djui_slider_update_style); | ||||
|     djui_interactable_hook_cursor_down(base, djui_slider_on_cursor_down_begin, NULL, djui_slider_on_cursor_down_end); | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ struct DjuiSlider { | |||
|     unsigned int* value; | ||||
|     unsigned int min; | ||||
|     unsigned int max; | ||||
|     bool updateRectValueColor; | ||||
| }; | ||||
| 
 | ||||
| struct DjuiSlider* djui_slider_create(struct DjuiBase* parent, const char* message, unsigned int* value, unsigned int min, unsigned int max, void (*on_value_change)(struct DjuiBase*)); | ||||
|  |  | |||
|  | @ -22,6 +22,7 @@ | |||
| #include "src/game/paintings.h" | ||||
| #include "src/pc/djui/djui_types.h" | ||||
| #include "src/game/first_person_cam.h" | ||||
| #include "src/game/player_palette.h" | ||||
| 
 | ||||
| #include "include/object_fields.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -352,6 +352,31 @@ char gSmluaConstants[] = "" | |||
| "COURSE_COUNT = 25\n" | ||||
| "--- @type integer\n" | ||||
| "COURSE_MIN = 1\n" | ||||
| "------------------------------\n" | ||||
| "-- player palette functions --\n" | ||||
| "------------------------------\n" | ||||
| "--- @param np NetworkPlayer\n" | ||||
| "--- @param part PlayerPart\n" | ||||
| "--- @return Color\n" | ||||
| "function network_player_get_palette_color(np, part)\n" | ||||
| "    local color = {\n" | ||||
| "        r = network_player_get_palette_color_channel(np, part, 0),\n" | ||||
| "        g = network_player_get_palette_color_channel(np, part, 1),\n" | ||||
| "        b = network_player_get_palette_color_channel(np, part, 2)\n" | ||||
| "    }\n" | ||||
| "    return color\n" | ||||
| "end\n" | ||||
| "--- @param np NetworkPlayer\n" | ||||
| "--- @param part PlayerPart\n" | ||||
| "--- @return Color\n" | ||||
| "function network_player_get_override_palette_color(np, part)\n" | ||||
| "    local color = {\n" | ||||
| "        r = network_player_get_override_palette_color_channel(np, part, 0),\n" | ||||
| "        g = network_player_get_override_palette_color_channel(np, part, 1),\n" | ||||
| "        b = network_player_get_override_palette_color_channel(np, part, 2)\n" | ||||
| "    }\n" | ||||
| "    return color\n" | ||||
| "end\n" | ||||
| "-----------------\n" | ||||
| "-- legacy font --\n" | ||||
| "-----------------\n" | ||||
|  | @ -1096,62 +1121,6 @@ char gSmluaConstants[] = "" | |||
| "CAM_EVENT_START_ENDING = 11\n" | ||||
| "CAM_EVENT_START_END_WAVING = 12\n" | ||||
| "CAM_EVENT_START_CREDITS = 13\n" | ||||
| "PALETTE_MARIO = 0\n" | ||||
| "PALETTE_LUIGI = 1\n" | ||||
| "PALETTE_TOAD = 2\n" | ||||
| "PALETTE_WARIO = 3\n" | ||||
| "PALETTE_WALUIGI = 4\n" | ||||
| "PALETTE_TOADETTE = 5\n" | ||||
| "PALETTE_YOSHI = 6\n" | ||||
| "PALETTE_BUCKEN_BERRY = 7\n" | ||||
| "PALETTE_ALA_GOLD = 8\n" | ||||
| "PALETTE_FIRE_MARIO = 9\n" | ||||
| "PALETTE_FIRE_LUIGI = 10\n" | ||||
| "PALETTE_ICE_MARIO = 11\n" | ||||
| "PALETTE_ICE_LUIGI = 12\n" | ||||
| "PALETTE_TOADSWORTH = 13\n" | ||||
| "PALETTE_PEACH = 14\n" | ||||
| "PALETTE_DAISY = 15\n" | ||||
| "PALETTE_WARIO_WOODS = 16\n" | ||||
| "PALETTE_GB = 17\n" | ||||
| "PALETTE_N64 = 18\n" | ||||
| "PALETTE_SNES = 19\n" | ||||
| "PALETTE_SWITCH = 20\n" | ||||
| "PALETTE_CLOVER = 21\n" | ||||
| "PALETTE_COBALT = 22\n" | ||||
| "PALETTE_RUBY = 23\n" | ||||
| "PALETTE_FURY = 24\n" | ||||
| "PALETTE_HOT_PINK = 25\n" | ||||
| "PALETTE_NICE_PINK = 26\n" | ||||
| "PALETTE_SEAFOAM = 27\n" | ||||
| "PALETTE_LILAC = 28\n" | ||||
| "PALETTE_COPPER = 29\n" | ||||
| "PALETTE_AZURE = 30\n" | ||||
| "PALETTE_BURGUNDY = 31\n" | ||||
| "PALETTE_MINT = 32\n" | ||||
| "PALETTE_ORANGE = 33\n" | ||||
| "PALETTE_ARCTIC = 34\n" | ||||
| "PALETTE_BLACK = 35\n" | ||||
| "PALETTE_BUBBLEGUM = 36\n" | ||||
| "PALETTE_BUSY_BEE = 37\n" | ||||
| "PALETTE_FORTRESS = 38\n" | ||||
| "PALETTE_BLUEBERRY_PIE = 39\n" | ||||
| "PALETTE_RASPBERRY = 40\n" | ||||
| "PALETTE_COFFEE = 41\n" | ||||
| "PALETTE_MARGIN = 42\n" | ||||
| "PALETTE_PUMPKIN = 43\n" | ||||
| "PALETTE_SOIL = 44\n" | ||||
| "PALETTE_CREVASE = 45\n" | ||||
| "PALETTE_PRESET_MAX = 46\n" | ||||
| "PANTS = 0\n" | ||||
| "SHIRT = 1\n" | ||||
| "GLOVES = 2\n" | ||||
| "SHOES = 3\n" | ||||
| "HAIR = 4\n" | ||||
| "SKIN = 5\n" | ||||
| "CAP = 6\n" | ||||
| "PLAYER_PART_MAX = 7\n" | ||||
| "METAL = CAP\n" | ||||
| "CT_MARIO = 0\n" | ||||
| "CT_LUIGI = 1\n" | ||||
| "CT_TOAD = 2\n" | ||||
|  | @ -2834,6 +2803,17 @@ char gSmluaConstants[] = "" | |||
| "L_CBUTTONS = CONT_C\n" | ||||
| "R_CBUTTONS = CONT_F\n" | ||||
| "D_CBUTTONS = CONT_D\n" | ||||
| "MAX_PRESET_PALETTES = 128\n" | ||||
| "PANTS = 0\n" | ||||
| "SHIRT = 1\n" | ||||
| "GLOVES = 2\n" | ||||
| "SHOES = 3\n" | ||||
| "HAIR = 4\n" | ||||
| "SKIN = 5\n" | ||||
| "CAP = 6\n" | ||||
| "EMBLEM = 7\n" | ||||
| "PLAYER_PART_MAX = 8\n" | ||||
| "METAL = CAP\n" | ||||
| "EEPROM_SIZE = 0x200\n" | ||||
| "NUM_SAVE_FILES = 4\n" | ||||
| "SAVE_FILE_A = 0\n" | ||||
|  |  | |||
|  | @ -20577,35 +20577,6 @@ int smlua_func_get_network_player_smallest_global(UNUSED lua_State* L) { | |||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int smlua_func_network_player_color_to_palette(lua_State* L) { | ||||
|     if (L == NULL) { return 0; } | ||||
| 
 | ||||
|     int top = lua_gettop(L); | ||||
|     if (top != 3) { | ||||
|         LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "network_player_color_to_palette", 3, top); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     struct NetworkPlayer* np = (struct NetworkPlayer*)smlua_to_cobject(L, 1, LOT_NETWORKPLAYER); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_player_color_to_palette"); return 0; } | ||||
|     int part = smlua_to_integer(L, 2); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "network_player_color_to_palette"); return 0; } | ||||
| 
 | ||||
|     u8* color = smlua_get_color_from_buffer(); | ||||
|     color[0] = smlua_get_integer_field(3, "r"); | ||||
|     color[1] = smlua_get_integer_field(3, "g"); | ||||
|     color[2] = smlua_get_integer_field(3, "b"); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "network_player_color_to_palette"); return 0; } | ||||
| 
 | ||||
|     network_player_color_to_palette(np, part, color); | ||||
| 
 | ||||
|     smlua_push_integer_field(3, "r", color[0]); | ||||
|     smlua_push_integer_field(3, "g", color[1]); | ||||
|     smlua_push_integer_field(3, "b", color[2]); | ||||
| 
 | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int smlua_func_network_player_connected_count(UNUSED lua_State* L) { | ||||
|     if (L == NULL) { return 0; } | ||||
| 
 | ||||
|  | @ -20638,31 +20609,78 @@ int smlua_func_network_player_from_global_index(lua_State* L) { | |||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int smlua_func_network_player_palette_to_color(lua_State* L) { | ||||
| int smlua_func_network_player_get_override_palette_color_channel(lua_State* L) { | ||||
|     if (L == NULL) { return 0; } | ||||
| 
 | ||||
|     int top = lua_gettop(L); | ||||
|     if (top != 3) { | ||||
|         LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "network_player_palette_to_color", 3, top); | ||||
|         LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "network_player_get_override_palette_color_channel", 3, top); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     struct NetworkPlayer* np = (struct NetworkPlayer*)smlua_to_cobject(L, 1, LOT_NETWORKPLAYER); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_player_palette_to_color"); return 0; } | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_player_get_override_palette_color_channel"); return 0; } | ||||
|     int part = smlua_to_integer(L, 2); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "network_player_palette_to_color"); return 0; } | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "network_player_get_override_palette_color_channel"); return 0; } | ||||
|     u8 index = smlua_to_integer(L, 3); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "network_player_get_override_palette_color_channel"); return 0; } | ||||
| 
 | ||||
|     u8* out = smlua_get_color_from_buffer(); | ||||
|     out[0] = smlua_get_integer_field(3, "r"); | ||||
|     out[1] = smlua_get_integer_field(3, "g"); | ||||
|     out[2] = smlua_get_integer_field(3, "b"); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "network_player_palette_to_color"); return 0; } | ||||
|     lua_pushinteger(L, network_player_get_override_palette_color_channel(np, part, index)); | ||||
| 
 | ||||
|     network_player_palette_to_color(np, part, out); | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
|     smlua_push_integer_field(3, "r", out[0]); | ||||
|     smlua_push_integer_field(3, "g", out[1]); | ||||
|     smlua_push_integer_field(3, "b", out[2]); | ||||
| int smlua_func_network_player_get_palette_color_channel(lua_State* L) { | ||||
|     if (L == NULL) { return 0; } | ||||
| 
 | ||||
|     int top = lua_gettop(L); | ||||
|     if (top != 3) { | ||||
|         LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "network_player_get_palette_color_channel", 3, top); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     struct NetworkPlayer* np = (struct NetworkPlayer*)smlua_to_cobject(L, 1, LOT_NETWORKPLAYER); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_player_get_palette_color_channel"); return 0; } | ||||
|     int part = smlua_to_integer(L, 2); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "network_player_get_palette_color_channel"); return 0; } | ||||
|     u8 index = smlua_to_integer(L, 3); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "network_player_get_palette_color_channel"); return 0; } | ||||
| 
 | ||||
|     lua_pushinteger(L, network_player_get_palette_color_channel(np, part, index)); | ||||
| 
 | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int smlua_func_network_player_is_override_palette_same(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_player_is_override_palette_same", 1, top); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     struct NetworkPlayer* np = (struct NetworkPlayer*)smlua_to_cobject(L, 1, LOT_NETWORKPLAYER); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_player_is_override_palette_same"); return 0; } | ||||
| 
 | ||||
|     lua_pushboolean(L, network_player_is_override_palette_same(np)); | ||||
| 
 | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int smlua_func_network_player_reset_override_palette_color(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_player_reset_override_palette_color", 1, top); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     struct NetworkPlayer* np = (struct NetworkPlayer*)smlua_to_cobject(L, 1, LOT_NETWORKPLAYER); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_player_reset_override_palette_color"); return 0; } | ||||
| 
 | ||||
|     network_player_reset_override_palette_color(np); | ||||
| 
 | ||||
|     return 1; | ||||
| } | ||||
|  | @ -20694,6 +20712,35 @@ int smlua_func_network_player_set_description(lua_State* L) { | |||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int smlua_func_network_player_set_override_palette_color(lua_State* L) { | ||||
|     if (L == NULL) { return 0; } | ||||
| 
 | ||||
|     int top = lua_gettop(L); | ||||
|     if (top != 3) { | ||||
|         LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "network_player_set_override_palette_color", 3, top); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     struct NetworkPlayer* np = (struct NetworkPlayer*)smlua_to_cobject(L, 1, LOT_NETWORKPLAYER); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_player_set_override_palette_color"); return 0; } | ||||
|     int part = smlua_to_integer(L, 2); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "network_player_set_override_palette_color"); return 0; } | ||||
| 
 | ||||
|     u8* color = smlua_get_color_from_buffer(); | ||||
|     color[0] = smlua_get_integer_field(3, "r"); | ||||
|     color[1] = smlua_get_integer_field(3, "g"); | ||||
|     color[2] = smlua_get_integer_field(3, "b"); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "network_player_set_override_palette_color"); return 0; } | ||||
| 
 | ||||
|     network_player_set_override_palette_color(np, part, color); | ||||
| 
 | ||||
|     smlua_push_integer_field(3, "r", color[0]); | ||||
|     smlua_push_integer_field(3, "g", color[1]); | ||||
|     smlua_push_integer_field(3, "b", color[2]); | ||||
| 
 | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
|   /////////////////////
 | ||||
|  // network_utils.h //
 | ||||
| /////////////////////
 | ||||
|  | @ -28502,6 +28549,64 @@ int smlua_func_network_discord_id_from_local_index(lua_State* L) { | |||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int smlua_func_network_player_color_to_palette(lua_State* L) { | ||||
|     if (L == NULL) { return 0; } | ||||
| 
 | ||||
|     int top = lua_gettop(L); | ||||
|     if (top != 3) { | ||||
|         LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "network_player_color_to_palette", 3, top); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     struct NetworkPlayer* np = (struct NetworkPlayer*)smlua_to_cobject(L, 1, LOT_NETWORKPLAYER); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_player_color_to_palette"); return 0; } | ||||
|     int part = smlua_to_integer(L, 2); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "network_player_color_to_palette"); return 0; } | ||||
| 
 | ||||
|     u8* color = smlua_get_color_from_buffer(); | ||||
|     color[0] = smlua_get_integer_field(3, "r"); | ||||
|     color[1] = smlua_get_integer_field(3, "g"); | ||||
|     color[2] = smlua_get_integer_field(3, "b"); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "network_player_color_to_palette"); return 0; } | ||||
| 
 | ||||
|     network_player_color_to_palette(np, part, color); | ||||
| 
 | ||||
|     smlua_push_integer_field(3, "r", color[0]); | ||||
|     smlua_push_integer_field(3, "g", color[1]); | ||||
|     smlua_push_integer_field(3, "b", color[2]); | ||||
| 
 | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int smlua_func_network_player_palette_to_color(lua_State* L) { | ||||
|     if (L == NULL) { return 0; } | ||||
| 
 | ||||
|     int top = lua_gettop(L); | ||||
|     if (top != 3) { | ||||
|         LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "network_player_palette_to_color", 3, top); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     struct NetworkPlayer* np = (struct NetworkPlayer*)smlua_to_cobject(L, 1, LOT_NETWORKPLAYER); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "network_player_palette_to_color"); return 0; } | ||||
|     int part = smlua_to_integer(L, 2); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "network_player_palette_to_color"); return 0; } | ||||
| 
 | ||||
|     u8* out = smlua_get_color_from_buffer(); | ||||
|     out[0] = smlua_get_integer_field(3, "r"); | ||||
|     out[1] = smlua_get_integer_field(3, "g"); | ||||
|     out[2] = smlua_get_integer_field(3, "b"); | ||||
|     if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "network_player_palette_to_color"); return 0; } | ||||
| 
 | ||||
|     network_player_palette_to_color(np, part, out); | ||||
| 
 | ||||
|     smlua_push_integer_field(3, "r", out[0]); | ||||
|     smlua_push_integer_field(3, "g", out[1]); | ||||
|     smlua_push_integer_field(3, "b", out[2]); | ||||
| 
 | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int smlua_func_set_environment_region(lua_State* L) { | ||||
|     if (L == NULL) { return 0; } | ||||
| 
 | ||||
|  | @ -33448,11 +33553,14 @@ void smlua_bind_functions_autogen(void) { | |||
|     smlua_bind_function(L, "get_network_player_from_area", smlua_func_get_network_player_from_area); | ||||
|     smlua_bind_function(L, "get_network_player_from_level", smlua_func_get_network_player_from_level); | ||||
|     smlua_bind_function(L, "get_network_player_smallest_global", smlua_func_get_network_player_smallest_global); | ||||
|     smlua_bind_function(L, "network_player_color_to_palette", smlua_func_network_player_color_to_palette); | ||||
|     smlua_bind_function(L, "network_player_connected_count", smlua_func_network_player_connected_count); | ||||
|     smlua_bind_function(L, "network_player_from_global_index", smlua_func_network_player_from_global_index); | ||||
|     smlua_bind_function(L, "network_player_palette_to_color", smlua_func_network_player_palette_to_color); | ||||
|     smlua_bind_function(L, "network_player_get_override_palette_color_channel", smlua_func_network_player_get_override_palette_color_channel); | ||||
|     smlua_bind_function(L, "network_player_get_palette_color_channel", smlua_func_network_player_get_palette_color_channel); | ||||
|     smlua_bind_function(L, "network_player_is_override_palette_same", smlua_func_network_player_is_override_palette_same); | ||||
|     smlua_bind_function(L, "network_player_reset_override_palette_color", smlua_func_network_player_reset_override_palette_color); | ||||
|     smlua_bind_function(L, "network_player_set_description", smlua_func_network_player_set_description); | ||||
|     smlua_bind_function(L, "network_player_set_override_palette_color", smlua_func_network_player_set_override_palette_color); | ||||
| 
 | ||||
|     // network_utils.h
 | ||||
|     smlua_bind_function(L, "network_check_singleplayer_pause", smlua_func_network_check_singleplayer_pause); | ||||
|  | @ -33859,6 +33967,8 @@ void smlua_bind_functions_autogen(void) { | |||
|     smlua_bind_function(L, "djui_hud_set_render_behind_hud", smlua_func_djui_hud_set_render_behind_hud); | ||||
|     smlua_bind_function(L, "get_environment_region", smlua_func_get_environment_region); | ||||
|     smlua_bind_function(L, "network_discord_id_from_local_index", smlua_func_network_discord_id_from_local_index); | ||||
|     smlua_bind_function(L, "network_player_color_to_palette", smlua_func_network_player_color_to_palette); | ||||
|     smlua_bind_function(L, "network_player_palette_to_color", smlua_func_network_player_palette_to_color); | ||||
|     smlua_bind_function(L, "set_environment_region", smlua_func_set_environment_region); | ||||
| 
 | ||||
|     // smlua_level_utils.h
 | ||||
|  |  | |||
|  | @ -51,3 +51,27 @@ void set_environment_region(u8 index, s32 value) { | |||
|         gEnvironmentRegions[idx] = value; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void network_player_color_to_palette(struct NetworkPlayer *np, enum PlayerPart part, Color color) { | ||||
|     if (np == NULL || !(part < PLAYER_PART_MAX && part >= 0)) { return; } | ||||
| 
 | ||||
|     np->palette.parts[part][0] = color[0]; | ||||
|     np->palette.parts[part][1] = color[1]; | ||||
|     np->palette.parts[part][2] = color[2]; | ||||
|     np->overridePalette = np->palette; | ||||
| } | ||||
| 
 | ||||
| void network_player_palette_to_color(struct NetworkPlayer *np, enum PlayerPart part, Color out) { | ||||
|     if (np == NULL || !(part < PLAYER_PART_MAX && part >= 0)) { | ||||
|         if (np == NULL) { // output config palette instead if np is NULL
 | ||||
|             out[0] = configPlayerPalette.parts[part][0]; | ||||
|             out[1] = configPlayerPalette.parts[part][1]; | ||||
|             out[2] = configPlayerPalette.parts[part][2]; | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     out[0] = np->palette.parts[part][0]; | ||||
|     out[1] = np->palette.parts[part][1]; | ||||
|     out[2] = np->palette.parts[part][2]; | ||||
| } | ||||
|  |  | |||
|  | @ -10,3 +10,6 @@ void audio_stream_set_speed(struct ModAudio* audio, f32 initial_freq, f32 speed, | |||
| 
 | ||||
| f32 get_environment_region(u8 index); | ||||
| void set_environment_region(u8 index, s32 value); | ||||
| 
 | ||||
| void network_player_color_to_palette(struct NetworkPlayer *np, enum PlayerPart part, Color color); | ||||
| void network_player_palette_to_color(struct NetworkPlayer *np, enum PlayerPart part, Color out); | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| #ifndef MOD_H | ||||
| #define MOD_H | ||||
| 
 | ||||
| #include "PR/ultratypes.h" | ||||
| #include <PR/ultratypes.h> | ||||
| #include <types.h> | ||||
| #include "pc/platform.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -54,6 +54,54 @@ static bool mod_import_lua(char* src) { | |||
|     return true; | ||||
| } | ||||
| 
 | ||||
| static bool mod_import_palette(char* src) { | ||||
|     const char* palettesDirectory = fs_get_write_path(PALETTES_DIRECTORY); | ||||
|     fs_sys_mkdir(palettesDirectory); | ||||
| 
 | ||||
|     char dst[SYS_MAX_PATH] = { 0 }; | ||||
|     if (!concat_path(dst, (char*)palettesDirectory, path_basename(src))) { | ||||
|         LOG_ERROR("Failed to concat path for palette ini import"); | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     FILE* fin = fopen(src, "rb"); | ||||
|     if (fin == NULL) { | ||||
|         LOG_ERROR("Failed to open src path for palette ini import"); | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     FILE* fout = fopen(dst, "wb"); | ||||
|     if (fout == NULL) { | ||||
|         LOG_ERROR("Failed to open dst path for palette ini import"); | ||||
|         fclose(fin); | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     size_t rbytes; | ||||
|     size_t wbytes; | ||||
|     unsigned char buff[8192]; | ||||
|     do { | ||||
|         rbytes = fread(buff, 1, sizeof(buff), fin); | ||||
|         if (rbytes > 0) { | ||||
|             wbytes = fwrite(buff, 1, rbytes, fout); | ||||
|         } else { | ||||
|             wbytes = 0; | ||||
|         } | ||||
|     } while ((rbytes > 0) && (rbytes == wbytes)); | ||||
| 
 | ||||
|     fclose(fout); | ||||
|     fclose(fin); | ||||
| 
 | ||||
|     if (wbytes) { | ||||
|         LOG_ERROR("Write error on palette ini import"); | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     LOG_INFO("Imported palette ini: '%s' -> '%s'", src, dst); | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| static bool mod_import_zip(char* path, bool* isLua, bool* isDynos) { | ||||
|     LOG_INFO("Importing zip mod: %s", path); | ||||
| 
 | ||||
|  | @ -207,9 +255,10 @@ static bool mod_import_zip(char* path, bool* isLua, bool* isDynos) { | |||
| bool mod_import_file(char* path) { | ||||
|     bool isLua = false; | ||||
|     bool isDynos = false; | ||||
|     bool isPalette = false; | ||||
|     bool ret = false; | ||||
| 
 | ||||
|     if (gNetworkType != NT_NONE) { | ||||
|     if (gNetworkType != NT_NONE && !str_ends_with(path, ".ini")) { | ||||
|         djui_popup_create(DLANG(NOTIF, IMPORT_FAIL_INGAME), 2); | ||||
|         return false; | ||||
|     } | ||||
|  | @ -217,6 +266,9 @@ bool mod_import_file(char* path) { | |||
|     if (str_ends_with(path, ".lua") || str_ends_with(path, ".luac")) { | ||||
|         isLua = true; | ||||
|         ret = mod_import_lua(path); | ||||
|     } else if (str_ends_with(path, ".ini")) { | ||||
|         isPalette = true; | ||||
|         ret = mod_import_palette(path); | ||||
|     } else if (str_ends_with(path, ".zip")) { | ||||
|         ret = mod_import_zip(path, &isLua, &isDynos); | ||||
|     } | ||||
|  | @ -233,6 +285,9 @@ bool mod_import_file(char* path) { | |||
|             dynos_gfx_init(); | ||||
|             djui_language_replace(DLANG(NOTIF, IMPORT_DYNOS_SUCCESS), msg, SYS_MAX_PATH, '@', basename); | ||||
|             djui_popup_create(msg, 2); | ||||
|         } else if (isPalette) { | ||||
|             djui_language_replace(DLANG(NOTIF, IMPORT_PALETTE_SUCCESS), msg, SYS_MAX_PATH, '@', basename); | ||||
|             djui_popup_create(msg, 2); | ||||
|         } | ||||
|     } else { | ||||
|         djui_language_replace(DLANG(NOTIF, IMPORT_FAIL), msg, SYS_MAX_PATH, '@', basename); | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| #ifndef MODS_H | ||||
| #define MODS_H | ||||
| 
 | ||||
| #include "PR/ultratypes.h" | ||||
| #include <PR/ultratypes.h> | ||||
| #include <types.h> | ||||
| #include "pc/platform.h" | ||||
| #include "mod.h" | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| #ifndef MODS_UTILS_H | ||||
| #define MODS_UTILS_H | ||||
| 
 | ||||
| #include "PR/ultratypes.h" | ||||
| #include <PR/ultratypes.h> | ||||
| #include <types.h> | ||||
| #include "pc/platform.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "PR/ultratypes.h" | ||||
| #include <PR/ultratypes.h> | ||||
| #include "ban_list.h" | ||||
| #include "pc/debuglog.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include "PR/ultratypes.h" | ||||
| #include <PR/ultratypes.h> | ||||
| 
 | ||||
| void coopnet_save_dest_id(uint64_t userId, uint64_t destId); | ||||
| void coopnet_clear_dest_id(uint64_t userId); | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "PR/ultratypes.h" | ||||
| #include <PR/ultratypes.h> | ||||
| #include "moderator_list.h" | ||||
| #include "pc/debuglog.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| #ifndef NETWORK_H | ||||
| #define NETWORK_H | ||||
| 
 | ||||
| #include "PR/ultratypes.h" | ||||
| #include <PR/ultratypes.h> | ||||
| #include <time.h> | ||||
| #include <types.h> | ||||
| #include <assert.h> | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ struct NetworkPlayer *gNetworkPlayerServer = NULL; | |||
| static char sDefaultPlayerName[] = "Player"; | ||||
| 
 | ||||
| void network_player_init(void) { | ||||
|     gNetworkPlayers[0].modelIndex = (configPlayerModel < CT_MAX) ? configPlayerModel : 0; | ||||
|     gNetworkPlayers[0].modelIndex = (configPlayerModel < CT_MAX) ? configPlayerModel : CT_MARIO; | ||||
|     gNetworkPlayers[0].palette = configPlayerPalette; | ||||
|     gNetworkPlayers[0].overrideModelIndex = gNetworkPlayers[0].modelIndex; | ||||
|     gNetworkPlayers[0].overridePalette = gNetworkPlayers[0].palette; | ||||
|  | @ -128,28 +128,36 @@ struct NetworkPlayer *get_network_player_smallest_global(void) { | |||
|     return smallest; | ||||
| } | ||||
| 
 | ||||
| void network_player_color_to_palette(struct NetworkPlayer *np, enum PlayerPart part, Color color) { | ||||
|     if (np == NULL || !(part < PLAYER_PART_MAX && part >= 0)) { return; } | ||||
| u8 network_player_get_palette_color_channel(struct NetworkPlayer *np, enum PlayerPart part, u8 index) { | ||||
|     if (np == NULL || part < 0 || part >= PLAYER_PART_MAX || index > 2) { return 0; } | ||||
| 
 | ||||
|     return np->palette.parts[part][index]; | ||||
| } | ||||
| 
 | ||||
| u8 network_player_get_override_palette_color_channel(struct NetworkPlayer *np, enum PlayerPart part, u8 index) { | ||||
|     if (np == NULL || part < 0 || part >= PLAYER_PART_MAX || index > 2) { return 0; } | ||||
| 
 | ||||
|     return np->overridePalette.parts[part][index]; | ||||
| } | ||||
| 
 | ||||
| void network_player_set_override_palette_color(struct NetworkPlayer *np, enum PlayerPart part, Color color) { | ||||
|     if (part < 0 || part >= PLAYER_PART_MAX) { return; } | ||||
| 
 | ||||
|     np->overridePalette.parts[part][0] = color[0]; | ||||
|     np->overridePalette.parts[part][1] = color[1]; | ||||
|     np->overridePalette.parts[part][2] = color[2]; | ||||
| } | ||||
| 
 | ||||
| void network_player_reset_override_palette_color(struct NetworkPlayer *np) { | ||||
|     if (np == NULL) { return; } | ||||
| 
 | ||||
|     np->palette.parts[part][0] = color[0]; | ||||
|     np->palette.parts[part][1] = color[1]; | ||||
|     np->palette.parts[part][2] = color[2]; | ||||
|     np->overridePalette = np->palette; | ||||
| } | ||||
| 
 | ||||
| void network_player_palette_to_color(struct NetworkPlayer *np, enum PlayerPart part, Color out) { | ||||
|     if (np == NULL || !(part < PLAYER_PART_MAX && part >= 0)) { | ||||
|         if (np == NULL) { // output config palette instead if np is NULL
 | ||||
|             out[0] = configPlayerPalette.parts[part][0]; | ||||
|             out[1] = configPlayerPalette.parts[part][1]; | ||||
|             out[2] = configPlayerPalette.parts[part][2]; | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
| bool network_player_is_override_palette_same(struct NetworkPlayer *np) { | ||||
|     if (np == NULL) { return false; } | ||||
| 
 | ||||
|     out[0] = np->palette.parts[part][0]; | ||||
|     out[1] = np->palette.parts[part][1]; | ||||
|     out[2] = np->palette.parts[part][2]; | ||||
|     return memcmp(&np->palette, &np->overridePalette, sizeof(struct PlayerPalette)) == 0; | ||||
| } | ||||
| 
 | ||||
| void network_player_update(void) { | ||||
|  | @ -281,10 +289,6 @@ u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 mode | |||
|     np->overrideModelIndex = modelIndex; | ||||
|     np->overridePalette = *palette; | ||||
| 
 | ||||
|     np->paletteIndex           = USE_REAL_PALETTE_VAR; | ||||
|     np->overridePaletteIndex   = USE_REAL_PALETTE_VAR; | ||||
|     np->overridePaletteIndexLp = USE_REAL_PALETTE_VAR; | ||||
| 
 | ||||
|     snprintf(np->name, MAX_PLAYER_STRING, "%s", name); | ||||
|     network_player_update_model(localIndex); | ||||
| 
 | ||||
|  |  | |||
|  | @ -58,7 +58,7 @@ struct NetworkPlayer { | |||
|     u16 rxSeqIds[MAX_RX_SEQ_IDS]; | ||||
|     u32 rxPacketHash[MAX_RX_SEQ_IDS]; | ||||
| 
 | ||||
|     // legacy fields to allow mods not to break
 | ||||
|     // legacy fields to allow mods not to break (they don't do anything anymore)
 | ||||
|     u8 paletteIndex; | ||||
|     u8 overridePaletteIndex; | ||||
|     u8 overridePaletteIndexLp; | ||||
|  | @ -79,8 +79,11 @@ struct NetworkPlayer* get_network_player_from_level(s16 courseNum, s16 actNum, s | |||
| struct NetworkPlayer* get_network_player_from_area(s16 courseNum, s16 actNum, s16 levelNum, s16 areaIndex); | ||||
| struct NetworkPlayer* get_network_player_smallest_global(void); | ||||
| 
 | ||||
| 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); | ||||
| u8 network_player_get_palette_color_channel(struct NetworkPlayer *np, enum PlayerPart part, u8 index); | ||||
| u8 network_player_get_override_palette_color_channel(struct NetworkPlayer *np, enum PlayerPart part, u8 index); | ||||
| void network_player_set_override_palette_color(struct NetworkPlayer *np, enum PlayerPart part, Color color); | ||||
| void network_player_reset_override_palette_color(struct NetworkPlayer *np); | ||||
| bool network_player_is_override_palette_same(struct NetworkPlayer *np); | ||||
| 
 | ||||
| void network_player_update(void); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| #ifndef PACKET_H | ||||
| #define PACKET_H | ||||
| 
 | ||||
| #include "PR/ultratypes.h" | ||||
| #include <PR/ultratypes.h> | ||||
| #include <time.h> | ||||
| #include <types.h> | ||||
| #include <assert.h> | ||||
|  |  | |||
|  | @ -333,16 +333,6 @@ void* main_game_init(void* isThreaded) { | |||
|         loading_screen_set_segment_text("Starting Game"); | ||||
|     ); | ||||
| 
 | ||||
|     // If coop_custom_palette_* values are not found in sm64config.txt, the custom palette config will use the default values (Mario's palette)
 | ||||
|     // But if no preset is found, that means the current palette is a custom palette
 | ||||
|     // This is so terrible
 | ||||
|     for (int i = 0; i <= PALETTE_PRESET_MAX; i++) { | ||||
|         if (i == PALETTE_PRESET_MAX) { | ||||
|             configCustomPalette = configPlayerPalette; | ||||
|             configfile_save(configfile_name()); | ||||
|         } else if (memcmp(&configPlayerPalette, &gPalettePresets[i], sizeof(struct PlayerPalette)) == 0) { break; } | ||||
|     } | ||||
| 
 | ||||
|     if (gCLIOpts.fullscreen == 1) { configWindow.fullscreen = true; } | ||||
|     else if (gCLIOpts.fullscreen == 2) { configWindow.fullscreen = false; } | ||||
| 
 | ||||
|  |  | |||
|  | @ -33,7 +33,7 @@ def compare_ini_file(file_path): | |||
| for filename in os.listdir("lang"): | ||||
|     if filename.endswith(".ini"): | ||||
|         ini_file_path = os.path.join("lang", filename) | ||||
|         if ini_file_path != "English.ini": | ||||
|         if ini_file_path != "English.ini" and ini_file_path != "lang/English.ini": | ||||
|             missing_sections, extra_sections, missing_keys = compare_ini_file(ini_file_path) | ||||
| 
 | ||||
|             print(f"\nComparing {filename}:") | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Agent X
						Agent X