aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordrumsetmonkey <abelleisle@roadrunner.com>2015-12-22 20:04:04 -0500
committerdrumsetmonkey <abelleisle@roadrunner.com>2015-12-22 20:04:04 -0500
commit1ccd85fd022ab5d628c9e26a213e47cf2687fce7 (patch)
tree05a55beccc626259a6bd34c11aad67f39325a24b
parent426809972df04eebb4702432c352b8e7d88f792d (diff)
parente67bfdde0b7e15ac6bc29993a92a89a844474554 (diff)
shit
-rw-r--r--Changelog15
-rw-r--r--assets/fountain1.pngbin0 -> 524 bytes
-rw-r--r--assets/house2.pngbin0 -> 747 bytes
-rw-r--r--assets/music/calm.wavbin0 -> 12073004 bytes
-rw-r--r--assets/sounds/frig.wavbin0 -> 332726 bytes
-rw-r--r--include/common.h8
-rw-r--r--include/entities.h51
-rw-r--r--include/ui.h1
-rw-r--r--include/world.h9
-rw-r--r--main.cpp46
-rw-r--r--src/entities.cpp33
-rw-r--r--src/gameplay.cpp29
-rw-r--r--src/inventory.cpp42
-rw-r--r--src/ui.cpp75
-rw-r--r--src/world.cpp109
-rw-r--r--xcf/maybeplayer.xcfbin0 -> 3117 bytes
16 files changed, 342 insertions, 76 deletions
diff --git a/Changelog b/Changelog
index 0a44904..18b918e 100644
--- a/Changelog
+++ b/Changelog
@@ -411,4 +411,19 @@
- imrpoved BGM handling
- continued work on particles, made a fountain
- added sanic
+<<<<<<< HEAD
>>>>>>> 43bbcf02fd5e4e69a9aa521fa4cd572cc8675cf3
+=======
+
+ ~ Broke 5000 lines of code/doc, now with some file Doxygen'd
+
+12/14/2015:
+===========
+
+ - Re-implemented Arena
+ added door mob for exit
+ added white flash + sound transition
+ - fixed fading bugs
+ - continued fixing general game bugs
+ - fixed structure spawn issues
+>>>>>>> e67bfdde0b7e15ac6bc29993a92a89a844474554
diff --git a/assets/fountain1.png b/assets/fountain1.png
new file mode 100644
index 0000000..46f7c44
--- /dev/null
+++ b/assets/fountain1.png
Binary files differ
diff --git a/assets/house2.png b/assets/house2.png
new file mode 100644
index 0000000..7404cd9
--- /dev/null
+++ b/assets/house2.png
Binary files differ
diff --git a/assets/music/calm.wav b/assets/music/calm.wav
new file mode 100644
index 0000000..5b4d27c
--- /dev/null
+++ b/assets/music/calm.wav
Binary files differ
diff --git a/assets/sounds/frig.wav b/assets/sounds/frig.wav
new file mode 100644
index 0000000..86d64e9
--- /dev/null
+++ b/assets/sounds/frig.wav
Binary files differ
diff --git a/include/common.h b/include/common.h
index 095b3e3..31126d7 100644
--- a/include/common.h
+++ b/include/common.h
@@ -54,11 +54,17 @@ typedef struct {
vec2 end;
} Ray;
+typedef struct{
+ float red;
+ float green;
+ float blue;
+} Color;
+
/**
* Define the game's name (displayed in the window title).
*/
-#define GAME_NAME "Independent Study v.0.4 alpha"
+#define GAME_NAME "Independent Study v.0.5 alpha - NOW WITH SOUND!"
/**
* The desired width of the game window.
diff --git a/include/entities.h b/include/entities.h
index dd3adab..1abe886 100644
--- a/include/entities.h
+++ b/include/entities.h
@@ -31,7 +31,52 @@ enum GENDER{
enum MOB_SUB {
MS_RABBIT = 1,
MS_BIRD,
- MS_TRIGGER
+ MS_TRIGGER,
+ MS_DOOR
+};
+
+enum BUILD_SUB{
+ TOWN_HALL = 1,
+ HOUSE,
+ HOUSE2,
+ HOUSE3,
+ HOUSE4,
+ FOUNTAIN
+};
+
+class Particles{
+public:
+ vec2 loc;
+ float width;
+ float height;
+ float velx;
+ float vely;
+ Color color;
+ int duration;
+ bool canMove;
+ Particles(float x, float y, float w, float h, float vx, float vy, Color c, int d){
+ loc.x = (x);
+ loc.y = (y);
+ width = (w);
+ height = (h);
+ velx = vx;
+ vely = vy;
+ color.red = (c.red);
+ color.green = (c.green);
+ color.blue = (c.blue);
+ duration = d;
+ }
+ ~Particles(){}
+ void draw(){
+ glColor3f(color.red,color.green,color.blue);
+ glRectf(loc.x,loc.y,loc.x+width,loc.y+height);
+ }
+ bool kill(float delta){
+ duration -= delta;
+ if(duration <= 0)
+ return true;
+ else return false;
+ }
};
class Entity{
@@ -58,6 +103,7 @@ public:
bool canMove; // Enables movement
bool right,left; // Direction faced by Entity
bool alive;
+ bool hit;
unsigned char ground; // Shows how the Entity is grounded (if it is)
/*
@@ -118,11 +164,12 @@ class Structures : public Entity{
public:
void *inWorld;
void *inside;
+ BUILD_SUB bsubtype;
Structures();
~Structures();
- unsigned int spawn(_TYPE, float, float);
+ unsigned int spawn(_TYPE, BUILD_SUB, float, float);
};
class Mob : public Entity{
diff --git a/include/ui.h b/include/ui.h
index 2fe3b0a..5d17c47 100644
--- a/include/ui.h
+++ b/include/ui.h
@@ -87,6 +87,7 @@ namespace ui {
void toggleBlack(void);
void toggleBlackFast(void);
void toggleWhite(void);
+ void toggleWhiteFast(void);
void waitForCover(void);
}
diff --git a/include/world.h b/include/world.h
index 1e78cd0..0a23965 100644
--- a/include/world.h
+++ b/include/world.h
@@ -164,12 +164,15 @@ public:
std::vector<Mob *> mob;
std::vector<Entity *> entity;
std::vector<Object *> object;
+ std::vector<Particles *> particles;
- void addStructure(_TYPE t,float x,float y,World *outside,World *inside);
+ void addStructure(_TYPE t,BUILD_SUB sub,float x,float y,World *outside,World *inside);
+ void addVillage(int bCount, int npcMin, int npcMax,_TYPE t,float x,float y,World *outside,World *inside);
void addMob(int t,float x,float y);
void addMob(int t,float x,float y,void (*hey)(Mob *));
void addNPC(float x,float y);
void addObject(ITEM_ID, bool, const char *, float, float);
+ void addParticle(float, float, float, float, float, float, Color color, int);
void update(Player *p,unsigned int delta);
@@ -231,6 +234,9 @@ public:
World *goWorldRight(Player *p);
World *goWorldBack(Player *p);
World *goWorldFront(Player *p);
+
+ bool isWorldLeft(void);
+ bool isWorldRight(void);
/*
* Called to enter/exit a structure.
@@ -277,7 +283,6 @@ public:
class Arena : public World {
private:
vec2 pxy;
- vec2 door;
World *exit;
public:
Arena(World *leave,Player *p);
diff --git a/main.cpp b/main.cpp
index 4e45189..5b9b1b6 100644
--- a/main.cpp
+++ b/main.cpp
@@ -212,7 +212,7 @@ extern WEATHER weather;
extern bool fadeEnable;
extern bool fadeWhite;
extern bool fadeFast;
-extern unsigned int fadeIntensity;
+extern int fadeIntensity;
/*******************************************************************************
* MAIN ************************************************************************
@@ -515,7 +515,6 @@ void mainLoop(void){
debugDiv=0;
fps=1000/deltaTime;
-
}else if(!(debugDiv%10)){
debugY = player->loc.y;
}
@@ -717,9 +716,9 @@ void render(){
if(fadeIntensity){
if(fadeWhite)
- glColor4ub(255,255,255,fadeIntensity);
+ safeSetColorA(255,255,255,fadeIntensity);
else
- glColor4ub(0,0,0,fadeIntensity);
+ safeSetColorA(0,0,0,fadeIntensity);
glRectf(offset.x-SCREEN_WIDTH /2,
offset.y-SCREEN_HEIGHT/2,
offset.x+SCREEN_WIDTH /2,
@@ -839,9 +838,16 @@ void logic(){
*/
if(n->canMove) n->wander((rand() % 120 + 30));
-
- if(player->inv->usingi && player->inv->detectCollision(vec2{n->loc.x, n->loc.y},vec2{n->loc.x+n->width,n->loc.y+n->height})){
- n->alive=false;
+ if(!player->inv->usingi) n->hit = false;
+ if(player->inv->usingi && !n->hit && player->inv->detectCollision(vec2{n->loc.x, n->loc.y},vec2{n->loc.x+n->width,n->loc.y+n->height})){
+ n->health -= 25;
+ n->hit = true;
+ for(int r = 0; r < (rand()%5);r++)
+ currentWorld->addParticle(rand()%HLINE*3 + n->loc.x - .05f,n->loc.y + n->height*.5, HLINE,HLINE, -(rand()%10)*.01,((rand()%4)*.001-.002), {(rand()%75+10)/100.0f,0,0}, 10000);
+ if(n->health <= 0){
+ for(int r = 0; r < (rand()%30)+15;r++)
+ currentWorld->addParticle(rand()%HLINE*3 + n->loc.x - .05f,n->loc.y + n->height*.5, HLINE,HLINE, -(rand()%10)*.01,((rand()%10)*.01-.05), {(rand()%75)+10/100.0f,0,0}, 10000);
+ }
}
/*
* Don't bother handling the NPC if another has already been handled.
@@ -866,9 +872,7 @@ void logic(){
* considered legal. In other words, require the player to be close to
* the NPC in order to interact with it.
*
- * This uses the Pythagorean theorem to check for NPCs within a certain
- * radius (40 HLINEs) of the player's coordinates.
- *
+ * This uses the Pythagorean theorem to check for NPCs within a certain *
*/
if(pow((n->loc.x - player->loc.x),2) + pow((n->loc.y - player->loc.y),2) <= pow(40*HLINE,2)){
@@ -916,6 +920,8 @@ void logic(){
case MS_TRIGGER:
m->wander(0);
break;
+ case MS_DOOR:
+ break;
default:
std::cout<<"Unhandled mob of subtype "<<m->subtype<<"."<<std::endl;
break;
@@ -928,7 +934,7 @@ void logic(){
if(ui::mouse.x >= o->loc.x &&
ui::mouse.x <= o->loc.x + o->width &&
ui::mouse.y >= o->loc.y &&
- ui::mouse.y <= o->loc.y + o->width ){
+ ui::mouse.y <= o->loc.y + o->height ){
if(pow((o->loc.x - player->loc.x),2) + pow((o->loc.y - player->loc.y),2) <= pow(40*HLINE,2)){
/*
@@ -948,6 +954,12 @@ void logic(){
}
}
}
+ for(auto &b : currentWorld->build){
+ if(b->bsubtype == FOUNTAIN){
+ for(int r = 0; r < (rand()%20)+10;r++)
+ currentWorld->addParticle(rand()%HLINE*3 + b->loc.x + b->width/2,b->loc.y + b->height, HLINE,HLINE, rand()%2 == 0?-(rand()%7)*.01:(rand()%7)*.01,((4+rand()%6)*.05), {0,0,1.0f}, 2500);
+ }
+ }
/*
* Switch between day and night (SUNNY and DARK) if necessary.
@@ -955,7 +967,6 @@ void logic(){
if(!(tickCount%DAY_CYCLE)||!tickCount){
if(weather==SUNNY){
weather=DARK;
- Mix_PlayChannel(2,crickets,0);
}else{
weather=SUNNY;
Mix_Pause(2);
@@ -971,12 +982,15 @@ void logic(){
/*
* Transition to and from black if necessary.
*/
+
if(fadeEnable){
- if(fadeIntensity < 150)fadeIntensity+=fadeFast?30:10;
- else if(fadeIntensity < 255)fadeIntensity+=fadeFast?15:5;
+ if(fadeIntensity < 150)fadeIntensity+=fadeFast?40:10;
+ else if(fadeIntensity < 255)fadeIntensity+=fadeFast?20:5;
+ else fadeIntensity = 255;
}else{
- if(fadeIntensity > 150)fadeIntensity-=fadeFast?15:5;
- else if(fadeIntensity > 0) fadeIntensity-=fadeFast?30:10;
+ if(fadeIntensity > 150)fadeIntensity-=fadeFast?20:5;
+ else if(fadeIntensity > 0) fadeIntensity-=fadeFast?40:10;
+ else fadeIntensity = 0;
}
/*
diff --git a/src/entities.cpp b/src/entities.cpp
index 5c00cc7..24c0d01 100644
--- a/src/entities.cpp
+++ b/src/entities.cpp
@@ -10,6 +10,8 @@ extern Player *player;
extern const char *itemName;
+extern
+
void getRandomName(Entity *e){
int tempNum,max=0;
char *bufs;
@@ -57,6 +59,7 @@ void Entity::spawn(float x, float y){ //spawns the entity you pass to it based o
near = false;
canMove = true;
ground = false;
+ hit = false;
ticksToUse = 0;
@@ -116,12 +119,12 @@ NPC::~NPC(){
}
Structures::Structures(){ //sets the structure type
- health = maxHealth = 1;
+ health = maxHealth = 25;
alive = false;
near = false;
- tex = new Texturec(1,"assets/house1.png");
+ tex = new Texturec(3,"assets/house1.png", "assets/house2.png", "assets/fountain1.png");
inWorld = NULL;
name = NULL;
@@ -151,6 +154,10 @@ Mob::Mob(int sub){
width = HLINE * 20;
height = 2000;
tex = new Texturec(0);
+ case MS_DOOR:
+ width = HLINE * 10;
+ height = HLINE * 16;
+ tex = new Texturec(1,"assets/door.png");
break;
}
@@ -211,6 +218,7 @@ void Entity::draw(void){ //draws the entities
static int texState = 0;
static bool up = true;
if(loops % (int)((float)4/(float)speed) == 0){
+ //currentWorld->addParticle(loc.x,loc.y-HLINE,HLINE,HLINE,0,0,{0.0f,.17f,0.0f},1000);
if(up){
if(++texState==2)up=false;
tex->bindNext();
@@ -236,11 +244,25 @@ void Entity::draw(void){ //draws the entities
goto NOPE;
break;
case MS_BIRD:
+ case MS_DOOR:
default:
tex->bind(0);
break;
}
break;
+ case STRUCTURET:
+ for(auto &strt : currentWorld->build){
+ if(this == strt){
+ if(strt->bsubtype == HOUSE){
+ tex->bind(0);
+ }else if(strt->bsubtype == HOUSE2){
+ tex->bind(1);
+ }else if(strt->bsubtype == FOUNTAIN){
+ tex->bind(2);
+ }
+ }
+ }
+ break;
default:
tex->bind(0);
break;
@@ -319,7 +341,8 @@ const char *randomDialog[] = {
"Did you know this game has over 4000 lines of code? I didn\'t. I didn't even know I was in a game until now...",
"HELP MY CAPS LOCK IS STUCK",
"You know, if anyone ever asked me who I wanted to be when I grow up, I would say Abby Ross.",
- "I want to have the wallpaper in our house changed. It doesn\'t really fit the environment."
+ "I want to have the wallpaper in our house changed. It doesn\'t really fit the environment.",
+ "Frig."
};
void NPC::interact(){ //have the npc's interact back to the player
@@ -368,7 +391,7 @@ void Object::interact(void){
* point to have non-normal traits so it could be invisible or invincible...
*/
-unsigned int Structures::spawn(_TYPE t, float x, float y){
+unsigned int Structures::spawn(_TYPE t, BUILD_SUB sub, float x, float y){
loc.x = x;
loc.y = y;
type = t;
@@ -377,6 +400,7 @@ unsigned int Structures::spawn(_TYPE t, float x, float y){
width = 50 * HLINE;
height = 40 * HLINE;
+ bsubtype = sub;
/*
* tempN is the amount of entities that will be spawned in the village. Currently the village
@@ -437,6 +461,7 @@ void Mob::wander(int timeRun){
hey(this);
}
break;
+ case MS_DOOR:
default:
break;
}
diff --git a/src/gameplay.cpp b/src/gameplay.cpp
index a9d29c4..70630dd 100644
--- a/src/gameplay.cpp
+++ b/src/gameplay.cpp
@@ -48,9 +48,17 @@ void worldSpawnHill1_hillBlock(Mob *callee){
callee->alive = true;
}
+static Arena *a;
void worldSpawnHill2_infoSprint(Mob *callee){
- ui::dialogBox("B-) ",NULL,true,"Press \'Shift\' to run!");
callee->alive = false;
+ a = new Arena(currentWorld,player);
+ a->setBackground(BG_FOREST);
+ a->setBGM("assets/music/embark.wav");
+ ui::toggleWhiteFast();
+ ui::waitForCover();
+ currentWorld = a;
+ ui::toggleWhiteFast();
+ //ui::dialogBox("B-) ",NULL,true,"Press \'Shift\' to run!");
}
void worldSpawnHill3_itemGet(Mob *callee){
@@ -103,7 +111,7 @@ void initEverything(void){
worldSpawnHill2->setBackground(BG_FOREST);
worldSpawnHill2->setBGM("assets/music/embark.wav");
worldSpawnHill2->addMob(MS_TRIGGER,-400,0,worldSpawnHill2_infoSprint);
-
+
worldSpawnHill3 = new World();
worldSpawnHill3->generateFunc(1000,gen_worldSpawnHill3);
worldSpawnHill3->setBackground(BG_FOREST);
@@ -116,10 +124,23 @@ void initEverything(void){
worldSpawnHill1->toRight = worldSpawnHill2;
worldSpawnHill2->toLeft = worldSpawnHill1;
-
worldSpawnHill2->toRight = worldSpawnHill3;
worldSpawnHill3->toLeft = worldSpawnHill2;
-
+
+ /*
+ * Spawn some entities.
+ */
+
+ //playerSpawnHill->addMob(MS_TRIGGER,player->loc.x,0,story);
+
+ //worldSpawnHill2->addStructure(STRUCTURET,HOUSE,(rand()%120*HLINE),100,worldSpawnHill1,worldSpawnHill2);
+ //playerSpawnHill->addStructure(STRUCTURET,FOUNTAIN,(rand()%120*HLINE)+100*HLINE,100,test,iw);
+ //playerSpawnHill->addStructure(STRUCTURET,HOUSE2,(rand()%120*HLINE)+300*HLINE,100,test,iw);
+
+ //playerSpawnHill->addVillage(5,1,4,STRUCTURET,rand()%500+120,(float)200,playerSpawnHill,iw);
+ //playerSpawnHill->addMob(MS_TRIGGER,-1300,0,CUTSCENEEE);*/
+
+
currentWorld = worldSpawnHill1;
player = new Player();
diff --git a/src/inventory.cpp b/src/inventory.cpp
index 8d8f958..5ae97b4 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -7,7 +7,7 @@
extern Player *player;
extern GLuint invUI;
static float hangle = 0.0f;
-static bool up = true;
+static bool swing = false;
static float xc,yc;
static vec2 itemLoc;
Mix_Chunk* swordSwing;
@@ -26,7 +26,7 @@ void initInventorySprites(void){
}
swordSwing = Mix_LoadWAV("assets/sounds/shortSwing.wav");
- Mix_Volume(2,75);
+ Mix_Volume(2,100);
}
char *getItemTexturePath(ITEM_ID id){
@@ -278,13 +278,13 @@ void itemDraw(Player *p,ITEM_ID id,ITEM_TYPE type){
if(hangle < 15){
hangle=15.0f;
p->inv->usingi = false;
- up = false;
+ //swing=false;
}
}else{
if(hangle > -15){
hangle=-15.0f;
p->inv->usingi = false;
- up = false;
+ //swing=false;
}
}
break;
@@ -310,19 +310,35 @@ void itemDraw(Player *p,ITEM_ID id,ITEM_TYPE type){
}
int Inventory::useItem(void){
+ static bool up = false;
ITEM_TYPE type = item[inv[sel].id].type;
if(!invHover){
switch(type){
case SWORD:
- if(!player->left){
- if(hangle==-15){up=true;Mix_PlayChannel(2,swordSwing,0);}
- if(up)hangle-=15;
- if(hangle<=-90)hangle=-14;
- }else{
- if(hangle==15){up=true;Mix_PlayChannel(2,swordSwing,0);}
- if(up)hangle+=15;
- if(hangle>=90)hangle=14;
- }
+ if(swing){
+ if(!player->left){
+ if(hangle==-15){up=true;Mix_PlayChannel(2,swordSwing,0);}
+ if(up)hangle-=.75*deltaTime;
+ if(hangle<=-90)hangle=-14;
+ }else{
+ if(hangle==15){up=true;Mix_PlayChannel(2,swordSwing,0);}
+ if(up)hangle+=.75*deltaTime;
+ if(hangle>=90)hangle=14;
+ /*
+ if(hangle<90&&!up)hangle+=.75*deltaTime;
+ if(hangle>=90&&!up)up=true;
+ if(up)hangle-=.75*deltaTime;
+ if(up&&hangle<=15){
+ up=false;
+ swing=false;
+ hangle=15;
+ return 0;
+ }*/
+ }
+ }else if(!swing){
+ swing=true;
+ Mix_PlayChannel(2,swordSwing,0);
+ }
break;
default:
break;
diff --git a/src/ui.cpp b/src/ui.cpp
index 26b30c4..11bc195 100644
--- a/src/ui.cpp
+++ b/src/ui.cpp
@@ -65,6 +65,7 @@ bool fadeFast = false;
unsigned int fadeIntensity = 0;
bool inBattle = false;
+Mix_Chunk *battleStart;
namespace ui {
@@ -460,7 +461,8 @@ namespace ui {
void waitForCover(void){
do{
mainLoop();
- }while(fadeIntensity != 255);
+ }while(fadeIntensity < 255);
+ fadeIntensity = 255;
}
void importantText(const char *text,...){
va_list textArgs;
@@ -598,6 +600,7 @@ DONE:
static vec2 premouse={0,0};
static int heyOhLetsGo = 0;
World *tmp;
+ vec2 oldpos,tmppos;
SDL_Event e;
mouse.x=premouse.x+offset.x-(SCREEN_WIDTH/2);
@@ -628,9 +631,9 @@ DONE:
gameRunning = false;
return;
}else if(SDL_KEY == SDLK_SPACE){
- if(dialogBoxExists)
+ /*if(dialogBoxExists)
dialogAdvance();
- else if(player->ground){
+ else */if(player->ground){
player->vel.y=.4;
player->loc.y+=HLINE*2;
player->ground=false;
@@ -640,35 +643,65 @@ DONE:
tmp = currentWorld;
switch(SDL_KEY){
case SDLK_a:
+ if(fadeEnable)break;
player->vel.x=-.15;
player->left = true;
player->right = false;
left = true;
right = false;
- currentWorld=currentWorld->goWorldLeft(player);
- if(tmp!=currentWorld)
- dialogBoxExists = false;
+ if(currentWorld->isWorldLeft()){
+ memcpy(&oldpos,&player->loc,sizeof(vec2));
+ tmp = currentWorld->goWorldLeft(player);
+ if(currentWorld != tmp){
+ memcpy(&tmppos,&player->loc,sizeof(vec2));
+ memcpy(&player->loc,&oldpos,sizeof(vec2));
+ toggleBlackFast();
+ waitForCover();
+ memcpy(&player->loc,&tmppos,sizeof(vec2));
+ currentWorld = tmp;
+ toggleBlackFast();
+ dialogBoxExists = false;
+ }
+ }
break;
case SDLK_d:
+ if(fadeEnable)break;
player->vel.x=.15;
player->right = true;
player->left = false;
left = false;
right = true;
- currentWorld=currentWorld->goWorldRight(player);
- if(tmp!=currentWorld)
- dialogBoxExists = false;
+ if(currentWorld->isWorldRight()){
+ memcpy(&oldpos,&player->loc,sizeof(vec2));
+ tmp = currentWorld->goWorldRight(player);
+ if(currentWorld != tmp){
+ memcpy(&tmppos,&player->loc,sizeof(vec2));
+ memcpy(&player->loc,&oldpos,sizeof(vec2));
+ toggleBlackFast();
+ waitForCover();
+ memcpy(&player->loc,&tmppos,sizeof(vec2));
+ currentWorld = tmp;
+ toggleBlackFast();
+ dialogBoxExists = false;
+ }
+ }
break;
case SDLK_s:
- if(player->ground == 2){
+ /*if(player->ground == 2){
player->ground=false;
player->loc.y-=HLINE*1.5;
- }
+ }*/
break;
case SDLK_w:
- if(inBattle)
- currentWorld=((Arena *)currentWorld)->exitArena(player);
- else currentWorld=currentWorld->goInsideStructure(player);
+ if(inBattle){
+ tmp = currentWorld;
+ currentWorld = ((Arena *)currentWorld)->exitArena(player);
+ if(tmp != currentWorld){
+ //delete &tmp;
+ toggleBlackFast();
+ }
+ }else
+ currentWorld=currentWorld->goInsideStructure(player);
break;
case SDLK_i:
currentWorld=currentWorld->goWorldBack(player); // Go back a layer if possible
@@ -718,6 +751,13 @@ DONE:
default:
break;
}
+ if(tmp != currentWorld){
+ std::swap(tmp,currentWorld);
+ toggleBlackFast();
+ waitForCover();
+ std::swap(tmp,currentWorld);
+ toggleBlackFast();
+ }
}
break;
/*
@@ -795,4 +835,11 @@ DONE:
fadeWhite = true;
fadeFast = false;
}
+ void toggleWhiteFast(void){
+ fadeEnable ^= true;
+ fadeWhite = true;
+ fadeFast = true;
+ battleStart = Mix_LoadWAV("assets/sounds/frig.wav");
+ Mix_PlayChannel(1,battleStart,0);
+ }
}
diff --git a/src/world.cpp b/src/world.cpp
index 3f35e21..1b460a2 100644
--- a/src/world.cpp
+++ b/src/world.cpp
@@ -106,7 +106,13 @@ void World::deleteEntities(void){
delete object.back();
object.pop_back();
}
- while(!entity.empty()) entity.pop_back();
+ while(!entity.empty()){
+ entity.pop_back();
+ }
+ while(!particles.empty()){
+ delete particles.back();
+ particles.pop_back();
+ }
}
World::~World(void){
@@ -296,6 +302,28 @@ void World::update(Player *p,unsigned int delta){
else if(e->vel.x > 0)e->left = false;
}
}
+ uint oh = 0;
+ for(auto &pa : particles){
+ if(pa->kill(deltaTime)){
+ delete pa;
+ particles.erase(particles.begin()+oh);
+ }else if(pa->canMove){
+ pa->loc.y += pa->vely * deltaTime;
+ pa->loc.x += pa->velx * deltaTime;
+
+ for(auto &b : build){
+ if(b->bsubtype==FOUNTAIN){
+ if(pa->loc.x >= b->loc.x && pa->loc.x <= b->loc.x+b->width){
+ if(pa->loc.y <= b->loc.y + b->height*.25){
+ delete pa;
+ particles.erase(particles.begin()+oh);
+ }
+ }
+ }
+ }
+ }
+ oh++;
+ }oh=0;
if(ui::dialogImportant){
Mix_FadeOutMusic(2000);
@@ -351,7 +379,7 @@ LLLOOP:
current=current->infront;
goto LLLOOP;
}
- cx_start = current->x_start;
+ cx_start = current->x_start * 1.5;
width = (-x_start) << 1;
glEnable(GL_TEXTURE_2D);
@@ -437,6 +465,9 @@ LLLOOP:
glDisable(GL_TEXTURE_2D);
+ glColor3ub(0,0,0);
+ glRectf(cx_start,GEN_MIN,-cx_start,0);
+
/*
* World drawing is done recursively, meaning that this function jumps
* back as many 'layers' as it can and then draws, eventually coming
@@ -592,7 +623,7 @@ LOOP2:
/*
* Draw non-structure entities.
*/
-
+ for(auto &part : particles){part->draw();}
for(auto &n : current->npc){
n->loc.y+=(yoff-DRAW_Y_OFFSET);
n->draw();
@@ -610,6 +641,7 @@ LOOP2:
o->loc.y-=(yoff-DRAW_Y_OFFSET);
}
}
+
/*
* If we're drawing the closest/last world, handle and draw the player.
@@ -842,23 +874,52 @@ void World::detect(Player *p){
*/
LOOOOP:
+ static int what = 0;
for(auto &e : hey->entity)
hey->singleDetect(e);
+ for(auto &part : particles){
+ int l;
+ unsigned int i;
+ l=(part->loc.x + part->width / 2 - x_start) / HLINE;
+ if(l < 0) l=0;
+ i = l;
+ if(i > lineCount-1) i=lineCount-1;
+ if(part->loc.y < line[i].y){
+ part->loc.y = line[i].y;
+ part->vely = 0;
+ part->velx = 0;
+ part->canMove = false;
+ }else{
+ if(part->vely > -2)part->vely-=.003 * deltaTime;
+ }
+ what++;
+ }what=0;
if(hey->infront){
hey = hey->infront;
goto LOOOOP;
}
}
-
-void World::addStructure(_TYPE t,float x,float y,World *outside,World *inside){
+void World::addStructure(_TYPE t,BUILD_SUB sub, float x,float y,World *outside,World *inside){
build.push_back(new Structures());
- build.back()->spawn(t,x,y);
+ build.back()->spawn(t,sub,x,y);
build.back()->inWorld=outside;
build.back()->inside=(void *)inside;
entity.push_back(build.back());
}
+void World::addVillage(int bCount, int npcMin, int npcMax,_TYPE t,float x,float y,World *outside,World *inside){
+ std::cout << npcMin << ", " << npcMax << std::endl;
+ int xwasd;
+ for(int i = 0; i < bCount; i++){
+ xwasd = (rand()%(int)x+1000*HLINE);
+ HERE:
+ for(auto &bu : build){
+ if(xwasd > bu->loc.x && xwasd < bu->loc.x+bu->width)goto HERE;
+ }
+ addStructure(t,HOUSE,xwasd,y,outside,inside);
+ }
+}
void World::addMob(int t,float x,float y){
mob.push_back(new Mob(t));
mob.back()->spawn(x,y);
@@ -888,6 +949,11 @@ void World::addObject(ITEM_ID i, bool q, const char *p, float x, float y){
entity.push_back(object.back());
}
+void World::addParticle(float x, float y, float w, float h, float vx, float vy, Color color, int d){
+ particles.push_back(new Particles(x,y,w,h,vx,vy,color,d));
+ particles.back()->canMove = true;
+}
+
/*void World::removeObject(Object i){
object.delete[](i);
}*/
@@ -941,6 +1007,14 @@ World *World::goWorldFront(Player *p){
return this;
}
+bool World::isWorldLeft(void){
+ return toLeft ? true : false;
+}
+
+bool World::isWorldRight(void){
+ return toRight ? true : false;
+}
+
std::vector<void *>thing;
World *World::goInsideStructure(Player *p){
if(!thing.size()){
@@ -1078,18 +1152,13 @@ extern bool inBattle;
Arena::Arena(World *leave,Player *p){
generate(300);
- //door.y = line[299].y;
- //door.x = 100;
- exit = leave;
-
- /*npc.push_back(new NPC());
- entity.push_back(npc.back());
- entity.back()->spawn(door.x,door.y);
- entity.back()->width = HLINE * 12;
- entity.back()->height = HLINE * 16;*/
-
+ addMob(MS_DOOR,100,100);
inBattle = true;
+ exit = leave;
pxy = p->loc;
+
+ star = new vec2[100];
+ memset(star,0,100 * sizeof(vec2));
}
Arena::~Arena(void){
@@ -1101,11 +1170,11 @@ Arena::~Arena(void){
}
World *Arena::exitArena(Player *p){
- npc[0]->loc.x = door.x;
- npc[0]->loc.y = door.y;
- if(p->loc.x + p->width / 2 > door.x &&
- p->loc.x + p->width / 2 < door.x + HLINE * 12 ){
+ if(p->loc.x + p->width / 2 > mob[0]->loc.x &&
+ p->loc.x + p->width / 2 < mob[0]->loc.x + HLINE * 12 ){
inBattle = false;
+ ui::toggleBlackFast();
+ ui::waitForCover();
p->loc = pxy;
return exit;
}else{
diff --git a/xcf/maybeplayer.xcf b/xcf/maybeplayer.xcf
new file mode 100644
index 0000000..5520815
--- /dev/null
+++ b/xcf/maybeplayer.xcf
Binary files differ