1
0
Fork 0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-12-22 17:49:43 +01:00

Animated roomnames, setroomname command

This commit adds a better system for animated roomnames.

The old system, like many other systems, were very hardcoded, and can be
described as mostly else-if chains, with some fun string comparisons.
The new system uses lists of text for transformations and glitchy names,
making it much easier to add new cases if needeed.

This commit implements the system but does not replace the old system,
where that is done in the next commit.

The settings for special roomnames can be read from level XML, and
`setroomname()` can be used from commands to set a new, static name.
This commit is contained in:
AllyTally 2022-12-11 19:05:20 -04:00 committed by Misa Elizabeth Kai
parent 27da7fe935
commit dd108a035f
6 changed files with 172 additions and 1 deletions

View file

@ -388,6 +388,7 @@ void customlevelclass::reset(void)
onewaycol_override = false; onewaycol_override = false;
customcolours.clear(); customcolours.clear();
map.specialroomnames.clear();
} }
const int* customlevelclass::loadlevel( int rxi, int ryi ) const int* customlevelclass::loadlevel( int rxi, int ryi )
@ -1313,6 +1314,71 @@ next:
} }
} }
} }
if (SDL_strcmp(pKey, "SpecialRoomnames") == 0)
{
for (tinyxml2::XMLElement* roomnameElement = pElem->FirstChildElement(); roomnameElement; roomnameElement = roomnameElement->NextSiblingElement())
{
const char* roomnameType = roomnameElement->Value();
Roomname name;
name.x = 0;
name.y = 0;
name.flag = -1;
name.loop = false;
name.type = STATIC;
name.progress = 0;
name.delay = 0;
if (SDL_strcmp(roomnameType, "transform") == 0)
{
name.type = TRANSFORM;
name.delay = 2;
}
else if (SDL_strcmp(roomnameType, "glitch") == 0)
{
name.type = GLITCH;
name.progress = 1;
name.delay = -1;
}
name.text.clear();
roomnameElement->QueryIntAttribute("x", &name.x);
roomnameElement->QueryIntAttribute("y", &name.y);
roomnameElement->QueryIntAttribute("flag", &name.flag);
roomnameElement->QueryBoolAttribute("loop", &name.loop);
if (name.type == STATIC)
{
const char* text = roomnameElement->GetText();
if (text != NULL)
{
name.text.push_back(std::string(text));
}
}
else
{
// Does it have children?
if (roomnameElement->FirstChildElement() == NULL)
{
continue;
}
for (tinyxml2::XMLElement* textElement = roomnameElement->FirstChildElement(); textElement; textElement = textElement->NextSiblingElement())
{
if (SDL_strcmp(textElement->Value(), "text") == 0)
{
const char* text = textElement->GetText();
if (text != NULL)
{
name.text.push_back(std::string(text));
}
}
}
}
map.specialroomnames.push_back(name);
}
}
} }
if (mapwidth < maxwidth) if (mapwidth < maxwidth)

View file

@ -5498,7 +5498,12 @@ void Game::customloadquick(const std::string& savfile)
{ {
map.showtrinkets = help.Int(pText); map.showtrinkets = help.Int(pText);
} }
else if (SDL_strcmp(pKey, "roomname") == 0)
{
map.setroomname(pText);
map.roomnameset = true;
map.roomname_special = true;
}
} }
map.showteleporters = true; map.showteleporters = true;
@ -5972,6 +5977,11 @@ bool Game::customsavequick(const std::string& savfile)
xml::update_tag(msgs, "showtrinkets", (int) map.showtrinkets); xml::update_tag(msgs, "showtrinkets", (int) map.showtrinkets);
if (map.roomnameset)
{
xml::update_tag(msgs, "roomname", map.roomname);
}
std::string summary = savearea + ", " + timestring(); std::string summary = savearea + ", " + timestring();
xml::update_tag(msgs, "summary", summary.c_str()); xml::update_tag(msgs, "summary", summary.c_str());

View file

