mirror of
https://github.com/rwengine/openrw.git
synced 2024-11-25 03:42:48 +01:00
Merge pull request #190 from tsjost/fix/timecheat
Add method to modify game time properly
This commit is contained in:
commit
3a53089d68
@ -678,6 +678,26 @@ int GameWorld::getMinute()
|
||||
return state->basic.gameMinute;
|
||||
}
|
||||
|
||||
void GameWorld::offsetGameTime(int minutes)
|
||||
{
|
||||
int gameMinute = state->basic.gameMinute;
|
||||
int gameHour = state->basic.gameHour;
|
||||
|
||||
gameMinute += minutes;
|
||||
bool backwards = gameMinute < 0;
|
||||
|
||||
gameHour += gameMinute / 60 - (backwards ? 1 : 0);
|
||||
|
||||
// Black mathgic? No. If the value is negative we want to wrap it around
|
||||
// to the other side, e.g. minute -7 should be 53.
|
||||
// The equivalent would be doing "while (gameMinute < 0) { gameMinute += 60 }"
|
||||
gameMinute = (gameMinute % 60 + 60) % 60;
|
||||
gameHour = (gameHour % 24 + 24) % 24;
|
||||
|
||||
state->basic.gameMinute = gameMinute;
|
||||
state->basic.gameHour = gameHour;
|
||||
}
|
||||
|
||||
glm::vec3 GameWorld::getGroundAtPosition(const glm::vec3 &pos) const
|
||||
{
|
||||
btVector3 rayFrom(pos.x, pos.y, 100.f);
|
||||
|
@ -165,6 +165,12 @@ public:
|
||||
*/
|
||||
int getMinute();
|
||||
|
||||
/**
|
||||
* Modifies the game time and handles the circular nature of clock numbers
|
||||
* Supports negative numbers
|
||||
*/
|
||||
void offsetGameTime(int minutes);
|
||||
|
||||
glm::vec3 getGroundAtPosition(const glm::vec3& pos) const;
|
||||
|
||||
float getGameTime() const;
|
||||
|
@ -777,10 +777,10 @@ void RWGame::globalKeyEvent(const SDL_Event& event)
|
||||
{
|
||||
switch (event.key.keysym.sym) {
|
||||
case SDLK_LEFTBRACKET:
|
||||
state->basic.gameMinute -= 30.f;
|
||||
world->offsetGameTime(-30);
|
||||
break;
|
||||
case SDLK_RIGHTBRACKET:
|
||||
state->basic.gameMinute += 30.f;
|
||||
world->offsetGameTime(30);
|
||||
break;
|
||||
case SDLK_9:
|
||||
timescale *= 0.5f;
|
||||
|
@ -16,6 +16,59 @@ BOOST_AUTO_TEST_CASE(test_gameobject_id)
|
||||
|
||||
BOOST_CHECK_NE( object1->getGameObjectID(), object2->getGameObjectID() );
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_offsetgametime)
|
||||
{
|
||||
GameWorld gw(&Global::get().log, &Global::get().work, Global::get().d);
|
||||
gw.state = new GameState();
|
||||
|
||||
BOOST_CHECK_EQUAL(0, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(0, gw.getMinute());
|
||||
|
||||
gw.offsetGameTime(30);
|
||||
BOOST_CHECK_EQUAL(0, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(30, gw.getMinute());
|
||||
|
||||
gw.offsetGameTime(30);
|
||||
BOOST_CHECK_EQUAL(1, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(0, gw.getMinute());
|
||||
|
||||
gw.offsetGameTime(-30);
|
||||
BOOST_CHECK_EQUAL(0, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(30, gw.getMinute());
|
||||
|
||||
gw.offsetGameTime(-60);
|
||||
BOOST_CHECK_EQUAL(23, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(30, gw.getMinute());
|
||||
|
||||
gw.offsetGameTime(30);
|
||||
BOOST_CHECK_EQUAL(0, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(0, gw.getMinute());
|
||||
|
||||
gw.offsetGameTime(24*60);
|
||||
BOOST_CHECK_EQUAL(0, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(0, gw.getMinute());
|
||||
|
||||
gw.offsetGameTime(8*60 + 25);
|
||||
BOOST_CHECK_EQUAL(8, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(25, gw.getMinute());
|
||||
|
||||
gw.offsetGameTime(-30);
|
||||
BOOST_CHECK_EQUAL(7, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(55, gw.getMinute());
|
||||
|
||||
gw.offsetGameTime(-24*60);
|
||||
BOOST_CHECK_EQUAL(7, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(55, gw.getMinute());
|
||||
|
||||
gw.offsetGameTime(0);
|
||||
BOOST_CHECK_EQUAL(7, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(55, gw.getMinute());
|
||||
|
||||
gw.offsetGameTime(30*24*60 + 90);
|
||||
BOOST_CHECK_EQUAL(9, gw.getHour());
|
||||
BOOST_CHECK_EQUAL(25, gw.getMinute());
|
||||
}
|
||||
#endif
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
Loading…
Reference in New Issue
Block a user