#include "Models.h"
#include "Lights.h"
#include "Person.h"
-#include "Constants.h"
#include "Sprite.h"
//#include <agl.h>
#include "Text.h"
#include "gamegl.h"
#include "Stereo.h"
#include "Account.h"
+#include "Sounds.h"
+
+#define NB_CAMPAIGN_MENU_ITEM 7
extern GLuint rabbittexture;
+struct TextureInfo;
+
+class CampaignLevel
+{
+private:
+ int width;
+ struct Position
+ {
+ int x;
+ int y;
+ };
+public:
+ std::string mapname;
+ std::string description;
+ int choosenext;
+ /*
+ 0 = Immediately load next level at the end of this one.
+ 1 = Go back to the world map.
+ 2 = Don't bring up the Fiery loading screen. Maybe other things, I've not investigated.
+ */
+ //int numnext; // 0 on final level. As David said: he meant to add story branching, but he eventually hadn't.
+ std::vector<int> nextlevel;
+ Position location;
+
+ CampaignLevel() : width(10) {
+ choosenext = 1;
+ location.x = 0;
+ location.y = 0;
+ }
+
+ int getStartX() {
+ return 30+120+location.x*400/512;
+ }
+
+ int getStartY() {
+ return 30+30+(512-location.y)*400/512;
+ }
+
+ int getEndX() {
+ return getStartX()+width;
+ }
+
+ int getEndY() {
+ return getStartY()+width;
+ }
+
+ XYZ getCenter() {
+ XYZ center;
+ center.x=getStartX()+width/2;
+ center.y=getStartY()+width/2;
+ return center;
+ }
+
+ int getWidth() {
+ return width;
+ }
+
+ istream& operator<< (istream& is) {
+ is.ignore(256,':');
+ is.ignore(256,':');
+ is.ignore(256,' ');
+ is >> mapname;
+ is.ignore(256,':');
+ is >> description;
+ for(int pos = description.find('_');pos!=string::npos;pos = description.find('_',pos)) {
+ description.replace(pos,1,1,' ');
+ }
+ is.ignore(256,':');
+ is >> choosenext;
+ is.ignore(256,':');
+ int numnext,next;
+ is >> numnext;
+ for(int j=0;j<numnext;j++) {
+ is.ignore(256,':');
+ is >> next;
+ nextlevel.push_back(next-1);
+ }
+ is.ignore(256,':');
+ is >> location.x;
+ is.ignore(256,':');
+ is >> location.y;
+ return is;
+ }
+
+ friend istream& operator>> (istream& is, CampaignLevel& cl) {
+ return cl << is;
+ }
+};
+
class Game
{
public:
- typedef std::map<std::string, GLuint> TextureList;
- typedef std::map<GLuint, std::string> GLTextureList;
- typedef TextureList::iterator TexIter;
- static TextureList textures;
-
GLuint terraintexture;
GLuint terraintexture2;
GLuint terraintexture3;
int endx[100];
int endy[100];
float selectedlong[100];
- float offsetx[100];
- float offsety[100];
- float movex[100];
- float movey[100];
- float transition;
- int anim;
int selected;
int keyselect;
- int loaddistrib;
int indemo;
bool won;
float rotation,rotation2;
SkyBox skybox;
bool cameramode;
- bool cameratogglekeydown;
- bool chattogglekeydown;
int olddrawmode;
int drawmode;
- bool drawmodetogglekeydown;
- bool explodetogglekeydown;
- bool detailtogglekeydown;
bool firstload;
bool oldbutton;
bool stealthloading;
- int campaignnumlevels;
- char campaignmapname[50][256];
- char campaigndescription[50][256];
- int campaignchoosenext[50];
- int campaignnumnext[50];
- int campaignnextlevel[50][10];
- int campaignchoicesmade;
- int campaignchoices[5000];
- int campaignlocationx[50];
- int campaignlocationy[50];
- int campaignchoicenum;
- int campaignchoicewhich[10];
+ std::vector<CampaignLevel> campaignlevels;
int whichchoice;
-
- int numlevelspassed;
- int levelorder[5000];
- int levelvisible[50];
- int levelhighlight[50];
+ int actuallevel;
bool minimap;
XYZ cameraloc;
float cameradist;
- bool envtogglekeydown;
- bool slomotogglekeydown;
- bool texturesizetogglekeydown;
- bool freezetogglekeydown;
int drawtoggle;
bool editorenabled;
bool displayblink;
int displayselected;
bool consolekeydown;
- bool consoletogglekeydown;
float consoleblinkdelay;
bool consoleblink;
int consoleselected;
- //int togglekey[140];
- //float togglekeydelay[140];
- bool registernow;
bool autocam;
unsigned short crouchkey,jumpkey,forwardkey,chatkey,backkey,leftkey,rightkey,drawkey,throwkey,attackkey;
+ unsigned short consolekey;
bool oldattackkey;
- static void LoadTexture(const char *fileName, GLuint *textureid,int mipmap, bool hasalpha);
- static void LoadTextureSave(const char *fileName, GLuint *textureid,int mipmap,GLubyte *array, int *skinsize);
+ static void LoadTexture(const string fileName, GLuint *textureid,int mipmap, bool hasalpha);
+ static void LoadTextureSave(const string fileName, GLuint *textureid,int mipmap,GLubyte *array, int *skinsize);
void LoadSave(const char *fileName, GLuint *textureid,bool mipmap,GLubyte *array, int *skinsize);
- bool AddClothes(const char *fileName, GLuint *textureid,bool mipmap,GLubyte *array, int *skinsize);
+ bool AddClothes(const char *fileName, GLubyte *array);
void InitGame();
+ void LoadScreenTexture();
void LoadStuff();
void LoadingScreen();
+ void LoadCampaign();
+ static std::vector<std::string> ListCampaigns();
void FadeLoadingScreen(float howmuch);
void Dispose();
int DrawGLScene(StereoSide side);
+ void DrawMenu();
+ void DrawGL();
+ //factored from Tick() -sf17k
+ void MenuTick();
+ void doTutorial();
+ void doDebugKeys();
+ void doJumpReversals();
+ void doAerialAcrobatics();
+ void doAttacks();
+ void doPlayerCollisions();
+ void doAI(int i);
+ //end factored
void Tick();
void TickOnce();
void TickOnceAfter();
void SetUpLighting();
void Loadlevel(int which);
- void Loadlevel(char *name);
- void LoadSounds();
+ void Loadlevel(const char *name);
void Setenvironment(int which);
GLvoid ReSizeGLScene(float fov, float near);
int findPathDist(int start,int end);
void inputText(char* str, int* charselected, int* nb_chars);
void flash();
bool waiting;
- bool mainmenutogglekeydown;
//int mainmenu;
Account* accountactive;
};
#define STUBBED(x) { static bool seen = false; if (!seen) { seen = true; fprintf(stderr, "STUBBED: %s at %s:%d\n", x, __FILE__, __LINE__); } }
//#define STUBBED(x)
+extern int numplayers;
+
+extern int numdialogues;
+const int max_dialogues = 20;
+const int max_dialoguelength = 20;
+extern int numdialogueboxes[max_dialogues];
+extern int dialoguetype[max_dialogues];
+extern int dialogueboxlocation[max_dialogues][max_dialoguelength];
+extern float dialogueboxcolor[max_dialogues][max_dialoguelength][3];
+extern int dialogueboxsound[max_dialogues][max_dialoguelength];
+extern char dialoguetext[max_dialogues][max_dialoguelength][128];
+extern char dialoguename[max_dialogues][max_dialoguelength][64];
+extern XYZ dialoguecamera[max_dialogues][max_dialoguelength];
+extern XYZ participantlocation[max_dialogues][10];
+extern int participantfocus[max_dialogues][max_dialoguelength];
+extern int participantaction[max_dialogues][max_dialoguelength];
+extern float participantrotation[max_dialogues][10];
+extern XYZ participantfacing[max_dialogues][max_dialoguelength][10];
+extern float dialoguecamerarotation[max_dialogues][max_dialoguelength];
+extern float dialoguecamerarotation2[max_dialogues][max_dialoguelength];
+extern int indialogue;
+extern int whichdialogue;
+extern int directing;
+extern float dialoguetime;
+extern int dialoguegonethrough[20];
+
+enum maptypes {
+ mapkilleveryone, mapgosomewhere,
+ mapkillsomeone, mapkillmost // These two are unused
+};
+
+enum pathtypes {wpkeepwalking, wppause};
+
+static const char *pathtypenames[] = {"keepwalking", "pause"};
+
+enum editortypes {typeactive, typesitting, typesittingwall, typesleeping,
+ typedead1, typedead2, typedead3, typedead4};
+
+static const char *editortypenames[] = {
+ "active", "sitting", "sitting wall", "sleeping",
+ "dead1", "dead2", "dead3", "dead4"
+};
+
#endif