aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ui.cpp320
-rw-r--r--src/world.cpp84
2 files changed, 196 insertions, 208 deletions
diff --git a/src/ui.cpp b/src/ui.cpp
index 245f1d7..458e797 100644
--- a/src/ui.cpp
+++ b/src/ui.cpp
@@ -38,23 +38,26 @@ extern unsigned int tickCount;
static FT_Library ftl;
static FT_Face ftf;
-static GLuint ftex[93];
-static vec2 ftexwh[93];
-static vec2 ftexbl[93];
-static vec2 ftexad[93];
+
+typedef struct {
+ vec2 wh;
+ vec2 bl;
+ vec2 ad;
+} FT_Info;
+
+static std::vector<FT_Info> ftdat ( 93, { { 0, 0 }, { 0, 0 }, { 0, 0 } } );
+static std::vector<GLuint> ftex ( 93, 0 );
static unsigned char fontColor[4] = {255,255,255,255};
/*
* Variables for dialog boxes / options.
-*/
+ */
-static char dialogBoxText[512];
-static char *dialogOptText[4];
-static float merchAOptLoc[2][3];
-static float dialogOptLoc[4][3];
-static unsigned char dialogOptCount = 0;
-static bool typeOutDone = true;
+static std::vector<std::pair<std::string,vec3>> dialogOptText;
+static std::string dialogBoxText;
+static vec3 merchArrowLoc[2];
+static bool typeOutDone = true;
/*
* Menu-related objects
@@ -69,12 +72,12 @@ static Mix_Chunk *dialogClick;
extern void mainLoop(void);
/*
- * Toggled by pressing 'q', disables some controls when true.
-*/
+ * Fade effect flags
+ */
bool fadeEnable = false;
-bool fadeWhite = false;
-bool fadeFast = false;
+bool fadeWhite = false;
+bool fadeFast = false;
unsigned int fadeIntensity = 0;
bool inBattle = false;
@@ -155,8 +158,7 @@ namespace ui {
std::cout<<"Error! Couldn't initialize freetype."<<std::endl;
abort();
}
- fontSize=0;
- memset(&ftex,0,93*sizeof(GLuint));
+ fontSize = 0;
#ifdef DEBUG
DEBUG_printf("Initialized FreeType2.\n",NULL);
#endif // DEBUG
@@ -196,7 +198,6 @@ namespace ui {
void setFontSize(unsigned int size){
mtx.lock();
unsigned int i,j;
- unsigned char *buf;
fontSize=size;
FT_Set_Pixel_Sizes(ftf,0,fontSize);
@@ -205,8 +206,8 @@ namespace ui {
* Pre-render 'all' the characters.
*/
- glDeleteTextures(93,ftex); // delete[] any already-rendered textures
- glGenTextures(93,ftex); // Generate new texture name/locations?
+ glDeleteTextures(93,ftex.data()); // delete[] any already-rendered textures
+ glGenTextures(93,ftex.data()); // Generate new texture name/locations?
for(i=33;i<126;i++){
@@ -236,26 +237,20 @@ namespace ui {
* making it white-on-black.
*/
- buf = new unsigned char[ftf->glyph->bitmap.width * ftf->glyph->bitmap.rows * 4];
- for(j=0;j<ftf->glyph->bitmap.width*ftf->glyph->bitmap.rows;j++){
- buf[j*4 ]=255;//fontColor[0];
- buf[j*4+1]=255;//fontColor[1];
- buf[j*4+2]=255;//fontColor[2];
- buf[j*4+3]=ftf->glyph->bitmap.buffer[j] ? 255 : 0;
- //buf[j*4+3]=ftf->glyph->bitmap.buffer[j];
- }
+ std::vector<uint32_t> buf ( ftf->glyph->bitmap.width * ftf->glyph->bitmap.rows, 0 );
- ftexwh[i-33].x=ftf->glyph->bitmap.width;
- ftexwh[i-33].y=ftf->glyph->bitmap.rows;
- ftexbl[i-33].x=ftf->glyph->bitmap_left;
- ftexbl[i-33].y=ftf->glyph->bitmap_top;
- ftexad[i-33].x=ftf->glyph->advance.x>>6;
- ftexad[i-33].y=ftf->glyph->advance.y>>6;
+ for( j = 0; j < buf.size(); j++ )
+ buf[j] = 0x00FFFFFF | (ftf->glyph->bitmap.buffer[j] ? (0xFF << 24) : 0);
- glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,ftf->glyph->bitmap.width,ftf->glyph->bitmap.rows,0,GL_RGBA,GL_UNSIGNED_BYTE,buf);
+ ftdat[i-33].wh.x=ftf->glyph->bitmap.width;
+ ftdat[i-33].wh.y=ftf->glyph->bitmap.rows;
+ ftdat[i-33].bl.x=ftf->glyph->bitmap_left;
+ ftdat[i-33].bl.y=ftf->glyph->bitmap_top;
+ ftdat[i-33].ad.x=ftf->glyph->advance.x>>6;
+ ftdat[i-33].ad.y=ftf->glyph->advance.y>>6;
- delete[] buf; //free(buf);
+ glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,ftf->glyph->bitmap.width,ftf->glyph->bitmap.rows,0,GL_RGBA,GL_UNSIGNED_BYTE,buf.data());
}
mtx.unlock();
}
@@ -291,9 +286,9 @@ namespace ui {
* Get the width and height of the rendered character.
*/
- c1={(float)floor(x)+ftexbl[c-33].x,
- (float)floor(y)+ftexbl[c-33].y};
- c2=ftexwh[c-33];
+ c1={(float)floor(x)+ftdat[c-33].bl.x,
+ (float)floor(y)+ftdat[c-33].bl.y};
+ c2=ftdat[c-33].wh;
/*
* Draw the character:
@@ -313,11 +308,8 @@ namespace ui {
glPopMatrix();
glDisable(GL_TEXTURE_2D);
- /*
- * return the width.
- */
-
- return ftexad[c-33];//(vec2){c2.x,ftexad[c-33].y};
+ // return the width.
+ return ftdat[c-33].ad;
}
/*
@@ -391,7 +383,7 @@ namespace ui {
width += fontSize / 2;
break;
default:
- width += ftexwh[i].x + fontSize * 0.1f;
+ width += ftdat[i].wh.x + fontSize * 0.1f;
break;
}
} while(s[++i]);
@@ -405,7 +397,7 @@ namespace ui {
*/
std::string ret;
- std::string typeOut(char *str){
+ std::string typeOut( std::string str ) {
static unsigned int sinc, // Acts as a delayer for the space between each character.
linc=0, // Contains the number of letters that should be drawn.
size=0; // Contains the full size of the current string.
@@ -414,9 +406,9 @@ namespace ui {
* Reset values if a new string is being passed.
*/
- if(strncmp(ret.c_str(),str,linc-1)){
+ if(strncmp(ret.c_str(),str.c_str(),linc-1)){
ret.clear(); // Zero the buffer
- size=strlen(str); // Set the new target string size
+ size=str.size(); // Set the new target string size
linc=0; // Reset the incrementers
sinc=1;
typeOutDone = false;
@@ -431,7 +423,7 @@ namespace ui {
else if(++sinc==2){
sinc=0;
- ret.append( 1, *(str + linc) );
+ ret.append(str, linc, 1);
if(linc<size)
linc++;
@@ -446,92 +438,56 @@ namespace ui {
* Draw a formatted string to the specified coordinates.
*/
- float putText(const float x,const float y,const char *str,...){
+ float putText( const float x, const float y, const char *str, ... ) {
va_list args;
- char *buf;
- float width;
-
- /*
- * Create a wimpy buffer.
- */
+ std::unique_ptr<char[]> buf (new char[512]);
- buf = new char[512]; //(char *)calloc(128,sizeof(char));
- memset(buf,0,512*sizeof(char));
+ // zero out the buffer
+ memset(buf.get(),0,512*sizeof(char));
/*
* Handle the formatted string, printing it to the buffer.
- */
+ */
va_start(args,str);
- vsnprintf(buf,512,str,args);
+ vsnprintf(buf.get(),512,str,args);
va_end(args);
- /*
- * Draw the string, free resources, return the width of the string.
- */
-
- width=putString(x,y,buf);
- delete[] buf; //free(buf);
-
- return width;
+ // draw the string and return the width
+ return putString( x, y, buf.get() );
}
- void dialogBox(const char *name,const char *opt,bool passive,const char *text,...){
- textWrapLimit = 110;
+
+ void dialogBox( const char *name, const char *opt, bool passive, const char *text, ... ) {
va_list dialogArgs;
- unsigned int len;
- char *sopt,*soptbuf;
+ std::unique_ptr<char[]> printfbuf (new char[512]);
+ textWrapLimit = 110;
dialogPassive = passive;
- /*
- * Set up the text buffer.
- */
-
- memset(dialogBoxText,0,512);
-
- /*
- * Get the text ready for rendering.
- */
-
- len=strlen(name);
- strcpy(dialogBoxText ,name);
- strcpy(dialogBoxText+len,": ");
- len+=2;
+ // reset & add speaker prefix
+ dialogBoxText.clear();
+ dialogBoxText = (std::string)name + ": ";
+ // handle the formatted string
va_start(dialogArgs,text);
- vsnprintf(dialogBoxText+len,512-len,text,dialogArgs);
+ vsnprintf(printfbuf.get(),512,text,dialogArgs);
va_end(dialogArgs);
+ dialogBoxText += printfbuf.get();
- /*
- * Set up option text.
- */
-
- while(dialogOptCount){
- if(dialogOptText[dialogOptCount]){
- delete[] dialogOptText[dialogOptCount]; //free(dialogOptText[dialogOptCount]);
- dialogOptText[dialogOptCount] = NULL;
- }
- dialogOptCount--;
- };
+ // setup option text
+ dialogOptText.clear();
- dialogOptCount = 0;
dialogOptChosen = 0;
- memset(&dialogOptLoc,0,sizeof(float)*12);
- if(opt != NULL){
+ if ( opt ) {
+ std::string soptbuf = opt;
+ char *sopt = strtok(&soptbuf[0], ":");
- soptbuf = new char[strlen(opt)+1];
- strcpy(soptbuf,opt);
-
- sopt=strtok(soptbuf,":");
- while(sopt != NULL){
- dialogOptText[dialogOptCount] = new char[strlen(sopt)+1]; //(char *)malloc(strlen(sopt));
- strcpy(dialogOptText[dialogOptCount++],sopt);
- sopt=strtok(NULL,":");
+ // cycle through options
+ while(sopt){
+ dialogOptText.push_back(std::make_pair((std::string)sopt, vec3 {0,0,0}) );
+ sopt = strtok(NULL,":");
}
-
- delete[] soptbuf;
-
}
/*
@@ -546,9 +502,10 @@ namespace ui {
void merchantBox(const char *name,Trade trade,const char *opt,bool passive,const char *text,...){
- std::cout << "Buying and selling on the bi-weekly!" << std::endl;
va_list dialogArgs;
- size_t len;
+ std::unique_ptr<char[]> printfbuf (new char[512]);
+
+ std::cout << "Buying and selling on the bi-weekly!" << std::endl;
dialogPassive = passive;
@@ -557,41 +514,28 @@ namespace ui {
merchTrade = trade;
// clear the buffer
- memset(dialogBoxText, '\0', 512);
+ dialogBoxText.clear();
+ dialogBoxText = (std::string)name + ": ";
- // create the string
- strcpy(dialogBoxText, name);
- strcat(dialogBoxText, ": ");
-
- len=strlen(dialogBoxText);
va_start(dialogArgs,text);
- vsnprintf(dialogBoxText + len, 512 - len, text, dialogArgs);
+ vsnprintf(printfbuf.get(),512,text,dialogArgs);
va_end(dialogArgs);
+ dialogBoxText += printfbuf.get();
// free old option text
- while(dialogOptCount){
- if(dialogOptText[dialogOptCount]){
- delete[] dialogOptText[dialogOptCount];
- dialogOptText[dialogOptCount] = NULL;
- }
-
- dialogOptCount--;
- };
+ dialogOptText.clear();
dialogOptChosen = 0;
merchOptChosen = 0;
- memset(&dialogOptLoc, 0, sizeof(float) * 12);
// handle options if desired
if(opt){
- //std::unique_ptr<char[]> soptbuf (new char[strlen(opt) + 1]);
- char soptbuf[255];
- strcpy(soptbuf, opt);
- char *sopt = strtok(soptbuf, ":");
+ std::string soptbuf = opt;
+ char *sopt = strtok(&soptbuf[0], ":");
// cycle through options
while(sopt){
- strcpy( (dialogOptText[dialogOptCount++] = new char[strlen(sopt) + 1]), sopt);
+ dialogOptText.push_back(std::make_pair((std::string)sopt, vec3 {0,0,0}) );
sopt = strtok(NULL,":");
}
}
@@ -634,29 +578,40 @@ namespace ui {
}
void importantText(const char *text,...){
va_list textArgs;
+ char *printfbuf;
//if(!player->ground)return;
- memset(dialogBoxText,0,512);
+ //memset(dialogBoxText,0,512);
+ dialogBoxText.clear();
+ printfbuf = new char[ 512 ];
va_start(textArgs,text);
- vsnprintf(dialogBoxText,512,text,textArgs);
+ vsnprintf(printfbuf,512,text,textArgs);
va_end(textArgs);
+ dialogBoxText = printfbuf;
+ delete[] printfbuf;
dialogBoxExists = true;
dialogImportant = true;
//toggleBlack();
}
+
void passiveImportantText(int duration, const char *text,...){
va_list textArgs;
+ char *printfbuf;
//if(!player->ground)return;
- memset(dialogBoxText,0,512);
+ //memset(dialogBoxText,0,512);
+ dialogBoxText.clear();
+ printfbuf = new char[ 512 ];
va_start(textArgs,text);
- vsnprintf(dialogBoxText,512,text,textArgs);
+ vsnprintf(printfbuf,512,text,textArgs);
va_end(textArgs);
+ dialogBoxText = printfbuf;
+ delete[] printfbuf;
dialogBoxExists = true;
dialogImportant = true;
@@ -701,9 +656,9 @@ namespace ui {
}
}
if(fadeIntensity == 255 || dialogPassive){
- setFontSize(24);
+ //setFontSize(24);
putStringCentered(offset.x,offset.y,rtext.c_str());
- setFontSize(16);
+ //setFontSize(16);
}
}else if(dialogMerchant){
//static int dispItem;
@@ -759,47 +714,47 @@ namespace ui {
glEnd();
glDisable(GL_TEXTURE_2D);
- merchAOptLoc[0][0] = offset.x - (SCREEN_WIDTH / 8.5) - 16;
- merchAOptLoc[1][0] = offset.x + (SCREEN_WIDTH / 8.5) + 16;
- merchAOptLoc[0][1] = offset.y + (SCREEN_HEIGHT *.2);
- merchAOptLoc[1][1] = offset.y + (SCREEN_HEIGHT *.2);
- merchAOptLoc[0][2] = offset.x - (SCREEN_WIDTH / 8.5);
- merchAOptLoc[1][2] = offset.x + (SCREEN_WIDTH / 8.5);
+ merchArrowLoc[0].x = offset.x - (SCREEN_WIDTH / 8.5) - 16;
+ merchArrowLoc[1].x = offset.x + (SCREEN_WIDTH / 8.5) + 16;
+ merchArrowLoc[0].y = offset.y + (SCREEN_HEIGHT *.2);
+ merchArrowLoc[1].y = offset.y + (SCREEN_HEIGHT *.2);
+ merchArrowLoc[0].z = offset.x - (SCREEN_WIDTH / 8.5);
+ merchArrowLoc[1].z = offset.x + (SCREEN_WIDTH / 8.5);
for(i = 0; i < 2; i++){
- if(((merchAOptLoc[i][0] < merchAOptLoc[i][2]) ?
- (mouse.x > merchAOptLoc[i][0] && mouse.x < merchAOptLoc[i][2]) :
- (mouse.x < merchAOptLoc[i][0] && mouse.x > merchAOptLoc[i][2])) &&
- mouse.y > merchAOptLoc[i][1] - 8 && mouse.y < merchAOptLoc[i][1] + 8){
+ if(((merchArrowLoc[i].x < merchArrowLoc[i].z) ?
+ (mouse.x > merchArrowLoc[i].x && mouse.x < merchArrowLoc[i].z) :
+ (mouse.x < merchArrowLoc[i].x && mouse.x > merchArrowLoc[i].z) ) &&
+ mouse.y > merchArrowLoc[i].y - 8 && mouse.y < merchArrowLoc[i].y + 8 ) {
glColor3ub(255,255, 0);
}else{
glColor3ub(255,255,255);
}
glBegin(GL_TRIANGLES);
- glVertex2f(merchAOptLoc[i][0],merchAOptLoc[i][1]);
- glVertex2f(merchAOptLoc[i][2],merchAOptLoc[i][1]-8);
- glVertex2f(merchAOptLoc[i][2],merchAOptLoc[i][1]+8);
+ glVertex2f(merchArrowLoc[i].x,merchArrowLoc[i].y);
+ glVertex2f(merchArrowLoc[i].z,merchArrowLoc[i].y-8);
+ glVertex2f(merchArrowLoc[i].z,merchArrowLoc[i].y+8);
glEnd();
}
// draw / handle dialog options if they exist
- for(i = 0; i < dialogOptCount; i++){
+ for(i = 0; i < dialogOptText.size(); i++){
setFontColor(255, 255, 255);
// draw option
- tmp = putStringCentered(offset.x, dialogOptLoc[i][1], dialogOptText[i]);
+ tmp = putStringCentered(offset.x, dialogOptText[i].second.y, dialogOptText[i].first);
// get coordinate information on option
- dialogOptLoc[i][2] = offset.x + tmp;
- dialogOptLoc[i][0] = offset.x - tmp;
- dialogOptLoc[i][1] = y - SCREEN_HEIGHT / 2 - (fontSize + HLINE) * (i + 1);
+ dialogOptText[i].second.z = offset.x + tmp;
+ dialogOptText[i].second.x = offset.x - tmp;
+ dialogOptText[i].second.y = y - SCREEN_HEIGHT / 2 - (fontSize + HLINE) * (i + 1);
// make text yellow if the mouse hovers over the text
- if(mouse.x > dialogOptLoc[i][0] && mouse.x < dialogOptLoc[i][2] &&
- mouse.y > dialogOptLoc[i][1] && mouse.y < dialogOptLoc[i][1] + 16 ){
+ if(mouse.x > dialogOptText[i].second.x && mouse.x < dialogOptText[i].second.z &&
+ mouse.y > dialogOptText[i].second.y && mouse.y < dialogOptText[i].second.y + 16 ){
setFontColor(255, 255, 0);
- putStringCentered(offset.x, dialogOptLoc[i][1], dialogOptText[i]);
+ putStringCentered(offset.x, dialogOptText[i].second.y, dialogOptText[i].first);
}
}
@@ -827,18 +782,18 @@ namespace ui {
putString(x+HLINE,y-fontSize-HLINE,rtext);
- for(i=0;i<dialogOptCount;i++){
+ for(i=0;i<dialogOptText.size();i++){
setFontColor(255,255,255);
- tmp = putStringCentered(offset.x,dialogOptLoc[i][1],dialogOptText[i]);
- dialogOptLoc[i][2] = offset.x + tmp;
- dialogOptLoc[i][0] = offset.x - tmp;
- dialogOptLoc[i][1] = y - SCREEN_HEIGHT / 4 + (fontSize + HLINE) * (i + 1);
- if(mouse.x > dialogOptLoc[i][0] &&
- mouse.x < dialogOptLoc[i][2] &&
- mouse.y > dialogOptLoc[i][1] &&
- mouse.y < dialogOptLoc[i][1] + 16 ){ // fontSize
+ tmp = putStringCentered(offset.x,dialogOptText[i].second.y,dialogOptText[i].first);
+ dialogOptText[i].second.z = offset.x + tmp;
+ dialogOptText[i].second.x = offset.x - tmp;
+ dialogOptText[i].second.y = y - SCREEN_HEIGHT / 4 + (fontSize + HLINE) * (i + 1);
+ if(mouse.x > dialogOptText[i].second.x &&
+ mouse.x < dialogOptText[i].second.z &&
+ mouse.y > dialogOptText[i].second.y &&
+ mouse.y < dialogOptText[i].second.y + 16 ){ // fontSize
setFontColor(255,255,0);
- putStringCentered(offset.x,dialogOptLoc[i][1],dialogOptText[i]);
+ putStringCentered(offset.x,dialogOptText[i].second.y,dialogOptText[i].first);
}
}
setFontColor(255,255,255);
@@ -1252,21 +1207,22 @@ namespace ui {
typeOutDone = true;
return;
}
- for(i=0;i<dialogOptCount;i++){
- if(mouse.x > dialogOptLoc[i][0] &&
- mouse.x < dialogOptLoc[i][2] &&
- mouse.y > dialogOptLoc[i][1] &&
- mouse.y < dialogOptLoc[i][1] + 16 ){ // fontSize
+
+ for(i=0;i<dialogOptText.size();i++){
+ if(mouse.x > dialogOptText[i].second.x &&
+ mouse.x < dialogOptText[i].second.z &&
+ mouse.y > dialogOptText[i].second.y &&
+ mouse.y < dialogOptText[i].second.y + 16 ){ // fontSize
dialogOptChosen = i + 1;
goto EXIT;
}
}
if(dialogMerchant){
for(i=0;i<2;i++){
- if(((merchAOptLoc[i][0] < merchAOptLoc[i][2]) ?
- (mouse.x > merchAOptLoc[i][0] && mouse.x < merchAOptLoc[i][2]) :
- (mouse.x < merchAOptLoc[i][0] && mouse.x > merchAOptLoc[i][2])) &&
- mouse.y > merchAOptLoc[i][1] - 8 && mouse.y < merchAOptLoc[i][1] + 8){ // fontSize
+ if(((merchArrowLoc[i].x < merchArrowLoc[i].z) ?
+ (mouse.x > merchArrowLoc[i].x && mouse.x < merchArrowLoc[i].z) :
+ (mouse.x < merchArrowLoc[i].x && mouse.x > merchArrowLoc[i].z) &&
+ mouse.y > merchArrowLoc[i].y - 8 && mouse.y < merchArrowLoc[i].y + 8)){
merchOptChosen = i + 1;
goto EXIT;
}
@@ -1274,7 +1230,7 @@ namespace ui {
}
- EXIT:
+EXIT:
//if(!dialogMerchant)closeBox();
dialogBoxExists = false;
dialogMerchant = false;
diff --git a/src/world.cpp b/src/world.cpp
index b1eb12e..1a7322f 100644
--- a/src/world.cpp
+++ b/src/world.cpp
@@ -22,6 +22,8 @@ using namespace tinyxml2;
extern Player *player; // main.cpp?
extern World *currentWorld; // main.cpp
+extern World *currentWorldToLeft; // main.cpp
+extern World *currentWorldToRight; // main.cpp
extern int commonAIFunc(NPC *); // entities.cpp
extern void commonTriggerFunc(Mob *); // gameplay.cpp
extern void commonPageFunc(Mob *); // gameplay.cpp
@@ -747,53 +749,50 @@ singleDetect( Entity *e )
exit(0);
}
- /*
- * Handle only living entities.
- */
-
- if(e->alive){
-
+ // handle only living entities
+ if ( e->alive ) {
if ( e->type == MOBT && Mobp(e)->subtype == MS_TRIGGER )
return;
/*
* Calculate the line that this entity is currently standing on.
- */
+ */
l=(e->loc.x + e->width / 2 - worldStart) / HLINE;
- if(l < 0) l=0;
+ if ( l < 0 )
+ l = 0;
i = l;
- if(i > lineCount-1) i=lineCount-1;
+ if ( i > lineCount - 1 )
+ i = lineCount - 1;
/*
* If the entity is under the world/line, pop it back to the surface.
*/
if ( e->loc.y < worldData[i].groundHeight ) {
-
- if ( worldData[i].groundHeight - e->loc.y > 30 ) {
- int dir = e->vel.x > 0 ? -1 : 1;
+ int dir = e->vel.x > 0 ? -1 : 1;
+ if ( worldData[i].groundHeight - 30 > worldData[i + dir].groundHeight ) {
e->loc.x += HLINE * 8 * dir;
e->loc.y = worldData[i + 8 * dir].groundHeight;
} else {
e->loc.y = worldData[i].groundHeight - .001 * deltaTime;
- e->ground = true;
- e->vel.y = 0;
+ e->ground = true;
+ e->vel.y = 0;
}
/*
* Handle gravity if the entity is above the line.
- */
+ */
+
+ } else {
- }else{
if(e->type == STRUCTURET && e->loc.y > 2000){
e->loc.y = worldData[i].groundHeight;
e->vel.y = 0;
e->ground = true;
return;
} else if ( e->vel.y > -2 )
- e->vel.y -= .003 * deltaTime;
-
+ e->vel.y -= .003 * deltaTime;
}
/*
@@ -992,13 +991,13 @@ goWorldLeft( Player *p )
{
World *tmp;
- // check if player is at world edge
+ // check if player is at world edge
if( !toLeft.empty() && p->loc.x < worldStart + HLINE * 15.0f ) {
- // load world (`toLeft` conditional confirms existance)
- tmp = loadWorldFromXML(toLeft);
+ // load world (`toLeft` conditional confirms existance)
+ tmp = loadWorldFromPtr( currentWorldToLeft );
- // adjust player location
+ // adjust player location
p->loc.x = tmp->worldStart + HLINE * 20;
p->loc.y = tmp->worldData[tmp->lineCount - 1].groundHeight;
@@ -1014,7 +1013,7 @@ goWorldRight( Player *p )
World *tmp;
if( !toRight.empty() && p->loc.x + p->width > -worldStart - HLINE * 15 ) {
- tmp = loadWorldFromXML(toRight);
+ tmp = loadWorldFromPtr( currentWorldToRight );
p->loc.x = tmp->worldStart - HLINE * -15.0f;
p->loc.y = GROUND_HEIGHT_MINIMUM;
@@ -1353,6 +1352,11 @@ World *Arena::exitArena(Player *p){
}
}
+
+
+static bool loadedLeft = false;
+static bool loadedRight = false;
+
World *loadWorldFromXML(std::string path){
if ( !currentXML.empty() )
currentWorld->save();
@@ -1360,6 +1364,21 @@ World *loadWorldFromXML(std::string path){
return loadWorldFromXMLNoSave(path);
}
+World *loadWorldFromPtr( World *ptr )
+{
+ World *tmp = ptr;
+
+ loadedLeft = true;
+ currentWorldToLeft = loadWorldFromXML( tmp->toLeft );
+ loadedLeft = false;
+
+ loadedRight = true;
+ currentWorldToRight = loadWorldFromXML( tmp->toRight );
+ loadedRight = false;
+
+ return tmp;
+}
+
/**
* Loads a world from the given XML file.
*/
@@ -1377,6 +1396,9 @@ loadWorldFromXMLNoSave( std::string path ) {
const char *ptr;
std::string name;
+ if ( path.empty() )
+ return NULL;
+
currentXML = (std::string)"xml/" + path;
xml.LoadFile(currentXML.c_str());
@@ -1398,11 +1420,21 @@ loadWorldFromXMLNoSave( std::string path ) {
name = wxml->Name();
if ( name == "link" ) {
- if((ptr = wxml->Attribute("left")))
+ if ((ptr = wxml->Attribute("left"))) {
tmp->setToLeft(ptr);
- else if((ptr = wxml->Attribute("right")))
+ if ( !loadedLeft ) {
+ loadedLeft = true;
+ currentWorldToLeft = loadWorldFromXMLNoSave( ptr );
+ loadedLeft = false;
+ }
+ } else if ((ptr = wxml->Attribute("right"))) {
tmp->setToRight(ptr);
- else
+ if ( !loadedRight ) {
+ loadedRight = true;
+ currentWorldToRight = loadWorldFromXMLNoSave( ptr );
+ loadedRight = false;
+ }
+ } else
abort();
} else if ( name == "style" ) {
tmp->setStyle(wxml->StrAttribute("folder"));