]> code.bitgloo.com Git - clyne/gamedev.git/commitdiff
world fixes
authorClyne Sullivan <tullivan99@gmail.com>
Fri, 4 Dec 2015 13:49:49 +0000 (08:49 -0500)
committerClyne Sullivan <tullivan99@gmail.com>
Fri, 4 Dec 2015 13:49:49 +0000 (08:49 -0500)
Changelog
include/world.h
main.cpp
src/gameplay.cpp
src/ui.cpp
src/world.cpp

index a2727957fa90f90b6696019265bf5c4875f8c0a0..903e91e3495b4a91ec31116089c0ddb3a2fc8df4 100644 (file)
--- a/Changelog
+++ b/Changelog
        - improved world background drawing; added that to IndoorWorld's
        - improved inventory functionality
        - fixed issues with cutscenes
+
+12/3/2015:
+==========
+
+       - improved inventory draw
+       - fixed most segfaults, including those when exiting
+       - added -Wall,-Wextra, and -Werror to enforce better/safer coding
index 11918c8ff3cd53473a7932a10229d70e38647327..8aaba0c6c7f6b3ba437aa349520ad15f07150444 100644 (file)
@@ -1,3 +1,10 @@
+/** @file world.h
+ * @brief The world system.
+ * 
+ * This file contains the classes and variables necessary to create an in-game
+ * world.
+ */
+
 #ifndef WORLD_H
 #define WORLD_H
 
 
 #define DAY_CYCLE 3000
 
+/**
+ * The background type enum.
+ * This enum contains all different possibilities for world backgrounds; used
+ * in World::setBackground() to select the appropriate images.
+ */
+
 typedef enum {
-       BG_FOREST,
-       BG_WOODHOUSE
+       BG_FOREST,              /**< A forest theme. */
+       BG_WOODHOUSE    /**< An indoor wooden house theme. */
 } WORLD_BG_TYPE;
 
+/**
+ * The weather type enum.
+ * This enum contains every type of weather currently implemented in the game.
+ * Weather is set by the world somewhere.
+ */
+
 typedef enum {
-       SUNNY = 0,
-       DARK,
-       RAIN
+       SUNNY = 0,      /**< Sunny/daytime */
+       DARK,           /**< Nighttime */
+       RAIN            /**< Rain (not implemented :) )*/
 } WEATHER;
 
+/**
+ * The line structure.
+ * This structure is used to store the world's ground, stored in vertical
+ * lines. Dirt color and grass properties are also kept track of here.
+ */
+
 struct line_t {
-       bool gs;
-       float y,gh[2];
-       unsigned char color;
+       float y;                                /**< Height of this vertical line */
+       bool gs;                                /**< Show grass */
+       float gh[2];                    /**< Height of glass (2 blades per line) */
+       unsigned char color;    /**< Lightness of dirt (brown) */
 } __attribute__ ((packed));
 
