Palette system overhaul and preset rewrite

This commit is contained in:
Agent X 2024-05-19 09:38:22 -04:00
parent 0d71c6c12f
commit ceb7aa4649
94 changed files with 2303 additions and 1171 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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 = "Марио"

View file

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

View file

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

View file

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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
#pragma once
#include "PR/ultratypes.h"
#include <PR/ultratypes.h>
#include "discord_game_sdk.h"
#ifdef _WIN32

View file

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

View file

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

View file

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

View file

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

View file

@ -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(&currentTime);
struct tm *lt = localtime(&currentTime);
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);

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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}:")