Skip to content

Commit 3d0ac3f

Browse files
committed
Add classic cheat to set game speed by using ALT+1 through ALT+6
1 parent a22129d commit 3d0ac3f

File tree

8 files changed

+228
-29
lines changed

8 files changed

+228
-29
lines changed

extras/videoDrivers/SDL2/VideoSDL2.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,12 @@ bool VideoSDL2::MessageLoop()
306306
// Die 12 F-Tasten
307307
if(ev.key.keysym.sym >= SDLK_F1 && ev.key.keysym.sym <= SDLK_F12)
308308
ke.kt = static_cast<KeyType>(rttr::enum_cast(KeyType::F1) + ev.key.keysym.sym - SDLK_F1);
309+
310+
if((SDL_GetModState() & KMOD_ALT) && isdigit(ev.key.keysym.sym))
311+
{
312+
ke.kt = KeyType::Char;
313+
ke.c = ev.key.keysym.sym;
314+
}
309315
}
310316
break;
311317
case SDLK_RETURN: ke.kt = KeyType::Return; break;

libs/s25main/CheatCommandTracker.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ CheatCommandTracker::CheatCommandTracker(Cheats& cheats) : cheats_(cheats), last
1818

1919
void CheatCommandTracker::trackKeyEvent(const KeyEvent& ke)
2020
{
21-
if(trackSpecialKeyEvent(ke))
21+
if(trackSpecialKeyEvent(ke) || trackSpeedKeyEvent(ke))
2222
{
2323
lastChars_.clear();
2424
return;
@@ -65,6 +65,17 @@ bool CheatCommandTracker::trackSpecialKeyEvent(const KeyEvent& ke)
6565
return true;
6666
}
6767

68+
bool CheatCommandTracker::trackSpeedKeyEvent(const KeyEvent& ke)
69+
{
70+
const char c = ke.c;
71+
if(ke.alt && c >= '1' && c <= '6')
72+
{
73+
cheats_.setGameSpeed(c - '1');
74+
return true;
75+
}
76+
return false;
77+
}
78+
6879
bool CheatCommandTracker::trackCharKeyEvent(const KeyEvent& ke)
6980
{
7081
lastChars_.push_back(ke.c);

libs/s25main/CheatCommandTracker.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class CheatCommandTracker
2020

2121
private:
2222
bool trackSpecialKeyEvent(const KeyEvent& ke);
23+
bool trackSpeedKeyEvent(const KeyEvent& ke);
2324
bool trackCharKeyEvent(const KeyEvent& ke);
2425

2526
Cheats& cheats_;

libs/s25main/Cheats.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,16 @@ void Cheats::placeCheatBuilding(const MapPoint& mp, const GamePlayer& player)
7777
player.IsHQTent());
7878
}
7979