-/*
- *     World - creates and handles an area of land
-*/
+/**
+ * The world class. This class does everything a world should do.
+ */
 
 class World {
 protected:
        
-       /*
-        *      struct line_t
-        * 
-        *      The world is stored in an array of lines. Example:
-        * 
-        *                      ||       
-        *                      |||  || |
-        *                      |||||||||
-        * line no. 123456789...
-        * 
+       /**
+        * The line array.
+        * This array is created through 'new' in World::generate(), with an amount
+        * of elements provided by the function.
         */
         
        struct line_t *line;
        
-       /*
-        *      Contains the starting x-coordinate to draw the world at. This should be equal to
-        *      - getWidth() (see world.cpp) / 2
-       */
+       /**
+        * Starting x coordinate.
+        * This x value is the point at which line[0] should reside, can be used to
+        * calculate the width of the world.
+        */
        
        int x_start;
        
-       /*
-        *      Runs world detection for a single entity. This function is used in World->detect()
-        *      to detect the player and all entities in the world.
-       */
+       /**
+        * 
+        */
        
        void singleDetect(Entity *e);
        
index a273f0cd3da603323142bf94b74e2f8b84d46862..2203465f3e87869fc9c00ae253743edc8fb4b0dc 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -212,7 +212,8 @@ static unsigned int fadeIntensity = 0;
  * MAIN ************************************************************************
  *******************************************************************************/
 
-int main(/*int argc, char *argv[]*/){
+int main(int argc, char *argv[]){
+       *argv = (char *)argc;
        gameRunning=false;
 
        /*!
index b4c4b165e2526b7962fa1e17ff367b149a4e48e9..eb5ce7971635c9bb55a6a2fbb44959cafbbb9922 100644 (file)
@@ -29,15 +29,21 @@ int giveTestQuest(NPC *speaker){
        return 0;
 }
 
+//static World *a;
+
 void CUTSCENEEE(Mob *callee){
        player->vel.x = 0;
        
-       ui::dialogBox(player->name,":K.","No way I\'m gettin\' up this hill.");
+       ui::dialogBox(player->name,":K then","No way I\'m gettin\' up this hill.");
        ui::waitForDialog();
 
-       player->right = true;
+       //a = new World();//Arena(currentWorld,player);
+       //a->generate(300);
+       currentWorld = currentWorld->toRight;
+
+       /*player->right = true;
        player->left  = false;
-       player->loc.x += HLINE * 5;
+       player->loc.x += HLINE * 5;*/
        
        callee->alive = false;
 }
index db376b79ebbfc7b5dad29ef9b27af4312df39c53..9e03f97009f8ed2cbeb1c6c4343976f2a671d062 100644 (file)
@@ -475,16 +475,18 @@ namespace ui {
                        putString(x+HLINE,y-fontSize-HLINE,rtext);
                        
                        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
-                                         setFontColor(255,255,0);
-                               }else setFontColor(255,255,255);
+                               setFontColor(255,255,255);
                                dialogOptLoc[i][1]=y-SCREEN_HEIGHT/4+(fontSize+HLINE)*(i+1);
                                dialogOptLoc[i][2]=
                                putStringCentered(offset.x,dialogOptLoc[i][1],dialogOptText[i]);
                                dialogOptLoc[i][0]=offset.x-dialogOptLoc[i][2]/2;
+                               if(mouse.x > dialogOptLoc[i][0] &&
+                                  mouse.x < dialogOptLoc[i][0] + dialogOptLoc[i][2] &&
+                                  mouse.y > dialogOptLoc[i][1] &&
+                                  mouse.y < dialogOptLoc[i][1] + 16 ){ // fontSize
+                                         setFontColor(255,255,0);
+                                         putStringCentered(offset.x,dialogOptLoc[i][1],dialogOptText[i]);
+                               }
                        }
                        setFontColor(255,255,255);
                }
@@ -506,23 +508,28 @@ namespace ui {
                }
                
                /*
-                * Lists all of the quests the player has
+                *      Lists all of the quests the player is currently taking.
                */
                
