1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-11-07 03:12:36 +01:00

Improve game text behaviour

* Fix messages not being cleared
* Implemented clearing help messages
This commit is contained in:
Daniel Evans 2015-04-05 02:08:51 +01:00
parent c7376273b4
commit 66b7c878c1
3 changed files with 34 additions and 16 deletions

View File

@ -143,9 +143,15 @@ struct GameState
std::map<unsigned short, std::string> specialCharacters;
std::map<unsigned short, std::string> specialModels;
/**
* Stores long-lasting on screen messages
*/
std::vector<OnscreenText> text;
TextDisplayData nextText;
/**
* Stores temporary, one-tick messages
*/
std::vector<TextDisplayData> texts;
/** The camera near value currently set by the script */

View File

@ -794,7 +794,7 @@ void game_display_help(const ScriptArguments& args)
{
std::string id(args[0].string);
std::string str = args.getVM()->getWorld()->gameData.texts.text(id);
unsigned short style = 12;
unsigned short style = OnscreenText::Help;
args.getVM()->getWorld()->state.text.push_back({
id,
str,
@ -804,6 +804,18 @@ void game_display_help(const ScriptArguments& args)
});
}
void game_clear_help(const ScriptArguments& args)
{
for( int i = 0; i < args.getVM()->getWorld()->state.text.size(); )
{
auto& texts = args.getVM()->getWorld()->state.text;
if( texts[i].osTextStyle == OnscreenText::Help )
{
texts.erase(texts.begin() + i);
}
}
}
bool game_can_player_move(const ScriptArguments& args)
{
return true;
@ -1089,7 +1101,7 @@ GameModule::GameModule()
bindFunction(0x03E1, game_get_found_hidden_packages, 1, "Get Hidden Packages Found" );
bindFunction(0x03E5, game_display_help, 1, "Display Help Text" );
bindUnimplemented( 0x03E6, game_clear_help, 0, "Clear Help Text" );
bindFunction(0x03E6, game_clear_help, 0, "Clear Help Text" );
bindUnimplemented( 0x03E7, game_flash_hud, 1, "Flash HUD Item" );
bindUnimplemented( 0x03EB, game_clear_prints, 0, "Clear Small Prints" );

View File

@ -304,6 +304,19 @@ void RWGame::tick(float dt)
engine->destroyQueuedObjects();
engine->state.texts.clear();
for( int i = 0; i < engine->state.text.size(); )
{
auto& text = engine->state.text[i];
if( engine->gameTime > text.osTextStart + text.osTextTime )
{
engine->state.text.erase(engine->state.text.begin() + i);
}
else
{
i++;
}
}
engine->dynamicsWorld->stepSimulation(dt, 2, dt);
if( script ) {
@ -496,19 +509,6 @@ void RWGame::renderDebugStats(float time)
engine->renderer.text.renderText(ti);
ti.screenPosition.y -= ti.size;
}*/
for( int i = 0; i < engine->state.text.size(); )
{
if( engine->gameTime > engine->state.text[i].osTextStart + engine->state.text[i].osTextTime )
{
engine->state.text.erase(engine->state.text.begin() + i);
}
else
{
i++;
}
}
}
void RWGame::globalKeyEvent(const sf::Event& event)