game for 2035
Dependencies: mbed wave_player 4DGL-uLCD-SE MMA8452
Revision 5:a16af8f3fea9, committed 2018-11-30
- Comitter:
- Sterofin
- Date:
- Fri Nov 30 08:29:52 2018 +0000
- Parent:
- 4:af9d6e3b8a29
- Commit message:
- bigger doot;
Changed in this revision
diff -r af9d6e3b8a29 -r a16af8f3fea9 graphics.cpp --- a/graphics.cpp Fri Nov 30 05:31:06 2018 +0000 +++ b/graphics.cpp Fri Nov 30 08:29:52 2018 +0000 @@ -1,226 +0,0 @@ -#include "graphics.h" - -#include "globals.h" -#define W 0xffffff -#define G 0xcccccc -#define P 0xb700b7 -#define R 0xff0015 -#define N 0x0 -#define B 0x005dff -#define DB 0x592e03 -#define O 0xff9b38 - -void draw_player(int u, int v, int key) -{ - //uLCD.filled_rectangle(u, v, u+11, v+11, RED); - int player[121] = - { - N,N,N,N,P,P,N,N,N,N,N, - N,N,N,P,P,W,W,N,N,N,N, - N,N,N,P,G,G,G,N,N,N,N, - N,N,P,P,W,W,W,N,N,N,N, - N,N,P,R,R,B,R,R,N,N,N, - N,N,N,R,R,B,R,R,N,N,N, - N,N,N,R,R,B,R,R,N,N,N, - N,N,N,R,B,B,B,R,N,N,N, - N,N,N,R,B,N,B,R,N,N,N, - N,N,N,N,B,N,B,N,N,N,N, - N,N,N,N,B,N,B,N,N,N,N - }; - uLCD.BLIT(u,v,11,11,&player[0]); -} - -#define YELLOW 0xFFFF00 -#define BROWN 0xD2691E -#define DIRT BROWN -void draw_img(int u, int v, const char* img) -{ - int colors[11*11]; - for (int i = 0; i < 11*11; i++) - { - if (img[i] == 'R') colors[i] = RED; - else if (img[i] == 'Y') colors[i] = YELLOW; - else if (img[i] == 'G') colors[i] = GREEN; - else if (img[i] == 'D') colors[i] = DIRT; - else if (img[i] == '5') colors[i] = LGREY; - else if (img[i] == '3') colors[i] = DGREY; - else colors[i] = BLACK; - } - uLCD.BLIT(u, v, 11, 11, colors); - wait_us(250); // Recovery time! -} - -void draw_nothing(int u, int v) -{ - // Fill a tile with blackness - uLCD.filled_rectangle(u, v, u+10, v+10, BLACK); -} - -void draw_wall(int u, int v) -{ - uLCD.filled_rectangle(u, v, u+10, v+10, BROWN); -} - -void draw_netPortal(int u, int v) -{ - uLCD.filled_rectangle(u, v, u+10, v+10, WHITE); -} - -void draw_terminal(int u, int v) -{ - uLCD.filled_rectangle(u, v, u+10, v+10, 0x359aff); -} - -void draw_hacked_terminal(int u, int v) -{ - uLCD.filled_rectangle(u, v, u+10, v+10, 0x52ff3f); -} - -void draw_plant(int u, int v) -{ - uLCD.filled_rectangle(u, v, u+10, v+10, GREEN); -} - -void draw_door(int u, int v) -{ - uLCD.filled_rectangle(u, v, u+10, v+10, G); -} - -void draw_NPC(int u, int v) -{ - //uLCD.filled_rectangle(u, v, u+10, v+10, 0xffb600); - int player[121] = - { - N,N,N,N,DB,DB,DB,N,N,N,N, - N,N,N,N,BROWN,BROWN,BROWN,N,N,N,N, - N,N,N,N,G,BROWN,G,N,N,N,N, - N,N,N,N,DB,DB,DB,N,N,N, - N,N,N,W,W,O,W,W,N,N,N, - N,N,N,W,W,O,W,W,N,N,N, - N,N,N,W,W,O,W,W,N,N,N, - N,N,N,W,R,R,R,W,N,N,N, - N,N,N,N,R,N,R,N,N,N,N, - N,N,N,N,R,N,R,N,N,N,N, - N,N,N,N,R,N,R,N,N,N,N - - }; - uLCD.BLIT(u,v,11,11,&player[0]); -} - -void draw_upper_status(int x, int y) -{ - // Draw bottom border of status bar - //uLCD.line(0, 9, 127, 9, GREEN); - uLCD.locate(0,0); - uLCD.printf("(%d,%d)",x,y); - - // Add other status info drawing code here -} - -void draw_lower_status(int money) -{ - // Draw top border of status bar - //uLCD.line(0, 118, 127, 118, GREEN); - uLCD.locate(0,118); - uLCD.printf("Credits: %d",money); - - // Add other status info drawing code here -} - -void draw_border() -{ - uLCD.filled_rectangle(0, 9, 127, 14, WHITE); // Top - uLCD.filled_rectangle(0, 13, 2, 114, WHITE); // Left - uLCD.filled_rectangle(0, 114, 127, 117, WHITE); // Bottom - uLCD.filled_rectangle(124, 14, 127, 117, WHITE); // Right -} - -void draw_menu_1() -{ - uLCD.locate(1,12); - uLCD.text_width(1); //4X size text - uLCD.text_height(1); - uLCD.color(RED); - uLCD.printf(" Press Start "); -} - -void draw_menu_2() -{ - uLCD.filled_rectangle(0,90,128,115, 0x0); -} - -void draw_boots(int u, int v) -{ - int image[121] = - { - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0xe8,0xe8,0xe8,0xe8,0xe8,0x00,0x00,0x00, - 0x00,0x00,0x00,0xe8,0xe8,0xe8,0xe8,0xe8,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x69,0x69,0x69,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x69,0x69,0x69,0xfc,0x69,0x69,0x00, - 0xe8,0xe8,0xe8,0xe8,0xe8,0x69,0xfc,0x69,0x69,0x69,0x69, - 0xe8,0xe8,0xe8,0xe8,0xe8,0xfc,0x69,0x69,0x69,0x69,0x69, - 0x00,0x69,0x69,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x69,0x69,0x69,0xfc,0x69,0x69,0x00,0x00,0x00,0x00, - 0x00,0x69,0x69,0xfc,0x69,0x69,0x69,0x69,0x00,0x00,0x00, - 0x00,0x69,0xfc,0x69,0x69,0x69,0x69,0x69,0x00,0x00,0x00 - }; - uLCD.BLIT(u,v,11,11,&image[0]); -} - -void draw_printer(int u, int v) -{ - int image[121] = - { - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00, - 0x00,0x0a,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x0a,0x00, - 0x00,0x0a,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x0a,0x00, - 0x00,0x0a,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x0a,0x00, - 0x00,0x0a,0x00,0x00,0x6d,0x6d,0x6d,0x00,0x00,0x0a,0x00, - 0x00,0x0a,0x00,0x00,0x6d,0x6d,0x6d,0x00,0x00,0x0a,0x00, - 0x00,0x0a,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x0a,0x00, - 0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00, - 0x00,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 - }; - uLCD.BLIT(u,v,11,11,&image[0]); -} - -void draw_teleport(int u, int v) -{ - int image[121] = - { - 0x00,0x00,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x00,0x00, - 0x00,0x2a,0x2a,0xff,0xff,0xff,0xff,0xff,0x2a,0x2a,0x00, - 0x2a,0x2a,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0x2a,0x2a, - 0x2a,0xff,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xff,0x2a, - 0x2a,0xff,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0x00,0x2a, - 0x2a,0xff,0xff,0xff,0xe1,0xe1,0xe1,0xff,0xff,0xff,0x2a, - 0x2a,0xff,0xff,0xff,0xe1,0xe1,0xe1,0xff,0xff,0xff,0x2a, - 0x2a,0xff,0xff,0xff,0xe1,0xe1,0xe1,0xff,0xff,0xff,0x2a, - 0x2a,0x2a,0xff,0xff,0xe1,0xe1,0xe1,0xff,0xff,0x2a,0x2a, - 0x00,0x2a,0x2a,0xff,0xe1,0xe1,0xe1,0xff,0x2a,0x2a,0x00, - 0x00,0x00,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x00,0x00 - }; - uLCD.BLIT(u,v,11,11,&image[0]); -} - -void draw_gun(int u, int v) -{ - int image[121] = - { - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x2a,0x2a,0x00,0x00,0x2a,0x2a,0x00,0x00, - 0x00,0x00,0x2a,0x2a,0x00,0x00,0x2a,0x2a,0x00,0x00,0x00, - 0x2a,0x2a,0x2a,0x00,0x00,0x2a,0x2a,0x00,0x00,0x00,0x00, - 0x2a,0xc0,0x2a,0x00,0x00,0x2a,0x2a,0x00,0x00,0x00,0x00, - 0x2a,0xc0,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x00, - 0x2a,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, - 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 - }; - uLCD.BLIT(u,v,11,11,&image[0]); -}
diff -r af9d6e3b8a29 -r a16af8f3fea9 hash_table.cpp --- a/hash_table.cpp Fri Nov 30 05:31:06 2018 +0000 +++ b/hash_table.cpp Fri Nov 30 08:29:52 2018 +0000 @@ -268,7 +268,7 @@ *@return NULL if we don't find it, a pointer to the value if we do */ void* removeItem(HashTable* hashTable, unsigned int key) { - unsigned int bucket = (hashTable->hash)(key); //Find which bucket our entry is in + unsigned int bucket = hashTable->hash(key); //Find which bucket our entry is in HashTableEntry* this_entry= hashTable->buckets[bucket]; HashTableEntry* tmp; @@ -311,7 +311,7 @@ *@param key The key of the entry we want to remove */ void deleteItem(HashTable* hashTable, unsigned int key) { - unsigned int bucket = (hashTable->hash)(key); //Find which bucket our entry is in + unsigned int bucket = hashTable->hash(key); //Find which bucket our entry is in HashTableEntry* this_entry= hashTable->buckets[bucket]; HashTableEntry* tmp;
diff -r af9d6e3b8a29 -r a16af8f3fea9 main.cpp --- a/main.cpp Fri Nov 30 05:31:06 2018 +0000 +++ b/main.cpp Fri Nov 30 08:29:52 2018 +0000 @@ -1,745 +0,0 @@ -// Project includes -#include "globals.h" -#include "hardware.h" -#include "map.h" -#include "graphics.h" -#include "speech.h" -#include "hash_table.h" - -GameInputs in; -int actions; -int update; -bool god; -bool puzzle = false; -bool mapact = 0; -int story = 0; -unsigned int m_z=12434,m_w=33254; -unsigned int rnd() { - m_z = 36969 * (m_z & 65535) + (m_z >>16); - m_w = 18000 * (m_w & 65535) + (m_w >>16); - return ((m_z <<16) + m_w); -} - -unsigned int n[4]; - - -// Functions in this file -int get_action (GameInputs inputs); -int update_game (int action); -void draw_game (int init); -void init_main_map (); -int main (); - -/** - * The main game state. Must include Player locations and previous locations for - * drawing to work properly. Other items can be added as needed. - */ -struct { - int x,y; // Current locations - int px, py; // Previous locations - int has_key; - int speed; - bool can_teleport; - int money; -} Player; - -struct { - bool has_boots; - bool has_teleport; - bool has_gun; - bool has_printer; -} Inventory; - -/** - * Given the game inputs, determine what kind of update needs to happen. - * Possbile return values are defined below. - */ -#define NO_ACTION 0 -#define ACTION_BUTTON 1 -#define MENU_BUTTON 2 -#define GO_LEFT 3 -#define GO_RIGHT 4 -#define GO_UP 5 -#define GO_DOWN 6 -#define THRESH 0.3 -#define GOD_MODE 7 -#define BUTTON_3 8 -#define BUTTON_4 9 -int walkk; -int get_action(GameInputs inputs) -{ - //pc.printf("%d,%d\r\n",inputs.ax,inputs.ay); - if(inputs.ax < -THRESH) return GO_UP; - if(inputs.ax >= THRESH) return GO_DOWN; - if(inputs.ay >= THRESH) return GO_RIGHT; - if(inputs.ay < -THRESH) return GO_LEFT; - if(!inputs.b1) return ACTION_BUTTON; - if(!inputs.b2) return MENU_BUTTON; - if(!inputs.b3 && !puzzle){ - pc.printf("Button 3 pressed"); - god = !god; - if(god) uLCD.filled_rectangle(128,0,119,7,WHITE); - else if(!god) uLCD.filled_rectangle(128,0,119,7,BLACK); - } - else if(!inputs.b3) return BUTTON_3; - if(!inputs.b4) return BUTTON_4; - return NO_ACTION; -} - -int go_up() -{ - if(get_north(Player.x,Player.y)->walkable || god) - { - for(walkk = 1;walkk < Player.speed;walkk++){ - if(!get_north(Player.x,Player.y-walkk)->walkable) break; - } - Player.y-=walkk; - return 1; - }else return 0; -} - -int go_down() -{ - if(get_south(Player.x,Player.y)->walkable || god) - { - for(walkk = 1;walkk < Player.speed;walkk++){ - if(!get_south(Player.x,Player.y+walkk)->walkable) break; - } - Player.y+=walkk; - return 1; - }else return 0; -} - -int go_left() -{ - if(get_west(Player.x,Player.y)->walkable || god) - { - for(walkk = 1;walkk < Player.speed;walkk++){ - if(!get_west(Player.x-walkk,Player.y)->walkable) break; - } - Player.x-=walkk; - return 1; - }else return 0; -} - -int go_right() -{ - if(get_east(Player.x,Player.y)->walkable || god) - { - for(walkk = 1;walkk < Player.speed;walkk++){ - if(!get_east(Player.x+walkk,Player.y)->walkable) break; - } - Player.x+=walkk; - return 1; - }else return 0; -} - -//Looks at if there's a block of the desired type next to the player -int checkType(int t) -{ - MapItem* n = get_north(Player.x,Player.y); - MapItem* s = get_south(Player.x,Player.y); - MapItem* e = get_east(Player.x,Player.y); - MapItem* w = get_west(Player.x,Player.y); - //pc.printf("%d\r\n",n->type); -// pc.printf("%d\r\n",s->type); -// pc.printf("%d\r\n",e->type); -// pc.printf("%d\r\n",w->type); - if(n->type == t || s->type == t || e->type == t || w->type == t) - { - return 1; - }else return 0; -} - -MapItem* find_type(int t) -{ - MapItem* n = get_north(Player.x,Player.y); - MapItem* s = get_south(Player.x,Player.y); - MapItem* e = get_east(Player.x,Player.y); - MapItem* w = get_west(Player.x,Player.y); - //pc.printf("%d\r\n",n->type); -// pc.printf("%d\r\n",s->type); -// pc.printf("%d\r\n",e->type); -// pc.printf("%d\r\n",w->type); - if(n->type == t) return n; - else if(s->type == t) return s; - else if(e->type == t) return e; - else if(w->type == t) return w; - else return NULL; -} - -int convert(int num) -{ - if(num == 1) return ACTION_BUTTON; - else if(num == 2) return MENU_BUTTON; - else if(num == 3) return BUTTON_3; - else if(num == 4) return BUTTON_4; - return 5; -} - -#define mx 4 -#define my 3 -void run_minigame(){ - char buffer[100]; - n[0] = rnd()%4+1; - n[1] = rnd()%4+1; - n[2] = rnd()%4+1; - n[3] = rnd()%4+1; - sprintf(buffer,"of numbers: %d%d%d%d",n[0],n[1],n[2],n[3]); - speech(buffer,""); - int solved = 0; - while(solved < 4) - { - in = read_inputs(); - actions = get_action(in); - if(solved == 0){ - if(actions == convert(n[0])){ - uLCD.locate(mx,my); - sprintf(buffer," %d - - - ",n[0]); - uLCD.printf(buffer); - solved++; - wait(0.25); - } - } - else if(solved == 1){ - if(actions == convert(n[1])){ - uLCD.locate(mx,my); - sprintf(buffer," %d %d - - ",n[0],n[1]); - uLCD.printf(buffer); - solved++; - wait(0.25); - } - } - else if(solved == 2){ - if(actions == convert(n[2])){ - uLCD.locate(mx,my); - sprintf(buffer," %d %d %d - ",n[0],n[1],n[2]); - uLCD.printf(buffer); - solved++; - wait(0.25); - } - } - else if(solved == 3){ - if(actions == convert(n[3])){ - uLCD.locate(mx,my); - sprintf(buffer," %d %d %d %d ",n[0],n[1],n[2],n[3]); - uLCD.printf(buffer); - solved++; - wait(0.5); - } - } - } -} - -void item_menu(){ - uLCD.cls(); - uLCD.printf(" INVENTORY"); - if(Inventory.has_gun){ - draw_gun(20,40); - uLCD.locate(35,40); - uLCD.printf("KillInator5000"); - } - if(Inventory.has_printer){ - draw_printer(20,55); - uLCD.locate(35,55); - uLCD.printf("Organ Printer"); - } - if(Inventory.has_teleport){ - draw_teleport(20,70); - uLCD.locate(35,70); - uLCD.printf("Teleporter"); - } - if(Inventory.has_boots){ - draw_boots(20,85); - uLCD.locate(35,85); - uLCD.printf("SpeedyBoots"); - } - in = read_inputs(); - actions = get_action(in); - draw_lower_status(Player.money); - while(actions != MENU_BUTTON){ - in = read_inputs(); - actions = get_action(in); - } -} - -/** - * Update the game state based on the user action. For example, if the user - * requests GO_UP, then this function should determine if that is possible by - * consulting the map, and update the Player position accordingly. - * - * Return values are defined below. FULL_DRAW indicates that for this frame, - * draw_game should not optimize drawing and should draw every tile, even if - * the player has not moved. - */ -#define NO_RESULT 0 -#define GAME_OVER 1 -#define FULL_DRAW 2 -MapItem* boi; -int update_game(int action) -{ - // Save player previous location before updating - Player.px = Player.x; - Player.py = Player.y; - - // Do different things based on the each action. - // You can define functions like "go_up()" that get called for each case. - switch(action) - { - case GO_UP: - go_up(); - break; - case GO_LEFT: - go_left(); - break; - case GO_DOWN: - go_down(); - break; - case GO_RIGHT: - go_right(); - break; - case ACTION_BUTTON: - pc.printf("Action Button Pressed\r\n"); - if(checkType(NPORTAL)) - { - if(story == 2 || story == 3 || story == 4){ - speech("Don't leave! The","hack is almost"); - speech("finished!",""); - return FULL_DRAW; - } - pc.printf("Entering Portal"); - if(!mapact){ - set_active_map(1); - mapact = 1; - Player.x = 2; - Player.y = 5; - } - else if(mapact){ - set_active_map(0); - mapact = 0; - Player.x = 37; - Player.y = 44; - } - uLCD.filled_rectangle(0,0,127,9, 0x0); - return FULL_DRAW; - } - else if(checkType(NPC)) - { - if(story == 0){ - speech("Hey, want to make","some quick cash?"); - speech("Head over to the","netPortal next"); - speech("door. Hack","BULLETCORPs server"); - speech("so we can steal","some of their"); - speech("advanced tech.","That is, if"); - speech("you're up for","the job"); - story++; - } - else if(story == 1) - { - speech("C'mon! What are","you waiting for?"); - } - else if(story == 6) - { - speech("Thanks for the","codes. here's a "); - speech("chip that will","let you into"); - speech("BULLETCORP's","secret tech room"); - Player.has_key = true; - story++; - } - else if(story == 7) - { - if(Inventory.has_gun && Inventory.has_printer) story++; - else{ - speech("You don't have","everything, go"); - speech("back and get","the rest of the"); - speech("tech in order","to get paid"); - } - } - else if(story == 8){ - speech("Nice! Here's your","cash as"); - speech("promised.",""); - Inventory.has_printer = false; - Inventory.has_gun = false; - Player.money = 100; - story++; - } - else if(story == 9){ - speech("I've got one","more job if"); - speech("you want it.",""); - speech("I need you to","take out the"); - speech("leader of the","Gigem' Boys"); - speech("He's been the","source of a"); - speech("lot of trouble","around here"); - speech("lately",""); - speech("Head up north","to find him"); - speech("but before you","go, you'll"); - speech("need this:",""); - Inventory.has_gun = true; - return FULL_DRAW; - } - else if(checkType(TERMINAL)) - { - if(story == 1){ - speech("Pondsmith:","~ksshhk~"); - speech("Nice, you're in.","Use the terminals"); - speech("to decypher the","BULLETCORP access"); - speech("codes. There are","4 codes. Each"); - speech("terminal will","give one of the"); - speech("access codes.",""); - uLCD.cls(); - puzzle = true; - uLCD.locate(mx,my); - uLCD.printf(" - - - - "); - speech("Ok, here is","the first string"); - run_minigame(); - story++; - if((boi = find_type(TERMINAL))){ - boi->type = HACKED_TERMINAL; - boi->draw = draw_hacked_terminal; - } - puzzle = false; - return FULL_DRAW; - } - else if(story == 2){ - uLCD.cls(); - puzzle = true; - uLCD.locate(mx,my); - uLCD.printf(" - - - - "); - speech("Ok, here is","the second string"); - run_minigame(); - story++; - if((boi = find_type(TERMINAL))){ - boi->type = HACKED_TERMINAL; - boi->draw = draw_hacked_terminal; - } - puzzle = false; - return FULL_DRAW; - } - else if(story == 3){ - uLCD.cls(); - puzzle = true; - uLCD.locate(mx,my); - uLCD.printf(" - - - - "); - speech("Ok, here is","the third string"); - run_minigame(); - story++; - if((boi = find_type(TERMINAL))){ - boi->type = HACKED_TERMINAL; - boi->draw = draw_hacked_terminal; - } - puzzle = false; - return FULL_DRAW; - } - else if(story == 4){ - uLCD.cls(); - puzzle = true; - uLCD.locate(mx,my); - uLCD.printf(" - - - - "); - speech("Ok, here is","the fourth string"); - run_minigame(); - story++; - if((boi = find_type(TERMINAL))){ - boi->type = HACKED_TERMINAL; - boi->draw = draw_hacked_terminal; - } - puzzle = false; - return FULL_DRAW; - } - } - else if(checkType(DOOR) && Player.has_key == true){ - if(boi = find_type(DOOR)) boi->walkable = true; - return FULL_DRAW; - } - else if(checkType(TELEPORT)){ - Inventory.has_teleport = true; - if(boi = find_type(TELEPORT)) - { - boi->walkable = true; - boi->draw = draw_nothing; - boi->type = WALL; - } - return FULL_DRAW; - } - else if(checkType(KILL)){ - Inventory.has_gun = true; - if(boi = find_type(KILL)) - { - boi->walkable = true; - boi->draw = draw_nothing; - boi->type = WALL; - } - return FULL_DRAW; - } - else if(checkType(BOOTS)){ - Inventory.has_boots = true; - Player.speed = 1; - if(boi = find_type(BOOTS)) - { - boi->walkable = true; - boi->draw = draw_nothing; - boi->type = WALL; - } - return FULL_DRAW; - } - else if(checkType(PRINTER)){ - Inventory.has_printer = true; - if(boi = find_type(PRINTER)) - { - boi->walkable = true; - boi->draw = draw_nothing; - boi->type = WALL; - } - return FULL_DRAW; - } - break; - case MENU_BUTTON: - pc.printf("Menu Button Pressed\r\n"); - item_menu(); - break; - case BUTTON_4: - pc.printf("Button 4 Pressed\r\n"); - //NVIC_SystemReset(); - break; - default: break; - } - return NO_RESULT; -} - -/** - * Entry point for frame drawing. This should be called once per iteration of - * the game loop. This draws all tiles on the screen, followed by the status - * bars. Unless init is nonzero, this function will optimize drawing by only - * drawing tiles that have changed from the previous frame. - */ -void draw_game(int init) -{ - // Draw game border first - if(init) draw_border(); - - // Iterate over all visible map tiles - for (int i = -5; i <= 5; i++) // Iterate over columns of tiles - { - for (int j = -4; j <= 4; j++) // Iterate over one column of tiles - { - // Here, we have a given (i,j) - - // Compute the current map (x,y) of this tile - int x = i + Player.x; - int y = j + Player.y; - - // Compute the previous map (px, py) of this tile - int px = i + Player.px; - int py = j + Player.py; - - // Compute u,v coordinates for drawing - int u = (i+5)*11 + 3; - int v = (j+4)*11 + 15; - - // Figure out what to draw - DrawFunc draw = NULL; - if (i == 0 && j == 0) // Only draw the player on init - { - draw_player(u, v, Player.has_key); - continue; - } - else if (x >= 0 && y >= 0 && x < map_width() && y < map_height()) // Current (i,j) in the map - { - MapItem* curr_item = get_here(x, y); - MapItem* prev_item = get_here(px, py); - if (init || curr_item != prev_item) // Only draw if they're different - { - if (curr_item) // There's something here! Draw it - { - draw = curr_item->draw; - } - else // There used to be something, but now there isn't - { - draw = draw_nothing; - } - } - } - else if (init) // If doing a full draw, but we're out of bounds, draw the walls. - { - draw = draw_wall; - } - - // Actually draw the tile - if (draw) draw(u, v); - } - } - - // Draw status bars - draw_upper_status(Player.x,Player.y); - uLCD.color(0xFFD700); - draw_lower_status(Player.money); - uLCD.color(GREEN); -} - - -/** - * Initialize the main world map. Add walls around the edges, interior chambers, - * and plants in the background so you can see motion. - */ -void init_main_map() -{ - Map* map = set_active_map(0); - - pc.printf("Adding walls!\r\n"); - add_wall(0, 0, HORIZONTAL, map_width()); - add_wall(0, map_height()-1, HORIZONTAL, map_width()); - add_wall(0, 0, VERTICAL, map_height()); - add_wall(map_width()-1, 0, VERTICAL, map_height()); - - - add_wall(0,38,HORIZONTAL,4); - add_wall(6,38,HORIZONTAL,15); - add_wall(0,29,HORIZONTAL,2); - add_wall(4,29,HORIZONTAL,26); - add_door(2,29,false); - add_door(3,29,false); - add_boots(3,22); - add_teleport(5,24); - add_orgprint(8,21); - add_kill(15,19); - add_wall(0,17,HORIZONTAL,40); - add_wall(0,13,HORIZONTAL,2); - add_door(2,13,false); - add_door(3,13,false); - add_wall(4,13,HORIZONTAL,36); - add_wall(39,0,VERTICAL,13); - add_wall(11,0,VERTICAL,13); - add_wall(39,17,VERTICAL,13); - add_wall(39,38,VERTICAL,12); - add_wall(26,38,VERTICAL,10); - add_wall(21,38,VERTICAL,4); - add_wall(21,44,VERTICAL,5); - add_wall(31,38,HORIZONTAL,9); - add_wall(27,38,HORIZONTAL,2); - add_netPortal(38,44); - add_NPC(5,42); - pc.printf("Walls done!\r\n"); - - //print_map(); -} - -void init_sub_map() -{ - set_active_map(1); - pc.printf("Adding walls!\r\n"); - add_wall(0, 0, HORIZONTAL, map_width()); - add_wall(0, map_height()-1, HORIZONTAL, map_width()); - add_wall(0, 0, VERTICAL, map_height()); - add_wall(map_width()-1, 0, VERTICAL, map_height()); - add_terminal(3,3); - add_terminal(7,3); - add_terminal(3,7); - add_terminal(7,7); - add_netPortal(1,5); -} - -/** - * Program entry point! This is where it all begins. - * This function orchestrates all the parts of the game. Most of your - * implementation should be elsewhere - this holds the game loop, and should - * read like a road map for the rest of the code. - */ - - - -int main() -{ - // First things first: initialize hardware - ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!"); - //hardware_init(); - pc.printf("Initializing Game\r\n"); - in = read_inputs(); - actions = get_action(in); - uLCD.text_width(2); //4X size text - uLCD.text_height(2); - uLCD.color(0x00ffd8); - uLCD.set_font(FONT_5X7); - uLCD.text_bold(true); - uLCD.printf("\n\n N E O\n"); - uLCD.color(0xff00e4); - uLCD.printf("\n P U N K\n"); - uLCD.text_width(1); //4X size text - uLCD.text_height(1); - uLCD.color(RED); - bool swap = 0; - int flash = 0; - while(actions != ACTION_BUTTON) - { - if(flash >= 600){ - swap = !swap; - flash = 0; - if(swap) draw_menu_2(); - else if(!swap) draw_menu_1(); - } - if(swap) flash+=3; - else if(!swap) flash++; - - - in = read_inputs(); - actions = get_action(in); - } - uLCD.cls(); - uLCD.text_width(1); //4X size text - uLCD.text_height(1); - uLCD.color(GREEN); - uLCD.set_font(FONT_7X8); - // Initialize the maps - maps_init(); - init_main_map(); - init_sub_map(); - set_active_map(0); - print_map(); - pc.printf("Map initialized\r\n"); - - // Initialize game state - Player.x = 3; - Player.y = 33; - Player.speed = 1; - Player.money = 0; - // Initial drawing - draw_game(true); - - // Main game loop - while(1) - { - //pc.printf("Game Running\r\n"); - // Timer to measure game update speed - Timer t; t.start(); - - // Actually do the game update: - // 1. Read inputs - in = read_inputs(); - //pc.printf("Gathering Sensor Data\r\n"); - // 2. Determine action (get_action) - actions = get_action(in); - //pc.printf("Determining Action\r\n"); - // 3. Update game (update_game) - update = update_game(actions); - //pc.printf("Updating Game State\r\n"); - //pc.printf("Game State: %d\r\n", gameState); - // 3b. Check for game over - //if(update == 0) break; - // 4. Draw frame (draw_game) - //pc.printf("Drawing Game\r\n"); - draw_game(update); - - // 5. Frame delay - t.stop(); - int dt = t.read_ms(); - if (dt < 100) wait_ms(100 - dt); - - if(story == 5){ - speech("Nice! You got","the codes."); - speech("Come back to me","and i'll"); - speech("compile them into","a security chip"); - speech("you can use to","break into"); - speech("BULLETCORP",""); - story++; - draw_game(FULL_DRAW); - } - } -}
diff -r af9d6e3b8a29 -r a16af8f3fea9 map.cpp --- a/map.cpp Fri Nov 30 05:31:06 2018 +0000 +++ b/map.cpp Fri Nov 30 08:29:52 2018 +0000 @@ -148,6 +148,8 @@ w1->draw = draw_wall; w1->walkable = false; w1->data = NULL; + w1->x = x; + w1->y = y; unsigned key = (dir == HORIZONTAL) ? XY_KEY(x+i, y) : XY_KEY(x, y+i); void* val = insertItem(get_active_map()->items, key, w1); if (val) free(val); // If something is already there, free it @@ -161,6 +163,8 @@ w1->draw = draw_netPortal; w1->walkable = false; w1->data = NULL; + w1->x = x; + w1->y = y; void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1); if (val) free(val); // If something is already there, free it } @@ -172,6 +176,8 @@ w1->draw = draw_terminal; w1->walkable = false; w1->data = NULL; + w1->x = x; + w1->y = y; void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1); if (val) free(val); // If something is already there, free it } @@ -183,6 +189,8 @@ w1->draw = draw_hacked_terminal; w1->walkable = false; w1->data = NULL; + w1->x = x; + w1->y = y; void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1); if (val) free(val); // If something is already there, free it } @@ -194,6 +202,8 @@ w1->draw = draw_NPC; w1->walkable = false; w1->data = NULL; + w1->x = x; + w1->y = y; void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1); if (val) free(val); // If something is already there, free it } @@ -205,6 +215,8 @@ w1->draw = draw_plant; w1->walkable = true; w1->data = NULL; + w1->x = x; + w1->y = y; void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1); if (val) free(val); // If something is already there, free it } @@ -216,6 +228,8 @@ w1->draw = draw_door; w1->walkable = walk; w1->data = NULL; + w1->x = x; + w1->y = y; void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1); if (val) free(val); // If something is already there, free it } @@ -226,6 +240,8 @@ w1->draw = draw_boots; w1->walkable = false; w1->data = NULL; + w1->x = x; + w1->y = y; void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1); if (val) free(val); // If something is already there, free it } @@ -235,6 +251,8 @@ w1->draw = draw_gun; w1->walkable = false; w1->data = NULL; + w1->x = x; + w1->y = y; void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1); if (val) free(val); // If something is already there, free it } @@ -244,6 +262,8 @@ w1->draw = draw_printer; w1->walkable = false; w1->data = NULL; + w1->x = x; + w1->y = y; void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1); if (val) free(val); // If something is already there, free it } @@ -253,6 +273,8 @@ w1->draw = draw_teleport; w1->walkable = false; w1->data = NULL; + w1->x = x; + w1->y = y; void* val = insertItem(get_active_map()->items, XY_KEY(x, y), w1); if (val) free(val); // If something is already there, free it } \ No newline at end of file