From: fgsfds Date: Sat, 10 Aug 2019 18:22:23 +0000 (+0300) Subject: Net: Master now supports MOTD and message boxes X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=commitdiff_plain;h=a49e32f2040ac79644fabdfa629cd4fd4750c515 Net: Master now supports MOTD and message boxes --- diff --git a/src/engine/e_graphics.pas b/src/engine/e_graphics.pas index d0f9672..b1d3410 100644 --- a/src/engine/e_graphics.pas +++ b/src/engine/e_graphics.pas @@ -115,7 +115,8 @@ procedure e_TextureFontKill(FontID: DWORD); procedure e_TextureFontPrint(X, Y: GLint; Text: string; FontID: DWORD); procedure e_TextureFontPrintEx(X, Y: GLint; Text: string; FontID: DWORD; Red, Green, Blue: Byte; Scale: Single; Shadow: Boolean = False); -procedure e_TextureFontPrintFmt(X, Y: GLint; Text: string; FontID: DWORD; Shadow: Boolean = False); +procedure e_TextureFontPrintFmt(X, Y: GLint; Text: string; FontID: DWORD; + Shadow: Boolean = False; Newlines: Boolean = False); procedure e_TextureFontGetSize(ID: DWORD; out CharWidth, CharHeight: Byte); procedure e_RemoveAllTextureFont(); @@ -1685,11 +1686,12 @@ begin result := e_TextureFonts[FontID].CharWidth; end; -procedure e_TextureFontPrintFmt(X, Y: GLint; Text: string; FontID: DWORD; Shadow: Boolean = False); +procedure e_TextureFontPrintFmt(X, Y: GLint; Text: string; FontID: DWORD; + Shadow: Boolean = False; Newlines: Boolean = False); var a, TX, TY, len: Integer; tc, c: TRGB; - w: Word; + w, h: Word; begin if e_NoGraphics then Exit; if Text = '' then Exit; @@ -1705,6 +1707,7 @@ begin len := Length(Text); w := e_TextureFonts[FontID].CharWidth; + h := e_TextureFonts[FontID].CharHeight; with e_TextureFonts[FontID] do begin @@ -1721,12 +1724,15 @@ begin for a := 1 to len do begin case Text[a] of - {#10: // line feed + #10: // line feed begin - TX := X; - TY := TY + h; - continue; - end;} + if Newlines then + begin + TX := X; + TY := TY + h; + continue; + end; + end; #1: // black begin c.R := 0; c.G := 0; c.B := 0; diff --git a/src/game/g_language.pas b/src/game/g_language.pas index 2072855..08d315e 100644 --- a/src/game/g_language.pas +++ b/src/game/g_language.pas @@ -380,6 +380,8 @@ type I_NET_SLIST_WAIT, I_NET_SLIST_PING_MS, I_NET_SLIST_NO_ACCESS, + I_NET_SLIST_URGENT, + I_NET_SLIST_URGENT_CONT, I_NET_SLIST_FETCH, I_NET_SLIST_RETRIEVED, @@ -1319,6 +1321,10 @@ const ' ìñ'), ('NET SLIST NO ACCESS', 'N/A', 'Í/Ä'), + ('NET SLIST URGENT', 'Message from master server', + 'Ñîîáùåíèå ñ ìàñòåðñåðâåðà'), + ('NET SLIST URGENT CONT', 'Press [ENTER] to continue', + 'Íàæìèòå [ENTER] äëÿ ïðîäîëæåíèÿ'), ('NET SLIST FETCH', 'Fetching server list...', 'Ïîëó÷àåì ñïèñîê ñåðâåðîâ...'), diff --git a/src/game/g_netmaster.pas b/src/game/g_netmaster.pas index 84f6544..b413486 100644 --- a/src/game/g_netmaster.pas +++ b/src/game/g_netmaster.pas @@ -63,6 +63,9 @@ var slWaitStr: string = ''; slReturnPressed: Boolean = True; + slMOTD: string = ''; + slUrgent: string = ''; + procedure g_Net_Slist_Set(IP: string; Port: Word); function g_Net_Slist_Fetch(var SL: TNetServerList): Boolean; procedure g_Net_Slist_Update(); @@ -88,6 +91,7 @@ var slSelection: Byte = 0; slFetched: Boolean = False; slDirPressed: Boolean = False; + slReadUrgent: Boolean = False; function GetTimerMS(): Int64; begin @@ -136,7 +140,7 @@ var InMsg: TMsg; SvAddr: ENetAddress; FromSL: Boolean; - UpdVer, MyVer: string; + MyVer, Str: string; procedure ProcessLocal(); begin @@ -263,11 +267,20 @@ begin if InMsg.ReadCount < InMsg.CurSize then begin // new master, supports version reports - UpdVer := InMsg.ReadString(); - if (UpdVer <> MyVer) then + Str := InMsg.ReadString(); + if (Str <> MyVer) then begin { TODO } - g_Console_Add('!!! UpdVer = `' + UpdVer + '`'); + g_Console_Add('!!! UpdVer = `' + Str + '`'); + end; + // even newer master, supports extra info + if InMsg.ReadCount < InMsg.CurSize then + begin + slMOTD := b_Text_Format(InMsg.ReadString()); + Str := b_Text_Format(InMsg.ReadString()); + // check if the message has updated and the user has to read it again + if slUrgent <> Str then slReadUrgent := False; + slUrgent := Str; end; end; @@ -535,15 +548,47 @@ begin ip := _lc[I_NET_SLIST_HELP]; mw := (Length(ip) * cw) div 2; - e_DrawFillQuad(16, 64, gScreenWidth-16, gScreenHeight-44, 64, 64, 64, 110); - e_DrawQuad(16, 64, gScreenWidth-16, gScreenHeight-44, 255, 127, 0); + e_DrawFillQuad(16, 64, gScreenWidth-16, gScreenHeight-84, 64, 64, 64, 110); + e_DrawQuad(16, 64, gScreenWidth-16, gScreenHeight-84, 255, 127, 0); e_TextureFontPrintEx(gScreenWidth div 2 - mw, gScreenHeight-24, ip, gStdFont, 225, 225, 225, 1); + // MOTD + if slMOTD <> '' then + begin + e_DrawFillQuad(16, gScreenHeight-84, gScreenWidth-16, gScreenHeight-44, 64, 64, 64, 110); + e_DrawQuad(16, gScreenHeight-84, gScreenWidth-16, gScreenHeight-44, 255, 127, 0); + e_TextureFontPrintFmt(20, gScreenHeight-81, slMOTD, gStdFont, False, True); + end; + + // Urgent message + if not slReadUrgent and (slUrgent <> '') then + begin + e_DrawFillQuad(17, 65, gScreenWidth-17, gScreenHeight-85, 64, 64, 64, 128); + e_DrawFillQuad(gScreenWidth div 2 - 256, gScreenHeight div 2 - 60, + gScreenWidth div 2 + 256, gScreenHeight div 2 + 60, 64, 64, 64, 128); + e_DrawQuad(gScreenWidth div 2 - 256, gScreenHeight div 2 - 60, + gScreenWidth div 2 + 256, gScreenHeight div 2 + 60, 255, 127, 0); + e_DrawLine(1, gScreenWidth div 2 - 256, gScreenHeight div 2 - 40, + gScreenWidth div 2 + 256, gScreenHeight div 2 - 40, 255, 127, 0); + l := Length(_lc[I_NET_SLIST_URGENT]) div 2; + e_TextureFontPrint(gScreenWidth div 2 - cw * l, gScreenHeight div 2 - 58, + _lc[I_NET_SLIST_URGENT], gStdFont); + l := Length(slUrgent) div 2; + e_TextureFontPrintFmt(gScreenWidth div 2 - 253, gScreenHeight div 2 - 38, + slUrgent, gStdFont, False, True); + l := Length(_lc[I_NET_SLIST_URGENT_CONT]) div 2; + e_TextureFontPrint(gScreenWidth div 2 - cw * l, gScreenHeight div 2 + 41, + _lc[I_NET_SLIST_URGENT_CONT], gStdFont); + e_DrawLine(1, gScreenWidth div 2 - 256, gScreenHeight div 2 + 40, + gScreenWidth div 2 + 256, gScreenHeight div 2 + 40, 255, 127, 0); + Exit; + end; + if SL = nil then begin l := Length(slWaitStr) div 2; - e_DrawFillQuad(16, 64, gScreenWidth-16, gScreenHeight-44, 64, 64, 64, 128); + e_DrawFillQuad(17, 65, gScreenWidth-17, gScreenHeight-85, 64, 64, 64, 128); e_DrawQuad(gScreenWidth div 2 - 192, gScreenHeight div 2 - 10, gScreenWidth div 2 + 192, gScreenHeight div 2 + 11, 255, 127, 0); e_TextureFontPrint(gScreenWidth div 2 - cw * l, gScreenHeight div 2 - ch div 2, @@ -574,12 +619,12 @@ begin e_DrawLine(1, 16 + 1, sy + 41, gScreenWidth - 16 - 1, sy + 41, 255, 255, 255); e_DrawLine(1, 16, 85, gScreenWidth - 16, 85, 255, 127, 0); - e_DrawLine(1, 16, gScreenHeight-64, gScreenWidth-16, gScreenHeight-64, 255, 127, 0); + e_DrawLine(1, 16, gScreenHeight-104, gScreenWidth-16, gScreenHeight-104, 255, 127, 0); - e_DrawLine(1, mx - 70, 64, mx - 70, gScreenHeight-44, 255, 127, 0); - e_DrawLine(1, mx, 64, mx, gScreenHeight-64, 255, 127, 0); - e_DrawLine(1, mx + 52, 64, mx + 52, gScreenHeight-64, 255, 127, 0); - e_DrawLine(1, mx + 104, 64, mx + 104, gScreenHeight-64, 255, 127, 0); + e_DrawLine(1, mx - 70, 64, mx - 70, gScreenHeight-84, 255, 127, 0); + e_DrawLine(1, mx, 64, mx, gScreenHeight-104, 255, 127, 0); + e_DrawLine(1, mx + 52, 64, mx + 52, gScreenHeight-104, 255, 127, 0); + e_DrawLine(1, mx + 104, 64, mx + 104, gScreenHeight-104, 255, 127, 0); e_TextureFontPrintEx(18, 68, 'NAME/MAP', gStdFont, 255, 127, 0, 1); e_TextureFontPrintEx(mx - 68, 68, 'PING', gStdFont, 255, 127, 0, 1); @@ -620,10 +665,10 @@ begin y := y + 42; end; - e_TextureFontPrintEx(20, gScreenHeight-61, ip, gStdFont, 205, 205, 205, 1); + e_TextureFontPrintEx(20, gScreenHeight-101, ip, gStdFont, 205, 205, 205, 1); ip := IntToStr(Length(ST)) + _lc[I_NET_SLIST_SERVERS]; e_TextureFontPrintEx(gScreenWidth - 48 - (Length(ip) + 1)*cw, - gScreenHeight-61, ip, gStdFont, 205, 205, 205, 1); + gScreenHeight-101, ip, gStdFont, 205, 205, 205, 1); end; procedure g_Serverlist_GenerateTable(SL: TNetServerList; var ST: TNetServerTable); @@ -738,6 +783,15 @@ begin Exit; end; + // if there's a message on the screen, + if not slReadUrgent and (slUrgent <> '') then + begin + if e_KeyPressed(IK_RETURN) or e_KeyPressed(IK_KPRETURN) or e_KeyPressed(VK_FIRE) or e_KeyPressed(VK_OPEN) or + e_KeyPressed(JOY0_ATTACK) or e_KeyPressed(JOY1_ATTACK) or e_KeyPressed(JOY2_ATTACK) or e_KeyPressed(JOY3_ATTACK) then + slReadUrgent := True; + Exit; + end; + if e_KeyPressed(IK_SPACE) or e_KeyPressed(VK_JUMP) or e_KeyPressed(JOY0_ACTIVATE) or e_KeyPressed(JOY1_ACTIVATE) or e_KeyPressed(JOY2_ACTIVATE) or e_KeyPressed(JOY3_ACTIVATE) then begin diff --git a/src/mastersrv/master.c b/src/mastersrv/master.c index 7f476c1..9745694 100644 --- a/src/mastersrv/master.c +++ b/src/mastersrv/master.c @@ -27,7 +27,11 @@ #define LC_MS_LIST "\nSent server list to %x:%u (ver. %s).\n" #define LC_MS_DIE "\nD2DF master server shutting down...\n" #define LC_MS_CONN "\nIncoming connection from %x:%u...\n" +#define LC_MS_MOTD "\nMOTD: %s\n" +#define LC_MS_URGENT "\nURGENT: %s\n" +#define MS_URGENT_FILE "urgent.txt" +#define MS_MOTD_FILE "motd.txt" struct ms_server_s { enet_uint8 used; @@ -46,6 +50,9 @@ struct ms_server_s { typedef struct ms_server_s ms_server; const char ms_game_ver[] = "0.63"; +char ms_motd[256] = ""; +char ms_urgent[256] = ""; + int ms_port = 25660; int ms_timeout = 100000; @@ -132,7 +139,18 @@ void d_getargs (int argc, char *argv[]) { } -enet_uint8 b_read_uint8 (enet_uint8 buf[], size_t *pos) { +int d_readtextfile (const char *fname, char *buf, size_t max) { + FILE *f = fopen(fname, "r"); + if (f) { + fgets(buf, max, f); + fclose(f); + return 0; + } + return 1; +} + + +enet_uint8 b_read_uint8 (enet_uint8 buf[], size_t *pos) { return buf[(*pos)++]; } @@ -205,6 +223,12 @@ int main (int argc, char *argv[]) { printf(LC_MS_INIT, ms_port); + d_readtextfile(MS_MOTD_FILE, ms_motd, sizeof(ms_motd)); + d_readtextfile(MS_URGENT_FILE, ms_urgent, sizeof(ms_urgent)); + + if (ms_motd[0]) printf(LC_MS_MOTD, ms_motd); + if (ms_urgent[0]) printf(LC_MS_URGENT, ms_urgent); + for (int i = 0; i < NET_MAXCLIENTS; ++i) ms_peers[i] = NULL; for (int i = 0; i < MS_MAXSRVS; ++i) { @@ -347,6 +371,9 @@ int main (int argc, char *argv[]) { // TODO: check if this client is outdated (?) and send back new verstring // for now just write the same shit back b_write_dstring(b_send, &b_write, clientver); + // write the motd and urgent message + b_write_dstring(b_send, &b_write, ms_motd); + b_write_dstring(b_send, &b_write, ms_urgent); } ENetPacket *p = enet_packet_create(b_send, b_write, ENET_PACKET_FLAG_RELIABLE);