2020-01-01 21:29:24 +01:00
|
|
|
#ifndef MAPGAME_H
|
|
|
|
#define MAPGAME_H
|
|
|
|
|
|
|
|
#include "Tower.h"
|
|
|
|
#include "WarpClass.h"
|
|
|
|
#include "Finalclass.h"
|
|
|
|
#include "Labclass.h"
|
|
|
|
#include "Spacestation2.h"
|
|
|
|
#include "Otherlevel.h"
|
|
|
|
#include "Entity.h"
|
|
|
|
#include "Graphics.h"
|
|
|
|
#include <vector>
|
|
|
|
#include "Music.h"
|
|
|
|
#include "editor.h"
|
|
|
|
|
|
|
|
class mapclass
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
mapclass();
|
|
|
|
|
|
|
|
int RGB(int red,int green,int blue);
|
|
|
|
|
|
|
|
int intpol(int a, int b, float c);
|
|
|
|
|
2020-04-15 04:29:19 +02:00
|
|
|
void setteleporter(int x, int y);
|
2020-01-01 21:29:24 +01:00
|
|
|
|
2020-04-15 04:37:00 +02:00
|
|
|
void settrinket(int x, int y);
|
2020-01-01 21:29:24 +01:00
|
|
|
|
|
|
|
void resetmap();
|
|
|
|
|
|
|
|
void resetnames();
|
|
|
|
|
|
|
|
void transformname(int t);
|
|
|
|
|
|
|
|
std::string getglitchname(int x, int y);
|
|
|
|
|
|
|
|
void initmapdata();
|
|
|
|
|
|
|
|
int finalat(int x, int y);
|
|
|
|
|
|
|
|
int maptiletoenemycol(int t);
|
|
|
|
|
2020-03-31 10:09:42 +02:00
|
|
|
void changefinalcol(int t);
|
2020-01-01 21:29:24 +01:00
|
|
|
|
|
|
|
void setcol(const int r1, const int g1, const int b1 , const int r2, const int g2, const int b2, const int c);
|
|
|
|
|
|
|
|
void updatetowerglow();
|
|
|
|
|
|
|
|
void nexttowercolour();
|
|
|
|
|
|
|
|
void settowercolour(int t);
|
|
|
|
|
|
|
|
bool spikecollide(int x, int y);
|
|
|
|
|
|
|
|
bool collide(int x, int y);
|
|
|
|
|
|
|
|
void settile(int xp, int yp, int t);
|
|
|
|
|
|
|
|
|
|
|
|
int area(int _rx, int _ry);
|
|
|
|
|
|
|
|
void exploretower();
|
|
|
|
|
|
|
|
void hideship();
|
|
|
|
|
|
|
|
void showship();
|
|
|
|
|
2020-03-31 10:09:42 +02:00
|
|
|
void resetplayer();
|
2020-01-01 21:29:24 +01:00
|
|
|
|
2020-03-31 10:09:42 +02:00
|
|
|
void warpto(int rx, int ry , int t, int tx, int ty);
|
2020-01-01 21:29:24 +01:00
|
|
|
|
2020-03-31 10:09:42 +02:00
|
|
|
void gotoroom(int rx, int ry);
|
2020-01-01 21:29:24 +01:00
|
|
|
|
|
|
|
std::string currentarea(int t);
|
|
|
|
|
2020-03-31 10:09:42 +02:00
|
|
|
void loadlevel(int rx, int ry);
|
2020-01-01 21:29:24 +01:00
|
|
|
|
|
|
|
|
|
|
|
std::vector <int> roomdeaths;
|
|
|
|
std::vector <int> roomdeathsfinal;
|
|
|
|
std::vector <int> areamap;
|
|
|
|
std::vector <int> contents;
|
|
|
|
std::vector <int> explored;
|
|
|
|
std::vector <int> vmult;
|
|
|
|
std::vector <std::string> tmap;
|
|
|
|
|
|
|
|
int temp;
|
|
|
|
int temp2;
|
|
|
|
int background;
|
|
|
|
int rcol;
|
|
|
|
int tileset;
|
|
|
|
bool warpx;
|
|
|
|
bool warpy;
|
|
|
|
|
|
|
|
|
|
|
|
std::string roomname;
|
Refactor how "hidden names" work
By "hidden names", I'm referring to "Dimension VVVVVV" and "The Ship"
popping up on the quit/pause/teleporter screens, even though those rooms
don't have any roomnames.
Apparently my commit to fix roomname re-draw bleed on the
quit/pause/teleporter screens exposed yet another hardreset()-caused
bug. The issue here is that since hardreset() sets game.roomx and
game.roomy to 0, map.area() will no longer work properly, and since the
hidden roomname check is based on map.area(), it will no longer display
"Dimension VVVVVV" or "The Ship" once you press ACTION to quit. It used
to do this due to the re-draw bleed, but now it doesn't.
I saw that roomnames didn't get reset in hardreset(), so the solution
here is to re-factor hidden names to be an actual variable, instead of
being implicit. map.hiddenname is a variable that's set in
mapclass::loadlevel(), and if isn't empty, it will be drawn on the
quit/pause/teleporter screens. That way it will still display "Dimension
VVVVVV" and "The Ship" when you press ACTION to quit to the menu.
EDIT: Since PR #230 got merged, this commit is no longer strictly
necessary, but it's still good to refactor hidden names like this.
2020-05-02 23:10:22 +02:00
|
|
|
std::string hiddenname;
|
2020-01-01 21:29:24 +01:00
|
|
|
|
|
|
|
//Special tower stuff
|
|
|
|
bool towermode;
|
|
|
|
float ypos;
|
2020-04-30 20:52:21 +02:00
|
|
|
float oldypos;
|
2020-01-01 21:29:24 +01:00
|
|
|
int bypos;
|
|
|
|
int cameramode;
|
|
|
|
int cameraseek, cameraseekframe;
|
|
|
|
int resumedelay;
|
|
|
|
bool minitowermode;
|
|
|
|
int scrolldir;
|
|
|
|
|
|
|
|
//This is the old colour cycle
|
|
|
|
int r, g,b;
|
|
|
|
int check, cmode;
|
|
|
|
int towercol;
|
|
|
|
int colstate, colstatedelay;
|
|
|
|
int colsuperstate;
|
|
|
|
int spikeleveltop, spikelevelbottom;
|
2020-04-30 21:58:08 +02:00
|
|
|
int oldspikeleveltop, oldspikelevelbottom;
|
2020-01-01 21:29:24 +01:00
|
|
|
bool tdrawback;
|
|
|
|
int bscroll;
|
|
|
|
//final level navigation
|
|
|
|
int finalx;
|
|
|
|
int finaly;
|
|
|
|
bool finalmode;
|
|
|
|
bool finalstretch;
|
|
|
|
|
|
|
|
//Variables for playing custom levels
|
|
|
|
bool custommode;
|
|
|
|
bool custommodeforreal;
|
|
|
|
int customx, customy;
|
|
|
|
int customwidth, customheight;
|
|
|
|
int custommmxoff, custommmyoff, custommmxsize, custommmysize;
|
|
|
|
int customzoom;
|
|
|
|
bool customshowmm;
|
|
|
|
|
|
|
|
std::vector<std::string> specialnames;
|
|
|
|
int glitchmode;
|
|
|
|
int glitchdelay;
|
|
|
|
std::string glitchname;
|
|
|
|
|
|
|
|
//final level colour cycling stuff
|
|
|
|
bool final_colormode;
|
|
|
|
int final_mapcol;
|
|
|
|
int final_aniframe;
|
|
|
|
int final_aniframedelay;
|
|
|
|
int final_colorframe, final_colorframedelay;
|
|
|
|
|
|
|
|
//Teleporters and Trinkets on the map
|
|
|
|
std::vector<point> teleporters;
|
|
|
|
std::vector<point> shinytrinkets;
|
|
|
|
|
|
|
|
bool showteleporters, showtargets, showtrinkets;
|
|
|
|
|
|
|
|
//Roomtext
|
|
|
|
bool roomtexton;
|
Refactor roomtext to not use ad-hoc objects / separate length trackers
This refactors the roomtext code to (1) not use ad-hoc objects and (2)
not use a separate length-tracking variable to keep track of the actual
amount of roomtext in a room.
What I mean by ad-hoc object is, instead of formally creating a
fully-fledged struct or class and storing one vector containing that
object, this game instead hacks together an object by storing each
attribute of an object in different vectors.
In the case of roomtext, instead of making a Roomtext object that has
attributes 'x', 'y', and 'text', the 'text' attribute of each is stored
in the vector 'roomtext', the 'x' attribute of each is stored in the
vector 'roomtextx', and the 'y' attribute of each is stored in the
vector 'roomtexty'. It's only an object in the sense that you can grab
the attributes of each roomtext by using the same index across all three
vectors.
This makes it somewhat annoying to maintain and deal with, like when I
wanted add sub-tile positions to roomtext in VVVVVV: Community Edition.
Instead of being able to add attributes to an already-existing
formalized Roomtext object, I would instead have to add two more
vectors, which is inelegant. Or I could refactor the whole system, which
is what I decided to do instead.
Furthermore, this removes the separate length-tracking variable
'roomtextnumlines', which makes the code much more easy to maintain and
deal with, as the amount of roomtext is naturally tracked by C++ instead
of us having to keep track of the actual amount of roomtext manually.
2020-03-01 03:26:12 +01:00
|
|
|
std::vector<Roomtext> roomtext;
|
2020-01-01 21:29:24 +01:00
|
|
|
|
|
|
|
//Levels
|
|
|
|
otherlevelclass otherlevel;
|
|
|
|
spacestation2class spacestation2;
|
|
|
|
labclass lablevel;
|
|
|
|
finalclass finallevel;
|
|
|
|
warpclass warplevel;
|
|
|
|
towerclass tower;
|
|
|
|
int extrarow;
|
|
|
|
|
|
|
|
//Accessibility options
|
|
|
|
bool invincibility;
|
|
|
|
|
|
|
|
//Map cursor
|
|
|
|
int cursorstate, cursordelay;
|
|
|
|
};
|
|
|
|
|
Allow using help/graphics/music/game/key/map/obj everywhere
This commit makes `help`, `graphics`, `music`, `game`, `key`, `map`, and
`obj` essentially static global objects that can be used everywhere.
This is useful in case we ever need to add a new function in the future,
so we don't have to bother with passing a new argument in which means we
have to pass a new argument in to the function that calls that function
which means having to pass a new argument into the function that calls
THAT function, etc. which is a real headache when working on fan mods of
the source code.
Note that this changes NONE of the existing function signatures, it
merely just makes those variables accessible everywhere in the same way
`script` and `ed` are.
Also note that some classes had to be initialized after the filesystem
was initialized, but C++ would keep initializing them before the
filesystem got initialized, because I *had* to put them at the top of
`main.cpp`, or else they wouldn't be global variables.
The only way to work around this was to use entityclass's initialization
style (which I'm pretty sure entityclass of all things doesn't need to
be initialized this way), where you actually initialize the class in an
`init()` function, and so then you do `graphics.init()` after the
filesystem initialization, AFTER doing `Graphics graphics` up at the
top.
I've had to do this for `graphics` (but only because its child
GraphicsResources `grphx` needs to be initialized this way), `music`,
and `game`. I don't think this will affect anything. Other than that,
`help`, `key`, and `map` are still using the C++-intended method of
having ClassName::ClassName() functions.
2020-01-29 08:35:03 +01:00
|
|
|
extern mapclass map;
|
|
|
|
|
2020-01-01 21:29:24 +01:00
|
|
|
#endif /* MAPGAME_H */
|