Undertale

Dependencies:   mbed wave_player 4DGL-uLCD-SE MMA8452

Committer:
cdong49
Date:
Sun Apr 14 17:02:57 2019 +0000
Revision:
4:3883ea0930ec
Parent:
3:ab8f2b4b44b0
FINAL;

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 */
rconnorlawson 0:35660d7952f7 10 struct Map {
rconnorlawson 0:35660d7952f7 11 HashTable* items;
rconnorlawson 0:35660d7952f7 12 int w, h;
rconnorlawson 0:35660d7952f7 13 };
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 */
rconnorlawson 0:35660d7952f7 20 static Map map;
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) {
cdong49 2:3caab2cc0476 29 return X*(map.h)+Y;
rconnorlawson 0:35660d7952f7 30 }
rconnorlawson 0:35660d7952f7 31
rconnorlawson 0:35660d7952f7 32 /**
rconnorlawson 0:35660d7952f7 33 * This is the hash function actually passed into createHashTable. It takes an
rconnorlawson 0:35660d7952f7 34 * unsigned key (the output of XY_KEY) and turns it into a hash value (some
rconnorlawson 0:35660d7952f7 35 * small non-negative integer).
rconnorlawson 0:35660d7952f7 36 */
rconnorlawson 0:35660d7952f7 37 unsigned map_hash(unsigned key)
rconnorlawson 0:35660d7952f7 38 {
cdong49 2:3caab2cc0476 39 return key%NUMBUCKETS;
rconnorlawson 0:35660d7952f7 40 }
rconnorlawson 0:35660d7952f7 41
rconnorlawson 0:35660d7952f7 42 void maps_init()
rconnorlawson 0:35660d7952f7 43 {
cdong49 2:3caab2cc0476 44
cdong49 2:3caab2cc0476 45 map.items = createHashTable(map_hash, NUMBUCKETS);
cdong49 2:3caab2cc0476 46 map.w = WIDTH;
cdong49 2:3caab2cc0476 47 map.h = HEIGHT;
rconnorlawson 0:35660d7952f7 48 }
rconnorlawson 0:35660d7952f7 49
rconnorlawson 0:35660d7952f7 50 Map* get_active_map()
rconnorlawson 0:35660d7952f7 51 {
rconnorlawson 0:35660d7952f7 52 return ↦
rconnorlawson 0:35660d7952f7 53 }
rconnorlawson 0:35660d7952f7 54
rconnorlawson 0:35660d7952f7 55 Map* set_active_map(int m)
rconnorlawson 0:35660d7952f7 56 {
rconnorlawson 0:35660d7952f7 57 active_map = m;
rconnorlawson 0:35660d7952f7 58 return ↦
rconnorlawson 0:35660d7952f7 59 }
rconnorlawson 0:35660d7952f7 60
rconnorlawson 0:35660d7952f7 61 void print_map()
rconnorlawson 0:35660d7952f7 62 {
rconnorlawson 0:35660d7952f7 63 // As you add more types, you'll need to add more items to this array.
rconnorlawson 0:35660d7952f7 64 char lookup[] = {'W', 'P'};
rconnorlawson 0:35660d7952f7 65 for(int y = 0; y < map_height(); y++)
rconnorlawson 0:35660d7952f7 66 {
rconnorlawson 0:35660d7952f7 67 for (int x = 0; x < map_width(); x++)
rconnorlawson 0:35660d7952f7 68 {
rconnorlawson 0:35660d7952f7 69 MapItem* item = get_here(x,y);
rconnorlawson 0:35660d7952f7 70 if (item) pc.printf("%c", lookup[item->type]);
rconnorlawson 0:35660d7952f7 71 else pc.printf(" ");
rconnorlawson 0:35660d7952f7 72 }
rconnorlawson 0:35660d7952f7 73 pc.printf("\r\n");
rconnorlawson 0:35660d7952f7 74 }
rconnorlawson 0:35660d7952f7 75 }
rconnorlawson 0:35660d7952f7 76
rconnorlawson 0:35660d7952f7 77 int map_width()
rconnorlawson 0:35660d7952f7 78 {
cdong49 2:3caab2cc0476 79 Map *map = get_active_map();
cdong49 2:3caab2cc0476 80 return map->w;
rconnorlawson 0:35660d7952f7 81 }
rconnorlawson 0:35660d7952f7 82
rconnorlawson 0:35660d7952f7 83 int map_height()
rconnorlawson 0:35660d7952f7 84 {
cdong49 2:3caab2cc0476 85 Map *map = get_active_map();
cdong49 2:3caab2cc0476 86 return map->h;
rconnorlawson 0:35660d7952f7 87 }
rconnorlawson 0:35660d7952f7 88
rconnorlawson 0:35660d7952f7 89 int map_area()
rconnorlawson 0:35660d7952f7 90 {
cdong49 2:3caab2cc0476 91 Map* map = get_active_map();
cdong49 2:3caab2cc0476 92 return (map->h * map->w);
rconnorlawson 0:35660d7952f7 93 }
rconnorlawson 0:35660d7952f7 94
rconnorlawson 0:35660d7952f7 95 MapItem* get_north(int x, int y)
rconnorlawson 0:35660d7952f7 96 {
cdong49 2:3caab2cc0476 97 Map *map = get_active_map();
cdong49 2:3caab2cc0476 98 int key = XY_KEY(x, y-1);
cdong49 2:3caab2cc0476 99 return (MapItem*)getItem(map->items, key);
rconnorlawson 0:35660d7952f7 100 }
rconnorlawson 0:35660d7952f7 101
rconnorlawson 0:35660d7952f7 102 MapItem* get_south(int x, int y)
rconnorlawson 0:35660d7952f7 103 {
cdong49 2:3caab2cc0476 104 Map *map = get_active_map();
cdong49 2:3caab2cc0476 105 int key = XY_KEY(x, y+1);
cdong49 2:3caab2cc0476 106 return (MapItem*)getItem(map->items, key);
rconnorlawson 0:35660d7952f7 107 }
rconnorlawson 0:35660d7952f7 108
rconnorlawson 0:35660d7952f7 109 MapItem* get_east(int x, int y)
rconnorlawson 0:35660d7952f7 110 {
cdong49 2:3caab2cc0476 111 Map *map = get_active_map();
cdong49 2:3caab2cc0476 112 int key = XY_KEY(x+1, y);
cdong49 2:3caab2cc0476 113 return (MapItem*)getItem(map->items, key);
rconnorlawson 0:35660d7952f7 114 }
rconnorlawson 0:35660d7952f7 115
rconnorlawson 0:35660d7952f7 116 MapItem* get_west(int x, int y)
rconnorlawson 0:35660d7952f7 117 {
cdong49 2:3caab2cc0476 118 Map *map = get_active_map();
cdong49 2:3caab2cc0476 119 int key = XY_KEY(x-1, y);
cdong49 2:3caab2cc0476 120 return (MapItem*)getItem(map->items, key);
rconnorlawson 0:35660d7952f7 121 }
rconnorlawson 0:35660d7952f7 122
rconnorlawson 0:35660d7952f7 123 MapItem* get_here(int x, int y)
rconnorlawson 0:35660d7952f7 124 {
cdong49 2:3caab2cc0476 125 Map *map = get_active_map();
cdong49 2:3caab2cc0476 126 int key = XY_KEY(x, y);
cdong49 2:3caab2cc0476 127 return (MapItem*)getItem(map->items, key);
rconnorlawson 0:35660d7952f7 128 }
rconnorlawson 0:35660d7952f7 129
rconnorlawson 0:35660d7952f7 130
rconnorlawson 0:35660d7952f7 131 void map_erase(int x, int y)
rconnorlawson 0:35660d7952f7 132 {
cdong49 2:3caab2cc0476 133 Map *map = get_active_map();
cdong49 3:ab8f2b4b44b0 134 int key = XY_KEY(x, y);
cdong49 2:3caab2cc0476 135 deleteItem(map->items, key);
rconnorlawson 0:35660d7952f7 136 }
rconnorlawson 0:35660d7952f7 137
rconnorlawson 0:35660d7952f7 138 void add_wall(int x, int y, int dir, int len)
rconnorlawson 0:35660d7952f7 139 {
rconnorlawson 0:35660d7952f7 140 for(int i = 0; i < len; i++)
rconnorlawson 0:35660d7952f7 141 {
cdong49 2:3caab2cc0476 142
rconnorlawson 0:35660d7952f7 143 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
rconnorlawson 0:35660d7952f7 144 w1->type = WALL;
rconnorlawson 0:35660d7952f7 145 w1->draw = draw_wall;
rconnorlawson 0:35660d7952f7 146 w1->walkable = false;
rconnorlawson 0:35660d7952f7 147 w1->data = NULL;
rconnorlawson 0:35660d7952f7 148 unsigned key = (dir == HORIZONTAL) ? XY_KEY(x+i, y) : XY_KEY(x, y+i);
rconnorlawson 0:35660d7952f7 149 void* val = insertItem(get_active_map()->items, key, w1);
cdong49 2:3caab2cc0476 150 if (val)free(val); // If something is already there, free it
rconnorlawson 0:35660d7952f7 151 }
cdong49 2:3caab2cc0476 152
rconnorlawson 0:35660d7952f7 153 }
rconnorlawson 0:35660d7952f7 154
rconnorlawson 0:35660d7952f7 155 void add_plant(int x, int y)
rconnorlawson 0:35660d7952f7 156 {
rconnorlawson 0:35660d7952f7 157 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 3:ab8f2b4b44b0 158 w1->type = FLOWWINK;
cdong49 3:ab8f2b4b44b0 159 w1->draw = draw_flowey_wink;
cdong49 2:3caab2cc0476 160 w1->walkable = false;
rconnorlawson 0:35660d7952f7 161 w1->data = NULL;
cdong49 2:3caab2cc0476 162
rconnorlawson 0:35660d7952f7 163 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
rconnorlawson 0:35660d7952f7 164 if (val) free(val); // If something is already there, free it
cdong49 2:3caab2cc0476 165 }
cdong49 2:3caab2cc0476 166
cdong49 2:3caab2cc0476 167 void add_sign(int x, int y) {
cdong49 2:3caab2cc0476 168 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 2:3caab2cc0476 169 w1->type = SIGN;
cdong49 2:3caab2cc0476 170 w1->draw = draw_sign;
cdong49 2:3caab2cc0476 171 w1->walkable = false;
cdong49 2:3caab2cc0476 172 w1->data = NULL;
cdong49 2:3caab2cc0476 173
cdong49 2:3caab2cc0476 174 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 2:3caab2cc0476 175 if (val) free(val);
cdong49 2:3caab2cc0476 176 }
cdong49 2:3caab2cc0476 177
cdong49 2:3caab2cc0476 178 void add_door_locked(int x, int y) {
cdong49 2:3caab2cc0476 179 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 3:ab8f2b4b44b0 180 w1->type = DOORLOCKED;
cdong49 3:ab8f2b4b44b0 181 w1->draw = draw_door_locked;
cdong49 3:ab8f2b4b44b0 182 w1->walkable = false;
cdong49 3:ab8f2b4b44b0 183 w1->data = NULL;
cdong49 3:ab8f2b4b44b0 184
cdong49 3:ab8f2b4b44b0 185 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 3:ab8f2b4b44b0 186 if (val) free(val);
cdong49 3:ab8f2b4b44b0 187 }
cdong49 3:ab8f2b4b44b0 188
cdong49 3:ab8f2b4b44b0 189 void add_door_unlocked(int x, int y) {
cdong49 3:ab8f2b4b44b0 190 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 2:3caab2cc0476 191 w1->type = DOORUNLOCKED;
cdong49 2:3caab2cc0476 192 w1->draw = draw_door_unlocked;
cdong49 2:3caab2cc0476 193 w1->walkable = false;
cdong49 2:3caab2cc0476 194 w1->data = NULL;
cdong49 2:3caab2cc0476 195
cdong49 2:3caab2cc0476 196 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 2:3caab2cc0476 197 if (val) free(val);
cdong49 2:3caab2cc0476 198 }
cdong49 2:3caab2cc0476 199
cdong49 3:ab8f2b4b44b0 200
cdong49 2:3caab2cc0476 201 void add_flowey_friendly(int x, int y) {
cdong49 2:3caab2cc0476 202 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 2:3caab2cc0476 203 w1->type = FLOWFRIEND;
cdong49 2:3caab2cc0476 204 w1->draw = draw_flowey_friendly;
cdong49 2:3caab2cc0476 205 w1->walkable = false;
cdong49 2:3caab2cc0476 206 w1->data = NULL;
cdong49 2:3caab2cc0476 207
cdong49 2:3caab2cc0476 208 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 2:3caab2cc0476 209 if (val) free(val);
cdong49 2:3caab2cc0476 210 }
cdong49 2:3caab2cc0476 211
cdong49 2:3caab2cc0476 212 void add_flowey_wink(int x, int y) {
cdong49 2:3caab2cc0476 213 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 2:3caab2cc0476 214 w1->type = FLOWWINK;
cdong49 2:3caab2cc0476 215 w1->draw = draw_flowey_wink;
cdong49 2:3caab2cc0476 216 w1->walkable = false;
cdong49 2:3caab2cc0476 217 w1->data = NULL;
cdong49 2:3caab2cc0476 218
cdong49 2:3caab2cc0476 219 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 2:3caab2cc0476 220 if (val) free(val);
cdong49 2:3caab2cc0476 221 }
cdong49 2:3caab2cc0476 222
cdong49 2:3caab2cc0476 223 void add_flowey_creepy(int x, int y) {
cdong49 2:3caab2cc0476 224 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 2:3caab2cc0476 225 w1->type = FLOWCREEPY;
cdong49 2:3caab2cc0476 226 w1->draw = draw_flowey_creepy;
cdong49 2:3caab2cc0476 227 w1->walkable = false;
cdong49 2:3caab2cc0476 228 w1->data = NULL;
cdong49 2:3caab2cc0476 229
cdong49 2:3caab2cc0476 230 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 2:3caab2cc0476 231 if (val) free(val);
cdong49 2:3caab2cc0476 232 }
cdong49 2:3caab2cc0476 233
cdong49 2:3caab2cc0476 234 void add_toby(int x, int y) {
cdong49 2:3caab2cc0476 235 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 2:3caab2cc0476 236 w1->type = TOBY;
cdong49 2:3caab2cc0476 237 w1->draw = draw_toby;
cdong49 2:3caab2cc0476 238 w1->walkable = false;
cdong49 2:3caab2cc0476 239 w1->data = NULL;
cdong49 2:3caab2cc0476 240
cdong49 2:3caab2cc0476 241 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 2:3caab2cc0476 242 if (val) free(val);
cdong49 2:3caab2cc0476 243 }
cdong49 2:3caab2cc0476 244
cdong49 2:3caab2cc0476 245 void add_toby_bone(int x, int y) {
cdong49 2:3caab2cc0476 246 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 2:3caab2cc0476 247 w1->type = TOBYBONE;
cdong49 2:3caab2cc0476 248 w1->draw = draw_toby_bone;
cdong49 2:3caab2cc0476 249 w1->walkable = false;
cdong49 2:3caab2cc0476 250 w1->data = NULL;
cdong49 2:3caab2cc0476 251
cdong49 2:3caab2cc0476 252 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 2:3caab2cc0476 253 if (val) free(val);
cdong49 2:3caab2cc0476 254 }
cdong49 2:3caab2cc0476 255
cdong49 2:3caab2cc0476 256 void add_red_button(int x, int y) {
cdong49 2:3caab2cc0476 257 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 2:3caab2cc0476 258 w1->type = REDBUTTON;
cdong49 2:3caab2cc0476 259 w1->draw = draw_red_button;
cdong49 2:3caab2cc0476 260 w1->walkable = false;
cdong49 2:3caab2cc0476 261 w1->data = NULL;
cdong49 2:3caab2cc0476 262
cdong49 2:3caab2cc0476 263 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 2:3caab2cc0476 264 if (val) free(val);
cdong49 2:3caab2cc0476 265 }
cdong49 2:3caab2cc0476 266
cdong49 2:3caab2cc0476 267 void add_green_button(int x, int y) {
cdong49 2:3caab2cc0476 268 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 2:3caab2cc0476 269 w1->type = GREENBUTTON;
cdong49 2:3caab2cc0476 270 w1->draw = draw_green_button;
cdong49 2:3caab2cc0476 271 w1->walkable = false;
cdong49 2:3caab2cc0476 272 w1->data = NULL;
cdong49 2:3caab2cc0476 273
cdong49 2:3caab2cc0476 274 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 2:3caab2cc0476 275 if (val) free(val);
cdong49 2:3caab2cc0476 276 }
cdong49 2:3caab2cc0476 277
cdong49 2:3caab2cc0476 278 void add_blue_button(int x, int y) {
cdong49 2:3caab2cc0476 279 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 2:3caab2cc0476 280 w1->type = BLUEBUTTON;
cdong49 2:3caab2cc0476 281 w1->draw = draw_blue_button;
cdong49 2:3caab2cc0476 282 w1->walkable = false;
cdong49 2:3caab2cc0476 283 w1->data = NULL;
cdong49 2:3caab2cc0476 284
cdong49 2:3caab2cc0476 285 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 2:3caab2cc0476 286 if (val) free(val);
cdong49 2:3caab2cc0476 287 }
cdong49 2:3caab2cc0476 288
cdong49 2:3caab2cc0476 289 void add_river_man(int x, int y) {
cdong49 2:3caab2cc0476 290 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 2:3caab2cc0476 291 w1->type = RIVERMAN;
cdong49 2:3caab2cc0476 292 w1->draw = draw_river_man;
cdong49 2:3caab2cc0476 293 w1->walkable = false;
cdong49 2:3caab2cc0476 294 w1->data = NULL;
cdong49 2:3caab2cc0476 295
cdong49 2:3caab2cc0476 296 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 2:3caab2cc0476 297 if (val) free(val);
cdong49 2:3caab2cc0476 298 }
cdong49 3:ab8f2b4b44b0 299
cdong49 3:ab8f2b4b44b0 300 void add_chest(int x, int y) {
cdong49 3:ab8f2b4b44b0 301 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 3:ab8f2b4b44b0 302 w1->type = CHEST;
cdong49 3:ab8f2b4b44b0 303 w1->draw = draw_chest;
cdong49 3:ab8f2b4b44b0 304 w1->walkable = false;
cdong49 3:ab8f2b4b44b0 305 w1->data = NULL;
cdong49 3:ab8f2b4b44b0 306
cdong49 3:ab8f2b4b44b0 307 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 3:ab8f2b4b44b0 308 if (val) free(val);
cdong49 3:ab8f2b4b44b0 309 }
cdong49 3:ab8f2b4b44b0 310 void add_leaf(int x, int y) {
cdong49 3:ab8f2b4b44b0 311 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 3:ab8f2b4b44b0 312 w1->type = LEAF;
cdong49 3:ab8f2b4b44b0 313 w1->draw = draw_leaf;
cdong49 3:ab8f2b4b44b0 314 w1->walkable = true;
cdong49 3:ab8f2b4b44b0 315 w1->data = NULL;
cdong49 3:ab8f2b4b44b0 316
cdong49 3:ab8f2b4b44b0 317 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 3:ab8f2b4b44b0 318 if (val) free(val);
cdong49 3:ab8f2b4b44b0 319 }
cdong49 3:ab8f2b4b44b0 320 void add_wood(int x, int y) {
cdong49 3:ab8f2b4b44b0 321 MapItem* w1 = (MapItem*) malloc(sizeof(MapItem));
cdong49 3:ab8f2b4b44b0 322 w1->type = WOOD;
cdong49 3:ab8f2b4b44b0 323 w1->draw = draw_wood;
cdong49 3:ab8f2b4b44b0 324 w1->walkable = false;
cdong49 3:ab8f2b4b44b0 325 w1->data = NULL;
cdong49 3:ab8f2b4b44b0 326
cdong49 3:ab8f2b4b44b0 327 void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1);
cdong49 3:ab8f2b4b44b0 328 if (val) free(val);
cdong49 3:ab8f2b4b44b0 329 }
cdong49 2:3caab2cc0476 330 // add toby, tobybone, riverman, doorlocked, doorunlocked,