80+
void Cheats::setGameSpeed(uint8_t speedIndex)
81+
{
82+
if(!isCheatModeOn())
83+
return;
84+
85+
constexpr auto gfLengthInMs = 50;
86+
GAMECLIENT.SetGFLengthReq(FramesInfo::milliseconds32_t{gfLengthInMs >> speedIndex});
87+
// 50 -> 25 -> 12 -> 6 -> 3 -> 1
88+
}
89+
8090
void Cheats::toggleHumanAIPlayer()
8191
{
8292
if(!isCheatModeOn())

libs/s25main/Cheats.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class Cheats
3333
bool canPlaceCheatBuilding(const MapPoint& mp) const;
3434
void placeCheatBuilding(const MapPoint& mp, const GamePlayer& player);
3535

36+
void setGameSpeed(uint8_t speedIndex);
37+
3638
// RTTR cheats
3739
void toggleHumanAIPlayer();
3840

libs/s25main/network/GameClient.cpp

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,44 +1148,51 @@ bool GameClient::OnGameMessage(const GameMessage_GameCommand& msg)
11481148

11491149
void GameClient::IncreaseSpeed()
11501150
{
1151-
const bool debugMode =
1152-
#ifndef NDEBUG
1153-
true;
1154-
#else
1155-
false;
1156-
#endif
1157-
if(framesinfo.gfLengthReq > FramesInfo::milliseconds32_t(10))
1158-
framesinfo.gfLengthReq -= FramesInfo::milliseconds32_t(10);
1159-
else if((replayMode || debugMode) && framesinfo.gfLengthReq == FramesInfo::milliseconds32_t(10))
1160-
framesinfo.gfLengthReq = FramesInfo::milliseconds32_t(1);
1161-
else
1162-
framesinfo.gfLengthReq = FramesInfo::milliseconds32_t(70);
1163-
1164-
if(replayMode)
1165-
framesinfo.gf_length = framesinfo.gfLengthReq;
1166-
else
1167-
mainPlayer.sendMsgAsync(new GameMessage_Speed(framesinfo.gfLengthReq.count()));
1151+
// 1..10 -> 0
1152+
// 11..20 -> 10
1153+
// 21..30 -> 20 etc.
1154+
SetGFLengthReq((framesinfo.gfLengthReq - 1ms) / 10 * 10);
11681155
}
11691156

11701157
void GameClient::DecreaseSpeed()
11711158
{
1172-
const bool debugMode =
1159+
// 1.. 9 -> 10
1160+
// 10..19 -> 20
1161+
// 20..29 -> 30 etc.
1162+
SetGFLengthReq(framesinfo.gfLengthReq / 10 * 10 + 10ms);
1163+
}
1164+
1165+
void GameClient::SetGFLengthReq(FramesInfo::milliseconds32_t gfLengthReq)
1166+
{
11731167
#ifndef NDEBUG
1174-
true;
1168+
constexpr auto minLength = 1ms;
11751169
#else
1176-
false;
1170+
const auto minLength = IsReplayModeOn() ? 1ms : 10ms;
11771171
#endif
11781172

1179-
FramesInfo::milliseconds32_t maxSpeed(replayMode ? 1000 : 70);
1173+
const auto maxLength = IsReplayModeOn() ? 1000ms : 70ms;
11801174

1181-
if(framesinfo.gfLengthReq == maxSpeed)
1182-
framesinfo.gfLengthReq = FramesInfo::milliseconds32_t(replayMode || debugMode ? 1 : 10);
1183-
else if(framesinfo.gfLengthReq == FramesInfo::milliseconds32_t(1))
1184-
framesinfo.gfLengthReq = FramesInfo::milliseconds32_t(10);
1185-
else
1186-
framesinfo.gfLengthReq += FramesInfo::milliseconds32_t(10);
1175+
if(gfLengthReq == 0ms)
1176+
{
1177+
// already at minimum? wrap around from min to max
1178+
if(framesinfo.gfLengthReq == minLength)
1179+
framesinfo.gfLengthReq = maxLength;
1180+
else // treat set 0 as set minimum
1181+
framesinfo.gfLengthReq = minLength;
1182+
} else if(gfLengthReq < minLength) // clamp to min
1183+
{
1184+
framesinfo.gfLengthReq = minLength;
1185+
} else if(gfLengthReq > maxLength)
1186+
{
1187+
// already at maximum? wrap around from max to min
1188+
if(framesinfo.gfLengthReq == maxLength)
1189+
framesinfo.gfLengthReq = minLength;
1190+
else // clamp to max
1191+
framesinfo.gfLengthReq = maxLength;
1192+
} else
1193+
framesinfo.gfLengthReq = gfLengthReq;
11871194

1188-
if(replayMode)
1195+
if(IsReplayModeOn())
11891196
framesinfo.gf_length = framesinfo.gfLengthReq;
11901197
else
11911198
mainPlayer.sendMsgAsync(new GameMessage_Speed(framesinfo.gfLengthReq.count()));

libs/s25main/network/GameClient.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,14 @@ class GameClient final :
127127
/// And a 2nd time when the GUI is ready which actually starty the game
128128
void OnGameStart();
129129

130+
// Used by + and v
130131
void IncreaseSpeed();
132+
// Used by -
131133
void DecreaseSpeed();
134+
// Used by ALT+1 through ALT+6 (cheats)
135+
void SetGFLengthReq(FramesInfo::milliseconds32_t);
136+
// Used by tests (stinks, but what to do?)
137+
FramesInfo::milliseconds32_t GetGFLengthReq() { return framesinfo.gfLengthReq; }
132138

133139
/// Lädt ein Replay und startet dementsprechend das Spiel
134140
bool StartReplay(const boost::filesystem::path& path);

tests/s25Main/network/testGameClient.cpp

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include <boost/test/data/test_case.hpp>
2424
#include <boost/test/unit_test.hpp>
2525

26+
using namespace std::literals;
27+
2628
namespace bfs = boost::filesystem;
2729

2830
// LCOV_EXCL_START
@@ -227,4 +229,158 @@ BOOST_AUTO_TEST_CASE(ClientDetectsMapBufferOverflow)
227229
BOOST_TEST(client.GetState() == ClientState::Stopped);
228230
}
229231

232+
BOOST_AUTO_TEST_CASE(CanSetGFLengthReq)
233+
{
234+
GameClient client;
235+
236+
client.SetGFLengthReq(50ms);
237+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 50);
238+
}
239+
240+
BOOST_AUTO_TEST_CASE(CanSetGFLengthReq_Repeatedly)
241+
{
242+
GameClient client;
243+
244+
client.SetGFLengthReq(50ms);
245+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 50);
246+
client.SetGFLengthReq(40ms);
247+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 40);
248+
}
249+
250+
BOOST_AUTO_TEST_CASE(IncreaseSpeed_DecreasesGF_WhenDivisibleBy10_By10)
251+
{
252+
GameClient client;
253+
254+
client.SetGFLengthReq(50ms);
255+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 50);
256+
client.IncreaseSpeed();
257+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 40);
258+
client.IncreaseSpeed();
259+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 30);
260+
client.IncreaseSpeed();
261+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 20);
262+
client.IncreaseSpeed();
263+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 10);
264+
}
265+
266+
BOOST_AUTO_TEST_CASE(DecreaseSpeed_IncreasesGF_WhenDivisible10_By10)
267+
{
268+
GameClient client;
269+
270+
client.SetGFLengthReq(10ms);
271+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 10);
272+
client.DecreaseSpeed();
273+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 20);
274+
client.DecreaseSpeed();
275+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 30);
276+
client.DecreaseSpeed();
277+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 40);
278+
client.DecreaseSpeed();
279+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 50);
280+
}
281+
282+
BOOST_AUTO_TEST_CASE(IncreaseSpeed_DecreasesGF_WhenNotDivisibleBy10_RoundsDownTo10)
283+
{
284+
GameClient client;
285+
286+
client.SetGFLengthReq(25ms);
287+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 25);
288+
client.IncreaseSpeed();
289+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 20);
290+
291+
client.SetGFLengthReq(12ms);
292+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 12);
293+
client.IncreaseSpeed();
294+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 10);
295+
}
296+
297+
BOOST_AUTO_TEST_CASE(DecreaseSpeed_IncreasesGF_WhenNotDivisibleBy10_RoundsUpTo10)
298+
{
299+
GameClient client;
300+
301+
client.SetGFLengthReq(25ms);
302+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 25);
303+
client.DecreaseSpeed();
304+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 30);
305+
306+
client.SetGFLengthReq(12ms);
307+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 12);
308+
client.DecreaseSpeed();
309+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 20);
310+
}
311+
312+
#ifndef NDEBUG
313+
BOOST_AUTO_TEST_CASE(IncreaseSpeed_DecreasesGF_When10orLess_To1)
314+
{
315+
GameClient client;
316+
317+
client.SetGFLengthReq(10ms);
318+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 10);
319+
client.IncreaseSpeed();
320+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 1);
321+
322+
client.SetGFLengthReq(3ms);
323+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 3);
324+
client.IncreaseSpeed();
325+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 1);
326+
}
327+
328+
BOOST_AUTO_TEST_CASE(DecreaseSpeed_IncreasesGF_WhenLessThan10_To10)
329+
{
330+
GameClient client;
331+
332+
client.SetGFLengthReq(3ms);
333+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 3);
334+
client.DecreaseSpeed();
335+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 10);
336+
337+
client.SetGFLengthReq(1ms);
338+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 1);
339+
client.DecreaseSpeed();
340+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 10);
341+
}
342+
343+
BOOST_AUTO_TEST_CASE(IncreaseSpeed_SetsGF_When1_To70)
344+
{
345+
GameClient client;
346+
347+
client.SetGFLengthReq(1ms);
348+
client.IncreaseSpeed();
349+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 70);
350+
}
351+
352+
BOOST_AUTO_TEST_CASE(DecreaseSpeed_SetsGF_WhenLimitReached_To1_ReplayModeOff)
353+
{
354+
GameClient client;
355+
356+
client.SetGFLengthReq(70ms);
357+
client.DecreaseSpeed();
358+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 1);
359+
}
360+
#else
361+
BOOST_AUTO_TEST_CASE(IncreaseSpeed_SetsGF_When10OrLess_To70)
362+
{
363+
GameClient client;
364+
365+
client.SetGFLengthReq(10ms);
366+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 10);
367+
client.IncreaseSpeed();
368+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 70);
369+
370+
client.SetGFLengthReq(1ms);
371+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 10);
372+
client.IncreaseSpeed();
373+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 70);
374+
}
375+
376+
BOOST_AUTO_TEST_CASE(DecreaseSpeed_SetsGF_WhenLimitReached_To10_ReplayModeOff)
377+
{
378+
GameClient client;
379+
380+
client.SetGFLengthReq(70ms);
381+
client.DecreaseSpeed();
382+
BOOST_TEST_REQUIRE(client.GetGFLengthReq().count() == 10);
383+
}
384+
#endif
385+
230386
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)