Adventure game written for ECE2035 at the Georgia Institute of Technology

Dependencies:   mbed wave_player 4DGL-uLCD-SE MMA8452

Committer:
trmontgomery
Date:
Tue Apr 17 17:17:20 2018 +0000
Revision:
2:0876296d9473
Parent:
0:35660d7952f7
Child:
3:289762133fd6
Baseline completed + 3 features

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rconnorlawson 0:35660d7952f7 1 #include "map.h"
rconnorlawson 0:35660d7952f7 2
rconnorlawson 0:35660d7952f7 3 #include "globals.h"
rconnorlawson 0:35660d7952f7 4 #include "graphics.h"
rconnorlawson 0:35660d7952f7 5
rconnorlawson 0:35660d7952f7 6 /**
rconnorlawson 0:35660d7952f7 7 * The Map structure. This holds a HashTable for all the MapItems, along with
rconnorlawson 0:35660d7952f7 8 * values for the width and height of the Map.
rconnorlawson 0:35660d7952f7 9 */
trmontgomery 2:0876296d9473 10 typedef struct{
rconnorlawson 0:35660d7952f7 11 HashTable* items;
rconnorlawson 0:35660d7952f7 12 int w, h;
trmontgomery 2:0876296d9473 13 }Map;
rconnorlawson 0:35660d7952f7 14
rconnorlawson 0:35660d7952f7 15 /**
rconnorlawson 0:35660d7952f7 16 * Storage area for the maps.
rconnorlawson 0:35660d7952f7 17 * This is a global variable, but can only be access from this file because it
rconnorlawson 0:35660d7952f7 18 * is static.
rconnorlawson 0:35660d7952f7 19 */
trmontgomery 2:0876296d9473 20 static Map maps[2];
rconnorlawson 0:35660d7952f7 21 static int active_map;
rconnorlawson 0:35660d7952f7 22
rconnorlawson 0:35660d7952f7 23 /**
rconnorlawson 0:35660d7952f7 24 * The first step in HashTable access for the map is turning the two-dimensional
rconnorlawson 0:35660d7952f7 25 * key information (x, y) into a one-dimensional unsigned integer.
rconnorlawson 0:35660d7952f7 26 * This function should uniquely map (x,y) onto the space of unsigned integers.
rconnorlawson 0:35660d7952f7 27 */
rconnorlawson 0:35660d7952f7 28 static unsigned XY_KEY(int X, int Y) {
rconnorlawson 0:35660d7952f7 29 // TODO: Fix me!
trmontgomery 2:0876296d9473 30 //could just calculate the single array position of the location in the map using the offset formula from P1
trmontgomery 2:0876296d9473 31 return (map.w)*Y + X;
rconnorlawson 0:35660d7952f7 32 }
rconnorlawson 0:35660d7952f7 33
rconnorlawson 0:35660d7952f7 34 /**
rconnorlawson 0:35660d7952f7 35 * This is the hash function actually passed into createHashTable. It takes an
rconnorlawson 0:35660d7952f7 36 * unsigned key (the output of XY_KEY) and turns it into a hash value (some
rconnorlawson 0:35660d7952f7 37 * small non-negative integer).
rconnorlawson 0:35660d7952f7 38 */
rconnorlawson 0:35660d7952f7 39 unsigned map_hash(unsigned key)
rconnorlawson 0:35660d7952f7 40 {
rconnorlawson 0:35660d7952f7 41 // TODO: Fix me!
trmontgomery 2:0876296d9473 42 return key%5;
rconnorlawson 0:35660d7952f7 43 }
rconnorlawson 0:35660d7952f7 44
rconnorlawson 0:35660d7952f7 45 void maps_init()
rconnorlawson 0:35660d7952f7 46 {
rconnorlawson 0:35660d7952f7 47 // TODO: Implement!
rconnorlawson 0:35660d7952f7 48 // Initialize hash table
rconnorlawson 0:35660d7952f7 49 // Set width & height
trmontgomery 2:0876296d9473 50 map.items = createHashTable(map_hash, 5);
trmontgomery 2:0876296d9473 51 map.w = 50;
trmontgomery 2:0876296d9473 52 map.h = 50;
rconnorlawson 0:35660d7952f7 53 }
rconnorlawson 0:35660d7952f7 54
rconnorlawson 0:35660d7952f7 55 Map* get_active_map()
rconnorlawson 0:35660d7952f7 56 {
trmontgomery 2:0876296d9473 57
trmontgomery 2:0876296d9473 58 return &maps[active_map];
rconnorlawson 0:35660d7952f7 59 }
rconnorlawson 0:35660d7952f7 60
rconnorlawson 0:35660d7952f7 61 Map* set_active_map(int m)
rconnorlawson 0:35660d7952f7 62 {
rconnorlawson 0:35660d7952f7 63 active_map = m;
trmontgomery 2:0876296d9473 64 return &maps[active_map];
rconnorlawson 0:35660d7952f7 65 }
rconnorlawson 0:35660d7952f7 66
rconnorlawson 0:35660d7952f7 67 void print_map()
rconnorlawson 0:35660d7952f7 68 {
rconnorlawson 0:35660d7952f7 69 // As you add more types, you'll need to add more items to this array.
rconnorlawson 0:35660d7952f7 70 char lookup[] = {'W', 'P'};
rconnorlawson 0:35660d7952f7 71 for(int y = 0; y < map_height(); y++)
rconnorlawson 0:35660d7952f7 72 {
rconnorlawson 0:35660d7952f7 73 for (int x = 0; x < map_width(); x++)
rconnorlawson 0:35660d7952f7 74 {
rconnorlawson 0:35660d7952f7 75 MapItem* item = get_here(x,y);
rconnorlawson 0:35660d7952f7 76 if (item) pc.printf("%c", lookup[item->type]);
rconnorlawson 0:35660d7952f7 77 else pc.printf(" ");
rconnorlawson 0:35660d7952f7 78 }
rconnorlawson 0:35660d7952f7 79 pc.printf("\r\n");
rconnorlawson 0:35660d7952f7 80 }
rconnorlawson 0:35660d7952f7 81 }
rconnorlawson 0:35660d7952f7 82
rconnorlawson 0:35660d7952f7 83 int map_width()
rconnorlawson 0:35660d7952f7 84 {
trmontgomery 2:0876296d9473 85 get_active_map()
trmontgomery 2:0876296d9473 86 return map.w;
rconnorlawson 0:35660d7952f7 87 }
rconnorlawson 0:35660d7952f7 88
rconnorlawson 0:35660d7952f7 89 int map_height()
rconnorlawson 0:35660d7952f7 90 {
trmontgomery 2:0876296d9473 91 return map.h;
rconnorlawson 0:35660d7952f7 92 }
rconnorlawson 0:35660d7952f7 93
rconnorlawson 0:35660d7952f7 94 int map_area()
rconnorlawson 0:35660d7952f7 95 {
trmontgomery 2:0876296d9473 96 return map.h*map.w;
rconnorlawson 0:35660d7952f7 97 }
rconnorlawson 0:35660d7952f7 98
rconnorlawson 0:35660d7952f7 99 MapItem* get_north(int x, int y)
rconnorlawson 0:35660d7952f7 100 {
trmontgomery 2:0876296d9473 101 Map* map = get_active_map();
trmontgomery 2:0876296d9473 102 //get key of item north of the location
trmontgomery 2:0876296d9473 103 int index = XY_KEY(x, y-1);
trmontgomery 2:0876296d9473 104 return (MapItem*)getItem(map->items, index);
rconnorlawson 0:35660d7952f7 105 }
rconnorlawson 0:35660d7952f7 106
rconnorlawson 0:35660d7952f7 107 MapItem* get_south(int x, int y)
rconnorlawson 0:35660d7952f7 108 {
trmontgomery 2:0876296d9473 109 Map* map = get_active_map();
trmontgomery 2:0876296d9473 110 int index = XY_KEY(x, y+1);
trmontgomery 2:0876296d9473 111 return (MapItem*)getItem(map->items, index);
rconnorlawson 0:35660d7952f7 112 }
rconnorlawson 0:35660d7952f7 113
rconnorlawson 0:35660d7952f7 114 MapItem* get_east(int x, int y)
rconnorlawson 0:35660d7952f7 115 {
trmontgomery 2:0876296d9473 116 Map* map = get_active_map();
trmontgomery 2:0876296d9473 117 int index = XY_KEY(x-1, y); //wtf why does this work boi
trmontgomery 2:0876296d9473 118 return (MapItem*)getItem(map->items, index);
rconnorlawson 0:35660d7952f7 119 }
rconnorlawson 0:35660d7952f7 120
rconnorlawson 0:35660d7952f7 121 MapItem* get_west(int x, int y)
rconnorlawson 0:35660d7952f7 122 {
trmontgomery 2:0876296d9473 123 Map* map = get_active_map();
trmontgomery 2:0876296d9473 124 int index = XY_KEY(x+1, y); //shouldn't this be minus?
trmontgomery 2:0876296d9473 125 return (MapItem*)getItem(map->items, index);
rconnorlawson 0:35660d7952f7 126 }
rconnorlawson 0:35660d7952f7 127
rconnorlawson 0:35660d7952f7 128 MapItem* get_here(int x, int y)
rconnorlawson 0:35660d7952f7 129 {
trmontgomery 2:0876296d9473 130 Map* map = get_active_map();
trmontgomery 2:0876296d9473 131 int index = XY_KEY(x, y);
trmontgomery 2:0876296d9473 132 return (MapItem*)getItem(map->items, index);
rconnorlawson 0:35660d7952f7 133 }
rconnorlawson 0:35660d7952f7 134
rconnorlawson 0:35660d7952f7 135
rconnorlawson 0:35660d7952f7 136 void map_erase(int x, int y)
rconnorlawson 0:35660d7952f7 137 {
trmontgomery 2:0876296d9473 138 Map* map = get_active_map();
trmontgomery 2:0876296d9473 139 int index = XY_KEY(x, y);
trmontgomery 2:0876296d9473 140 deleteItem(map->items, index);
trmontgomery 2:0876296d9473 141 }
trmontgomery 2:0876296d9473 142
trmontgomery 2:0876296d9473 143 void omni(){
trmontgomery 2:0876296d9473 144 Map* map = get_active_map();
trmontgomery 2:0876296d9473 145 int h = map -> h;
trmontgomery 2:0876296d9473 146 int w = map -> w;
trmontgomery 2:0876296d9473 147 for (int i = 0; i < h; i++){
trmontgomery 2:0876296d9473 148 for(int j = 0; j < w; j++){
trmontgomery 2:0876296d9473 149 MapItem* object = (MapItem*)getItem(map->items, XY_KEY(i,j));
trmontgomery 2:0876296d9473 150 if(object) object -> walkable = true;
trmontgomery 2:0876296d9473 151 }
trmontgomery 2:0876296d9473 152 }
rconnorlawson 0:35660d7952f7 153 }
rconnorlawson 0:35660d7952f7 154
rconnorlawson 0:35660d7952f7 155 void add_wall(int x, int y, int dir, int len)
rconnorlawson 0:35660d7952f7 156 {
rconnorlawson 0:35660d7952f7 157 for(int i = 0; i < len; i++)
rconnorlawson 0:35660d7952f7 158 {
rconnorlawson 0:35660d7952f7 159 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
rconnorlawson 0:35660d7952f7 160 w1->type = WALL;
rconnorlawson 0:35660d7952f7 161 w1->draw = draw_wall;
rconnorlawson 0:35660d7952f7 162 w1->walkable = false;
rconnorlawson 0:35660d7952f7 163 w1->data = NULL;
rconnorlawson 0:35660d7952f7 164 unsigned key = (dir == HORIZONTAL) ? XY_KEY(x+i, y) : XY_KEY(x, y+i);
rconnorlawson 0:35660d7952f7 165 void* val = insertItem(get_active_map()->items, key, w1);
rconnorlawson 0:35660d7952f7 166 if (val) free(val); // If something is already there, free it
rconnorlawson 0:35660d7952f7 167 }
rconnorlawson 0:35660d7952f7 168 }
rconnorlawson 0:35660d7952f7 169
rconnorlawson 0:35660d7952f7 170 void add_plant(int x, int y)
rconnorlawson 0:35660d7952f7 171 {
rconnorlawson 0:35660d7952f7 172 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
rconnorlawson 0:35660d7952f7 173 w1->type = PLANT;
rconnorlawson 0:35660d7952f7 174 w1->draw = draw_plant;
rconnorlawson 0:35660d7952f7 175 w1->walkable = true;
rconnorlawson 0:35660d7952f7 176 w1->data = NULL;
rconnorlawson 0:35660d7952f7 177 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
rconnorlawson 0:35660d7952f7 178 if (val) free(val); // If something is already there, free it
trmontgomery 2:0876296d9473 179 }
trmontgomery 2:0876296d9473 180
trmontgomery 2:0876296d9473 181 void add_rock(int x, int y)
trmontgomery 2:0876296d9473 182 {
trmontgomery 2:0876296d9473 183 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
trmontgomery 2:0876296d9473 184 w1->type = ROCK;
trmontgomery 2:0876296d9473 185 w1->draw = draw_rock;
trmontgomery 2:0876296d9473 186 w1->walkable = false;
trmontgomery 2:0876296d9473 187 Rock* r = (Rock*) malloc(sizeof(Rock));
trmontgomery 2:0876296d9473 188 //r -> is_pushed = false;
trmontgomery 2:0876296d9473 189 //r -> wall_touch = false;
trmontgomery 2:0876296d9473 190 //r -> x = x;
trmontgomery 2:0876296d9473 191 //r -> y = y;
trmontgomery 2:0876296d9473 192 w1->data = r;
trmontgomery 2:0876296d9473 193 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
trmontgomery 2:0876296d9473 194 if (val) free(val); // If something is already there, free it
trmontgomery 2:0876296d9473 195 }
trmontgomery 2:0876296d9473 196
trmontgomery 2:0876296d9473 197 void add_npc(int x, int y)
trmontgomery 2:0876296d9473 198 {
trmontgomery 2:0876296d9473 199 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
trmontgomery 2:0876296d9473 200 w1->type = NPC;
trmontgomery 2:0876296d9473 201 w1->draw = draw_npc;
trmontgomery 2:0876296d9473 202 w1->walkable = false;
trmontgomery 2:0876296d9473 203 NonPlayer* npc = (NonPlayer*) malloc(sizeof(NonPlayer));
trmontgomery 2:0876296d9473 204 npc->quest_requested = false;
trmontgomery 2:0876296d9473 205 npc->quest_complete = false;
trmontgomery 2:0876296d9473 206 npc->has_key = true;
trmontgomery 2:0876296d9473 207 w1->data = npc;
trmontgomery 2:0876296d9473 208 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
trmontgomery 2:0876296d9473 209 if (val) free(val); // If something is already there, free it
trmontgomery 2:0876296d9473 210 }
trmontgomery 2:0876296d9473 211
trmontgomery 2:0876296d9473 212 void add_door(int x, int y)
trmontgomery 2:0876296d9473 213 {
trmontgomery 2:0876296d9473 214 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
trmontgomery 2:0876296d9473 215 w1->type = DOOR;
trmontgomery 2:0876296d9473 216 w1->draw = draw_door;
trmontgomery 2:0876296d9473 217 w1->walkable = false;
trmontgomery 2:0876296d9473 218 int o = false;
trmontgomery 2:0876296d9473 219 w1->data = &o;
trmontgomery 2:0876296d9473 220 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
trmontgomery 2:0876296d9473 221 if (val) free(val); // If something is already there, free it
trmontgomery 2:0876296d9473 222 }
trmontgomery 2:0876296d9473 223
trmontgomery 2:0876296d9473 224 void add_goal(int x, int y)
trmontgomery 2:0876296d9473 225 {
trmontgomery 2:0876296d9473 226 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
trmontgomery 2:0876296d9473 227 w1->type = GOAL;
trmontgomery 2:0876296d9473 228 w1->draw = draw_goal;
trmontgomery 2:0876296d9473 229 w1->walkable = false;
trmontgomery 2:0876296d9473 230 int o = false;
trmontgomery 2:0876296d9473 231 w1->data = &o;
trmontgomery 2:0876296d9473 232 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
trmontgomery 2:0876296d9473 233 if (val) free(val); // If something is already there, free it
trmontgomery 2:0876296d9473 234 }
trmontgomery 2:0876296d9473 235
trmontgomery 2:0876296d9473 236 void add_spike(int x, int y)
trmontgomery 2:0876296d9473 237 {
trmontgomery 2:0876296d9473 238 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
trmontgomery 2:0876296d9473 239 w1->type = SPIKE;
trmontgomery 2:0876296d9473 240 w1->draw = draw_spike;
trmontgomery 2:0876296d9473 241 w1->walkable = false;
trmontgomery 2:0876296d9473 242 int o = false;
trmontgomery 2:0876296d9473 243 w1->data = &o;
trmontgomery 2:0876296d9473 244 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
trmontgomery 2:0876296d9473 245 if (val) free(val); // If something is already there, free it
rconnorlawson 0:35660d7952f7 246 }