diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index 40ae0e659..4a6c71112 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -281,6 +281,7 @@
- [get_network_player_smallest_global](#get_network_player_smallest_global)
- [network_player_connected_count](#network_player_connected_count)
- [network_player_from_global_index](#network_player_from_global_index)
+ - [network_player_set_description](#network_player_set_description)
@@ -4815,6 +4816,31 @@
+## [network_player_set_description](#network_player_set_description)
+
+### Lua Example
+`network_player_set_description(np, description, r, g, b, a)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| np | [NetworkPlayer](structs.md#NetworkPlayer) |
+| description | string |
+| r | integer |
+| g | integer |
+| b | integer |
+| a | integer |
+
+### Returns
+- None
+
+### C Prototype
+`void network_player_set_description(struct NetworkPlayer* np, const char* description, u8 r, u8 g, u8 b, u8 a);`
+
+[:arrow_up_small:](#)
+
+
+
---
# functions from network_utils.h
diff --git a/docs/lua/structs.md b/docs/lua/structs.md
index 004212c4e..cde8c6541 100644
--- a/docs/lua/structs.md
+++ b/docs/lua/structs.md
@@ -598,6 +598,11 @@
| currLevelAreaSeqId | integer | read-only |
| currLevelNum | integer | read-only |
| currLevelSyncValid | bool | read-only |
+| description | string | read-only |
+| descriptionA | integer | read-only |
+| descriptionB | integer | read-only |
+| descriptionG | integer | read-only |
+| descriptionR | integer | read-only |
| fadeOpacity | integer | read-only |
| globalIndex | integer | read-only |
| lastReceived | number | read-only |
diff --git a/mods/hide-and-seek.lua b/mods/hide-and-seek.lua
index 8366a4855..d1eb3891b 100644
--- a/mods/hide-and-seek.lua
+++ b/mods/hide-and-seek.lua
@@ -247,6 +247,7 @@ function on_player_connected(m)
-- start out as a non-seeker
local s = gPlayerSyncTable[m.playerIndex]
s.seeking = true
+ network_player_set_description(gNetworkPlayers[m.playerIndex], "seeker", 255, 64, 64, 255)
end
function hud_top_render()
@@ -420,6 +421,12 @@ function on_seeking_changed(tag, oldVal, newVal)
sLastSeekerIndex = m.playerIndex
sRoundTimer = 0
end
+
+ if newVal then
+ network_player_set_description(np, "seeker", 255, 64, 64, 255)
+ else
+ network_player_set_description(np, "hider", 128, 128, 128, 255)
+ end
end
-----------
@@ -440,4 +447,5 @@ hook_on_sync_table_change(gGlobalSyncTable, 'roundState', 0, on_round_state_chan
for i=0,(MAX_PLAYERS-1) do
gPlayerSyncTable[i].seeking = true
hook_on_sync_table_change(gPlayerSyncTable[i], 'seeking', i, on_seeking_changed)
+ network_player_set_description(gNetworkPlayers[i], "seeker", 255, 64, 64, 255)
end
diff --git a/src/pc/configfile.h b/src/pc/configfile.h
index ba2614db0..425f572a6 100644
--- a/src/pc/configfile.h
+++ b/src/pc/configfile.h
@@ -9,6 +9,7 @@
#define MAX_VOLUME 127
#define MAX_CONFIG_STRING 64
#define MAX_PLAYER_STRING 20
+#define MAX_DESCRIPTION_STRING 20
#define DEFAULT_PORT 7777
diff --git a/src/pc/controller/controller_keyboard_debug.c b/src/pc/controller/controller_keyboard_debug.c
index 960496adb..6910309d9 100644
--- a/src/pc/controller/controller_keyboard_debug.c
+++ b/src/pc/controller/controller_keyboard_debug.c
@@ -14,7 +14,7 @@
#ifdef DEBUG
#include "pc/lua/smlua.h"
-static u8 warpToLevel = LEVEL_BOB;
+static u8 warpToLevel = LEVEL_SSL;
static u8 warpToArea = 27;
// warpToArea: 26 = basement
// warpToArea: 27 = upstairs
diff --git a/src/pc/djui/djui_panel_modlist.c b/src/pc/djui/djui_panel_modlist.c
index 91c20131a..5fab41061 100644
--- a/src/pc/djui/djui_panel_modlist.c
+++ b/src/pc/djui/djui_panel_modlist.c
@@ -6,7 +6,7 @@
struct DjuiThreePanel* gDjuiModList = NULL;
void djui_panel_modlist_create(UNUSED struct DjuiBase* caller) {
- int playerListWidth = 580;
+ int playerListWidth = 585;
int modListWidth = 280;
// delete old mod list
diff --git a/src/pc/djui/djui_panel_playerlist.c b/src/pc/djui/djui_panel_playerlist.c
index 14f8b5ac6..dfe9417e3 100644
--- a/src/pc/djui/djui_panel_playerlist.c
+++ b/src/pc/djui/djui_panel_playerlist.c
@@ -13,6 +13,7 @@ struct DjuiThreePanel* gDjuiPlayerList = NULL;
static struct DjuiFlowLayout* djuiRow[MAX_PLAYERS] = { 0 };
static struct DjuiImage* djuiImages[MAX_PLAYERS] = { 0 };
static struct DjuiText* djuiTextNames[MAX_PLAYERS] = { 0 };
+static struct DjuiText* djuiTextDescriptions[MAX_PLAYERS] = { 0 };
static struct DjuiText* djuiTextLocations[MAX_PLAYERS] = { 0 };
static void playerlist_update_row(u8 i, struct NetworkPlayer* np) {
@@ -31,6 +32,9 @@ static void playerlist_update_row(u8 i, struct NetworkPlayer* np) {
djui_base_set_color(&djuiTextNames[i]->base, rgb[0], rgb[1], rgb[2], 255);
djui_text_set_text(djuiTextNames[i], np->name);
+ djui_base_set_color(&djuiTextDescriptions[i]->base, np->descriptionR, np->descriptionG, np->descriptionB, np->descriptionA);
+ djui_text_set_text(djuiTextDescriptions[i], np->description);
+
djui_text_set_text(djuiTextLocations[i], get_level_name(np->currCourseNum, np->currLevelNum, np->currAreaIndex));
}
@@ -56,7 +60,7 @@ void djui_panel_playerlist_create(UNUSED struct DjuiBase* caller) {
panel->base.on_render_pre = djui_panel_playerlist_on_render_pre;
djui_base_set_alignment(&panel->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER);
djui_base_set_size_type(&panel->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_ABSOLUTE);
- djui_base_set_size(&panel->base, 580, bodyHeight + (32 + 16) + 32 + 32);
+ djui_base_set_size(&panel->base, 585, bodyHeight + (32 + 16) + 32 + 32);
djui_base_set_visible(&panel->base, false);
struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel);
djui_flow_layout_set_margin(body, 4);
@@ -84,11 +88,18 @@ void djui_panel_playerlist_create(UNUSED struct DjuiBase* caller) {
djui_base_set_color(&t2->base, t, t, t, 255);
djuiTextNames[i] = t2;
- struct DjuiText* t3 = djui_text_create(&row->base, "location");
+ struct DjuiText* t3 = djui_text_create(&row->base, "");
djui_base_set_size_type(&t3->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_ABSOLUTE);
- djui_base_set_size(&t3->base, 300, 32.0f);
- djui_base_set_color(&t3->base, t, t, t, 255);
- djui_text_set_alignment(t3, DJUI_HALIGN_RIGHT, DJUI_VALIGN_TOP);
- djuiTextLocations[i] = t3;
+ djui_base_set_size(&t3->base, 100, 32.0f);
+ djui_base_set_color(&t3->base, 220, 220, 220, 255);
+ djui_text_set_alignment(t3, DJUI_HALIGN_CENTER, DJUI_VALIGN_TOP);
+ djuiTextDescriptions[i] = t3;
+
+ struct DjuiText* t4 = djui_text_create(&row->base, "location");
+ djui_base_set_size_type(&t4->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_ABSOLUTE);
+ djui_base_set_size(&t4->base, 300 - 100, 32.0f);
+ djui_base_set_color(&t4->base, t, t, t, 255);
+ djui_text_set_alignment(t4, DJUI_HALIGN_RIGHT, DJUI_VALIGN_TOP);
+ djuiTextLocations[i] = t4;
}
}
diff --git a/src/pc/lua/smlua_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c
index e6af69eb4..8362c44c7 100644
--- a/src/pc/lua/smlua_cobject_autogen.c
+++ b/src/pc/lua/smlua_cobject_autogen.c
@@ -447,7 +447,7 @@ static struct LuaObjectField sModeTransitionInfoFields[LUA_MODE_TRANSITION_INFO_
{ "transitionStart", LVT_COBJECT, offsetof(struct ModeTransitionInfo, transitionStart), true, LOT_LINEARTRANSITIONPOINT },
};
-#define LUA_NETWORK_PLAYER_FIELD_COUNT 18
+#define LUA_NETWORK_PLAYER_FIELD_COUNT 23
static struct LuaObjectField sNetworkPlayerFields[LUA_NETWORK_PLAYER_FIELD_COUNT] = {
{ "connected", LVT_BOOL, offsetof(struct NetworkPlayer, connected), true, LOT_NONE },
{ "currActNum", LVT_S16, offsetof(struct NetworkPlayer, currActNum), true, LOT_NONE },
@@ -457,6 +457,11 @@ static struct LuaObjectField sNetworkPlayerFields[LUA_NETWORK_PLAYER_FIELD_COUNT
{ "currLevelAreaSeqId", LVT_U16, offsetof(struct NetworkPlayer, currLevelAreaSeqId), true, LOT_NONE },
{ "currLevelNum", LVT_S16, offsetof(struct NetworkPlayer, currLevelNum), true, LOT_NONE },
{ "currLevelSyncValid", LVT_BOOL, offsetof(struct NetworkPlayer, currLevelSyncValid), true, LOT_NONE },
+ { "description", LVT_STRING, offsetof(struct NetworkPlayer, description), true, LOT_NONE },
+ { "descriptionA", LVT_U8, offsetof(struct NetworkPlayer, descriptionA), true, LOT_NONE },
+ { "descriptionB", LVT_U8, offsetof(struct NetworkPlayer, descriptionB), true, LOT_NONE },
+ { "descriptionG", LVT_U8, offsetof(struct NetworkPlayer, descriptionG), true, LOT_NONE },
+ { "descriptionR", LVT_U8, offsetof(struct NetworkPlayer, descriptionR), true, LOT_NONE },
{ "fadeOpacity", LVT_U8, offsetof(struct NetworkPlayer, fadeOpacity), true, LOT_NONE },
{ "globalIndex", LVT_U8, offsetof(struct NetworkPlayer, globalIndex), true, LOT_NONE },
{ "lastReceived", LVT_F32, offsetof(struct NetworkPlayer, lastReceived), true, LOT_NONE },
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index 4546e34e0..1707e54c7 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -2995,6 +2995,27 @@ int smlua_func_network_player_from_global_index(lua_State* L) {
return 1;
}
+int smlua_func_network_player_set_description(lua_State* L) {
+ if(!smlua_functions_valid_param_count(L, 6)) { return 0; }
+
+ struct NetworkPlayer* np = (struct NetworkPlayer*)smlua_to_cobject(L, 1, LOT_NETWORKPLAYER);
+ if (!gSmLuaConvertSuccess) { return 0; }
+ const char* description = smlua_to_string(L, 2);
+ if (!gSmLuaConvertSuccess) { return 0; }
+ u8 r = smlua_to_integer(L, 3);
+ if (!gSmLuaConvertSuccess) { return 0; }
+ u8 g = smlua_to_integer(L, 4);
+ if (!gSmLuaConvertSuccess) { return 0; }
+ u8 b = smlua_to_integer(L, 5);
+ if (!gSmLuaConvertSuccess) { return 0; }
+ u8 a = smlua_to_integer(L, 6);
+ if (!gSmLuaConvertSuccess) { return 0; }
+
+ network_player_set_description(np, description, r, g, b, a);
+
+ return 1;
+}
+
/////////////////////
// network_utils.h //
/////////////////////
@@ -3793,6 +3814,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "get_network_player_smallest_global", smlua_func_get_network_player_smallest_global);
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_set_description", smlua_func_network_player_set_description);
// network_utils.h
smlua_bind_function(L, "network_get_player_text_color_string", smlua_func_network_get_player_text_color_string);
diff --git a/src/pc/network/network_player.c b/src/pc/network/network_player.c
index f19c9b17a..c9d44a369 100644
--- a/src/pc/network/network_player.c
+++ b/src/pc/network/network_player.c
@@ -42,6 +42,21 @@ u8 network_player_connected_count(void) {
return count;
}
+void network_player_set_description(struct NetworkPlayer* np, const char* description, u8 r, u8 g, u8 b, u8 a) {
+ if (np == NULL) { return; }
+
+ if (description != NULL) {
+ snprintf(np->description, MAX_DESCRIPTION_STRING, "%s", description);
+ } else {
+ np->description[0] = '\0';
+ }
+
+ np->descriptionR = r;
+ np->descriptionG = g;
+ np->descriptionB = b;
+ np->descriptionA = a;
+}
+
struct NetworkPlayer* network_player_from_global_index(u8 globalIndex) {
for (int i = 0; i < MAX_PLAYERS; i++) {
if (!gNetworkPlayers[i].connected) { continue; }
@@ -181,6 +196,7 @@ u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 mode
np->localIndex = localIndex;
np->globalIndex = globalIndex;
if ((type != NPT_LOCAL) && (gNetworkType == NT_SERVER || type == NPT_SERVER)) { gNetworkSystem->save_id(localIndex, 0); }
+ network_player_set_description(np, NULL, 0, 0, 0, 0);
// update course/level
np->currLevelAreaSeqId = 0;
diff --git a/src/pc/network/network_player.h b/src/pc/network/network_player.h
index b5bf10ba2..eecb675c8 100644
--- a/src/pc/network/network_player.h
+++ b/src/pc/network/network_player.h
@@ -37,6 +37,13 @@ struct NetworkPlayer {
u8 modelIndex;
u8 paletteIndex;
char name[MAX_PLAYER_STRING+1];
+
+ char description[MAX_DESCRIPTION_STRING+1];
+ u8 descriptionR;
+ u8 descriptionG;
+ u8 descriptionB;
+ u8 descriptionA;
+
u16 rxSeqIds[MAX_RX_SEQ_IDS];
u32 rxPacketHash[MAX_RX_SEQ_IDS];
};
@@ -49,14 +56,18 @@ void network_player_init(void);
void network_player_update_model(u8 localIndex);
bool network_player_any_connected(void);
u8 network_player_connected_count(void);
+void network_player_set_description(struct NetworkPlayer* np, const char* description, u8 r, u8 g, u8 b, u8 a);
struct NetworkPlayer* network_player_from_global_index(u8 globalIndex);
struct NetworkPlayer* get_network_player_from_level(s16 courseNum, s16 actNum, s16 levelNum);
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_update(void);
+
u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 modelIndex, u8 paletteIndex, char* name);
u8 network_player_disconnected(u8 globalIndex);
+
void network_player_update_course_level(struct NetworkPlayer* np, s16 courseNum, s16 actNum, s16 levelNum, s16 areaIndex);
void network_player_shutdown(void);