@ -88,6 +88,8 @@ mapclass::mapclass(void)
hiddenname = ""; hiddenname = "";
roomname_special = false; roomname_special = false;
specialroomnames.clear();
roomnameset = false;
} }
static char roomname_static[SCREEN_WIDTH_CHARS]; static char roomname_static[SCREEN_WIDTH_CHARS];
@ -396,6 +398,59 @@ void mapclass::transformname(int t)
} }
} }
void mapclass::updateroomnames(void)
{
if (roomnameset)
{
return;
}
const int rx = game.roomx - 100;
const int ry = game.roomy - 100;
for (int i = specialroomnames.size() - 1; i >= 0; i--)
{
Roomname &roomname = specialroomnames[i];
if (rx == roomname.x && ry == roomname.y && (roomname.flag == -1 || (INBOUNDS_ARR(roomname.flag, obj.flags) && obj.flags[roomname.flag])))
{
roomname_special = true;
if (roomname.type == STATIC)
{
setroomname(roomname.text[0].c_str());
}
if (roomname.type == GLITCH)
{
roomname.delay--;
if (roomname.delay <= 0)
{
roomname.progress = (roomname.progress + 1) % 2;
roomname.delay = 5;
if (roomname.progress == 0)
{
roomname.delay = 25 + (int) (fRandom() * 10);
}
}
setroomname(roomname.text[roomname.progress].c_str());
}
if (roomname.type == TRANSFORM)
{
roomname.delay--;
if (roomname.delay <= 0)
{
roomname.progress++;
roomname.delay = 2;
if (roomname.progress >= roomname.text.size())
{
roomname.progress = roomname.loop ? 0 : roomname.text.size() - 1;
}
}
setroomname(roomname.text[roomname.progress].c_str());
}
break;
}
}
}
const char* mapclass::getglitchname(int x, int y) const char* mapclass::getglitchname(int x, int y)
{ {
//Returns the name in the final area. //Returns the name in the final area.
@ -1414,6 +1469,7 @@ void mapclass::loadlevel(int rx, int ry)
roomtexton = false; roomtexton = false;
roomtext.clear(); roomtext.clear();
roomnameset = false;
obj.platformtile = 0; obj.platformtile = 0;
obj.customplatformtile=0; obj.customplatformtile=0;

View file

@ -2,6 +2,7 @@
#define MAPGAME_H #define MAPGAME_H
#include <vector> #include <vector>
#include <string>
#include "Finalclass.h" #include "Finalclass.h"
#include "Labclass.h" #include "Labclass.h"
@ -17,6 +18,25 @@ struct Roomtext
const char* text; const char* text;
}; };
enum RoomnameType
{
STATIC,
GLITCH,
TRANSFORM
};
struct Roomname
{
int x;
int y;
bool loop;
int flag;
RoomnameType type;
std::vector<std::string> text;
int progress;
int delay;
};
class mapclass class mapclass
{ {
public: public:
@ -39,6 +59,8 @@ public:
void resetnames(void); void resetnames(void);
void updateroomnames(void);
void transformname(int t); void transformname(int t);
const char* getglitchname(int x, int y); const char* getglitchname(int x, int y);
@ -114,8 +136,11 @@ public:
const char* roomname; const char* roomname;
bool roomname_special; bool roomname_special;
bool roomnameset;
const char* hiddenname; const char* hiddenname;
std::vector<Roomname> specialroomnames;
//Special tower stuff //Special tower stuff
bool towermode; bool towermode;
int ypos; int ypos;

View file

@ -114,6 +114,8 @@ void gamerenderfixed(void)
obj.entities[i].updatecolour(); obj.entities[i].updatecolour();
} }
map.updateroomnames();
if (map.finalmode) if (map.finalmode)
{ {
map.glitchname = map.getglitchname(game.roomx, game.roomy); map.glitchname = map.getglitchname(game.roomx, game.roomy);
@ -245,6 +247,8 @@ void maprenderfixed(void)
map.cursordelay++; map.cursordelay++;
} }
map.updateroomnames();
if (map.finalmode) if (map.finalmode)
{ {
map.glitchname = map.getglitchname(game.roomx, game.roomy); map.glitchname = map.getglitchname(game.roomx, game.roomy);

View file

@ -176,6 +176,16 @@ void scriptclass::run(void)
scriptdelay = 1; scriptdelay = 1;
} }
#if !defined(NO_CUSTOM_LEVELS) #if !defined(NO_CUSTOM_LEVELS)
if (words[0] == "setroomname")
{
++position;
if (INBOUNDS_VEC(position, commands))
{
map.roomname_special = true;
map.roomnameset = true;
map.setroomname(commands[position].c_str());
}
}
if (words[0] == "warpdir") if (words[0] == "warpdir")
{ {
int temprx = ss_toi(words[1]) - 1; int temprx = ss_toi(words[1]) - 1;