Skip to content

Instantly share code, notes, and snippets.

@maxsupermanhd
Last active February 11, 2021 21:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maxsupermanhd/8c9faa786f739ec2f18c3923430ef5ee to your computer and use it in GitHub Desktop.
Save maxsupermanhd/8c9faa786f739ec2f18c3923430ef5ee to your computer and use it in GitHub Desktop.
Warzone 2100 3.4.1 patch
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);
  • Added next factory/lab/vtlfactory hotkeys (src/keybind.cpp src/keybind.h src/keymap.h src/selection.cpp src/selection.h)
  • Added elo text shower (src/multiint.cpp 192 4381-4383 src/multistat.h src/multistat.cpp 47-49 165-195)
  • Added force start game via #forcestart and limits printing via #showlimits room chat command (src/multiint.cpp)
  • Fix warnings of size (src/multijoin.cpp src/multimenu.cpp src/multiplay.cpp 266 1765 src/order.cpp src/qtscriptfuncs.cpp src/scores.cpp
  • Chat logging including hash and ip (src/multiplay.cpp)

Appy to c74244a (tag 3.4.1)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment