From 76ea4488afcb5ee1ddbf32046c451b6f137fd915 Mon Sep 17 00:00:00 2001 From: AllyTally Date: Sat, 5 Aug 2023 19:34:15 -0300 Subject: [PATCH] Initial implementation of textbox sprites This commit adds a system for displaying sprites in textboxes, meant to replace the hardcoded system in the main game. This does not support levelcomplete.png and gamecomplete.png yet, which will most likely just be special cases. --- desktop_version/src/Graphics.cpp | 22 ++++++++++++++++++++++ desktop_version/src/Graphics.h | 2 ++ desktop_version/src/Script.cpp | 16 ++++++++++++++++ desktop_version/src/Script.h | 4 +++- desktop_version/src/Textbox.cpp | 12 ++++++++++++ desktop_version/src/Textbox.h | 12 ++++++++++++ 6 files changed, 67 insertions(+), 1 deletion(-) diff --git a/desktop_version/src/Graphics.cpp b/desktop_version/src/Graphics.cpp index b04c59a9..85f1ff0e 100644 --- a/desktop_version/src/Graphics.cpp +++ b/desktop_version/src/Graphics.cpp @@ -1049,6 +1049,17 @@ void Graphics::drawgui(void) //blue guy draw_sprite(crew_xp, crew_yp, crew_sprite, 75, 75, 255 - help.glow / 4 - textboxes[i].rand); } + + for (int index = 0; index < (int) textboxes[i].sprites.size(); index++) + { + TextboxSprite* sprite = &textboxes[i].sprites[index]; + draw_sprite( + sprite->x + textboxes[i].xp, + sprite->y + textboxes[i].yp, + sprite->tile, + getcol(sprite->col) + ); + } } } @@ -1428,6 +1439,17 @@ void Graphics::textboxtimer(int t) textboxes[m].timer = t; } +void Graphics::addsprite(int x, int y, int tile, int col) +{ + if (!INBOUNDS_VEC(m, textboxes)) + { + vlog_error("addsprite() out-of-bounds!"); + return; + } + + textboxes[m].addsprite(x, y, tile, col); +} + void Graphics::addline( const std::string& t ) { if (!INBOUNDS_VEC(m, textboxes)) diff --git a/desktop_version/src/Graphics.h b/desktop_version/src/Graphics.h index 5cb7479c..ce748552 100644 --- a/desktop_version/src/Graphics.h +++ b/desktop_version/src/Graphics.h @@ -122,6 +122,8 @@ public: void textboxtimer(int t); + void addsprite(int x, int y, int tile, int col); + void textboxremove(void); void textboxremovefast(void); diff --git a/desktop_version/src/Script.cpp b/desktop_version/src/Script.cpp index c6ebe63e..260144da 100644 --- a/desktop_version/src/Script.cpp +++ b/desktop_version/src/Script.cpp @@ -53,6 +53,7 @@ scriptclass::scriptclass(void) textcase = 1; textbuttons = false; textlarge = false; + textbox_sprites.clear(); } void scriptclass::add_default_colours(void) @@ -528,6 +529,7 @@ void scriptclass::run(void) textpad_right = 0; textpadtowidth = 0; textboxtimer = 0; + textbox_sprites.clear(); translate_dialogue(); } @@ -698,6 +700,15 @@ void scriptclass::run(void) { textboxtimer = ss_toi(words[1]); } + else if (words[0] == "textsprite") + { + TextboxSprite sprite; + sprite.x = ss_toi(words[1]); + sprite.y = ss_toi(words[2]); + sprite.tile = ss_toi(words[3]); + sprite.col = ss_toi(words[4]); + textbox_sprites.push_back(sprite); + } else if (words[0] == "flipme") { textflipme = !textflipme; @@ -729,6 +740,11 @@ void scriptclass::run(void) graphics.textboxtimer(textboxtimer); } + for (size_t i = 0; i < textbox_sprites.size(); i++) + { + graphics.addsprite(textbox_sprites[i].x, textbox_sprites[i].y, textbox_sprites[i].tile, textbox_sprites[i].col); + } + // Some textbox formatting that can be set by translations... if (textcentertext) { diff --git a/desktop_version/src/Script.h b/desktop_version/src/Script.h index 1924fb41..6bc19715 100644 --- a/desktop_version/src/Script.h +++ b/desktop_version/src/Script.h @@ -2,10 +2,11 @@ #define SCRIPT_H #include +#include #include #include -#include +#include "Textbox.h" #define filllines(lines) commands.insert(commands.end(), lines, lines + SDL_arraysize(lines)) @@ -123,6 +124,7 @@ public: bool textbuttons; bool textlarge; int textboxtimer; + std::vector textbox_sprites; //Misc int i, j, k; diff --git a/desktop_version/src/Textbox.cpp b/desktop_version/src/Textbox.cpp index 7978a3da..1546b425 100644 --- a/desktop_version/src/Textbox.cpp +++ b/desktop_version/src/Textbox.cpp @@ -28,6 +28,18 @@ textboxclass::textboxclass(void) print_flags = PR_FONT_LEVEL; fill_buttons = false; + + sprites.clear(); +} + +void textboxclass::addsprite(int x, int y, int tile, int col) +{ + TextboxSprite sprite; + sprite.x = x; + sprite.y = y; + sprite.tile = tile; + sprite.col = col; + sprites.push_back(sprite); } void textboxclass::centerx(void) diff --git a/desktop_version/src/Textbox.h b/desktop_version/src/Textbox.h index 46cf1f1f..92da145d 100644 --- a/desktop_version/src/Textbox.h +++ b/desktop_version/src/Textbox.h @@ -5,11 +5,21 @@ #include #include +struct TextboxSprite +{ + int x; + int y; + int col; + int tile; +}; + class textboxclass { public: textboxclass(void); + void addsprite(int x, int y, int tile, int col); + void centerx(void); void centery(void); @@ -53,6 +63,8 @@ public: uint32_t print_flags; bool fill_buttons; + + std::vector sprites; }; #endif /* TEXTBOX_H */