aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorClyne Sullivan <tullivan99@gmail.com>2016-02-12 08:48:50 -0500
committerClyne Sullivan <tullivan99@gmail.com>2016-02-12 08:48:50 -0500
commit51b0b214967ca4770b1674431cffa15777b0ec06 (patch)
tree2165f359d803bbc1944f5bcc10a377b06f6676e7 /src
parentba7df965e73e121820f20e3a0e57631d078c11db (diff)
parent2a4a514b654ef0e08134a116c658d49a8f16cfe7 (diff)
mergge
Diffstat (limited to 'src')
-rw-r--r--src/Texture.cpp24
-rw-r--r--src/entities.cpp58
-rw-r--r--src/ui.cpp16
-rw-r--r--src/world.cpp110
4 files changed, 122 insertions, 86 deletions
diff --git a/src/Texture.cpp b/src/Texture.cpp
index e715b1e..1487dcd 100644
--- a/src/Texture.cpp
+++ b/src/Texture.cpp
@@ -4,6 +4,7 @@
struct texture_t {
char *name;
GLuint tex;
+ dim2 dim;
} __attribute__ ((packed));
struct index_t{
@@ -59,17 +60,28 @@ namespace Texture{
GL_UNSIGNED_BYTE,
image->pixels
);
-
- SDL_FreeSurface(image); // Free the surface
LoadedTexture[LoadedTextureCounter] = new struct texture_t; //(struct texture_t *)malloc(sizeof(struct texture_t));
LoadedTexture[LoadedTextureCounter]->name = new char[strlen(fileName)+1]; //(char *)malloc(safe_strlen(fileName));
LoadedTexture[LoadedTextureCounter]->tex = object;
strcpy(LoadedTexture[LoadedTextureCounter]->name,fileName);
+ LoadedTexture[LoadedTextureCounter]->dim.x = image->w;
+ LoadedTexture[LoadedTextureCounter]->dim.y = image->h;
LoadedTextureCounter++;
+ SDL_FreeSurface(image); // Free the surface
+
return object;
}
+
+ dim2 imageDim(const char *fileName){
+ for(unsigned int i=0;i<LoadedTextureCounter;i++){
+ if(!strcmp(LoadedTexture[i]->name,fileName)){
+ return LoadedTexture[i]->dim;
+ }
+ }
+ return {0,0};
+ }
void freeTextures(void){
for(unsigned int i=0;i<LoadedTextureCounter;i++){
@@ -158,6 +170,14 @@ Texturec::Texturec(uint amt, ...){
va_end(fNames);
}
+Texturec::Texturec(std::vector<std::string>v){
+ texState = 0;
+ image = new GLuint[v.size()];
+ for(unsigned int i = 0; i < v.size(); i++){
+ image[i] = Texture::loadTexture(v[i].c_str());
+ }
+}
+
Texturec::Texturec(uint amt,const char **paths){
texState = 0;
image = new GLuint[amt];
diff --git a/src/entities.cpp b/src/entities.cpp
index aa98809..71a0890 100644
--- a/src/entities.cpp
+++ b/src/entities.cpp
@@ -14,15 +14,6 @@ extern Player *player;
extern const char *itemName;
-std::string sTexLoc[] = { "assets/townhall.png",
- "assets/house1.png",
- "assets/house2.png",
- "assets/house1.png",
- "assets/house1.png",
- "assets/fountain1.png",
- "assets/lampPost1.png",
- "assets/brazzier.png"};
-
GLuint waterTex;
void initEntity(){
@@ -97,15 +88,15 @@ Player::Player(){ //sets all of the player specific traits on object creation
subtype = 0;
health = maxHealth = 100;
speed = 1;
- tex = new Texturec(9, "assets/playerk.png",
- "assets/playerk1.png",
- "assets/playerk2.png",
- "assets/playerk3.png",
- "assets/playerk4.png",
- "assets/playerk5.png",
- "assets/playerk6.png",
- "assets/playerk7.png",
- "assets/playerk8.png");
+ tex = new Texturec(9, "assets/player/playerk.png",
+ "assets/player/playerk1.png",
+ "assets/player/playerk2.png",
+ "assets/player/playerk3.png",
+ "assets/player/playerk4.png",
+ "assets/player/playerk5.png",
+ "assets/player/playerk6.png",
+ "assets/player/playerk7.png",
+ "assets/player/playerk8.png");
inv = new Inventory(PLAYER_INV_SIZE);
}
Player::~Player(){
@@ -461,6 +452,7 @@ unsigned int Structures::spawn(BUILD_SUB sub, float x, float y){
alive = true;
bsubtype = sub;
+ dim2 dim;
/*
* tempN is the amount of entities that will be spawned in the village. Currently the village
@@ -469,33 +461,11 @@ unsigned int Structures::spawn(BUILD_SUB sub, float x, float y){
//unsigned int tempN = (getRand() % 5 + 2);
switch(sub){
- case TOWN_HALL:
- tex = new Texturec(1, sTexLoc[sub].c_str());
- width = 50 * HLINE;
- height = 40 * HLINE;
-
- break;
- case HOUSE:
- tex = new Texturec(1, sTexLoc[sub].c_str());
- width = 50 * HLINE;
- height = 40 * HLINE;
- break;
- case FOUNTAIN:
- tex = new Texturec(1, sTexLoc[sub].c_str());
- width = 50 * HLINE;
- height = 40 * HLINE;
- break;
- case LAMP_POST:
- tex = new Texturec(1, sTexLoc[sub].c_str());
- width = 10 * HLINE;
- height = 40 * HLINE;
- break;
- case FIRE_PIT:
- tex = new Texturec(1, sTexLoc[sub].c_str());
- width = 12 * HLINE;
- height = 12 * HLINE;
- break;
default:
+ tex = new Texturec(1, textureLoc ? textureLoc : inWorld->sTexLoc[sub].c_str());
+ dim = Texture::imageDim(textureLoc ? textureLoc : inWorld->sTexLoc[sub].c_str());
+ width = dim.x;
+ height = dim.y;
break;
}
return 0;
diff --git a/src/ui.cpp b/src/ui.cpp
index 6dad3f0..3d635ab 100644
--- a/src/ui.cpp
+++ b/src/ui.cpp
@@ -146,15 +146,10 @@ namespace ui {
#ifdef DEBUG
DEBUG_printf("Initialized FreeType2.\n",NULL);
#endif // DEBUG
-
dialogClick = Mix_LoadWAV("assets/sounds/click.wav");
- if(dialogClick == NULL){
- std::cout<<Mix_GetError()<<std::endl;
- abort();
- }
battleStart = Mix_LoadWAV("assets/sounds/frig.wav");
sanic = Mix_LoadWAV("assets/sounds/sanic.wav");
- Mix_Volume(1,50);
+ //Mix_Volume(1,50);
}
void destroyFonts(void){
@@ -263,9 +258,11 @@ namespace ui {
* Draws a character at the specified coordinates, aborting if the character is unknown.
*/
- vec2 putChar(float x,float y,char c){
+ vec2 putChar(float xx,float yy,char c){
vec2 c1,c2;
-
+
+ int x = xx, y = yy;
+
/*
* Get the width and height of the rendered character.
*/
@@ -733,7 +730,6 @@ namespace ui {
*/
void drawMenu(Menu *menu){
-
setFontSize(24);
SDL_Event e;
@@ -1238,7 +1234,7 @@ DONE:
//currentWorld->addVillage(player->loc.x, player->loc.y, 5, 10, 100, NULL);
break;
case SDLK_b:
- currentWorld->addStructure(FIRE_PIT, player->loc.x, player->loc.y, NULL);
+ currentWorld->addStructure(FIRE_PIT, player->loc.x, player->loc.y, NULL, NULL);
currentWorld->addLight({player->loc.x + SCREEN_WIDTH/2, player->loc.y},{1.0f,1.0f,1.0f});
break;
case SDLK_F12:
diff --git a/src/world.cpp b/src/world.cpp
index 2189007..25b7d35 100644
--- a/src/world.cpp
+++ b/src/world.cpp
@@ -17,23 +17,49 @@ bool worldInside = false; // True if player is inside a structure
WEATHER weather = SUNNY;
-const char *bgPaths[2][7]={
- {"assets/bg.png", // Daytime background
- "assets/bgn.png", // Nighttime background
- "assets/bgFarMountain.png", // Furthest layer
- "assets/forestTileBack.png", // Closer layer
- "assets/forestTileMid.png", // Near layer
- "assets/forestTileFront.png", // Closest layer
- "assets/dirt.png"}, // Dirt
- {"assets/bgWoodTile.png",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL}
+// const char *bgPaths[2][7]={
+// {"assets/bg.png", // Daytime background
+// "assets/bgn.png", // Nighttime background
+// "assets/bgFarMountain.png", // Furthest layer
+// "assets/forestTileBack.png", // Closer layer
+// "assets/forestTileMid.png", // Near layer
+// "assets/forestTileFront.png", // Closest layer
+// "assets/dirt.png"}, // Dirt
+// {"assets/bgWoodTile.png",
+// NULL,
+// NULL,
+// NULL,
+// NULL,
+// NULL}
+// };
+
+const std::string bgPaths[2][8]={
+ {"bg.png", // Daytime background
+ "bgn.png", // Nighttime background
+ "bgFarMountain.png", // Furthest layer
+ "forestTileBack.png", // Closer layer
+ "forestTileMid.png", // Near layer
+ "forestTileFront.png", // Closest layer
+ "dirt.png", // Dirt
+ "grass.png"}, // Grass
+ {"bgWoodTile.png",
+ "bgWoodTile.png",
+ "bgWoodTile.png",
+ "bgWoodTile.png",
+ "bgWoodTile.png",
+ "bgWoodTile.png",
+ "bgWoodTile.png",
+ "bgWoodTile.png"}
};
-Texturec *grassT;
+const std::string buildPaths[] = { "townhall.png",
+ "house1.png",
+ "house2.png",
+ "house1.png",
+ "house1.png",
+ "fountain1.png",
+ "lampPost1.png",
+ "brazzier.png"};
const float bgDraw[3][3]={
{100,240,.6 },
@@ -56,14 +82,34 @@ void World::setBackground(WORLD_BG_TYPE bgt){
bgType = bgt;
switch(bgt){
case BG_FOREST:
- bgTex = new Texturec(7,bgPaths[0]);
+ bgTex = new Texturec(bgFiles);
break;
case BG_WOODHOUSE:
- bgTex = new Texturec(1,bgPaths[1]);
+ bgTex = new Texturec(bgFilesIndoors);
break;
}
}
+void World::setStyle(const char* pre){
+ std::string prefix = pre ? pre : "assets/style/classic/";
+ for(uint i = 0; i < arrAmt(buildPaths);i++){
+ sTexLoc.push_back(prefix);
+ sTexLoc.back() += buildPaths[i];
+ std::cout << sTexLoc.back() << std::endl;
+ }
+ prefix += "bg/";
+ for(uint i = 0; i < arrAmt(bgPaths[0]);i++){
+ bgFiles.push_back(prefix);
+ bgFiles.back() += bgPaths[0][i];
+ std::cout << bgFiles.back() << std::endl;
+ }
+ for(uint i = 0; i < arrAmt(bgPaths[1]);i++){
+ bgFilesIndoors.push_back(prefix);
+ bgFilesIndoors.back() += bgPaths[1][i];
+ std::cout << bgFilesIndoors.back() << std::endl;
+ }
+}
+
World::World(void){
bgm = NULL;
@@ -78,7 +124,6 @@ World::World(void){
star = new vec2[100];
memset(star,0,100 * sizeof(vec2));
- grassT = new Texturec(1,"assets/grass.png");
}
void World::deleteEntities(void){
@@ -592,10 +637,10 @@ void World::draw(Player *p){
hey=true;
glColor4ub(0,0,0,255);
}else safeSetColorA(150+shade*2,150+shade*2,150+shade*2,255);
- glTexCoord2i(0,0);glVertex2i(cx_start+i*HLINE ,cline[i].y-GRASS_HEIGHT);
- glTexCoord2i(1,0);glVertex2i(cx_start+i*HLINE+HLINE,cline[i].y-GRASS_HEIGHT);
+ glTexCoord2i(0,0); glVertex2i(cx_start+i*HLINE ,cline[i].y-GRASS_HEIGHT);
+ glTexCoord2i(1,0); glVertex2i(cx_start+i*HLINE+HLINE,cline[i].y-GRASS_HEIGHT);
glTexCoord2i(1,(int)(cline[i].y/64)+cline[i].color);glVertex2i(cx_start+i*HLINE+HLINE,0);
- glTexCoord2i(0,(int)(cline[i].y/64)+cline[i].color);glVertex2i(cx_start+i*HLINE ,0);
+ glTexCoord2i(0,(int)(cline[i].y/64)+cline[i].color);glVertex2i(cx_start+i*HLINE ,0);
cline[i].y-=(yoff-DRAW_Y_OFFSET); // Restore the line's y value
if(hey){
hey=false;
@@ -613,7 +658,7 @@ void World::draw(Player *p){
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
- grassT->bind(0);
+ bgTex->bindNext();
glUseProgram(shaderProgram);
glUniform1i(glGetUniformLocation(shaderProgram, "sampler"), 0);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //for the s direction
@@ -945,10 +990,12 @@ void World::detect(Player *p){
goto LOOOOP;
}*/
}
-void World::addStructure(BUILD_SUB sub, float x,float y,const char *inside){
+void World::addStructure(BUILD_SUB sub, float x,float y, char *tex, const char *inside){
build.push_back(new Structures());
+ build.back()->inWorld = this;
+ build.back()->textureLoc = tex;
build.back()->spawn(sub,x,y);
-
+
if(inside)
strcpy((build.back()->inside = new char[1 + strlen(inside)]),inside);
else
@@ -1068,8 +1115,7 @@ char *World::setToRight(const char *file){
World *World::goWorldLeft(Player *p){
World *tmp;
-
- if(toLeft && p->loc.x < x_start + HLINE * 15){
+ if(toLeft && p->loc.x < x_start + (int)HLINE * 15){
tmp = loadWorldFromXML(toLeft);
p->loc.x = -tmp->x_start - HLINE * 10;
@@ -1475,6 +1521,7 @@ World *loadWorldFromXMLNoSave(const char *path){
tmp->setToRight(ptr);
else abort();
}else if(!strcmp(name,"style")){
+ tmp->setStyle(wxml->Attribute("folder"));
tmp->setBackground((WORLD_BG_TYPE)wxml->UnsignedAttribute("background"));
tmp->setBGM(wxml->Attribute("bgm"));
}else if(!strcmp(name,"generation")){
@@ -1520,10 +1567,13 @@ World *loadWorldFromXMLNoSave(const char *path){
}else if(!strcmp(name,"structure")){
ptr = wxml->Attribute("inside");
- if(wxml->QueryFloatAttribute("x",&spawnx) != XML_NO_ERROR)
- tmp->addStructure((BUILD_SUB)wxml->UnsignedAttribute("type"),getRand() % tmp->getTheWidth() / 2.0f,100,ptr);
- else
- tmp->addStructure((BUILD_SUB)wxml->UnsignedAttribute("type"),spawnx,wxml->FloatAttribute("y"),ptr);
+ tmp->addStructure((BUILD_SUB)wxml->UnsignedAttribute("type"),
+ wxml->QueryFloatAttribute("x",&spawnx) != XML_NO_ERROR ?
+ getRand() % tmp->getTheWidth() / 2.0f :
+ spawnx,
+ 100,
+ (char*)wxml->Attribute("texture"),
+ ptr);
}else if(!strcmp(name,"trigger")){
tmp->addMob(MS_TRIGGER,wxml->FloatAttribute("x"),0,commonTriggerFunc);
tmp->mob.back()->heyid = wxml->Attribute("id");