|
diff --git a/src/keybind.cpp b/src/keybind.cpp |
|
index eea404603..31b094ca3 100644 |
|
--- a/src/keybind.cpp |
|
+++ b/src/keybind.cpp |
|
@@ -1724,7 +1724,7 @@ void kf_SelectNextFactory() |
|
{ |
|
STRUCTURE *psCurr; |
|
|
|
- selNextSpecifiedBuilding(REF_FACTORY); |
|
+ selNextSpecifiedBuilding(REF_FACTORY, false); |
|
|
|
//deselect factories of other types |
|
for (psCurr = apsStructLists[selectedPlayer]; psCurr; psCurr = psCurr->psNext) |
|
@@ -1747,7 +1747,7 @@ void kf_SelectNextFactory() |
|
// -------------------------------------------------------------------------- |
|
void kf_SelectNextResearch() |
|
{ |
|
- selNextSpecifiedBuilding(REF_RESEARCH); |
|
+ selNextSpecifiedBuilding(REF_RESEARCH, false); |
|
if (intCheckReticuleButEnabled(IDRET_RESEARCH)) |
|
{ |
|
setKeyButtonMapping(IDRET_RESEARCH); |
|
@@ -1758,7 +1758,7 @@ void kf_SelectNextResearch() |
|
// -------------------------------------------------------------------------- |
|
void kf_SelectNextPowerStation() |
|
{ |
|
- selNextSpecifiedBuilding(REF_POWER_GEN); |
|
+ selNextSpecifiedBuilding(REF_POWER_GEN, false); |
|
triggerEventSelected(); |
|
} |
|
|
|
@@ -1767,7 +1767,7 @@ void kf_SelectNextCyborgFactory() |
|
{ |
|
STRUCTURE *psCurr; |
|
|
|
- selNextSpecifiedBuilding(REF_CYBORG_FACTORY); |
|
+ selNextSpecifiedBuilding(REF_CYBORG_FACTORY, false); |
|
|
|
//deselect factories of other types |
|
for (psCurr = apsStructLists[selectedPlayer]; psCurr; psCurr = psCurr->psNext) |
|
@@ -1787,6 +1787,124 @@ void kf_SelectNextCyborgFactory() |
|
triggerEventSelected(); |
|
} |
|
|
|
+// -------------------------------------------------------------------------- |
|
+void kf_SelectNextVTOLFactory() |
|
+{ |
|
+ STRUCTURE *psCurr; |
|
+ |
|
+ selNextSpecifiedBuilding(REF_VTOL_FACTORY, false); |
|
+ |
|
+ //deselect factories of other types |
|
+ for (psCurr = apsStructLists[selectedPlayer]; psCurr; psCurr = psCurr->psNext) |
|
+ { |
|
+ if (psCurr->selected && |
|
+ ((psCurr->pStructureType->type == REF_FACTORY) || |
|
+ (psCurr->pStructureType->type == REF_CYBORG_FACTORY))) |
|
+ { |
|
+ psCurr->selected = false; |
|
+ } |
|
+ } |
|
+ |
|
+ if (intCheckReticuleButEnabled(IDRET_MANUFACTURE)) |
|
+ { |
|
+ setKeyButtonMapping(IDRET_MANUFACTURE); |
|
+ } |
|
+ triggerEventSelected(); |
|
+} |
|
+ |
|
+// -------------------------------------------------------------------------- |
|
+void kf_JumpNextFactory() |
|
+{ |
|
+ STRUCTURE *psCurr; |
|
+ |
|
+ selNextSpecifiedBuilding(REF_FACTORY, true); |
|
+ |
|
+ //deselect factories of other types |
|
+ for (psCurr = apsStructLists[selectedPlayer]; psCurr; psCurr = psCurr->psNext) |
|
+ { |
|
+ if (psCurr->selected && |
|
+ ((psCurr->pStructureType->type == REF_CYBORG_FACTORY) || |
|
+ (psCurr->pStructureType->type == REF_VTOL_FACTORY))) |
|
+ { |
|
+ psCurr->selected = false; |
|
+ } |
|
+ } |
|
+ |
|
+ if (intCheckReticuleButEnabled(IDRET_MANUFACTURE)) |
|
+ { |
|
+ setKeyButtonMapping(IDRET_MANUFACTURE); |
|
+ } |
|
+ triggerEventSelected(); |
|
+} |
|
+ |
|
+// -------------------------------------------------------------------------- |
|
+void kf_JumpNextResearch() |
|
+{ |
|
+ selNextSpecifiedBuilding(REF_RESEARCH, true); |
|
+ if (intCheckReticuleButEnabled(IDRET_RESEARCH)) |
|
+ { |
|
+ setKeyButtonMapping(IDRET_RESEARCH); |
|
+ } |
|
+ triggerEventSelected(); |
|
+} |
|
+ |
|
+// -------------------------------------------------------------------------- |
|
+void kf_JumpNextPowerStation() |
|
+{ |
|
+ selNextSpecifiedBuilding(REF_POWER_GEN, true); |
|
+ triggerEventSelected(); |
|
+} |
|
+ |
|
+// -------------------------------------------------------------------------- |
|
+void kf_JumpNextCyborgFactory() |
|
+{ |
|
+ STRUCTURE *psCurr; |
|
+ |
|
+ selNextSpecifiedBuilding(REF_CYBORG_FACTORY, true); |
|
+ |
|
+ //deselect factories of other types |
|
+ for (psCurr = apsStructLists[selectedPlayer]; psCurr; psCurr = psCurr->psNext) |
|
+ { |
|
+ if (psCurr->selected && |
|
+ ((psCurr->pStructureType->type == REF_FACTORY) || |
|
+ (psCurr->pStructureType->type == REF_VTOL_FACTORY))) |
|
+ { |
|
+ psCurr->selected = false; |
|
+ } |
|
+ } |
|
+ |
|
+ if (intCheckReticuleButEnabled(IDRET_MANUFACTURE)) |
|
+ { |
|
+ setKeyButtonMapping(IDRET_MANUFACTURE); |
|
+ } |
|
+ triggerEventSelected(); |
|
+} |
|
+ |
|
+// -------------------------------------------------------------------------- |
|
+void kf_JumpNextVTOLFactory() |
|
+{ |
|
+ STRUCTURE *psCurr; |
|
+ |
|
+ selNextSpecifiedBuilding(REF_VTOL_FACTORY, true); |
|
+ |
|
+ //deselect factories of other types |
|
+ for (psCurr = apsStructLists[selectedPlayer]; psCurr; psCurr = psCurr->psNext) |
|
+ { |
|
+ if (psCurr->selected && |
|
+ ((psCurr->pStructureType->type == REF_FACTORY) || |
|
+ (psCurr->pStructureType->type == REF_CYBORG_FACTORY))) |
|
+ { |
|
+ psCurr->selected = false; |
|
+ } |
|
+ } |
|
+ |
|
+ if (intCheckReticuleButEnabled(IDRET_MANUFACTURE)) |
|
+ { |
|
+ setKeyButtonMapping(IDRET_MANUFACTURE); |
|
+ } |
|
+ triggerEventSelected(); |
|
+} |
|
+ |
|
// -------------------------------------------------------------------------- |
|
|
|
|
|
diff --git a/src/keybind.h b/src/keybind.h |
|
index 32801606b..0ec6ce92d 100644 |
|
--- a/src/keybind.h |
|
+++ b/src/keybind.h |
|
@@ -203,8 +203,14 @@ void kf_RadarZoomIn(); |
|
void kf_RadarZoomOut(); |
|
void kf_SelectNextFactory(); |
|
void kf_SelectNextCyborgFactory(); |
|
+void kf_SelectNextVTOLFactory(); |
|
void kf_SelectNextPowerStation(); |
|
void kf_SelectNextResearch(); |
|
+void kf_JumpNextFactory(); |
|
+void kf_JumpNextCyborgFactory(); |
|
+void kf_JumpNextVTOLFactory(); |
|
+void kf_JumpNextPowerStation(); |
|
+void kf_JumpNextResearch(); |
|
void kf_ToggleConsoleDrop(); |
|
void kf_ToggleMouseInvert(); |
|
void kf_BifferBaker(); |
|
diff --git a/src/keymap.cpp b/src/keymap.cpp |
|
index d725ee360..9b58176bb 100644 |
|
--- a/src/keymap.cpp |
|
+++ b/src/keymap.cpp |
|
@@ -295,6 +295,12 @@ static KeyMapSaveTable const keyMapSaveTable( |
|
{kf_SelectNextResearch, "SelectNextResearch"}, |
|
{kf_SelectNextPowerStation, "SelectNextPowerStation"}, |
|
{kf_SelectNextCyborgFactory, "SelectNextCyborgFactory"}, |
|
+ {kf_SelectNextVTOLFactory, "SelectNextVtolFactory"}, |
|
+ {kf_JumpNextFactory, "JumpNextFactory"}, |
|
+ {kf_JumpNextResearch, "JumpNextResearch"}, |
|
+ {kf_JumpNextPowerStation, "JumpNextPowerStation"}, |
|
+ {kf_JumpNextCyborgFactory, "JumpNextCyborgFactory"}, |
|
+ {kf_JumpNextVTOLFactory, "JumpNextVtolFactory"}, |
|
// |
|
// Debug options |
|
{kf_ToggleDebugMappings, "ToggleDebugMappings"}, |
|
@@ -528,6 +534,12 @@ void keyInitMappings(bool bForceDefaults) |
|
didAdd = keyAddDefaultMapping(KEYMAP_ASSIGNABLE, KEY_IGNORE, (KEY_CODE)KEY_MAXSCAN, KEYMAP_PRESSED, kf_SelectNextResearch, N_("Select next Research Facility"), bForceDefaults) || didAdd; |
|
didAdd = keyAddDefaultMapping(KEYMAP_ASSIGNABLE, KEY_IGNORE, (KEY_CODE)KEY_MAXSCAN, KEYMAP_PRESSED, kf_SelectNextPowerStation, N_("Select next Power Generator"), bForceDefaults) || didAdd; |
|
didAdd = keyAddDefaultMapping(KEYMAP_ASSIGNABLE, KEY_IGNORE, (KEY_CODE)KEY_MAXSCAN, KEYMAP_PRESSED, kf_SelectNextCyborgFactory, N_("Select next Cyborg Factory"), bForceDefaults) || didAdd; |
|
+ didAdd = keyAddDefaultMapping(KEYMAP_ASSIGNABLE, KEY_IGNORE, (KEY_CODE)KEY_MAXSCAN, KEYMAP_PRESSED, kf_SelectNextVTOLFactory, N_("Select next VTOL Factory"), bForceDefaults) || didAdd; |
|
+ didAdd = keyAddDefaultMapping(KEYMAP_ASSIGNABLE, KEY_IGNORE, (KEY_CODE)KEY_MAXSCAN, KEYMAP_PRESSED, kf_JumpNextFactory, N_("Jump to next Factory"), bForceDefaults) || didAdd; |
|
+ didAdd = keyAddDefaultMapping(KEYMAP_ASSIGNABLE, KEY_IGNORE, (KEY_CODE)KEY_MAXSCAN, KEYMAP_PRESSED, kf_JumpNextResearch, N_("Jump to next Research Facility"), bForceDefaults) || didAdd; |
|
+ didAdd = keyAddDefaultMapping(KEYMAP_ASSIGNABLE, KEY_IGNORE, (KEY_CODE)KEY_MAXSCAN, KEYMAP_PRESSED, kf_JumpNextPowerStation, N_("Jump to next Power Generator"), bForceDefaults) || didAdd; |
|
+ didAdd = keyAddDefaultMapping(KEYMAP_ASSIGNABLE, KEY_IGNORE, (KEY_CODE)KEY_MAXSCAN, KEYMAP_PRESSED, kf_JumpNextCyborgFactory, N_("Jump to next Cyborg Factory"), bForceDefaults) || didAdd; |
|
+ didAdd = keyAddDefaultMapping(KEYMAP_ASSIGNABLE, KEY_IGNORE, (KEY_CODE)KEY_MAXSCAN, KEYMAP_PRESSED, kf_JumpNextVTOLFactory, N_("Jump to next VTOL Factory"), bForceDefaults) || didAdd; |
|
|
|
// Debug options |
|
didAdd = keyAddDefaultMapping(KEYMAP___HIDE, KEY_LSHIFT, KEY_BACKSPACE, KEYMAP_PRESSED, kf_ToggleDebugMappings, N_("Toggle Debug Mappings"), bForceDefaults) || didAdd; |
|
diff --git a/src/multiint.cpp b/src/multiint.cpp |
|
index dad538d38..1c6f0ec84 100644 |
|
--- a/src/multiint.cpp |
|
+++ b/src/multiint.cpp |
|
@@ -189,6 +189,7 @@ struct DisplayPlayerCache { |
|
WzText wzMainText; // the main text |
|
|
|
WzText wzSubText; // the sub text (used for players) |
|
+ WzText wzEloText; // elo text |
|
}; |
|
struct DisplayPositionCache { |
|
WzText wzPositionText; |
|
@@ -2975,7 +2976,7 @@ static void randomizeOptions() |
|
if (bHosted) |
|
{ |
|
((MultichoiceWidget *)widgGetFromID(psWScreen, MULTIOP_TECHLEVEL))->choose(game.techLevel); |
|
- |
|
+ |
|
disableMultiButs(); |
|
resetReadyStatus(true); |
|
} |
|
@@ -3236,11 +3237,43 @@ void WzMultiOptionTitleUI::processMultiopWidgets(UDWORD id) |
|
case MULTIOP_CHATEDIT: |
|
|
|
// don't send empty lines to other players in the lobby |
|
- if (!strcmp(widgGetString(psWScreen, MULTIOP_CHATEDIT), "")) |
|
- { |
|
+ if(!strcmp(widgGetString(psWScreen, MULTIOP_CHATEDIT), "")) { |
|
+ break; |
|
+ } |
|
+ if(!strcmp(widgGetString(psWScreen, MULTIOP_CHATEDIT), "#showlimits")) { |
|
+ char msggg[1025] = {0}; |
|
+ if(!ingame.structureLimits.empty()) { |
|
+ int limv = -1, limfcyb = -1, limffac = -1, limlab = -1; |
|
+ for(const auto& structLimit : ingame.structureLimits) { |
|
+ debug(LOG_INFO, "%d", asStructureStats[id].type); |
|
+ int id = structLimit.id; |
|
+ int lim = structLimit.limit; |
|
+ if(asStructureStats[id].type == REF_VTOL_FACTORY) { |
|
+ limv = lim; |
|
+ } |
|
+ if(asStructureStats[id].type == REF_CYBORG_FACTORY) { |
|
+ limfcyb = lim; |
|
+ } |
|
+ if(asStructureStats[id].type == REF_FACTORY) { |
|
+ limffac = lim; |
|
+ } |
|
+ if(asStructureStats[id].type == REF_RESEARCH) { |
|
+ limlab = lim; |
|
+ } |
|
+ } |
|
+ snprintf(msggg, 1024, "VTOL:%d FACT:%dc/%dt LAB:%d", limv, limfcyb, limffac, limlab); |
|
+ } else { |
|
+ snprintf(msggg, 1024, "Limits not initialized"); |
|
+ } |
|
+ sendTextMessage(msggg, true); |
|
+ widgSetString(psWScreen, MULTIOP_CHATEDIT, ""); |
|
+ break; |
|
+ } else if(!strcmp(widgGetString(psWScreen, MULTIOP_CHATEDIT), "#forcestart")) { |
|
+ startMultiplayerGame(); |
|
+ sendTextMessage("Host is force starting game because he can, glhf", true); |
|
+ widgSetString(psWScreen, MULTIOP_CHATEDIT, ""); |
|
break; |
|
} |
|
- |
|
sendTextMessage(widgGetString(psWScreen, MULTIOP_CHATEDIT), true); //send |
|
widgSetString(psWScreen, MULTIOP_CHATEDIT, ""); // clear box |
|
break; |
|
@@ -4371,6 +4404,9 @@ void displayPlayer(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset) |
|
} |
|
|
|
PLAYERSTATS stat = getMultiStats(j); |
|
+ cache.wzEloText.setText(stat.elo, font_small); |
|
+ cache.wzEloText.render(x + nameX, y + 31 + 5*!subText.empty(), WZCOL_TEXT_BRIGHT); |
|
+ |
|
if (stat.played < 5) |
|
{ |
|
iV_DrawImage(FrontImages, IMAGE_MEDAL_DUMMY, x + 4, y + 13); |
|
diff --git a/src/multijoin.cpp b/src/multijoin.cpp |
|
index 2da9f9b7a..c80e6713e 100644 |
|
--- a/src/multijoin.cpp |
|
+++ b/src/multijoin.cpp |
|
@@ -456,7 +456,7 @@ bool recvDataCheck(NETQUEUE queue) |
|
{ |
|
} |
|
|
|
- sprintf(msg, _("%s (%u) has an incompatible mod, and has been kicked."), getPlayerName(player), player); |
|
+ snprintf(msg, sizeof(msg), _("%s (%u) has an incompatible mod, and has been kicked."), getPlayerName(player), player); |
|
sendTextMessage(msg, true); |
|
addConsoleMessage(msg, LEFT_JUSTIFY, NOTIFY_MESSAGE); |
|
|
|
diff --git a/src/multimenu.cpp b/src/multimenu.cpp |
|
index 2c1466c74..b07fb42f9 100644 |
|
--- a/src/multimenu.cpp |
|
+++ b/src/multimenu.cpp |
|
@@ -703,19 +703,19 @@ static void displayExtraGubbins(UDWORD height, ExtraGubbinsCache& cache) |
|
bool isTotal = q != 0; |
|
|
|
char const *srText[2] = {_("Sent/Received per sec —"), _("Total Sent/Received —")}; |
|
- sprintf(str, "%s", srText[q]); |
|
+ snprintf(str, sizeof(str), "%s", srText[q]); |
|
iV_DrawText(str, MULTIMENU_FORM_X + xPos, MULTIMENU_FORM_Y + height + yPos, font_small); |
|
xPos += iV_GetTextWidth(str, font_small) + 20; |
|
|
|
- sprintf(str, _("Traf: %u/%u"), NETgetStatistic(NetStatisticRawBytes, true, isTotal), NETgetStatistic(NetStatisticRawBytes, false, isTotal)); |
|
+ snprintf(str, sizeof(str), _("Traf: %u/%u"), NETgetStatistic(NetStatisticRawBytes, true, isTotal), NETgetStatistic(NetStatisticRawBytes, false, isTotal)); |
|
iV_DrawText(str, MULTIMENU_FORM_X + xPos, MULTIMENU_FORM_Y + height + yPos, font_small); |
|
xPos += iV_GetTextWidth(str, font_small) + 20; |
|
|
|
- sprintf(str, _("Uncompressed: %u/%u"), NETgetStatistic(NetStatisticUncompressedBytes, true, isTotal), NETgetStatistic(NetStatisticUncompressedBytes, false, isTotal)); |
|
+ snprintf(str, sizeof(str), _("Uncompressed: %u/%u"), NETgetStatistic(NetStatisticUncompressedBytes, true, isTotal), NETgetStatistic(NetStatisticUncompressedBytes, false, isTotal)); |
|
iV_DrawText(str, MULTIMENU_FORM_X + xPos, MULTIMENU_FORM_Y + height + yPos, font_small); |
|
xPos += iV_GetTextWidth(str, font_small) + 20; |
|
|
|
- sprintf(str, _("Pack: %u/%u"), NETgetStatistic(NetStatisticPackets, true, isTotal), NETgetStatistic(NetStatisticPackets, false, isTotal)); |
|
+ snprintf(str, sizeof(str), _("Pack: %u/%u"), NETgetStatistic(NetStatisticPackets, true, isTotal), NETgetStatistic(NetStatisticPackets, false, isTotal)); |
|
iV_DrawText(str, MULTIMENU_FORM_X + xPos, MULTIMENU_FORM_Y + height + yPos, font_small); |
|
} |
|
#endif |
|
diff --git a/src/multiplay.cpp b/src/multiplay.cpp |
|
index 94449bbc4..6eabc3138 100644 |
|
--- a/src/multiplay.cpp |
|
+++ b/src/multiplay.cpp |
|
@@ -263,7 +263,7 @@ bool multiPlayerLoop() |
|
{ |
|
char msg[256] = {'\0'}; |
|
|
|
- sprintf(msg, _("Kicking player %s, because they tried to bypass data integrity check!"), getPlayerName(index)); |
|
+ snprintf(msg, sizeof(msg), _("Kicking player %s, because they tried to bypass data integrity check!"), getPlayerName(index)); |
|
sendTextMessage(msg, true); |
|
addConsoleMessage(msg, LEFT_JUSTIFY, NOTIFY_MESSAGE); |
|
NETlogEntry(msg, SYNC_FLAG, index); |
|
@@ -1498,6 +1498,15 @@ bool recvTextMessage(NETQUEUE queue) |
|
// Add message |
|
sstrcat(msg, newmsg); |
|
|
|
+ struct PLAYERSTATS ps = getMultiStats(playerIndex); |
|
+ if(!ps.identity.empty()) { |
|
+ typedef std::vector<uint8_t> Key; |
|
+ Key f = ps.identity.toBytes(EcKey::Public); |
|
+ printf("WZHCHAT %s %s %s\n", sha256Sum(&f[0], f.size()).toString().substr(0, 20).c_str(), NetPlay.players[playerIndex].IPtextAddress, NetPlay.players[playerIndex].name); |
|
+ printf("WZMCHAT %s\n", newmsg); |
|
+ fflush(stdout); |
|
+ } |
|
+ |
|
addConsoleMessage(msg, DEFAULT_JUSTIFY, playerIndex, team); |
|
|
|
// make some noise! |
|
@@ -1753,7 +1762,7 @@ VIEWDATA *CreateBeaconViewData(SDWORD sender, UDWORD LocX, UDWORD LocY) |
|
psViewData = new VIEWDATA; |
|
|
|
//store name |
|
- sprintf(name, _("Beacon %d"), sender); |
|
+ snprintf(name, sizeof(name), _("Beacon %d"), sender); |
|
psViewData->name = name; |
|
|
|
//store text message, hardcoded for now |
|
diff --git a/src/multistat.cpp b/src/multistat.cpp |
|
index 0fdfc4a38..753c8a6a4 100644 |
|
--- a/src/multistat.cpp |
|
+++ b/src/multistat.cpp |
|
@@ -44,6 +44,9 @@ |
|
#include "mission.h" // for cheats |
|
#include "multistat.h" |
|
#include "activity.h" |
|
+#include "urlhelpers.h" |
|
+#include "urlrequest.h" |
|
+#include "../lib/framework/wzapp.h" |
|
#include <utility> |
|
|
|
|
|
@@ -159,6 +162,37 @@ void recvMultiStats(NETQUEUE queue) |
|
{ |
|
ingame.PingTimes[playerIndex] = PING_LIMIT; |
|
} |
|
+ if (!identity.empty()) { |
|
+ playerStats[playerIndex].elo = std::string("loading"); |
|
+ EcKey::Key f = identity; |
|
+ URLDataRequest urlRequest; |
|
+ urlRequest.url = std::string("https://bruh.software/wz/api.php?key=aswudhgefnqidnadaw&hash=")+sha256Sum(&f[0], f.size()).toString().substr(0, 20).c_str(); |
|
+ debug(LOG_INFO, "Requesting %s", urlRequest.url.c_str()); |
|
+ urlRequest.onSuccess = [playerIndex](const std::string& url, const HTTPResponseDetails& responseDetails, const std::shared_ptr<MemoryStruct>& data) { |
|
+ long httpStatusCode = responseDetails.httpStatusCode(); |
|
+ if (httpStatusCode != 200) |
|
+ { |
|
+ wzAsyncExecOnMainThread([httpStatusCode]{ |
|
+ debug(LOG_WARNING, "Query for Autorating API returned HTTP status code: %ld", httpStatusCode); |
|
+ }); |
|
+ return; |
|
+ } |
|
+ |
|
+ if (!data || data->memory == nullptr || data->size == 0) |
|
+ { |
|
+ // Invalid data response |
|
+ return; |
|
+ } |
|
+ playerStats[playerIndex].elo = std::string(data->memory); |
|
+ }; |
|
+ urlRequest.onFailure = [](const std::string& url, URLRequestFailureType type, optional<HTTPResponseDetails> transferDetails) { |
|
+ wzAsyncExecOnMainThread([]{ |
|
+ debug(LOG_WARNING, "error"); |
|
+ }); |
|
+ }; |
|
+ urlRequest.maxDownloadSizeLimit = 4 * 1024 * 1024; // response should never be > 4 MB |
|
+ urlRequestData(urlRequest); |
|
+ } |
|
} |
|
NETend(); |
|
} |
|
@@ -385,4 +419,3 @@ uint32_t getSelectedPlayerUnitsKilled() |
|
return missionData.unitsKilled; |
|
} |
|
} |
|
- |
|
diff --git a/src/multistat.h b/src/multistat.h |
|
index 88a3683c2..1eac46bc7 100644 |
|
--- a/src/multistat.h |
|
+++ b/src/multistat.h |
|
@@ -41,6 +41,8 @@ struct PLAYERSTATS |
|
uint32_t recentKills; // score/kills in last game. |
|
uint32_t recentScore; |
|
|
|
+ std::string elo = ""; |
|
+ |
|
EcKey identity; |
|
}; |
|
|
|
diff --git a/src/order.cpp b/src/order.cpp |
|
index ebddc11c1..d26f534c2 100644 |
|
--- a/src/order.cpp |
|
+++ b/src/order.cpp |
|
@@ -1128,7 +1128,7 @@ void orderUpdateDroid(DROID *psDroid) |
|
if (psDroid->selected) |
|
{ |
|
// Tell us what the droid is doing. |
|
- sprintf(DROIDDOING, "%.12s,id(%d) order(%d):%s action(%d):%s secondary:%x move:%s", droidGetName(psDroid), psDroid->id, |
|
+ snprintf(DROIDDOING, sizeof(DROIDDOING), "%.12s,id(%d) order(%d):%s action(%d):%s secondary:%x move:%s", droidGetName(psDroid), psDroid->id, |
|
psDroid->order.type, getDroidOrderName(psDroid->order.type), psDroid->action, getDroidActionName(psDroid->action), psDroid->secondaryOrder, |
|
moveDescription(psDroid->sMove.Status)); |
|
} |
|
diff --git a/src/qtscriptfuncs.cpp b/src/qtscriptfuncs.cpp |
|
index a7cb97879..58cdec13c 100644 |
|
--- a/src/qtscriptfuncs.cpp |
|
+++ b/src/qtscriptfuncs.cpp |
|
@@ -1709,7 +1709,7 @@ static QScriptValue js_pursueResearch(QScriptContext *context, QScriptEngine *en |
|
sendResearchStatus(psStruct, cur->index, player, true); |
|
#if defined (DEBUG) |
|
char sTemp[128]; |
|
- sprintf(sTemp, "player:%d starts topic from script: %s", player, getID(cur)); |
|
+ snprintf(sTemp, sizeof(sTemp), "player:%d starts topic from script: %s", player, getID(cur)); |
|
NETlogEntry(sTemp, SYNC_FLAG, 0); |
|
#endif |
|
debug(LOG_SCRIPT, "Started research in %d's %s(%d) of %s", player, |
|
diff --git a/src/scores.cpp b/src/scores.cpp |
|
index 17ca6664e..c5b5eefb4 100644 |
|
--- a/src/scores.cpp |
|
+++ b/src/scores.cpp |
|
@@ -362,7 +362,7 @@ void scoreDataToScreen(WIDGET *psWidget, ScoreDataToScreenCache& cache) |
|
} |
|
} |
|
/* Now render the text by the bar */ |
|
- sprintf(text, getDescription((MR_STRING)infoBars[index].stringID), infoBars[index].number); |
|
+ snprintf(text, sizeof(text), getDescription((MR_STRING)infoBars[index].stringID), infoBars[index].number); |
|
if (index >= cache.wzInfoBarText.size()) |
|
{ |
|
cache.wzInfoBarText.resize(index + 1); |
|
@@ -387,26 +387,26 @@ void scoreDataToScreen(WIDGET *psWidget, ScoreDataToScreenCache& cache) |
|
/* We now need to display the mission time, game time, average unit experience level an number of artefacts found */ |
|
|
|
/* Firstly, top of the screen, number of artefacts found */ |
|
- sprintf(text, _("ARTIFACTS RECOVERED: %d"), missionData.artefactsFound); |
|
+ snprintf(text, sizeof(text), _("ARTIFACTS RECOVERED: %d"), missionData.artefactsFound); |
|
cache.wzInfoText_ArtifactsFound.setText(text, font_regular); |
|
cache.wzInfoText_ArtifactsFound.render((pie_GetVideoBufferWidth() - cache.wzInfoText_ArtifactsFound.width()) / 2, 300 + D_H, WZCOL_FORM_TEXT); |
|
|
|
/* Get the mission result time in a string - and write it out */ |
|
getAsciiTime((char *)&text2, gameTime - missionData.missionStarted); |
|
- sprintf(text, _("Mission Time - %s"), text2); |
|
+ snprintf(text, sizeof(text), _("Mission Time - %s"), text2); |
|
cache.wzInfoText_MissionTime.setText(text, font_regular); |
|
cache.wzInfoText_MissionTime.render((pie_GetVideoBufferWidth() - cache.wzInfoText_MissionTime.width()) / 2, 320 + D_H, WZCOL_FORM_TEXT); |
|
|
|
/* Write out total game time so far */ |
|
getAsciiTime((char *)&text2, gameTime); |
|
- sprintf(text, _("Total Game Time - %s"), text2); |
|
+ snprintf(text, sizeof(text), _("Total Game Time - %s"), text2); |
|
cache.wzInfoText_TotalGameTime.setText(text, font_regular); |
|
cache.wzInfoText_TotalGameTime.render((pie_GetVideoBufferWidth() - cache.wzInfoText_TotalGameTime.width()) / 2, 340 + D_H, WZCOL_FORM_TEXT); |
|
if (Cheated) |
|
{ |
|
// A quick way to flash the text |
|
PIELIGHT cheatedTextColor = ((realTime / 250) % 2) ? WZCOL_RED : WZCOL_YELLOW; |
|
- sprintf(text, "%s", _("You cheated!")); |
|
+ snprintf(text, sizeof(text), "%s", _("You cheated!")); |
|
cache.wzInfoText_Cheated.setText(text, font_regular); |
|
cache.wzInfoText_Cheated.render((pie_GetVideoBufferWidth() - cache.wzInfoText_Cheated.width()) / 2, 360 + D_H, cheatedTextColor); |
|
} |
|
diff --git a/src/selection.cpp b/src/selection.cpp |
|
index 76c71746f..619fd86e3 100644 |
|
--- a/src/selection.cpp |
|
+++ b/src/selection.cpp |
|
@@ -434,7 +434,7 @@ void selNextUnassignedUnit() |
|
} |
|
|
|
// --------------------------------------------------------------------- |
|
-void selNextSpecifiedBuilding(STRUCTURE_TYPE structType) |
|
+void selNextSpecifiedBuilding(STRUCTURE_TYPE structType, bool jump) |
|
{ |
|
STRUCTURE *psResult = nullptr, *psOldStruct = nullptr, *psFirst = nullptr; |
|
bool bLaterInList = false; |
|
@@ -473,7 +473,10 @@ void selNextSpecifiedBuilding(STRUCTURE_TYPE structType) |
|
{ |
|
camToggleStatus(); |
|
} |
|
- setViewPos(map_coord(psResult->pos.x), map_coord(psResult->pos.y), false); |
|
+ if (jump) |
|
+ { |
|
+ setViewPos(map_coord(psResult->pos.x), map_coord(psResult->pos.y), false); |
|
+ } |
|
if (psOldStruct) |
|
{ |
|
psOldStruct->selected = false; |
|
diff --git a/src/selection.h b/src/selection.h |
|
index b329e1799..f50c46519 100644 |
|
--- a/src/selection.h |
|
+++ b/src/selection.h |
|
@@ -54,7 +54,7 @@ unsigned int selDroidSelection(unsigned int player, SELECTION_CLASS droidClass, |
|
unsigned int selDroidDeselect(unsigned int player); |
|
unsigned int selNumSelected(unsigned int player); |
|
void selNextUnassignedUnit(); |
|
-void selNextSpecifiedBuilding(STRUCTURE_TYPE structType); |
|
+void selNextSpecifiedBuilding(STRUCTURE_TYPE structType, bool jump); |
|
void selNextSpecifiedUnit(DROID_TYPE unitType); |
|
// select the n'th command droid |
|
void selCommander(int n); |