mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-12-22 17:49:43 +01:00
Add textbox indexes, update trinket/crew textboxes
This adds an attribute to textboxclass to allow a text box to keep an index that references another text box inside the graphics.textboxes std::vector. This is needed because the second text box of a "You have found a shiny trinket!" or "You have found a lost crewmate!" pair of text boxes explicitly relies on the height of the first text box. With this, I have moved those text boxes over to the new text box translation system. Since the update order now matters, I added a comment to recomputetextboxes() that clarifies that the text boxes must be updated in linear order, starting from 0.
This commit is contained in:
parent
668d0c744d
commit
7088858957
7 changed files with 124 additions and 79 deletions
|
@ -1000,6 +1000,86 @@ static void im1_instructions_textbox3(textboxclass* THIS)
|
||||||
THIS->padtowidth(36*8);
|
THIS->padtowidth(36*8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Also used in foundtrinket() script command. */
|
||||||
|
void foundtrinket_textbox1(textboxclass* THIS)
|
||||||
|
{
|
||||||
|
THIS->lines.clear();
|
||||||
|
|
||||||
|
THIS->lines.push_back(loc::gettext("Congratulations!\n\nYou have found a shiny trinket!"));
|
||||||
|
THIS->wrap(2);
|
||||||
|
THIS->centertext();
|
||||||
|
THIS->pad(1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Also used in foundtrinket() script command. */
|
||||||
|
void foundtrinket_textbox2(textboxclass* THIS)
|
||||||
|
{
|
||||||
|
extern Game game;
|
||||||
|
THIS->lines.clear();
|
||||||
|
|
||||||
|
const int max_trinkets = map.custommode ? cl.numtrinkets() : 20;
|
||||||
|
|
||||||
|
char buffer[SCREEN_WIDTH_CHARS + 1];
|
||||||
|
vformat_buf(
|
||||||
|
buffer, sizeof(buffer),
|
||||||
|
loc::gettext("{n_trinkets|wordy} out of {max_trinkets|wordy}"),
|
||||||
|
"n_trinkets:int, max_trinkets:int",
|
||||||
|
game.trinkets(), max_trinkets
|
||||||
|
);
|
||||||
|
THIS->lines.push_back(buffer);
|
||||||
|
|
||||||
|
if (INBOUNDS_VEC(THIS->other_textbox_index, graphics.textboxes)
|
||||||
|
&& &graphics.textboxes[THIS->other_textbox_index] != THIS)
|
||||||
|
{
|
||||||
|
THIS->yp = 95 + graphics.textboxes[THIS->other_textbox_index].h;
|
||||||
|
}
|
||||||
|
THIS->wrap(2);
|
||||||
|
THIS->centertext();
|
||||||
|
THIS->pad(1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void foundcrewmate_textbox1(textboxclass* THIS)
|
||||||
|
{
|
||||||
|
THIS->lines.clear();
|
||||||
|
|
||||||
|
THIS->lines.push_back(loc::gettext("Congratulations!\n\nYou have found a lost crewmate!"));
|
||||||
|
THIS->wrap(2);
|
||||||
|
THIS->centertext();
|
||||||
|
THIS->pad(1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void foundcrewmate_textbox2(textboxclass* THIS)
|
||||||
|
{
|
||||||
|
extern Game game;
|
||||||
|
THIS->lines.clear();
|
||||||
|
|
||||||
|
const int num_remaining = cl.numcrewmates() - game.crewmates();
|
||||||
|
if (num_remaining == 0)
|
||||||
|
{
|
||||||
|
THIS->lines.push_back(loc::gettext("All crewmates rescued!"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char buffer[SCREEN_WIDTH_CHARS + 1];
|
||||||
|
loc::gettext_plural_fill(
|
||||||
|
buffer, sizeof(buffer),
|
||||||
|
"{n_crew|wordy} remain", "{n_crew|wordy} remains",
|
||||||
|
"n_crew:int",
|
||||||
|
num_remaining
|
||||||
|
);
|
||||||
|
THIS->lines.push_back(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (INBOUNDS_VEC(THIS->other_textbox_index, graphics.textboxes)
|
||||||
|
&& &graphics.textboxes[THIS->other_textbox_index] != THIS)
|
||||||
|
{
|
||||||
|
THIS->yp = 95 + graphics.textboxes[THIS->other_textbox_index].h;
|
||||||
|
}
|
||||||
|
THIS->wrap(4);
|
||||||
|
THIS->centertext();
|
||||||
|
THIS->pad(2, 2);
|
||||||
|
}
|
||||||
|
|
||||||
void Game::setstate(const int gamestate)
|
void Game::setstate(const int gamestate)
|
||||||
{
|
{
|
||||||
if (!statelocked || GlitchrunnerMode_less_than_or_equal(Glitchrunner2_2))
|
if (!statelocked || GlitchrunnerMode_less_than_or_equal(Glitchrunner2_2))
|
||||||
|
@ -2189,43 +2269,22 @@ void Game::updatestate(void)
|
||||||
setstatedelay(15);
|
setstatedelay(15);
|
||||||
break;
|
break;
|
||||||
case 1001:
|
case 1001:
|
||||||
{
|
|
||||||
//Found a trinket!
|
//Found a trinket!
|
||||||
advancetext = true;
|
advancetext = true;
|
||||||
incstate();
|
incstate();
|
||||||
graphics.createtextboxflipme(loc::gettext("Congratulations!\n\nYou have found a shiny trinket!"), 50, 85, TEXT_COLOUR("gray"));
|
graphics.createtextboxflipme("", 50, 85, TEXT_COLOUR("gray"));
|
||||||
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
||||||
int h = graphics.textboxwrap(2);
|
|
||||||
graphics.textboxcentertext();
|
|
||||||
graphics.textboxpad(1, 1);
|
|
||||||
graphics.textboxcenterx();
|
graphics.textboxcenterx();
|
||||||
|
graphics.textboxtranslate(TEXTTRANSLATE_FUNCTION, foundtrinket_textbox1);
|
||||||
|
graphics.textboxapplyposition();
|
||||||
|
|
||||||
int max_trinkets;
|
graphics.createtextboxflipme("", 50, 95, TEXT_COLOUR("gray"));
|
||||||
|
|
||||||
if(map.custommode)
|
|
||||||
{
|
|
||||||
max_trinkets = cl.numtrinkets();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
max_trinkets = 20;
|
|
||||||
}
|
|
||||||
|
|
||||||
char buffer[SCREEN_WIDTH_CHARS + 1];
|
|
||||||
vformat_buf(
|
|
||||||
buffer, sizeof(buffer),
|
|
||||||
loc::gettext("{n_trinkets|wordy} out of {max_trinkets|wordy}"),
|
|
||||||
"n_trinkets:int, max_trinkets:int",
|
|
||||||
trinkets(), max_trinkets
|
|
||||||
);
|
|
||||||
graphics.createtextboxflipme(buffer, 50, 95+h, TEXT_COLOUR("gray"));
|
|
||||||
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
||||||
graphics.textboxwrap(2);
|
|
||||||
graphics.textboxcentertext();
|
|
||||||
graphics.textboxpad(1, 1);
|
|
||||||
graphics.textboxcenterx();
|
graphics.textboxcenterx();
|
||||||
|
graphics.textboxindex(graphics.textboxes.size() - 2);
|
||||||
|
graphics.textboxtranslate(TEXTTRANSLATE_FUNCTION, foundtrinket_textbox2);
|
||||||
|
graphics.textboxapplyposition();
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case 1002:
|
case 1002:
|
||||||
if (!advancetext)
|
if (!advancetext)
|
||||||
{
|
{
|
||||||
|
@ -2254,39 +2313,22 @@ void Game::updatestate(void)
|
||||||
setstatedelay(15);
|
setstatedelay(15);
|
||||||
break;
|
break;
|
||||||
case 1011:
|
case 1011:
|
||||||
{
|
|
||||||
//Found a crewmate!
|
//Found a crewmate!
|
||||||
advancetext = true;
|
advancetext = true;
|
||||||
incstate();
|
incstate();
|
||||||
graphics.createtextboxflipme(loc::gettext("Congratulations!\n\nYou have found a lost crewmate!"), 50, 85, TEXT_COLOUR("gray"));
|
graphics.createtextboxflipme("", 50, 85, TEXT_COLOUR("gray"));
|
||||||
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
||||||
int h = graphics.textboxwrap(2);
|
|
||||||
graphics.textboxcentertext();
|
|
||||||
graphics.textboxpad(1, 1);
|
|
||||||
graphics.textboxcenterx();
|
graphics.textboxcenterx();
|
||||||
|
graphics.textboxtranslate(TEXTTRANSLATE_FUNCTION, foundcrewmate_textbox1);
|
||||||
|
graphics.textboxapplyposition();
|
||||||
|
|
||||||
if(cl.numcrewmates()-crewmates()==0)
|
graphics.createtextboxflipme("", 50, 95, TEXT_COLOUR("gray"));
|
||||||
{
|
|
||||||
graphics.createtextboxflipme(loc::gettext("All crewmates rescued!"), 50, 95+h, TEXT_COLOUR("gray"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char buffer[SCREEN_WIDTH_CHARS + 1];
|
|
||||||
loc::gettext_plural_fill(
|
|
||||||
buffer, sizeof(buffer),
|
|
||||||
"{n_crew|wordy} remain", "{n_crew|wordy} remains",
|
|
||||||
"n_crew:int",
|
|
||||||
cl.numcrewmates()-crewmates()
|
|
||||||
);
|
|
||||||
graphics.createtextboxflipme(buffer, 50, 95+h, TEXT_COLOUR("gray"));
|
|
||||||
}
|
|
||||||
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
||||||
graphics.textboxwrap(4);
|
|
||||||
graphics.textboxcentertext();
|
|
||||||
graphics.textboxpad(2, 2);
|
|
||||||
graphics.textboxcenterx();
|
graphics.textboxcenterx();
|
||||||
|
graphics.textboxindex(graphics.textboxes.size() - 2);
|
||||||
|
graphics.textboxtranslate(TEXTTRANSLATE_FUNCTION, foundcrewmate_textbox2);
|
||||||
|
graphics.textboxapplyposition();
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case 1012:
|
case 1012:
|
||||||
if (!advancetext)
|
if (!advancetext)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1525,6 +1525,17 @@ int Graphics::getlinegap(void)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Graphics::textboxindex(const int index)
|
||||||
|
{
|
||||||
|
if (!INBOUNDS_VEC(m, textboxes))
|
||||||
|
{
|
||||||
|
vlog_error("textboxindex() out-of-bounds!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
textboxes[m].other_textbox_index = index;
|
||||||
|
}
|
||||||
|
|
||||||
void Graphics::createtextboxreal(
|
void Graphics::createtextboxreal(
|
||||||
const std::string& t,
|
const std::string& t,
|
||||||
int xp, int yp,
|
int xp, int yp,
|
||||||
|
|
|
@ -137,6 +137,8 @@ public:
|
||||||
|
|
||||||
void setimage(TextboxImage image);
|
void setimage(TextboxImage image);
|
||||||
|
|
||||||
|
void textboxindex(int index);
|
||||||
|
|
||||||
void textboxremove(void);
|
void textboxremove(void);
|
||||||
|
|
||||||
void textboxremovefast(void);
|
void textboxremovefast(void);
|
||||||
|
|
|
@ -271,7 +271,8 @@ static void updatebuttonmappings(int bind)
|
||||||
|
|
||||||
static void recomputetextboxes(void)
|
static void recomputetextboxes(void)
|
||||||
{
|
{
|
||||||
/* Retranslate and reposition all text boxes. */
|
/* Retranslate and reposition all text boxes.
|
||||||
|
* WARNING: Needs to update in linear order, starting from 0. */
|
||||||
for (size_t i = 0; i < graphics.textboxes.size(); i++)
|
for (size_t i = 0; i < graphics.textboxes.size(); i++)
|
||||||
{
|
{
|
||||||
graphics.textboxes[i].updatetext();
|
graphics.textboxes[i].updatetext();
|
||||||
|
|
|
@ -158,6 +158,10 @@ static int getcrewmanfromname(std::string name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Also used in gamestate 1001. */
|
||||||
|
void foundtrinket_textbox1(textboxclass* THIS);
|
||||||
|
void foundtrinket_textbox2(textboxclass* THIS);
|
||||||
|
|
||||||
void scriptclass::run(void)
|
void scriptclass::run(void)
|
||||||
{
|
{
|
||||||
if (!running)
|
if (!running)
|
||||||
|
@ -1783,37 +1787,18 @@ void scriptclass::run(void)
|
||||||
|
|
||||||
graphics.textboxremovefast();
|
graphics.textboxremovefast();
|
||||||
|
|
||||||
graphics.createtextboxflipme(loc::gettext("Congratulations!\n\nYou have found a shiny trinket!"), 50, 85, TEXT_COLOUR("gray"));
|
graphics.createtextboxflipme("", 50, 85, TEXT_COLOUR("gray"));
|
||||||
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
||||||
int h = graphics.textboxwrap(2);
|
|
||||||
graphics.textboxcentertext();
|
|
||||||
graphics.textboxpad(1, 1);
|
|
||||||
graphics.textboxcenterx();
|
graphics.textboxcenterx();
|
||||||
|
graphics.textboxtranslate(TEXTTRANSLATE_FUNCTION, foundtrinket_textbox1);
|
||||||
|
graphics.textboxapplyposition();
|
||||||
|
|
||||||
int max_trinkets;
|
graphics.createtextboxflipme("", 50, 95, TEXT_COLOUR("gray"));
|
||||||
|
|
||||||
if (map.custommode)
|
|
||||||
{
|
|
||||||
max_trinkets = cl.numtrinkets();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
max_trinkets = 20;
|
|
||||||
}
|
|
||||||
|
|
||||||
char buffer[SCREEN_WIDTH_CHARS + 1];
|
|
||||||
vformat_buf(
|
|
||||||
buffer, sizeof(buffer),
|
|
||||||
loc::gettext("{n_trinkets|wordy} out of {max_trinkets|wordy}"),
|
|
||||||
"n_trinkets:int, max_trinkets:int",
|
|
||||||
game.trinkets(), max_trinkets
|
|
||||||
);
|
|
||||||
graphics.createtextboxflipme(buffer, 50, 95+h, TEXT_COLOUR("gray"));
|
|
||||||
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
graphics.textboxprintflags(PR_FONT_INTERFACE);
|
||||||
graphics.textboxwrap(2);
|
|
||||||
graphics.textboxcentertext();
|
|
||||||
graphics.textboxpad(1, 1);
|
|
||||||
graphics.textboxcenterx();
|
graphics.textboxcenterx();
|
||||||
|
graphics.textboxindex(graphics.textboxes.size() - 2);
|
||||||
|
graphics.textboxtranslate(TEXTTRANSLATE_FUNCTION, foundtrinket_textbox2);
|
||||||
|
graphics.textboxapplyposition();
|
||||||
|
|
||||||
if (!game.backgroundtext)
|
if (!game.backgroundtext)
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,6 +45,8 @@ textboxclass::textboxclass(int gap)
|
||||||
original = TextboxOriginalContext();
|
original = TextboxOriginalContext();
|
||||||
original.text_case = 1;
|
original.text_case = 1;
|
||||||
spacing = TextboxSpacing();
|
spacing = TextboxSpacing();
|
||||||
|
|
||||||
|
other_textbox_index = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void textboxclass::addsprite(int x, int y, int tile, int col)
|
void textboxclass::addsprite(int x, int y, int tile, int col)
|
||||||
|
|
|
@ -137,6 +137,8 @@ public:
|
||||||
TextboxOriginalContext original;
|
TextboxOriginalContext original;
|
||||||
TextboxSpacing spacing;
|
TextboxSpacing spacing;
|
||||||
TextboxFunction function;
|
TextboxFunction function;
|
||||||
|
|
||||||
|
int other_textbox_index;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* TEXTBOX_H */
|
#endif /* TEXTBOX_H */
|
||||||
|
|
Loading…
Reference in a new issue