diff options
author | Clyne Sullivan <tullivan99@gmail.com> | 2016-04-11 08:46:43 -0400 |
---|---|---|
committer | Clyne Sullivan <tullivan99@gmail.com> | 2016-04-11 08:46:43 -0400 |
commit | 5c48f10a46e470493328978d6ccee8722c743f31 (patch) | |
tree | fc01f93915327d1136b698d5e995c01c538828bd /src | |
parent | 75a344b842d534830d7d420c7fd6fda6ad33e625 (diff) |
merchant revision
Diffstat (limited to 'src')
-rw-r--r-- | src/entities.cpp | 105 | ||||
-rw-r--r-- | src/gameplay.cpp | 17 | ||||
-rw-r--r-- | src/ui.cpp | 145 | ||||
-rw-r--r-- | src/world.cpp | 154 |
4 files changed, 246 insertions, 175 deletions
diff --git a/src/entities.cpp b/src/entities.cpp index 5470245..df32a5b 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -63,15 +63,29 @@ void getRandomName(Entity *e){ switch(bufs[0]){ default : - case 'm': e->gender = MALE; break; - case 'f': e->gender = FEMALE;break; + case 'm': + e->gender = MALE; + break; + case 'f': + e->gender = FEMALE; + break; } - strcpy(e->name,bufs+1); + strcpy( e->name, bufs + 1 ); delete[] bufs; } +Trade::Trade(int qo, std::string o, int qt, std::string t){ + item[0] = o; + item[1] = t; + + quantity[0] = qo; + quantity[1] = qt; + + std::cout << "Trading: " << quantity[0] << " " << item[0] << " for " << quantity[1] << " " << item[1] << std::endl; +} + void Entity::spawn(float x, float y){ //spawns the entity you pass to it based off of coords and global entity settings loc.x = x; loc.y = y; @@ -89,6 +103,7 @@ void Entity::spawn(float x, float y){ //spawns the entity you pass to it based o forcedMove = false; ticksToUse = 0; + hitCooldown = 0; if(!maxHealth)health = maxHealth = 1; @@ -376,7 +391,12 @@ void Entity::draw(void){ //draws the entities tex->bind(0); break; } - glColor3ub(255,255,255); + + if ( hitCooldown ) + glColor3ub(255,255,0); + else + glColor3ub(255,255,255); + glUseProgram(shaderProgram); glUniform1i(glGetUniformLocation(shaderProgram, "sampler"), 0); glBegin(GL_QUADS); @@ -410,6 +430,9 @@ wander( int timeRun ) if ( forcedMove ) return; + if ( hitCooldown ) + hitCooldown--; + if ( followee ) { if ( loc.x < followee->loc.x - 40 ) direction = 1; @@ -500,9 +523,13 @@ void Merchant::wander(int timeRun){ if( vel.x < 0) currentWorld->goWorldLeft( this ); - if(inside != nullptr){ - if(loc.x <= inside->loc.x)loc.x = inside->loc.x; - if(loc.x + width >= inside->loc.x + inside->width)loc.x = inside->loc.x + inside->width - width; + if ( inside != nullptr ) { + loc.y = inside->loc.y + HLINE * 2; + vel.y = GRAVITY_CONSTANT * 5; + if ( loc.x <= inside->loc.x + HLINE * 5 ) + loc.x = inside->loc.x + HLINE * 5; + else if ( loc.x + width >= inside->loc.x + inside->width - HLINE * 5 ) + loc.x = inside->loc.x + inside->width - width - HLINE * 5; } ticksToUse--; } @@ -511,20 +538,43 @@ void Merchant::interact(){ std::thread([this]{ ui::merchantBox(name, trade[currTrade], ":Accept:Good-Bye", false, "Welcome to Smithy\'s. Buy your sausages here you freaking meme lording screw-face"); ui::waitForDialog(); - if(ui::dialogOptChosen == 1){ - if(!(player->inv->takeItem(trade[currTrade].item[1],trade[currTrade].quantity[1]))) + + // handle normal dialog options + switch ( ui::dialogOptChosen ) { + // Accept + case 1: + if ( !(player->inv->takeItem( trade[currTrade].item[1], trade[currTrade].quantity[1])) ) player->inv->addItem(trade[currTrade].item[0],trade[currTrade].quantity[0]); - }else if(ui::dialogOptChosen == 2){ - }else if(ui::merchOptChosen == 1){ - if(currTrade != 0){ + break; + + // Good-bye + case 2: + break; + + default: + break; + } + + // handle merchant-specific dialog options + switch ( ui::merchOptChosen ) { + // left arrow + case 1: + if ( currTrade ) currTrade--; - interact(); - } - }else if(ui::merchOptChosen == 2){ - if(currTrade < trade.size()){ + ui::dontTypeOut(); + interact(); // TODO should we nest like this? + break; + + // right arrow + case 2: + if ( currTrade < trade.size() - 1 ) currTrade++; - interact(); - } + ui::dontTypeOut(); + interact(); + break; + + default: + break; } }).detach(); } @@ -676,20 +726,11 @@ void Mob::wander(int timeRun){ //hey(this); break; case MS_PAGE: - if(player->loc.x > loc.x - 100 && - player->loc.x < loc.x + 100 && - ui::mouse.x > loc.x && - ui::mouse.x < loc.x + width && - ui::mouse.y > loc.y - width / 2 && - ui::mouse.y < loc.y + width * 1.5 && - SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(SDL_BUTTON_RIGHT)){ - std::thread([this]{hey(this);}).detach(); - /*if(speed != 666){ - speed = 666; - hey(this); - speed = 0; - }*/ - } + if(player->loc.x > loc.x - 100 && player->loc.x < loc.x + 100 && // within player ranger + ui::mouse.x > loc.x && ui::mouse.x < loc.x + width && // mouse x + ui::mouse.y > loc.y - width / 2 && ui::mouse.y < loc.y + width * 1.5 && // mouse y + SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(SDL_BUTTON_RIGHT)) // right click + hey(this); break; default: break; diff --git a/src/gameplay.cpp b/src/gameplay.cpp index ce514a4..9bf9728 100644 --- a/src/gameplay.cpp +++ b/src/gameplay.cpp @@ -219,20 +219,9 @@ CONT: } void commonPageFunc( Mob *callee ){ - //static bool lock = false; - - /*if ( !lock ) { - lock = true;*/ - if ( !ui::dialogBoxExists ) { - std::cout<<"begin\n"; - ui::drawPage( callee->heyid ); - while( ui::pageExists() ); - std::cout<<"done\n"; - //ui::waitForDialog(); - - callee->health = 0; - //lock = false; - } + ui::drawPage( callee->heyid ); + ui::waitForDialog(); + callee->health = 0; } void commonTriggerFunc(Mob *callee){ @@ -65,8 +65,9 @@ static unsigned char fontColor[4] = {255,255,255,255}; static std::vector<std::pair<std::string,vec3>> dialogOptText; static std::string dialogBoxText; -static vec3 merchArrowLoc[2]; +static std::vector<vec3> merchArrowLoc ( 2, vec3 { 0, 0, 0 } ); static bool typeOutDone = true; +static bool typeOutSustain = false; /* * Menu-related objects @@ -95,6 +96,7 @@ Mix_Chunk *battleStart; Mix_Chunk *sanic; static GLuint pageTex = 0; +static bool pageTexReady = false; void Menu::gotoParent(){ if(parent == NULL){ @@ -264,13 +266,15 @@ namespace ui { } ftex = &ftex16; ftdat = &ftdat16; - } else if ( size == 24 ){ + fontSize = 16; + } else if ( size == 24 ) { if ( !ft24loaded ) { loadFontSize( fontSize = size, ftex24, ftdat24 ); ft24loaded = true; } ftex = &ftex24; ftdat = &ftdat24; + fontSize = 24; } } @@ -410,6 +414,14 @@ namespace ui { return width; } + /** + * Prevents typeOut from typing the next string it's given. + */ + + void dontTypeOut( void ) { + typeOutSustain = true; + } + /* * Draw a string in a typewriter-esque fashion. Each letter is rendered as calls are made * to this function. Passing a different string to the function will reset the counters. @@ -417,34 +429,30 @@ namespace ui { std::string ret; std::string typeOut( std::string str ) { - static unsigned int sinc, // Acts as a delayer for the space between each character. + static unsigned int tadv = TICKS_PER_SEC / 12; + static unsigned int tickk, linc=0, // Contains the number of letters that should be drawn. size=0; // Contains the full size of the current string. - /* - * Reset values if a new string is being passed. - */ - - if(strncmp(ret.c_str(),str.c_str(),linc-1)){ - ret.clear(); // Zero the buffer - size=str.size(); // Set the new target string size - linc=0; // Reset the incrementers - sinc=1; - typeOutDone = false; + // reset values if a new string is being passed. + if ( !linc || ret.substr( 0, linc ) != str.substr( 0, linc ) ) { + tickk = tickCount + tadv; + ret = str.substr( 0, 1 ); + size = str.size(); // Set the new target string size + linc = 1; // Reset the incrementers + if ( (typeOutDone = typeOutSustain) ) + typeOutSustain = false; } - /* - * Draw the next letter if necessary. - */ - - if(typeOutDone) + if ( typeOutDone ) return str; - else if(++sinc==2){ - sinc=0; - ret.append(str, linc, 1); + // Draw the next letter if necessary. + else if ( tickk <= tickCount ) { + tickk = tickCount + tadv; + ret += str[linc]; - if(linc<size) + if ( linc < size ) linc++; else typeOutDone = true; @@ -519,15 +527,11 @@ namespace ui { ret.clear(); } - void merchantBox(const char *name,Trade trade,const char *opt,bool passive,const char *text,...){ va_list dialogArgs; std::unique_ptr<char[]> printfbuf (new char[512]); dialogPassive = passive; - - std::cout << "Market Trading: " << trade.quantity[0] << " " << trade.item[0] << " for " << trade.quantity[1] << " " << trade.item[1] << std::endl; - merchTrade = trade; // clear the buffer @@ -575,24 +579,21 @@ namespace ui { * Wait for a dialog box to be dismissed. */ - void waitForDialog(void){ - do{ - //std::thread(dialogAdvance); - //mainLoop(); - }while(dialogBoxExists); + void waitForDialog ( void ) { + while ( dialogBoxExists ); } - void waitForCover(void){ - do{ + + void waitForCover ( void ) { + while ( fadeIntensity < 255 ) mainLoop(); - }while(fadeIntensity < 255); fadeIntensity = 255; } - void waitForNothing(unsigned int ms){ + + void waitForNothing ( unsigned int ms ) { unsigned int target = millis() + ms; - do{ - mainLoop(); - }while(millis() < target); + while ( millis() < target ); } + void importantText(const char *text,...){ va_list textArgs; char *printfbuf; @@ -632,11 +633,7 @@ namespace ui { void drawPage( std::string path ) { pageTex = Texture::loadTexture( path ); - std::cout<<"page set\n"; - } - - bool pageExists( void ) { - return pageTex; + pageTexReady = true; } void draw(void){ @@ -644,11 +641,8 @@ namespace ui { float x,y,tmp; std::string rtext; - if ( pageTex ) { - - std::cout<<"page draw\n"; - - glEnable( GL_TEXTURE_2D); + if ( pageTexReady ) { + glEnable( GL_TEXTURE_2D ); glBindTexture( GL_TEXTURE_2D, pageTex ); glBegin( GL_QUADS ); glTexCoord2i( 0, 0 ); glVertex2i( offset.x - 300, SCREEN_HEIGHT - 100 ); @@ -656,9 +650,9 @@ namespace ui { glTexCoord2i( 1, 1 ); glVertex2i( offset.x + 300, SCREEN_HEIGHT - 600 ); glTexCoord2i( 0, 1 ); glVertex2i( offset.x - 300, SCREEN_HEIGHT - 600 ); glEnd(); - glDisable( GL_TEXTURE_2D); + glDisable( GL_TEXTURE_2D ); - } else if (dialogBoxExists){ + } else if (dialogBoxExists) { rtext=typeOut(dialogBoxText); @@ -677,10 +671,11 @@ namespace ui { putStringCentered(offset.x,offset.y,rtext.c_str()); setFontSize(16); } - }else if(dialogMerchant){ + }else if ( dialogMerchant ) { x=offset.x-SCREEN_WIDTH/6; y=(offset.y+SCREEN_HEIGHT/2)-HLINE*8; + // draw the box border glColor3ub(255,255,255); glBegin(GL_LINE_STRIP); glVertex2f(x-1 ,y+1); @@ -690,6 +685,7 @@ namespace ui { glVertex2f(x - 1,y+1); glEnd(); + // draw the box glColor3ub(0,0,0); glRectf(x,y,x+SCREEN_WIDTH/3,y-SCREEN_HEIGHT*.6); @@ -757,12 +753,12 @@ namespace ui { setFontColor(255, 255, 255); // draw option + dialogOptText[i].second.y = y - SCREEN_HEIGHT / 2 - (fontSize + HLINE) * (i + 1); tmp = putStringCentered(offset.x, dialogOptText[i].second.y, dialogOptText[i].first); // get coordinate information on option 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 > dialogOptText[i].second.x && mouse.x < dialogOptText[i].second.z && @@ -792,7 +788,7 @@ namespace ui { glColor3ub(0,0,0); glRectf(x,y,x+SCREEN_WIDTH-HLINE*16,y-SCREEN_HEIGHT/4); - rtext=typeOut(dialogBoxText); + rtext = typeOut(dialogBoxText); putString(x+HLINE,y-fontSize-HLINE,rtext); @@ -813,8 +809,11 @@ namespace ui { setFontColor(255,255,255); } - if ( rtext != dialogBoxText ) - Mix_PlayChannel(1,dialogClick,0); + static unsigned int rtext_oldsize = 0; + if ( rtext_oldsize != rtext.size() ) { + if ( !isspace( rtext[(rtext_oldsize = rtext.size()) - 1] ) ) + Mix_PlayChannel( 1, dialogClick, 0 ); + } }if(!fadeIntensity){ vec2 hub = { @@ -1211,16 +1210,16 @@ namespace ui { unsigned char i; if ( pageTex ) { - std::cout<<"rip page\n"; glDeleteTextures( 1, &pageTex ); pageTex = 0; + pageTexReady = false; return; } - if(!typeOutDone){ + /*if(!typeOutDone){ typeOutDone = true; return; - } + }*/ for(i=0;i<dialogOptText.size();i++){ if(mouse.x > dialogOptText[i].second.x && @@ -1231,10 +1230,14 @@ namespace ui { goto EXIT; } } - if(dialogMerchant){ - for(i=0;i<2;i++){ + + if ( dialogMerchant ) { + for ( i = 0; i < merchArrowLoc.size(); i++ ) { + + // TODO neaten this if statement + 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.x < merchArrowLoc[i].x && mouse.x > merchArrowLoc[i].z) && mouse.y > merchArrowLoc[i].y - 8 && mouse.y < merchArrowLoc[i].y + 8)){ merchOptChosen = i + 1; @@ -1288,11 +1291,6 @@ EXIT: break; case SDL_MOUSEBUTTONUP: - - // right click advances dialog - if ( ( e.button.button & SDL_BUTTON_RIGHT ) && (dialogBoxExists | pageTex) ) - dialogAdvance(); - if ( ig ) { ig->vel.x = (fr.x - mouse.x) / 50.0f; ig->vel.y = (fr.y - mouse.y) / 50.0f; @@ -1303,6 +1301,10 @@ EXIT: // mouse clicks case SDL_MOUSEBUTTONDOWN: + // right click advances dialog + if ( ( e.button.button & SDL_BUTTON_RIGHT ) && (dialogBoxExists | pageTexReady) ) + dialogAdvance(); + // left click uses item if ( ( e.button.button & SDL_BUTTON_LEFT ) && !dialogBoxExists ) player->inv->usingi = true; @@ -1405,8 +1407,8 @@ EXIT: currentWorld = ((Arena *)currentWorld)->exitArena( player ); if ( tmp != currentWorld ) toggleBlackFast(); - } else if( (tmp = currentWorld->goInsideStructure( player )) != currentWorld ) - currentWorld = tmp; + } else if ( (tmp = currentWorld->goInsideStructure( player )) != currentWorld ) + currentWorld = tmp; break; case SDLK_LSHIFT: if(debug){ @@ -1454,7 +1456,7 @@ EXIT: debug ^= true; break; case SDLK_z: - weather = WorldWeather::Snowy; + weather = WorldWeather::Rain; break; case SDLK_i: if ( isCurrentWorldIndoors() && Indoorp(currentWorld)->isFloorAbove( player ) ) { @@ -1517,9 +1519,6 @@ EXIT: static GLubyte* pixels; pixels = new GLubyte[ 3 * SCREEN_WIDTH * SCREEN_HEIGHT]; glReadPixels(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, pixels); - //static std::thread scr; - //scr = std::thread(takeScreenshot,pixels); - //scr.detach(); takeScreenshot(pixels); std::cout << "Took screenshot" << std::endl; @@ -1543,7 +1542,7 @@ EXIT: } } - // Flush preloaded AI functions if necessary + // Flush preloaded AI functions if necessary if ( !dialogBoxExists && AIpreaddr.size() ) { while ( !AIpreaddr.empty() ) { AIpreaddr.front()->addAIFunc( AIpreload.front(), false ); diff --git a/src/world.cpp b/src/world.cpp index ffddcab..0e7e41e 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -20,12 +20,6 @@ using namespace tinyxml2; #define INDOOR_FLOOR_THICKNESS 50 #define INDOOR_FLOOR_HEIGHTT 400 -/** - * Gravity thing - */ - -#define GRAVITY_CONSTANT 0.001f - extern Player *player; // main.cpp? extern World *currentWorld; // main.cpp extern World *currentWorldToLeft; // main.cpp @@ -335,8 +329,8 @@ update( Player *p, unsigned int delta ) particles.erase( std::remove_if( particles.begin(), particles.end(), [&delta](Particles &part){return part.kill(delta);}), particles.end()); for ( auto part = particles.begin(); part != particles.end(); part++ ) { if ( (*part).canMove ) { - (*part).loc.y += (*part).vely * delta; - (*part).loc.x += (*part).velx * delta; + (*part).loc.y += (*part).vel.y * delta; + (*part).loc.x += (*part).vel.x * delta; for ( auto &b : build ) { if ( b->bsubtype == FOUNTAIN ) { @@ -429,7 +423,19 @@ void World::draw(Player *p){ // the sunny wallpaper is faded with the night depending on tickCount bgTex->bind( 0 ); - safeSetColorA( 255, 255, 255, weather == WorldWeather::Snowy ? 150 : 255 - worldShade * 4); + int alpha; + switch( weather ) { + case WorldWeather::Snowy: + alpha = 150; + break; + case WorldWeather::Rain: + alpha = 0; + break; + default: + alpha = 255 - worldShade * 4; + break; + } + safeSetColorA( 255, 255, 255, alpha ); glBegin( GL_QUADS ); glTexCoord2i( 0, 0 ); glVertex2i( offset.x - SCREEN_WIDTH/2-5, offset.y + SCREEN_HEIGHT/2 ); @@ -439,7 +445,7 @@ void World::draw(Player *p){ glEnd(); bgTex->bindNext(); - safeSetColorA( 255, 255, 255, worldShade * 4); + safeSetColorA( 255, 255, 255, !alpha ? 255 : worldShade * 4); glBegin( GL_QUADS ); glTexCoord2i( 0, 0 ); glVertex2i( offset.x - SCREEN_WIDTH/2-5, offset.y + SCREEN_HEIGHT/2 ); @@ -532,8 +538,17 @@ void World::draw(Player *p){ glUseProgram(0); - for ( auto &b : build ) - b->draw(); + for ( auto &b : build ) { + if ( b->bsubtype == STALL_MARKET ) { + for ( auto &n : npc ) { + if ( n->type == MERCHT && ((Merchant *)n)->inside == b ) { + n->draw(); + break; + } + } + } + b->draw(); + } // draw light elements? @@ -570,9 +585,8 @@ void World::draw(Player *p){ } } - for(uint i = 0; i < light.size(); i++){ + for ( uint i = 0; i < light.size(); i++ ) flameArray[i] = light[i].fireFlicker; - } glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); @@ -685,8 +699,10 @@ void World::draw(Player *p){ glUseProgram(0); - for ( auto &n : npc ) - n->draw(); + for ( auto &n : npc ) { + if ( n->type != MERCHT ) + n->draw(); + } for ( auto &m : mob ) m->draw(); @@ -818,7 +834,7 @@ singleDetect( Entity *e ) // if the entity is under the world/line, pop it back to the surface if ( e->loc.y < worldData[i].groundHeight ) { int dir = e->vel.x < 0 ? -1 : 1; - if ( worldData[i + (dir * 8)].groundHeight - 30 > worldData[i + dir].groundHeight ) { + if ( i + (dir * 2) < worldData.size() && worldData[i + (dir * 2)].groundHeight - 30 > worldData[i + dir].groundHeight ) { e->loc.x -= ( PLAYER_SPEED_CONSTANT + 2.7 ) * e->speed * 2 * dir; e->vel.x = 0; } else { @@ -869,11 +885,11 @@ detect( Player *p ) int l; // handle the player - std::thread( &World::singleDetect, this, p).detach(); + std::thread( &World::singleDetect, this, p ).detach(); // handle other entities for ( auto &e : entity ) - std::thread(&World::singleDetect,this,e).detach(); + std::thread( &World::singleDetect, this, e ).detach(); // handle particles for ( auto &part : particles ) { @@ -887,14 +903,7 @@ detect( Player *p ) if ( l > (int)(lineCount - 1) ) l = lineCount - 1; - // handle ground collision - if ( part.loc.y < worldData[l].groundHeight ) { - part.loc.y = worldData[l].groundHeight; - part.vely = 0; - part.velx = 0; - part.canMove = false; - } else if ( part.gravity && part.vely > -2 ) - part.vely -= GRAVITY_CONSTANT * deltaTime; + part.update( GRAVITY_CONSTANT, worldData[l].groundHeight ); } // handle particle creation @@ -1500,8 +1509,9 @@ Arena::~Arena(void){ World *Arena::exitArena(Player *p){ World *tmp; - if(p->loc.x + p->width / 2 > mob[0]->loc.x && - p->loc.x + p->width / 2 < mob[0]->loc.x + HLINE * 12 ){ + if ( !mmob->alive && + p->loc.x + p->width / 2 > mob[0]->loc.x && + p->loc.x + p->width / 2 < mob[0]->loc.x + HLINE * 12 ) { tmp = battleNest.front(); battleNest.erase(battleNest.begin()); @@ -1640,6 +1650,10 @@ loadWorldFromXMLNoSave( std::string path ) { } } + // tells what world is outside, if in a structure + else if ( Indoor && (ptr = wxml->Attribute("outside")) ) + inside.push_back( ptr ); + // error, invalid link tag else UserError("XML Error: Invalid <link> tag in " + currentXML + "!"); @@ -1692,6 +1706,10 @@ loadWorldFromXMLNoSave( std::string path ) { // indoor spawning floor selection if ( Indoor && wxml->QueryUnsignedAttribute( "floor", &flooor ) == XML_NO_ERROR ) Indoorp(tmp)->moveToFloor( tmp->npc.back(), flooor ); + + // custom health value + if ( wxml->QueryFloatAttribute( "health", &spawnx) == XML_NO_ERROR ) + tmp->mob.back()->health = tmp->mob.back()->maxHealth = spawnx; } // npc creation @@ -1700,7 +1718,7 @@ loadWorldFromXMLNoSave( std::string path ) { // spawn at coordinates if desired if ( wxml->QueryFloatAttribute( "x", &spawnx ) == XML_NO_ERROR) - tmp->addNPC( spawnx, wxml->FloatAttribute("y") ); + tmp->addNPC( spawnx, 100 ); else tmp->addNPC( 0, 100 ); @@ -1720,6 +1738,10 @@ loadWorldFromXMLNoSave( std::string path ) { if ( Indoor && wxml->QueryUnsignedAttribute( "floor", &flooor ) == XML_NO_ERROR ) Indoorp(tmp)->moveToFloor( tmp->npc.back(), flooor ); + + // custom health value + if ( wxml->QueryFloatAttribute( "health", &spawnx) == XML_NO_ERROR ) + tmp->mob.back()->health = tmp->mob.back()->maxHealth = spawnx; } // structure creation @@ -1732,7 +1754,7 @@ loadWorldFromXMLNoSave( std::string path ) { wxml->StrAttribute("inside") ); } else if ( name == "trigger" ) { - tmp->addMob(MS_TRIGGER,wxml->FloatAttribute("x"),0,commonTriggerFunc); + tmp->addMob( MS_TRIGGER, wxml->FloatAttribute("x"), 0, commonTriggerFunc ); tmp->mob.back()->heyid = wxml->Attribute("id"); } else if ( name == "page" ) { tmp->addMob( MS_PAGE, wxml->FloatAttribute("x"), 0, commonPageFunc ); @@ -1748,6 +1770,7 @@ loadWorldFromXMLNoSave( std::string path ) { Indoorp(tmp)->addFloor( wxml->UnsignedAttribute("width") ); } + spawnx = 0; wxml = wxml->NextSiblingElement(); } @@ -1775,34 +1798,53 @@ loadWorldFromXMLNoSave( std::string path ) { 100, vil->StrAttribute("texture"), vil->StrAttribute("inside")); - }else if ( name == "stall" ) { - if(!strcmp(vil->Attribute("type"),"market")){ - tmp->addStructure((BUILD_SUB)70, - vil->QueryFloatAttribute("x", &spawnx) != XML_NO_ERROR ? - randx : spawnx, - 100, - vil->StrAttribute("texture"), - vil->StrAttribute("inside")); - tmp->addMerchant(0,100); + } else if ( name == "stall" ) { + sptr = vil->StrAttribute("type"); + + // handle markets + if ( sptr == "market" ) { + + // create a structure and a merchant, and pair them + tmp->addStructure( STALL_MARKET, + vil->QueryFloatAttribute("x", &spawnx) != XML_NO_ERROR ? randx : spawnx, + 100, + vil->StrAttribute("texture"), + vil->StrAttribute("inside") + ); + tmp->addMerchant( 0, 100 ); + tmp->merchant.back()->inside = tmp->build.back(); - if(vil->FirstChildElement("buy")){ - }else if(vil->FirstChildElement("sell")){ - }else if(vil->FirstChildElement("trade")){ - tmp->merchant.back()->trade.push_back(Trade(vil->FirstChildElement("trade")->IntAttribute("quantity"), - vil->FirstChildElement("trade")->Attribute("item"), - vil->FirstChildElement("trade")->IntAttribute("quantity1"), - vil->FirstChildElement("trade")->Attribute("item1"))); - tmp->merchant.back()->trade.push_back(Trade(1,"Wood Sword", 420, "Dank MayMay")); + } + + // handle traders + else if ( sptr == "trader") { + tmp->addStructure( STALL_TRADER, + vil->QueryFloatAttribute("x", &spawnx) != XML_NO_ERROR ? randx : spawnx, + 100, + vil->StrAttribute("texture"), + vil->StrAttribute("inside") + ); + } + + // loop through buy/sell/trade tags + XMLElement *sxml = vil->FirstChildElement(); + std::string tag; + while ( sxml ) { + tag = sxml->Name(); + + if ( tag == "buy" ) { + // TODO + } else if ( tag == "sell" ) { + // TODO + } else if ( tag == "trade" ) { + tmp->merchant.back()->trade.push_back( Trade( sxml->IntAttribute("quantity"), + sxml->StrAttribute("item"), + sxml->IntAttribute("quantity1"), + sxml->StrAttribute("item1") + )); } - strcpy(tmp->merchant.back()->name,"meme"); - }else if(!strcmp(vil->Attribute("type"),"trader")){ - tmp->addStructure((BUILD_SUB)71, - vil->QueryFloatAttribute("x", &spawnx) != XML_NO_ERROR ? - randx : spawnx, - 100, - vil->StrAttribute("texture"), - vil->StrAttribute("inside")); + sxml = sxml->NextSiblingElement(); } } |