diff options
-rw-r--r-- | Changelog | 20 | ||||
-rw-r--r-- | Goals.txt | 2 | ||||
-rw-r--r-- | assets/sounds/longSwing.mp3 | bin | 7941 -> 0 bytes | |||
-rw-r--r-- | assets/sounds/sanic.wav | bin | 0 -> 2299686 bytes | |||
-rw-r--r-- | config/items.h | 4 | ||||
-rw-r--r-- | include/Texture.h | 2 | ||||
-rw-r--r-- | include/common.h | 2 | ||||
-rw-r--r-- | include/entities.h | 2 | ||||
-rw-r--r-- | include/ui.h | 2 | ||||
-rw-r--r-- | include/world.h | 8 | ||||
-rw-r--r-- | main.cpp | 4 | ||||
-rw-r--r-- | src/entities.cpp | 8 | ||||
-rw-r--r-- | src/gameplay.cpp | 223 | ||||
-rw-r--r-- | src/ui.cpp | 30 | ||||
-rw-r--r-- | src/world.cpp | 50 |
15 files changed, 180 insertions, 177 deletions
@@ -388,3 +388,23 @@ - added border to dialogBox - fix entity movement handling; npcs stop when you talk to them - added sword animation? + +12/9/2015, +12/10/2015: +=========== + + - added sound effects + - fixed disappearing building + - began actually plotting areas + - fixed layer switching-ish + - added passive dialogs + - began working on particles stuffses + - improved village spawning + +12/11/2015: +=========== + + - plotted out a tutorial-ish area in game + - imrpoved BGM handling + - continued work on particles, made a fountain + - added sanic @@ -27,7 +27,7 @@ Summary: idea of a parallaxed background was applied, with up to four layers of tiled background material. Combinations of background layers were sorted and added to the World class with a World::setBackground() function. The inventory was created, with an animated inventory view based off of the player finished -by the end of the month. +by the end of the month. ... End of December: ================ diff --git a/assets/sounds/longSwing.mp3 b/assets/sounds/longSwing.mp3 Binary files differdeleted file mode 100644 index cb6dced..0000000 --- a/assets/sounds/longSwing.mp3 +++ /dev/null diff --git a/assets/sounds/sanic.wav b/assets/sounds/sanic.wav Binary files differnew file mode 100644 index 0000000..18708a9 --- /dev/null +++ b/assets/sounds/sanic.wav diff --git a/config/items.h b/config/items.h index 1bd9111..9012ff6 100644 --- a/config/items.h +++ b/config/items.h @@ -11,8 +11,8 @@ ID DEBUG_ITEM ID TEST_ITEM NAME "Dank MayMay" TYPE TOOL - WIDTH HLINE*1 - HEIGHT HLINE*1 + WIDTH HLINE*10 + HEIGHT HLINE*10 STACKSIZE 420 TEX "assets/items/ITEM_TEST.png" ENI diff --git a/include/Texture.h b/include/Texture.h index bcd95af..85225d8 100644 --- a/include/Texture.h +++ b/include/Texture.h @@ -52,7 +52,7 @@ public: * Contains an array of the GLuints returned from Texture::loadTexture(). */ - GLuint *image; + GLuint *image = NULL; /** * Populates the image array from a list of strings, with each string as a diff --git a/include/common.h b/include/common.h index f8bd935..095b3e3 100644 --- a/include/common.h +++ b/include/common.h @@ -64,7 +64,7 @@ typedef struct { * The desired width of the game window. */ -#define SCREEN_WIDTH 1280 +#define SCREEN_WIDTH 1024 /** * The desired height of the game window. diff --git a/include/entities.h b/include/entities.h index 64a251a..dd3adab 100644 --- a/include/entities.h +++ b/include/entities.h @@ -16,7 +16,7 @@ enum _TYPE { //these are the main types of entities OBJECTT = -2, - STRUCTURET = -1, + STRUCTURET, PLAYERT, NPCT, MOBT diff --git a/include/ui.h b/include/ui.h index 97e4bbf..2fe3b0a 100644 --- a/include/ui.h +++ b/include/ui.h @@ -60,7 +60,7 @@ namespace ui { * limited until a right click is given, closing the box. */ - void dialogBox(const char *name,const char *opt,const char *text,...); + void dialogBox(const char *name,const char *opt,bool passive,const char *text,...); void waitForDialog(void); /* diff --git a/include/world.h b/include/world.h index ccf93a8..1e78cd0 100644 --- a/include/world.h +++ b/include/world.h @@ -17,6 +17,11 @@ #define GEN_INC 10 + +#define GEN_MIN 80 +#define GEN_MAX 110 + + /** * Defines how many game ticks it takes for a day to elapse. */ @@ -194,8 +199,7 @@ public: */ void setBGM(const char *path); - void bgmPlay(void); - void bgmStop(void); + void bgmPlay(World *prev); /* * Looks for the furthest back layer in this world and adds a new layer of width `width` behind it. @@ -256,6 +256,7 @@ int main(/*int argc, char *argv[]*/){ std::cout << "SDL_mixer could not initialize! Error: " << Mix_GetError() << std::endl; return -1; } + Mix_AllocateChannels(8); // Run Mix_Quit when main returns atexit(Mix_CloseAudio); @@ -492,8 +493,7 @@ void mainLoop(void){ ui::handleEvents(); if(prev != currentWorld){ - prev->bgmStop(); - currentWorld->bgmPlay(); + currentWorld->bgmPlay(prev); } if(prevPrevTime + MSEC_PER_TICK <= currentTime){ diff --git a/src/entities.cpp b/src/entities.cpp index 1c36ca7..5c00cc7 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -148,7 +148,7 @@ Mob::Mob(int sub){ height = HLINE * 8; tex = new Texturec(1, "assets/robin.png"); case MS_TRIGGER: - width = HLINE * 8; + width = HLINE * 20; height = 2000; tex = new Texturec(0); break; @@ -337,7 +337,7 @@ void NPC::interact(){ //have the npc's interact back to the player if(aiFunc.size())aiFunc.erase(aiFunc.begin()); } }else{ - ui::dialogBox(name,NULL,randomDialog[randDialog]); + ui::dialogBox(name,NULL,false,randomDialog[randDialog]); } ui::waitForDialog(); canMove=true; @@ -345,7 +345,7 @@ void NPC::interact(){ //have the npc's interact back to the player void Object::interact(void){ if(questObject && alive){ - ui::dialogBox(player->name,":Yes:No",pickupDialog); + ui::dialogBox(player->name,":Yes:No",false,pickupDialog); ui::waitForDialog(); if(ui::dialogOptChosen == 1){ player->inv->addItem((ITEM_ID)(identifier), (char)1); @@ -434,8 +434,6 @@ void Mob::wander(int timeRun){ case MS_TRIGGER: if(player->loc.x + player->width / 2 > loc.x && player->loc.x + player->width / 2 < loc.x + width ){ - if(player->left)player->loc.x = loc.x + width; - else if(player->right) player->loc.x = loc.x - player->width; hey(this); } break; diff --git a/src/gameplay.cpp b/src/gameplay.cpp index b9aa328..74414d7 100644 --- a/src/gameplay.cpp +++ b/src/gameplay.cpp @@ -1,146 +1,132 @@ #include <common.h> +#include <entities.h> #include <world.h> #include <ui.h> -#include <entities.h> extern World *currentWorld; extern Player *player; -int compTestQuest(NPC *speaker){ - ui::dialogBox(speaker->name,NULL,"Ooo, that's a nice quest you got there. Lemme finish that for you ;)."); - player->qh.finish("Test",player); - return 0; +/* + * int (npc*) + * + * dialog + * wait... + * + * switch optchosen + * + * qh.assign + * addAIFunc? + * + * return 1 = repeat + */ + +void story(Mob *callee){ + player->vel.x = 0; + Mix_FadeOutMusic(0); + ui::importantText("It was a dark and stormy night..."); + ui::waitForDialog(); + callee->alive = false; } -int giveTestQuest(NPC *speaker){ - ui::dialogBox(speaker->name,":Yes:No","Here, have a quest!"); - ui::waitForDialog(); - - if(ui::dialogOptChosen == 1){ - - ui::dialogBox(speaker->name,"","Have a good day! :)"); - ui::waitForDialog(); - - player->qh.assign("Test"); - currentWorld->npc[1]->addAIFunc(compTestQuest,true); - - }else return 1; - - return 0; +float gen_worldSpawnHill1(float x){ + return (float)(pow(2,(-x+200)/5) + GEN_MIN); } -void CUTSCENEEE(Mob *callee){ - player->vel.x = 0; - - ui::dialogBox(player->name,":K then","No way I\'m gettin\' up this hill."); - ui::waitForDialog(); +float gen_worldSpawnHill3(float x){ + float tmp = 60*atan(-(x/30-20))+GEN_MIN*2; + return tmp>GEN_MIN?tmp:GEN_MIN; +} - player->right = true; - player->left = false; - player->loc.x += HLINE * 5; - +/* + * Thing-thangs + */ + +void worldSpawnHill1_hillBlock(Mob *callee){ + player->vel.x = 0; + player->loc.x = callee->loc.x + callee->width; + ui::dialogBox(player->name,NULL,false,"This hill seems to steep to climb up..."); callee->alive = true; } -void CUTSCENEEE2(Mob *callee){ - player->vel.x = 0; - ui::dialogBox(player->name,":Yeah.", - "What the fuck is this dead end supposed to mean, and why this place smell like soap."); - ui::waitForDialog(); +void worldSpawnHill2_infoSprint(Mob *callee){ + ui::dialogBox("B-) ",NULL,true,"Press \'Shift\' to run!"); callee->alive = false; } -void story(Mob *callee){ - player->vel.x = 0; - Mix_FadeOutMusic(0); - ui::importantText("It was a dark and stormy night..."); - ui::waitForDialog(); +void worldSpawnHill3_itemGet(Mob *callee){ + ui::dialogBox("B-) ",NULL,true,"Right click to pick up items!"); callee->alive = false; } -float playerSpawnHillFunc(float x){ - return (float)(pow(2,(-x+200)/5) + 80); +void worldSpawnHill3_itemSee(Mob *callee){ + ui::dialogBox("B-) ",NULL,true,"Press \'e\' to open your inventory!"); + callee->alive = false; } -static World *test; -static World *playerSpawnHill; -static IndoorWorld *iw; +void worldSpawnHill3_leave(Mob *callee){ + ui::dialogBox("B-) ",NULL,true,"Now jump in this hole, and let your journey begin :)"); + callee->alive = false; +} -void destroyEverything(void); +/* + * new world + * gen + * setbackground + * setbgm + * add... + * + */ + +/* + * World definitions + */ +static World *worldSpawnHill1; +static World *worldSpawnHill2; +static World *worldSpawnHill3; + +/* + * initEverything() start + */ + +void destroyEverything(void); void initEverything(void){ - //FILE *load; - - /* - * World creation: - */ - - test=new World(); - - test->generate(SCREEN_WIDTH*2); - test->setBackground(BG_FOREST); - test->setBGM("assets/music/embark.wav"); - - test->addHole(100,150); - test->addLayer(400); - - playerSpawnHill=new World(); - playerSpawnHill->setBackground(BG_FOREST); - playerSpawnHill->setBGM("assets/music/embark.wav"); - - /*if((load=fopen("world.dat","rb"))){ - playerSpawnHill->load(load); - fclose(load); - }else{*/ - playerSpawnHill->generateFunc(1280,playerSpawnHillFunc); - //} - - /* - * Setup the current world, making the player initially spawn in `test`. - */ - - currentWorld=playerSpawnHill; - - playerSpawnHill->toRight=test; - test->toLeft=playerSpawnHill; - - /* - * Create the player. - */ - - player=new Player(); - player->spawn(-1000,200); + + worldSpawnHill1 = new World(); + worldSpawnHill1->generateFunc(400,gen_worldSpawnHill1); + worldSpawnHill1->setBackground(BG_FOREST); + worldSpawnHill1->setBGM("assets/music/embark.wav"); + worldSpawnHill1->addMob(MS_TRIGGER,0,0,worldSpawnHill1_hillBlock); + + worldSpawnHill2 = new World(); + worldSpawnHill2->generate(700); + worldSpawnHill2->setBackground(BG_FOREST); + worldSpawnHill2->setBGM("assets/music/embark.wav"); + worldSpawnHill2->addMob(MS_TRIGGER,-400,0,worldSpawnHill2_infoSprint); - /* - * Create a structure (this will create villagers when spawned). - */ + worldSpawnHill3 = new World(); + worldSpawnHill3->generateFunc(1000,gen_worldSpawnHill3); + worldSpawnHill3->setBackground(BG_FOREST); + worldSpawnHill3->setBGM("assets/music/embark.wav"); + worldSpawnHill3->addMob(MS_TRIGGER,-500,0,worldSpawnHill3_itemGet); + worldSpawnHill3->addMob(MS_TRIGGER,0,0,worldSpawnHill3_itemSee); + worldSpawnHill3->addObject(TEST_ITEM,false,"",-200,300); + worldSpawnHill3->addMob(MS_TRIGGER,400,0,worldSpawnHill3_leave); + worldSpawnHill3->addHole(800,1000); - iw=new IndoorWorld(); - iw->setBackground(BG_WOODHOUSE); - iw->setBGM(NULL); - iw->generate(200); - iw->addMob(MS_TRIGGER,0,0,CUTSCENEEE2); + worldSpawnHill1->toRight = worldSpawnHill2; + worldSpawnHill2->toLeft = worldSpawnHill1; - /* - * Spawn some entities. - */ - - playerSpawnHill->addMob(MS_TRIGGER,player->loc.x,0,story); - - playerSpawnHill->addStructure(STRUCTURET,(rand()%120*HLINE),100,test,iw); - playerSpawnHill->addMob(MS_TRIGGER,-1300,0,CUTSCENEEE); + worldSpawnHill2->toRight = worldSpawnHill3; + worldSpawnHill3->toLeft = worldSpawnHill2; - playerSpawnHill->addObject(SWORD_WOOD, false, "", 480,200); - playerSpawnHill->addObject(FLASHLIGHT, false, "", 500,200); - playerSpawnHill->addObject(PLAYER_BAG, false, "", 520,200); - playerSpawnHill->addObject(TEST_ITEM, false, "", 540,200); + currentWorld = worldSpawnHill1; - test->addMob(MS_RABBIT,200,100); - test->addMob(MS_BIRD,-500,500); + player = new Player(); + player->spawn(200,100); - playerSpawnHill->npc[0]->addAIFunc(giveTestQuest,false); + currentWorld->bgmPlay(NULL); - currentWorld->bgmPlay(); atexit(destroyEverything); } @@ -148,21 +134,8 @@ extern std::vector<int (*)(NPC *)> AIpreload; extern std::vector<NPC *> AIpreaddr; void destroyEverything(void){ - //FILE *save; - - /*save = fopen("world.dat","wb"); - playerSpawnHill->save(save); - fclose(save);*/ - - delete test; - delete playerSpawnHill; - - while(!AIpreload.empty()){ + while(!AIpreload.empty()) AIpreload.pop_back(); - } - while(!AIpreaddr.empty()){ + while(!AIpreaddr.empty()) AIpreaddr.pop_back(); - } - - //delete iw; // segfaults } @@ -48,6 +48,7 @@ static char dialogBoxText[512]; static char *dialogOptText[4]; static float dialogOptLoc[4][3]; static unsigned char dialogOptCount = 0; +static bool dialogPassive = false; static bool typeOutDone = true; Mix_Chunk *dialogClick; @@ -346,7 +347,8 @@ namespace ui { if(linc<size) linc++; - else typeOutDone = true; + else + typeOutDone = true; } return ret; // The buffered string. @@ -385,11 +387,13 @@ namespace ui { return width; } - void dialogBox(const char *name,const char *opt,const char *text,...){ + void dialogBox(const char *name,const char *opt,bool passive,const char *text,...){ va_list dialogArgs; unsigned int len; char *sopt,*soptbuf; + dialogPassive = passive; + /* * Set up the text buffer. */ @@ -422,7 +426,7 @@ namespace ui { }; dialogOptChosen=0; - dialogOptCount=0; + memset(&dialogOptLoc,0,sizeof(float)*12); if(opt){ @@ -632,7 +636,8 @@ DONE: player->ground=false; } break; - }else if(!dialogBoxExists){//&&!fadeEnable){ + }else if(!dialogBoxExists || dialogPassive){ + tmp = currentWorld; switch(SDL_KEY){ case SDLK_a: player->vel.x=-.15; @@ -641,6 +646,8 @@ DONE: left = true; right = false; currentWorld=currentWorld->goWorldLeft(player); + if(tmp!=currentWorld) + dialogBoxExists = false; break; case SDLK_d: player->vel.x=.15; @@ -649,6 +656,8 @@ DONE: left = false; right = true; currentWorld=currentWorld->goWorldRight(player); + if(tmp!=currentWorld) + dialogBoxExists = false; break; case SDLK_s: if(player->ground == 2){ @@ -662,7 +671,6 @@ DONE: else currentWorld=currentWorld->goInsideStructure(player); break; case SDLK_i: - tmp=currentWorld; currentWorld=currentWorld->goWorldBack(player); // Go back a layer if possible if(tmp!=currentWorld){ currentWorld->detect(player); @@ -672,7 +680,6 @@ DONE: } break; case SDLK_k: - tmp=currentWorld; currentWorld=currentWorld->goWorldFront(player); // Go forward a layer if possible if(tmp!=currentWorld){ currentWorld->behind->detect(player); @@ -682,7 +689,13 @@ DONE: } break; case SDLK_LSHIFT: - player->speed = debug ? 4.0f : 3.0f; + if(debug){ + Mix_Chunk *sanic; + sanic = Mix_LoadWAV("assets/sounds/sanic.wav"); + Mix_PlayChannel(1,sanic,-1); + player->speed = 4.0f; + }else + player->speed = 2.0f; break; case SDLK_LCTRL: player->speed = .5; @@ -720,6 +733,9 @@ DONE: right = false; break; case SDLK_LSHIFT: + if(player->speed == 4){ + Mix_FadeOutChannel(1,2000); + } player->speed = 1; break; case SDLK_LCTRL: diff --git a/src/world.cpp b/src/world.cpp index 3fdfa7f..3f35e21 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -3,8 +3,6 @@ #define getWidth(w) ((w->lineCount-GEN_INC)*HLINE) // Calculates the width of world 'w' -#define GEN_MIN 80 -#define GEN_MAX 110 #define GEN_INIT 60 #define GRASS_HEIGHT 4 // Defines how long the grass layer of a line should be in multiples of HLINE. @@ -112,9 +110,13 @@ void World::deleteEntities(void){ } World::~World(void){ - if(behind) + if(behind != NULL) delete behind; + if(bgmObj) + Mix_FreeMusic(bgmObj); + if(bgm) + delete[] bgm; delete bgTex; delete[] star; delete[] line; @@ -314,24 +316,13 @@ void World::setBGM(const char *path){ } } -static Mix_Music *bgmC; - -void World::bgmPlay(void){ - if(bgmObj && bgmC != bgmObj){ +void World::bgmPlay(World *prev){ + if(!prev || strcmp(bgm,prev->bgm)){ Mix_VolumeMusic(50); Mix_PlayMusic(bgmObj,-1); // Loop infinitely - bgmC = bgmObj; - }else{ + }/*else{ Mix_FadeOutMusic(800); - } -} - -void World::bgmStop(void){ - if(bgmObj){ - if(bgmC != bgmObj){ - Mix_FreeMusic(bgmObj); - } - } + }*/ } int worldShade = 0; @@ -520,10 +511,7 @@ LOOP2: */ for(auto &b : current->build){ - //b->loc.y+=(yoff-DRAW_Y_OFFSET); b->draw(); - //b->loc.y-=(yoff-DRAW_Y_OFFSET); - std::cout<<b->loc.x<<" "<<b->loc.y<<std::endl; } /* @@ -779,29 +767,33 @@ void World::singleDetect(Entity *e){ * Check that the entity isn't trying to run through a wall. */ - if(e->loc.y + e->height > line[i-(int)e->width/2/HLINE].y && - e->loc.y + e->height > line[i+(int)e->width/2/HLINE].y ){ + //if(e->loc.y + e->height > line[i-(int)e->width/2/HLINE].y && + // e->loc.y + e->height > line[i+(int)e->width/2/HLINE].y ){ e->loc.y=line[i].y - .001 * deltaTime; e->ground=true; e->vel.y=0; - }else{ + //}else{ /* * Push the entity out of the wall if it's trying to go through it. */ - do{ + /*do{ e->loc.x+=.001 * e->vel.x>0?-1:1; l=(e->loc.x - e->width / 2 - x_start) / HLINE; - if(l < 0){ e->alive = false; return; } + if(l < 0){ + std::cout<<"push kill lol "<<e->type<<std::endl; + e->alive = false; return; } i = l; - if(i > lineCount-1){ e->alive = false; return; } + if(i > lineCount-1){ + std::cout<<"push kill lol "<<e->type<<std::endl; + e->alive = false; return; } }while(line[i].y>e->loc.y+ e->height); - } + }*/ /* * Handle gravity if the entity is above the line. @@ -815,7 +807,7 @@ void World::singleDetect(Entity *e){ e->ground = true; return; }else if(e->vel.y > -2)e->vel.y-=.003 * deltaTime; - + } /* |