-               hub.y-=fontSize*1.15;
-               
-               putString(hub.x,hub.y,"Current Quests:");
-
-               for(auto &c : player->qh.current){
-                       hub.y-=fontSize*1.15;
-                       putString(hub.x,hub.y,c->title);
+               if(player->inv->invOpen){
+                       hub.y = player->loc.y + fontSize * 10;
+                       hub.x = player->loc.x;
+                       
+                       putStringCentered(hub.x,hub.y,"Current Quests:");
+                       
+                       for(auto &c : player->qh.current){
+                               hub.y -= fontSize * 1.15;
+                               putString(hub.x,hub.y,c->title);
+                       }       
                }
+
+               
        }
        void handleEvents(void){
-               static bool left=false,right=false;
                static vec2 premouse={0,0};
                static int heyOhLetsGo = 0;
                unsigned char i;
+               World *tmp;
                SDL_Event e;
                
                mouse.x=premouse.x+offset.x-(SCREEN_WIDTH/2);
@@ -563,106 +570,128 @@ DONE:
                                KEYDOWN
                        */
                        case SDL_KEYDOWN:
-                       if(SDL_KEY==SDLK_ESCAPE)gameRunning=false;                                                      // Exit the game with ESC
-                       if(!dialogBoxExists&&!fadeEnable){
-                               if(SDL_KEY==SDLK_a){                                                                                            // Move left
-                                       left=true;
-                                       player->vel.x=-.15;
-                                       player->left = true;
-                                       player->right = false;
-                                       currentWorld=currentWorld->goWorldLeft(player);
-                               }
-                               if(SDL_KEY==SDLK_d){                                                                                            // Move right
-                                       right=true;
-                                       player->vel.x=.15;
-                                       player->right = true;
-                                       player->left = false;
-                                       currentWorld=currentWorld->goWorldRight(player);
-                               }
-                               if(SDL_KEY==SDLK_s && player->ground==2){
-                                       player->ground=false;
-                                       player->loc.y-=HLINE*1.5;
-                               }
-                               if(SDL_KEY==SDLK_w){
-                                       if(inBattle){
-                                               currentWorld=((Arena *)currentWorld)->exitArena(player);
-                                       }else currentWorld=currentWorld->goInsideStructure(player);
-                               }
-                               if(SDL_KEY==SDLK_SPACE){                                                                                        // Jump
-                                       if(player->ground){
-                                               player->vel.y=.4;
-                                               player->loc.y+=HLINE*2;
-                                               player->ground=false;
-                                       }
-                               }
-                               World *tmp;
-                               if(SDL_KEY==SDLK_i){
-                                       tmp=currentWorld;
-                                       currentWorld=currentWorld->goWorldBack(player); // Go back a layer if possible  
-                                       if(tmp!=currentWorld){
-                                               currentWorld->detect(player);
-                                               player->vel.y=.2;
-                                               player->loc.y+=HLINE*5;
-                                               player->ground=false;
-                                       }
-                               }
-                               if(SDL_KEY==SDLK_k){
-                                       tmp=currentWorld;
-                                       currentWorld=currentWorld->goWorldFront(player);        // Go forward a layer if possible
-                                       if(tmp!=currentWorld){
-                                               player->loc.y=0;
-                                               currentWorld->behind->detect(player);
-                                               player->vel.y=.2;
-                                               player->ground=false;
-                                       }
-                               }
-
-                               if(SDL_KEY==SDLK_LSHIFT)player->speed = debug?4:3;                                                      // Sprint
-                               if(SDL_KEY==SDLK_LCTRL)player->speed = .5;
-                       }
-                               if(SDL_KEY==SDLK_p)toggleBlack();
-                               if(SDL_KEY==SDLK_F3)debug^=true;
-                               if(((SDL_KEY==SDLK_b) & (SDL_KEY==SDLK_F3)))posFlag^=true;
-                               if(SDL_KEY==SDLK_e){
-                                       if(heyOhLetsGo == 0){
-                                               heyOhLetsGo = loops;
-                                               player->inv->mouseSel = false;
-                                       }
-                                       if(loops - heyOhLetsGo >= 2 && !(player->inv->invOpen) && !(player->inv->selected)){
-                                               player->inv->invHover=true;
-                                               //heyOhLetsGo = 0;
+                               if(!dialogBoxExists&&!fadeEnable){
+                                       switch(SDL_KEY){
+                                       case SDLK_ESCAPE:
+                                               gameRunning=false;
+                                               break;
+                                       case SDLK_a:
+                                               player->vel.x=-.15;
+                                               player->left = true;
+                                               player->right = false;
+                                               currentWorld=currentWorld->goWorldLeft(player);
+                                               break;
+                                       case SDLK_d:
+                                               player->vel.x=.15;
+                                               player->right = true;
+                                               player->left = false;
+                                               currentWorld=currentWorld->goWorldRight(player);
+                                               break;
+                                       case SDLK_s:
+                                               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);
+                                               break;
+                                       case SDLK_SPACE:
+                                               if(player->ground){
+                                                       player->vel.y=.4;
+                                                       player->loc.y+=HLINE*2;
+                                                       player->ground=false;
+                                               }
+                                               break;
+                                       case SDLK_i:
+                                               tmp=currentWorld;
+                                               currentWorld=currentWorld->goWorldBack(player); // Go back a layer if possible  
+                                               if(tmp!=currentWorld){
+                                                       currentWorld->detect(player);
+                                                       player->vel.y=.2;
+                                                       player->loc.y+=HLINE*5;
+                                                       player->ground=false;
+                                               }
+                                               break;
+                                       case SDLK_k:
+                                               tmp=currentWorld;
+                                               currentWorld=currentWorld->goWorldFront(player);        // Go forward a layer if possible
+                                               if(tmp!=currentWorld){
+                                                       player->loc.y=0;
+                                                       currentWorld->behind->detect(player);
+                                                       player->vel.y=.2;
+                                                       player->ground=false;
+                                               }
+                                               break;
+                                       case SDLK_LSHIFT:
+                                               player->speed = debug ? 4 : 3;
+                                               break;
+                                       case SDLK_LCTRL:
+                                               player->speed = .5;
+                                               break;
+                                       case SDLK_p:
+                                               toggleBlack();
+                                               break;
+                                       case SDLK_F3:
+                                               debug ^= true;
+                                               break;
+                                       case SDLK_b:
+                                               if(debug)posFlag ^= true;
+                                               break;
+                                       case SDLK_e:
+                                               if(!heyOhLetsGo){
+                                                       heyOhLetsGo = loops;
+                                                       player->inv->mouseSel = false;
+                                               }
+                                               if(loops - heyOhLetsGo >= 2 && !(player->inv->invOpen) && !(player->inv->selected))
+                                                       player->inv->invHover=true;
+                                               break;
+                                       default:
+                                               break;
                                        }
                                }
                                break;
                        /*
-                               KEYUP
-                       */      
+                        *      KEYUP
+                       */
+                       
                        case SDL_KEYUP:
-                               if(SDL_KEY==SDLK_a){left=false;}// Stop the player if movement keys are released
-                               if(SDL_KEY==SDLK_d){right=false;}
-                               if(!left&&!right)player->vel.x=0;
-                               if(SDL_KEY==SDLK_LSHIFT)player->speed = 1;
-                               if(SDL_KEY==SDLK_LCTRL)player->speed = 1;
-                               if(SDL_KEY==SDLK_h)player->health-=5;
-                               if(SDL_KEY==SDLK_f)player->light ^= true;
-                               if(SDL_KEY==SDLK_e){
+                               switch(SDL_KEY){
+                               case SDLK_a:
+                                       player->left = false;
+                                       break;
+                               case SDLK_d:
+                                       player->right = false;
+                                       break;
+                               case SDLK_LSHIFT:
+                               case SDLK_LCTRL:
+                                       player->speed = 1;
+                                       break;
+                               case SDLK_e:
                                        if(player->inv->invHover){
                                                player->inv->invHover = false;
-                                               heyOhLetsGo = 0;
                                        }else{
-                                               if(player->inv->selected == false){
-                                                       player->inv->invOpening ^= true;
-                                                       player->inv->mouseSel = false;
-                                                       heyOhLetsGo = 0;
-                                               }else{
-                                                       player->inv->selected = false;
-                                                       player->inv->mouseSel = false;
-                                                       heyOhLetsGo = 0;
-                                               }
+                                               if(!player->inv->selected)player->inv->invOpening ^= true;
+                                               else player->inv->selected = false;
+                                               player->inv->mouseSel = false;
                                        }
+                                       heyOhLetsGo = 0;
+                                       break;
+                               case SDLK_LEFT:
+                                       if(player->inv->sel)player->inv->sel--;
+                                       break;
+                               case SDLK_RIGHT:
+                                       player->inv->sel++;
+                                       break;
+                               default:
+                                       break;
                                }
-                               if(SDL_KEY==SDLK_RIGHT){player->inv->sel+=1;}
-                               if(SDL_KEY==SDLK_LEFT){if(player->inv->sel!=0)player->inv->sel-=1;}
+                               
+                               if(!player->left&&!player->right)
+                                       player->vel.x=0;
+                                       
                                break;
                        default:
                                break;
@@ -670,7 +699,7 @@ DONE:
                }
                
                if(!dialogBoxExists&&AIpreaddr.size()){ // Flush preloaded AI functions if necessary
-                       for(i=0;i<AIpreaddr.size();i++){
+                       while(!AIpreaddr.empty()){
                                AIpreaddr.front()->addAIFunc(AIpreload.front(),false);
                                AIpreaddr.erase(AIpreaddr.begin());
                                AIpreload.erase(AIpreload.begin());
index 5f8d44c37c094d7c341ee3458b69315efd6a8294..1b90a4b3b811940583a88bb707bb64467453c084 100644 (file)
@@ -321,8 +321,8 @@ void World::draw(Player *p){
        static float yoff=DRAW_Y_OFFSET;        // Initialize stuff
        static int shade,bgshade;
        static World *current;
-       unsigned int i,ie;
-       int is,v_offset,cx_start,width;
+       unsigned int i;
+       int is,ie,v_offset,cx_start,width;
        struct line_t *cline;
        
        bgshade = worldShade << 1; // *2
@@ -467,7 +467,8 @@ LOOP2:
        // ie -> i end
        
        ie=v_offset + (SCREEN_WIDTH / 2 / HLINE) + GEN_INC + HLINE; 
-       if(ie>current->lineCount)ie=current->lineCount;                         // Maximum bound
+       if(ie>(int)current->lineCount)ie=current->lineCount;            // Maximum bound
+       else if(ie < GEN_INC)ie = GEN_INC;
        
        /*
         *      Make more direct variables for quicker referencing.
@@ -499,7 +500,7 @@ LOOP2:
 
        bool hey=false;
        glBegin(GL_QUADS);
-               for(i=is;i<ie-GEN_INC;i++){
+               for(i=is;i<(unsigned)ie-GEN_INC;i++){
                        cline[i].y+=(yoff-DRAW_Y_OFFSET);                                                                                                                       // Add the y offset
                        if(!cline[i].y){
                                cline[i].y+=50;
@@ -526,7 +527,7 @@ LOOP2:
        
        float cgh[2];
        glBegin(GL_QUADS);
-               for(i=is;i<ie-GEN_INC;i++){
+               for(i=is;i<(unsigned)ie-GEN_INC;i++){
                        
                        /*
                         *      Load the current line's grass values
@@ -1043,15 +1044,15 @@ extern bool inBattle;
 
 Arena::Arena(World *leave,Player *p){
        generate(300);
-       door.y = line[299].y;
-       door.x = 100;
+       //door.y = line[299].y;
+       //door.x = 100;
        exit = leave;
        
-       npc.push_back(new NPC());
+       /*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;
+       entity.back()->height = HLINE * 16;*/
        
        inBattle = true;
        pxy = p->loc;