Christmas pokitto game
polar.cpp@0:8bd3f20eb4de, 2017-12-26 (annotated)
- Committer:
- trelemar
- Date:
- Tue Dec 26 23:46:15 2017 +0000
- Revision:
- 0:8bd3f20eb4de
opensource commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
trelemar | 0:8bd3f20eb4de | 1 | #include "Pokitto.h" |
trelemar | 0:8bd3f20eb4de | 2 | #include <vector> |
trelemar | 0:8bd3f20eb4de | 3 | #include <stdint.h> |
trelemar | 0:8bd3f20eb4de | 4 | #include "sprites.h" |
trelemar | 0:8bd3f20eb4de | 5 | #include "bear_sprites.h" |
trelemar | 0:8bd3f20eb4de | 6 | |
trelemar | 0:8bd3f20eb4de | 7 | Pokitto::Core game; |
trelemar | 0:8bd3f20eb4de | 8 | Pokitto::Display disp; |
trelemar | 0:8bd3f20eb4de | 9 | Pokitto::Buttons btn; |
trelemar | 0:8bd3f20eb4de | 10 | |
trelemar | 0:8bd3f20eb4de | 11 | #define WHITE 13 |
trelemar | 0:8bd3f20eb4de | 12 | |
trelemar | 0:8bd3f20eb4de | 13 | #define SW 110 |
trelemar | 0:8bd3f20eb4de | 14 | #define SH 88 |
trelemar | 0:8bd3f20eb4de | 15 | |
trelemar | 0:8bd3f20eb4de | 16 | #define MAP_WIDTH 48 |
trelemar | 0:8bd3f20eb4de | 17 | #define MAP_HEIGHT 48 |
trelemar | 0:8bd3f20eb4de | 18 | |
trelemar | 0:8bd3f20eb4de | 19 | #define ID_BEAR 0 |
trelemar | 0:8bd3f20eb4de | 20 | #define ID_PRESENT 7 |
trelemar | 0:8bd3f20eb4de | 21 | #define ID_PENGUIN 33 |
trelemar | 0:8bd3f20eb4de | 22 | #define ID_PORCH 35 |
trelemar | 0:8bd3f20eb4de | 23 | |
trelemar | 0:8bd3f20eb4de | 24 | bool game_won = false; |
trelemar | 0:8bd3f20eb4de | 25 | bool given_hat = false; |
trelemar | 0:8bd3f20eb4de | 26 | bool debug_console = false; |
trelemar | 0:8bd3f20eb4de | 27 | int present_count = 0; |
trelemar | 0:8bd3f20eb4de | 28 | |
trelemar | 0:8bd3f20eb4de | 29 | const uint8_t logo[] = |
trelemar | 0:8bd3f20eb4de | 30 | { |
trelemar | 0:8bd3f20eb4de | 31 | 32,52, |
trelemar | 0:8bd3f20eb4de | 32 | 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 33 | 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 34 | 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 35 | 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 36 | 34,34,34,34,35,50,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 37 | 34,34,34,34,61,211,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 38 | 34,34,34,35,221,221,50,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 39 | 34,34,34,35,221,221,50,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 40 | 34,34,35,51,221,221,51,50,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 41 | 34,34,61,221,29,209,221,211,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 42 | 34,35,221,221,209,29,221,221,50,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 43 | 34,35,221,221,209,29,221,221,50,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 44 | 34,35,29,221,29,209,221,209,50,34,35,50,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 45 | 34,35,17,17,221,221,17,17,50,34,61,99,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 46 | 34,34,49,17,221,221,17,19,34,35,214,102,50,34,34,34, |
trelemar | 0:8bd3f20eb4de | 47 | 34,34,35,51,221,221,51,50,34,35,102,102,50,34,34,34, |
trelemar | 0:8bd3f20eb4de | 48 | 34,34,34,35,29,209,50,34,35,51,38,98,51,50,34,34, |
trelemar | 0:8bd3f20eb4de | 49 | 34,34,34,35,17,17,50,34,61,243,34,34,61,83,34,34, |
trelemar | 0:8bd3f20eb4de | 50 | 34,34,34,34,49,19,34,35,223,255,50,35,213,85,50,34, |
trelemar | 0:8bd3f20eb4de | 51 | 34,34,34,34,35,50,34,35,255,255,51,51,85,85,50,34, |
trelemar | 0:8bd3f20eb4de | 52 | 34,34,34,34,34,34,34,35,175,250,51,51,69,84,50,34, |
trelemar | 0:8bd3f20eb4de | 53 | 34,34,34,34,34,34,34,35,170,170,61,131,68,68,50,34, |
trelemar | 0:8bd3f20eb4de | 54 | 34,34,34,34,34,34,34,34,58,163,216,136,52,67,34,34, |
trelemar | 0:8bd3f20eb4de | 55 | 34,34,34,34,34,34,34,34,35,51,136,136,51,50,34,34, |
trelemar | 0:8bd3f20eb4de | 56 | 34,34,34,34,34,34,34,34,34,35,152,137,50,34,34,34, |
trelemar | 0:8bd3f20eb4de | 57 | 34,34,34,34,34,34,34,34,34,35,153,153,50,34,34,34, |
trelemar | 0:8bd3f20eb4de | 58 | 34,34,34,34,34,34,34,34,34,34,57,147,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 59 | 34,34,34,34,34,34,34,34,34,34,35,50,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 60 | 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 61 | 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 62 | 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 63 | 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 64 | 34,34,34,45,221,221,45,221,210,45,221,221,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 65 | 34,34,34,33,29,17,45,17,29,45,17,17,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 66 | 34,34,34,34,45,34,45,34,45,45,221,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 67 | 34,34,34,34,45,34,45,221,209,45,17,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 68 | 34,34,34,34,45,34,45,17,29,45,221,221,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 69 | 34,34,34,34,33,34,33,34,33,33,17,17,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 70 | 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 71 | 34,34,34,34,34,210,34,34,221,221,210,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 72 | 34,34,34,34,34,210,34,34,209,17,18,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 73 | 34,34,34,34,34,210,34,34,221,210,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 74 | 34,34,34,34,34,210,34,34,209,18,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 75 | 34,34,34,34,34,221,221,210,221,221,210,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 76 | 34,34,34,34,34,17,17,18,17,17,18,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 77 | 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 78 | 34,34,34,45,34,45,34,221,210,45,221,210,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 79 | 34,34,34,45,210,221,45,17,29,45,17,29,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 80 | 34,34,34,45,29,29,45,34,45,45,34,45,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 81 | 34,34,34,45,33,45,45,221,221,45,221,209,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 82 | 34,34,34,45,34,45,45,17,29,45,17,29,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 83 | 34,34,34,33,34,33,33,34,33,33,34,33,34,34,34,34, |
trelemar | 0:8bd3f20eb4de | 84 | }; |
trelemar | 0:8bd3f20eb4de | 85 | |
trelemar | 0:8bd3f20eb4de | 86 | using namespace std; |
trelemar | 0:8bd3f20eb4de | 87 | |
trelemar | 0:8bd3f20eb4de | 88 | float lerp(float a, float b, float t) { |
trelemar | 0:8bd3f20eb4de | 89 | return (1-t)*a + t*b; |
trelemar | 0:8bd3f20eb4de | 90 | } |
trelemar | 0:8bd3f20eb4de | 91 | |
trelemar | 0:8bd3f20eb4de | 92 | float clip(float n, float lower, float upper) { |
trelemar | 0:8bd3f20eb4de | 93 | return std::max(lower, std::min(n, upper)); |
trelemar | 0:8bd3f20eb4de | 94 | } |
trelemar | 0:8bd3f20eb4de | 95 | int clip(int n, int lower, int upper) { |
trelemar | 0:8bd3f20eb4de | 96 | return std::max(lower, std::min(n, upper)); |
trelemar | 0:8bd3f20eb4de | 97 | } |
trelemar | 0:8bd3f20eb4de | 98 | |
trelemar | 0:8bd3f20eb4de | 99 | float dist(float x1, float y1, float x2, float y2) { |
trelemar | 0:8bd3f20eb4de | 100 | float x = x1 - x2; |
trelemar | 0:8bd3f20eb4de | 101 | float y = y1 - y2; |
trelemar | 0:8bd3f20eb4de | 102 | float dist; |
trelemar | 0:8bd3f20eb4de | 103 | dist = pow(x,2)+pow(y,2); |
trelemar | 0:8bd3f20eb4de | 104 | dist = sqrt(dist); |
trelemar | 0:8bd3f20eb4de | 105 | return dist; |
trelemar | 0:8bd3f20eb4de | 106 | } |
trelemar | 0:8bd3f20eb4de | 107 | float angle(float x1, float y1, float x2, float y2) { |
trelemar | 0:8bd3f20eb4de | 108 | return atan2(y1 - y2, x1 - x2); |
trelemar | 0:8bd3f20eb4de | 109 | } |
trelemar | 0:8bd3f20eb4de | 110 | |
trelemar | 0:8bd3f20eb4de | 111 | void splashScreen(char * name, char bg_color, char text_color) { |
trelemar | 0:8bd3f20eb4de | 112 | disp.persistence = true; |
trelemar | 0:8bd3f20eb4de | 113 | disp.bgcolor = bg_color; |
trelemar | 0:8bd3f20eb4de | 114 | disp.clear(); |
trelemar | 0:8bd3f20eb4de | 115 | disp.textWrap = true; |
trelemar | 0:8bd3f20eb4de | 116 | disp.drawBitmap((SW/2)-16,(SH/2)-28, logo); |
trelemar | 0:8bd3f20eb4de | 117 | disp.setColor(text_color); |
trelemar | 0:8bd3f20eb4de | 118 | disp.print(SW/2- ((strlen(name)*4)/2)-2,SH-7,name); |
trelemar | 0:8bd3f20eb4de | 119 | //game.wait(time); |
trelemar | 0:8bd3f20eb4de | 120 | for (int c=0; c<16;c++) { |
trelemar | 0:8bd3f20eb4de | 121 | disp.palette[c] = 0x00; |
trelemar | 0:8bd3f20eb4de | 122 | } |
trelemar | 0:8bd3f20eb4de | 123 | disp.update(); |
trelemar | 0:8bd3f20eb4de | 124 | |
trelemar | 0:8bd3f20eb4de | 125 | int frame = 0; |
trelemar | 0:8bd3f20eb4de | 126 | |
trelemar | 0:8bd3f20eb4de | 127 | while (frame<180&&!btn.cBtn()) { |
trelemar | 0:8bd3f20eb4de | 128 | if (frame<60) { |
trelemar | 0:8bd3f20eb4de | 129 | for (int c = 0; c<16; c++) { |
trelemar | 0:8bd3f20eb4de | 130 | disp.palette[c] = disp.interpolateColor(disp.palette[c], sprites_pal[c], (255/60)*frame); |
trelemar | 0:8bd3f20eb4de | 131 | } |
trelemar | 0:8bd3f20eb4de | 132 | } |
trelemar | 0:8bd3f20eb4de | 133 | else if (frame<120) { |
trelemar | 0:8bd3f20eb4de | 134 | disp.load565Palette(sprites_pal); |
trelemar | 0:8bd3f20eb4de | 135 | } |
trelemar | 0:8bd3f20eb4de | 136 | else { |
trelemar | 0:8bd3f20eb4de | 137 | for (int c = 0; c<16; c++) { |
trelemar | 0:8bd3f20eb4de | 138 | disp.palette[c] = disp.interpolateColor(disp.palette[c], 0x00, (255/60)*(frame-120)); |
trelemar | 0:8bd3f20eb4de | 139 | } |
trelemar | 0:8bd3f20eb4de | 140 | } |
trelemar | 0:8bd3f20eb4de | 141 | disp.update(); |
trelemar | 0:8bd3f20eb4de | 142 | frame++; |
trelemar | 0:8bd3f20eb4de | 143 | } |
trelemar | 0:8bd3f20eb4de | 144 | |
trelemar | 0:8bd3f20eb4de | 145 | disp.persistence = false; |
trelemar | 0:8bd3f20eb4de | 146 | } |
trelemar | 0:8bd3f20eb4de | 147 | |
trelemar | 0:8bd3f20eb4de | 148 | char dialogs[][88] { |
trelemar | 0:8bd3f20eb4de | 149 | {"Oh no! Santa's sleigh had a\nhole in the floor and all the presents fell from the sky!"}, |
trelemar | 0:8bd3f20eb4de | 150 | {"Do you think you can find all of them before Christmas\nday?"}, |
trelemar | 0:8bd3f20eb4de | 151 | {"If you find a present, pick it up and bring it back to the workshop!"}, |
trelemar | 0:8bd3f20eb4de | 152 | {"Just set them on the porch here. Be careful though,\n it's icy out there!"}, |
trelemar | 0:8bd3f20eb4de | 153 | {"You may carry more than one present at a time,\nbut they're pretty HEAVY!"}, |
trelemar | 0:8bd3f20eb4de | 154 | |
trelemar | 0:8bd3f20eb4de | 155 | {"You did it! You saved Christmas! Here, have a hat for your reward."}, |
trelemar | 0:8bd3f20eb4de | 156 | {"There's not much left to do anymore. Continue to roam around if you'd like."} |
trelemar | 0:8bd3f20eb4de | 157 | |
trelemar | 0:8bd3f20eb4de | 158 | }; |
trelemar | 0:8bd3f20eb4de | 159 | |
trelemar | 0:8bd3f20eb4de | 160 | bool dialog_active = false; |
trelemar | 0:8bd3f20eb4de | 161 | char active_dialog = 0; |
trelemar | 0:8bd3f20eb4de | 162 | char dialog_index = 0; |
trelemar | 0:8bd3f20eb4de | 163 | int dialog_draw_y = -42; |
trelemar | 0:8bd3f20eb4de | 164 | char dialog_target_y = 2; |
trelemar | 0:8bd3f20eb4de | 165 | |
trelemar | 0:8bd3f20eb4de | 166 | void drawDialog(int y, int collected_presents) { |
trelemar | 0:8bd3f20eb4de | 167 | |
trelemar | 0:8bd3f20eb4de | 168 | if (!dialog_active) return; |
trelemar | 0:8bd3f20eb4de | 169 | |
trelemar | 0:8bd3f20eb4de | 170 | disp.setColor(3); |
trelemar | 0:8bd3f20eb4de | 171 | int height = disp.fontHeight*3; |
trelemar | 0:8bd3f20eb4de | 172 | disp.fillRectangle(0,y,110,height); |
trelemar | 0:8bd3f20eb4de | 173 | disp.setColor(2); |
trelemar | 0:8bd3f20eb4de | 174 | disp.drawLine(0, y+height, 110, y + height); |
trelemar | 0:8bd3f20eb4de | 175 | disp.setColor(1); |
trelemar | 0:8bd3f20eb4de | 176 | disp.drawLine(0, y+height+1, 110, y + height+1); |
trelemar | 0:8bd3f20eb4de | 177 | disp.setColor(0); |
trelemar | 0:8bd3f20eb4de | 178 | disp.setCursor(0, y+1); |
trelemar | 0:8bd3f20eb4de | 179 | disp.print(" "); |
trelemar | 0:8bd3f20eb4de | 180 | for (char i = 0; i<dialog_index; i++) { |
trelemar | 0:8bd3f20eb4de | 181 | disp.print(dialogs[active_dialog][i]); |
trelemar | 0:8bd3f20eb4de | 182 | if (disp.cursorX==0) disp.cursorX = 3; |
trelemar | 0:8bd3f20eb4de | 183 | } |
trelemar | 0:8bd3f20eb4de | 184 | |
trelemar | 0:8bd3f20eb4de | 185 | if (game.frameCount%1==0) dialog_index = min(dialog_index + 1, 88); |
trelemar | 0:8bd3f20eb4de | 186 | if (dialog_index>44) { |
trelemar | 0:8bd3f20eb4de | 187 | disp.drawBitmap(100, y + 20, sprites[31 + ((game.frameCount / 4) % 2)]); |
trelemar | 0:8bd3f20eb4de | 188 | if (btn.pressed(BTN_A)) { |
trelemar | 0:8bd3f20eb4de | 189 | active_dialog++; |
trelemar | 0:8bd3f20eb4de | 190 | if (active_dialog==6&&game_won) { |
trelemar | 0:8bd3f20eb4de | 191 | given_hat = true; |
trelemar | 0:8bd3f20eb4de | 192 | } |
trelemar | 0:8bd3f20eb4de | 193 | if ((active_dialog>4&&!game_won)||(active_dialog>6&&game_won)) { |
trelemar | 0:8bd3f20eb4de | 194 | dialog_target_y = -42; |
trelemar | 0:8bd3f20eb4de | 195 | dialog_active = false; |
trelemar | 0:8bd3f20eb4de | 196 | } |
trelemar | 0:8bd3f20eb4de | 197 | dialog_index=0; |
trelemar | 0:8bd3f20eb4de | 198 | } |
trelemar | 0:8bd3f20eb4de | 199 | } |
trelemar | 0:8bd3f20eb4de | 200 | dialog_draw_y = lerp(dialog_draw_y, dialog_target_y, 0.2); |
trelemar | 0:8bd3f20eb4de | 201 | |
trelemar | 0:8bd3f20eb4de | 202 | if (dialog_target_y == -42 && dialog_draw_y < -40) dialog_active = false; |
trelemar | 0:8bd3f20eb4de | 203 | } |
trelemar | 0:8bd3f20eb4de | 204 | |
trelemar | 0:8bd3f20eb4de | 205 | |
trelemar | 0:8bd3f20eb4de | 206 | bool SOLID_TILES[40] { |
trelemar | 0:8bd3f20eb4de | 207 | 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, |
trelemar | 0:8bd3f20eb4de | 208 | 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
trelemar | 0:8bd3f20eb4de | 209 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
trelemar | 0:8bd3f20eb4de | 210 | 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, |
trelemar | 0:8bd3f20eb4de | 211 | }; |
trelemar | 0:8bd3f20eb4de | 212 | |
trelemar | 0:8bd3f20eb4de | 213 | namespace Map { |
trelemar | 0:8bd3f20eb4de | 214 | unsigned char data[MAP_WIDTH*MAP_HEIGHT] = { |
trelemar | 0:8bd3f20eb4de | 215 | 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, |
trelemar | 0:8bd3f20eb4de | 216 | 3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,3,3,3,3,3,3,3,3,3,3,0,0,6,3,3,3,3,3,3,3,3,3,3, |
trelemar | 0:8bd3f20eb4de | 217 | 3,3,3,1,1,1,0,0,0,6,5,6,0,6,6,6,5,6,0,6,0,6,0,3,3,1,1,0,3,3,3,3,3,3,3,0,10,0,0,6,0,0,1,1,1,3,3,3, |
trelemar | 0:8bd3f20eb4de | 218 | 3,3,1,5,1,0,1,0,6,0,6,0,0,5,6,7,6,0,6,0,0,0,0,3,1,0,0,0,0,3,3,3,3,3,6,0,0,0,0,0,0,6,6,0,6,1,3,3, |
trelemar | 0:8bd3f20eb4de | 219 | 3,3,1,0,6,0,6,0,6,0,0,1,6,1,0,6,6,6,6,0,6,6,6,3,0,0,0,0,0,0,3,3,3,0,6,1,0,0,0,0,0,6,6,5,0,6,1,3, |
trelemar | 0:8bd3f20eb4de | 220 | 3,3,1,5,6,0,0,6,0,0,0,0,0,0,6,0,6,1,5,1,0,6,0,3,0,0,8,0,1,0,3,3,3,3,6,6,0,6,6,6,0,0,0,6,0,0,1,3, |
trelemar | 0:8bd3f20eb4de | 221 | 3,1,6,6,6,0,0,0,0,0,0,0,0,0,0,6,0,0,6,1,1,6,6,3,3,0,0,0,0,5,3,3,3,3,6,6,1,0,6,3,6,6,9,6,1,0,1,3, |
trelemar | 0:8bd3f20eb4de | 222 | 3,1,0,0,0,6,5,0,0,0,0,0,0,6,0,0,0,5,6,1,1,6,6,0,3,3,3,0,0,0,3,3,3,0,6,6,0,0,6,0,6,6,0,0,6,0,6,3, |
trelemar | 0:8bd3f20eb4de | 223 | 3,1,0,0,6,0,0,0,0,0,0,0,6,0,6,0,0,0,6,1,6,0,0,1,6,5,3,3,0,0,3,3,3,6,6,0,0,5,6,6,0,0,0,5,0,0,0,3, |
trelemar | 0:8bd3f20eb4de | 224 | 3,1,0,0,5,0,0,0,0,0,30,30,30,30,30,5,0,1,6,6,5,6,6,0,6,5,5,3,3,0,3,3,0,6,0,0,0,6,6,0,1,6,0,0,0,0,0,3, |
trelemar | 0:8bd3f20eb4de | 225 | 3,1,6,5,6,0,0,6,5,6,30,30,30,30,30,6,0,0,0,0,0,6,6,0,6,6,0,1,3,0,0,3,6,6,0,6,0,0,0,0,6,6,5,6,6,6,0,3, |
trelemar | 0:8bd3f20eb4de | 226 | 3,1,6,5,6,6,6,0,6,0,16,15,15,15,18,1,6,6,0,1,0,5,0,6,0,6,6,6,6,6,6,6,0,0,6,0,0,5,0,6,6,0,6,1,6,0,3,3, |
trelemar | 0:8bd3f20eb4de | 227 | 3,6,1,1,0,5,6,0,6,5,17,13,13,13,17,6,6,0,6,0,0,0,0,0,6,5,6,0,0,0,6,0,0,0,0,0,0,6,6,0,0,6,0,0,0,0,3,3, |
trelemar | 0:8bd3f20eb4de | 228 | 3,0,6,6,6,6,6,6,5,36,19,20,14,12,20,36,6,5,0,0,5,0,6,1,0,0,6,0,0,0,0,6,0,1,0,6,6,1,6,0,0,6,0,0,0,6,3,3, |
trelemar | 0:8bd3f20eb4de | 229 | 3,0,5,6,0,5,6,0,1,36,35,35,35,35,35,36,1,0,0,6,0,0,5,6,0,0,0,0,0,6,0,6,6,0,6,6,6,1,1,6,0,0,0,5,5,6,0,3, |
trelemar | 0:8bd3f20eb4de | 230 | 3,6,1,5,0,6,5,0,0,36,35,35,35,35,35,36,0,6,5,0,1,6,0,6,0,6,6,6,0,6,0,0,6,6,6,6,1,1,1,6,6,1,6,6,0,6,0,3, |
trelemar | 0:8bd3f20eb4de | 231 | 3,3,6,0,0,6,6,1,6,37,38,38,6,38,38,39,0,6,6,0,0,5,0,6,0,6,1,1,6,6,0,0,1,6,6,1,1,6,6,6,3,3,6,6,0,6,0,3, |
trelemar | 0:8bd3f20eb4de | 232 | 3,3,0,6,5,0,6,6,6,1,6,6,6,33,0,0,0,6,0,6,6,6,6,6,0,1,1,5,0,6,6,6,1,1,1,1,1,1,6,6,3,0,0,0,0,0,0,3, |
trelemar | 0:8bd3f20eb4de | 233 | 3,3,0,0,0,6,0,0,0,5,0,2,6,6,6,6,21,23,6,0,5,6,0,0,6,1,1,1,6,0,6,5,1,1,1,5,1,1,6,6,0,0,5,0,6,6,0,3, |
trelemar | 0:8bd3f20eb4de | 234 | 3,3,3,5,0,0,6,6,6,0,0,5,6,21,22,22,25,25,23,6,0,6,6,0,5,0,1,1,5,6,6,1,1,1,1,1,5,6,0,0,6,6,0,6,0,1,6,3, |
trelemar | 0:8bd3f20eb4de | 235 | 3,3,3,3,5,0,6,5,0,0,1,6,6,24,25,25,28,28,25,23,5,6,1,6,5,0,0,1,6,6,6,1,1,6,6,0,0,0,0,6,5,1,0,0,0,6,0,3, |
trelemar | 0:8bd3f20eb4de | 236 | 3,3,3,3,3,3,3,0,1,6,5,6,6,27,28,29,0,1,27,29,0,0,0,5,0,6,0,5,0,1,6,6,1,1,6,0,6,5,6,5,0,0,0,6,0,0,0,3, |
trelemar | 0:8bd3f20eb4de | 237 | 3,3,3,1,3,3,3,3,0,5,6,0,6,6,6,6,5,0,0,0,0,0,6,0,0,0,6,0,0,6,6,6,1,1,1,6,0,0,6,6,6,5,0,6,6,0,6,3, |
trelemar | 0:8bd3f20eb4de | 238 | 3,3,1,1,1,1,3,3,6,0,0,6,0,0,5,6,5,0,6,6,1,6,6,0,6,3,3,3,3,3,5,6,6,1,1,6,6,6,6,1,1,6,0,0,0,7,0,3, |
trelemar | 0:8bd3f20eb4de | 239 | 3,3,1,6,0,0,0,3,6,0,5,5,0,1,1,6,0,6,0,0,6,0,6,6,3,3,6,6,0,3,6,0,6,1,1,1,1,1,1,1,1,6,6,0,6,6,0,3, |
trelemar | 0:8bd3f20eb4de | 240 | 3,3,0,5,0,5,0,3,3,0,5,5,6,6,1,1,1,0,0,6,1,0,5,0,3,5,6,5,7,3,3,3,1,1,1,6,6,1,1,6,6,6,0,5,0,0,6,3, |
trelemar | 0:8bd3f20eb4de | 241 | 3,3,0,0,10,0,0,3,3,6,6,0,6,6,6,6,5,0,0,0,6,0,0,1,3,3,0,1,6,6,3,3,3,1,6,0,6,0,0,6,0,0,6,1,5,6,0,3, |
trelemar | 0:8bd3f20eb4de | 242 | 3,3,0,5,0,0,0,3,5,6,6,0,6,0,6,6,0,5,6,6,6,5,5,5,0,3,3,0,5,0,3,3,3,5,0,0,9,0,0,0,6,0,6,6,6,0,0,3, |
trelemar | 0:8bd3f20eb4de | 243 | 3,3,3,0,0,0,0,0,6,5,0,1,6,0,6,5,1,6,6,6,6,6,0,6,0,0,5,6,6,6,3,3,3,0,6,6,6,5,0,0,6,6,6,6,6,6,5,3, |
trelemar | 0:8bd3f20eb4de | 244 | 3,3,3,3,0,5,0,0,0,6,6,6,0,6,1,6,0,1,0,6,0,0,5,6,0,0,0,6,0,3,3,3,3,3,6,1,1,1,6,1,1,5,6,6,6,6,3,3, |
trelemar | 0:8bd3f20eb4de | 245 | 3,3,3,3,3,3,3,3,6,0,6,6,6,6,5,6,6,6,0,5,0,6,1,6,0,0,0,3,3,3,0,0,3,3,6,3,1,1,1,1,6,6,0,6,6,3,3,3, |
trelemar | 0:8bd3f20eb4de | 246 | 3,3,3,3,3,3,3,3,3,3,3,6,0,6,5,0,0,0,0,0,0,1,0,5,0,0,0,0,0,0,0,0,0,3,3,3,3,0,0,0,0,0,3,3,3,3,3,3, |
trelemar | 0:8bd3f20eb4de | 247 | 3,3,3,3,3,3,1,6,6,6,6,0,0,0,6,0,0,5,0,5,0,6,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,3,3,3,3,3,3, |
trelemar | 0:8bd3f20eb4de | 248 | 3,3,3,3,3,1,1,6,6,0,5,6,6,1,6,0,5,0,0,0,6,0,6,0,6,0,0,6,0,0,0,5,0,0,0,6,1,5,0,6,0,0,0,3,3,3,3,3, |
trelemar | 0:8bd3f20eb4de | 249 | 3,3,3,1,1,1,0,0,0,0,5,0,0,0,0,6,0,5,1,0,0,0,3,3,0,0,0,0,6,1,0,6,0,0,6,0,0,6,6,6,0,0,0,1,3,3,3,3, |
trelemar | 0:8bd3f20eb4de | 250 | 3,3,1,1,0,0,6,0,0,6,6,0,0,6,6,0,6,0,0,3,3,3,3,6,1,6,0,5,0,0,0,0,0,1,6,5,6,0,0,0,0,0,6,6,0,3,3,3, |
trelemar | 0:8bd3f20eb4de | 251 | 3,1,1,0,0,0,6,0,6,0,0,6,0,0,0,6,0,3,3,3,3,3,3,0,0,0,0,0,0,0,21,22,23,0,0,6,0,6,0,1,1,5,0,0,0,1,3,3, |
trelemar | 0:8bd3f20eb4de | 252 | 3,1,6,6,0,6,0,0,0,0,0,5,0,6,0,0,0,3,3,3,0,0,6,0,0,6,0,21,22,22,25,25,26,0,0,0,0,1,1,1,1,6,6,1,6,5,3,3, |
trelemar | 0:8bd3f20eb4de | 253 | 3,0,6,6,1,5,0,0,0,0,6,0,0,0,0,6,0,6,0,0,0,5,0,0,0,21,22,25,25,25,25,25,29,6,0,0,0,1,1,1,6,6,0,6,0,0,3,3, |
trelemar | 0:8bd3f20eb4de | 254 | 3,0,1,0,0,6,6,0,0,9,6,6,0,0,0,0,0,5,5,0,0,0,0,0,0,6,0,0,6,27,28,29,0,6,1,0,0,1,1,0,6,1,0,0,6,6,3,3, |
trelemar | 0:8bd3f20eb4de | 255 | 3,0,0,0,1,1,6,0,0,0,0,0,0,0,6,6,6,0,6,0,1,0,5,0,0,0,0,0,6,6,0,1,6,5,0,6,5,0,0,0,0,0,0,5,7,0,3,3, |
trelemar | 0:8bd3f20eb4de | 256 | 3,5,0,0,0,1,1,6,6,0,0,6,0,5,0,6,0,0,0,5,6,5,0,0,0,1,1,6,0,0,1,0,6,0,0,6,0,0,0,6,0,0,0,6,6,6,3,3, |
trelemar | 0:8bd3f20eb4de | 257 | 3,0,0,0,0,0,1,1,5,0,0,0,0,1,1,0,5,6,0,0,0,6,6,6,6,0,6,5,6,0,6,1,0,0,0,6,6,6,0,0,6,5,0,6,0,0,6,3, |
trelemar | 0:8bd3f20eb4de | 258 | 3,3,3,0,0,6,1,1,1,1,0,0,0,0,6,0,5,5,0,0,0,5,0,6,0,0,0,6,0,6,6,6,0,0,1,0,0,5,0,0,0,6,6,0,6,0,0,3, |
trelemar | 0:8bd3f20eb4de | 259 | 3,3,3,6,0,0,0,1,1,1,0,0,6,6,6,6,5,6,0,6,0,6,5,0,6,0,0,0,5,6,0,0,0,0,5,0,6,6,0,0,9,0,0,6,0,1,3,3, |
trelemar | 0:8bd3f20eb4de | 260 | 3,3,3,3,5,6,7,0,1,1,0,6,0,6,6,0,0,3,3,0,6,6,0,5,6,0,6,6,0,5,1,0,0,0,0,6,0,0,0,0,0,0,0,5,0,3,3,3, |
trelemar | 0:8bd3f20eb4de | 261 | 3,3,3,3,3,3,0,6,3,3,3,3,3,3,3,3,3,3,3,3,3,5,6,0,0,5,0,0,0,0,0,5,6,0,0,5,6,0,0,3,3,3,3,3,3,3,3,3, |
trelemar | 0:8bd3f20eb4de | 262 | 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, |
trelemar | 0:8bd3f20eb4de | 263 | }; |
trelemar | 0:8bd3f20eb4de | 264 | |
trelemar | 0:8bd3f20eb4de | 265 | int getID(int x, int y) { |
trelemar | 0:8bd3f20eb4de | 266 | int addr = (y * MAP_WIDTH) + x; |
trelemar | 0:8bd3f20eb4de | 267 | return data[addr]; |
trelemar | 0:8bd3f20eb4de | 268 | } |
trelemar | 0:8bd3f20eb4de | 269 | |
trelemar | 0:8bd3f20eb4de | 270 | bool checkSolid(int x, int y) { |
trelemar | 0:8bd3f20eb4de | 271 | return SOLID_TILES[getID(x, y)]; |
trelemar | 0:8bd3f20eb4de | 272 | } |
trelemar | 0:8bd3f20eb4de | 273 | |
trelemar | 0:8bd3f20eb4de | 274 | float cam_x, cam_y; |
trelemar | 0:8bd3f20eb4de | 275 | |
trelemar | 0:8bd3f20eb4de | 276 | void update(int target_x, int target_y) { |
trelemar | 0:8bd3f20eb4de | 277 | cam_x = clip(lerp(cam_x, 55 - target_x - 5, .1), (float)-((MAP_WIDTH*10)-110), (float).0); |
trelemar | 0:8bd3f20eb4de | 278 | cam_y = clip(lerp(cam_y, 44 - target_y - 5, .1), (float)-((MAP_HEIGHT*10)-88), (float).0); |
trelemar | 0:8bd3f20eb4de | 279 | //cam_x = clip(55 - target_x, -((MAP_WIDTH*10)-110), 0); |
trelemar | 0:8bd3f20eb4de | 280 | //cam_y = clip(44 - target_y, -((MAP_HEIGHT*10)-88), 0); |
trelemar | 0:8bd3f20eb4de | 281 | } |
trelemar | 0:8bd3f20eb4de | 282 | void drawFast() { |
trelemar | 0:8bd3f20eb4de | 283 | for (unsigned char tx = 0; tx<12; tx++) { |
trelemar | 0:8bd3f20eb4de | 284 | for (unsigned char ty = 0; ty<10; ty++) { |
trelemar | 0:8bd3f20eb4de | 285 | unsigned char id = getID(tx-(cam_x/10), ty-(cam_y/10)); |
trelemar | 0:8bd3f20eb4de | 286 | if (id!=0) { |
trelemar | 0:8bd3f20eb4de | 287 | if ((id == 33)&&(game.frameCount/8)%2==0) id = 33+1; |
trelemar | 0:8bd3f20eb4de | 288 | disp.drawBitmap(tx*10 + ((int)cam_x%10), ty*10 + ((int)cam_y%10), sprites[id]); |
trelemar | 0:8bd3f20eb4de | 289 | } |
trelemar | 0:8bd3f20eb4de | 290 | } |
trelemar | 0:8bd3f20eb4de | 291 | } |
trelemar | 0:8bd3f20eb4de | 292 | } |
trelemar | 0:8bd3f20eb4de | 293 | void draw() { |
trelemar | 0:8bd3f20eb4de | 294 | for (int i = 0; i<(MAP_WIDTH*MAP_HEIGHT); i++) { |
trelemar | 0:8bd3f20eb4de | 295 | int x, y; |
trelemar | 0:8bd3f20eb4de | 296 | x = i%MAP_WIDTH; |
trelemar | 0:8bd3f20eb4de | 297 | y = (i-x)/MAP_WIDTH; |
trelemar | 0:8bd3f20eb4de | 298 | if (data[i]!=0) disp.drawBitmap(x*10 + cam_x, y*10 + cam_y, sprites[data[i]]); |
trelemar | 0:8bd3f20eb4de | 299 | } |
trelemar | 0:8bd3f20eb4de | 300 | } |
trelemar | 0:8bd3f20eb4de | 301 | } |
trelemar | 0:8bd3f20eb4de | 302 | |
trelemar | 0:8bd3f20eb4de | 303 | struct SnowFlake { |
trelemar | 0:8bd3f20eb4de | 304 | char x, y; |
trelemar | 0:8bd3f20eb4de | 305 | SnowFlake() { |
trelemar | 0:8bd3f20eb4de | 306 | x = random(0,110); |
trelemar | 0:8bd3f20eb4de | 307 | y = random(0,88); |
trelemar | 0:8bd3f20eb4de | 308 | }; |
trelemar | 0:8bd3f20eb4de | 309 | void update() { |
trelemar | 0:8bd3f20eb4de | 310 | y+=random(1, 2); |
trelemar | 0:8bd3f20eb4de | 311 | y%=88; |
trelemar | 0:8bd3f20eb4de | 312 | x+=random(-1,1) % 110; |
trelemar | 0:8bd3f20eb4de | 313 | disp.drawPixel(x, y, WHITE); |
trelemar | 0:8bd3f20eb4de | 314 | } |
trelemar | 0:8bd3f20eb4de | 315 | } snowflakes[20]; |
trelemar | 0:8bd3f20eb4de | 316 | |
trelemar | 0:8bd3f20eb4de | 317 | struct Particle { |
trelemar | 0:8bd3f20eb4de | 318 | int x, y, vx, vy, radius; |
trelemar | 0:8bd3f20eb4de | 319 | unsigned int time; |
trelemar | 0:8bd3f20eb4de | 320 | unsigned char color; |
trelemar | 0:8bd3f20eb4de | 321 | Particle(int _x, int _y, unsigned char _color, unsigned char _radius) { |
trelemar | 0:8bd3f20eb4de | 322 | x = _x; |
trelemar | 0:8bd3f20eb4de | 323 | y = _y; |
trelemar | 0:8bd3f20eb4de | 324 | vx = 0; |
trelemar | 0:8bd3f20eb4de | 325 | vy = 0; |
trelemar | 0:8bd3f20eb4de | 326 | color = _color; |
trelemar | 0:8bd3f20eb4de | 327 | radius = _radius; |
trelemar | 0:8bd3f20eb4de | 328 | time = 0; |
trelemar | 0:8bd3f20eb4de | 329 | } |
trelemar | 0:8bd3f20eb4de | 330 | void update() { |
trelemar | 0:8bd3f20eb4de | 331 | x+=vx; |
trelemar | 0:8bd3f20eb4de | 332 | y+=vy; |
trelemar | 0:8bd3f20eb4de | 333 | if (time % 2 == 0) { |
trelemar | 0:8bd3f20eb4de | 334 | x+=random(-1, 1); |
trelemar | 0:8bd3f20eb4de | 335 | y+=random(-1, 1); |
trelemar | 0:8bd3f20eb4de | 336 | } |
trelemar | 0:8bd3f20eb4de | 337 | time++; |
trelemar | 0:8bd3f20eb4de | 338 | }; |
trelemar | 0:8bd3f20eb4de | 339 | void draw() { |
trelemar | 0:8bd3f20eb4de | 340 | disp.setColor(color); |
trelemar | 0:8bd3f20eb4de | 341 | disp.fillCircle(x + Map::cam_x, y + Map::cam_y, radius); |
trelemar | 0:8bd3f20eb4de | 342 | }; |
trelemar | 0:8bd3f20eb4de | 343 | }; |
trelemar | 0:8bd3f20eb4de | 344 | |
trelemar | 0:8bd3f20eb4de | 345 | vector<Particle> parts; |
trelemar | 0:8bd3f20eb4de | 346 | |
trelemar | 0:8bd3f20eb4de | 347 | |
trelemar | 0:8bd3f20eb4de | 348 | struct Entity { |
trelemar | 0:8bd3f20eb4de | 349 | float x, y, vx, vy; |
trelemar | 0:8bd3f20eb4de | 350 | unsigned char w, h, type, spr, flip; |
trelemar | 0:8bd3f20eb4de | 351 | Entity * target; |
trelemar | 0:8bd3f20eb4de | 352 | Entity(int _x, int _y, unsigned char _type) { |
trelemar | 0:8bd3f20eb4de | 353 | type = _type; |
trelemar | 0:8bd3f20eb4de | 354 | spr = type; |
trelemar | 0:8bd3f20eb4de | 355 | x = _x; |
trelemar | 0:8bd3f20eb4de | 356 | y = _y; |
trelemar | 0:8bd3f20eb4de | 357 | vx = 0.0; |
trelemar | 0:8bd3f20eb4de | 358 | vy = 0.0; |
trelemar | 0:8bd3f20eb4de | 359 | w = 10; |
trelemar | 0:8bd3f20eb4de | 360 | h = 10; |
trelemar | 0:8bd3f20eb4de | 361 | if (type == ID_PRESENT) { |
trelemar | 0:8bd3f20eb4de | 362 | w = 5; |
trelemar | 0:8bd3f20eb4de | 363 | h = 6; |
trelemar | 0:8bd3f20eb4de | 364 | } |
trelemar | 0:8bd3f20eb4de | 365 | target = NULL; |
trelemar | 0:8bd3f20eb4de | 366 | }; |
trelemar | 0:8bd3f20eb4de | 367 | Entity(int _x, int _y, unsigned char _type, int _spr) { |
trelemar | 0:8bd3f20eb4de | 368 | type = _type; |
trelemar | 0:8bd3f20eb4de | 369 | spr = type; |
trelemar | 0:8bd3f20eb4de | 370 | x = _x; |
trelemar | 0:8bd3f20eb4de | 371 | y = _y; |
trelemar | 0:8bd3f20eb4de | 372 | vx = 0.0; |
trelemar | 0:8bd3f20eb4de | 373 | vy = 0.0; |
trelemar | 0:8bd3f20eb4de | 374 | w = 10; |
trelemar | 0:8bd3f20eb4de | 375 | h = 10; |
trelemar | 0:8bd3f20eb4de | 376 | if (type == ID_PRESENT) { |
trelemar | 0:8bd3f20eb4de | 377 | w = 5; |
trelemar | 0:8bd3f20eb4de | 378 | h = 6; |
trelemar | 0:8bd3f20eb4de | 379 | } |
trelemar | 0:8bd3f20eb4de | 380 | target = NULL; |
trelemar | 0:8bd3f20eb4de | 381 | spr = _spr; |
trelemar | 0:8bd3f20eb4de | 382 | }; |
trelemar | 0:8bd3f20eb4de | 383 | |
trelemar | 0:8bd3f20eb4de | 384 | void control(vector<Entity> &ents) { |
trelemar | 0:8bd3f20eb4de | 385 | bool walking = false; |
trelemar | 0:8bd3f20eb4de | 386 | float speed = 1.0; |
trelemar | 0:8bd3f20eb4de | 387 | if (btn.bBtn()) speed = 1.5; |
trelemar | 0:8bd3f20eb4de | 388 | if (btn.leftBtn()) { |
trelemar | 0:8bd3f20eb4de | 389 | vx = max((float)vx-.1,-(double)speed); |
trelemar | 0:8bd3f20eb4de | 390 | flip = 1; |
trelemar | 0:8bd3f20eb4de | 391 | walking = true; |
trelemar | 0:8bd3f20eb4de | 392 | } |
trelemar | 0:8bd3f20eb4de | 393 | else if (btn.rightBtn()) { |
trelemar | 0:8bd3f20eb4de | 394 | vx = min(vx+.1,(double)speed); |
trelemar | 0:8bd3f20eb4de | 395 | flip = 0; |
trelemar | 0:8bd3f20eb4de | 396 | walking = true; |
trelemar | 0:8bd3f20eb4de | 397 | } |
trelemar | 0:8bd3f20eb4de | 398 | else { |
trelemar | 0:8bd3f20eb4de | 399 | vx = lerp(vx, 0, 0.2); |
trelemar | 0:8bd3f20eb4de | 400 | } |
trelemar | 0:8bd3f20eb4de | 401 | |
trelemar | 0:8bd3f20eb4de | 402 | if (btn.upBtn()) { |
trelemar | 0:8bd3f20eb4de | 403 | vy = max((float)vy-.1,-(double)speed); |
trelemar | 0:8bd3f20eb4de | 404 | walking = true; |
trelemar | 0:8bd3f20eb4de | 405 | } |
trelemar | 0:8bd3f20eb4de | 406 | else if (btn.downBtn()) { |
trelemar | 0:8bd3f20eb4de | 407 | vy = min(vy+.1,(double)speed); |
trelemar | 0:8bd3f20eb4de | 408 | walking = true; |
trelemar | 0:8bd3f20eb4de | 409 | } |
trelemar | 0:8bd3f20eb4de | 410 | else { |
trelemar | 0:8bd3f20eb4de | 411 | vy = lerp(vy, 0, 0.2); |
trelemar | 0:8bd3f20eb4de | 412 | } |
trelemar | 0:8bd3f20eb4de | 413 | |
trelemar | 0:8bd3f20eb4de | 414 | if (Map::getID( (x + vx ) / 10, ( y + vy ) / 10 ) == ID_PENGUIN || Map::getID( ( x + w - 1 + vx ) / 10, ( y + vy ) / 10 ) == ID_PENGUIN ) { |
trelemar | 0:8bd3f20eb4de | 415 | if (btn.pressed(BTN_A)) { |
trelemar | 0:8bd3f20eb4de | 416 | dialog_active = true; |
trelemar | 0:8bd3f20eb4de | 417 | if (game_won) { |
trelemar | 0:8bd3f20eb4de | 418 | active_dialog = 5; |
trelemar | 0:8bd3f20eb4de | 419 | } |
trelemar | 0:8bd3f20eb4de | 420 | else active_dialog = 0; |
trelemar | 0:8bd3f20eb4de | 421 | dialog_index = 0; |
trelemar | 0:8bd3f20eb4de | 422 | dialog_draw_y = -42; |
trelemar | 0:8bd3f20eb4de | 423 | dialog_target_y = 2; |
trelemar | 0:8bd3f20eb4de | 424 | } |
trelemar | 0:8bd3f20eb4de | 425 | } |
trelemar | 0:8bd3f20eb4de | 426 | |
trelemar | 0:8bd3f20eb4de | 427 | //------//--ANIMATION-------- |
trelemar | 0:8bd3f20eb4de | 428 | |
trelemar | 0:8bd3f20eb4de | 429 | //--IDLE-- |
trelemar | 0:8bd3f20eb4de | 430 | |
trelemar | 0:8bd3f20eb4de | 431 | if (!walking) { |
trelemar | 0:8bd3f20eb4de | 432 | spr = (game.frameCount/8)%2; |
trelemar | 0:8bd3f20eb4de | 433 | } |
trelemar | 0:8bd3f20eb4de | 434 | |
trelemar | 0:8bd3f20eb4de | 435 | //--WALK-- |
trelemar | 0:8bd3f20eb4de | 436 | else { |
trelemar | 0:8bd3f20eb4de | 437 | int rate = game.frameCount/2; |
trelemar | 0:8bd3f20eb4de | 438 | if (btn.bBtn()) { |
trelemar | 0:8bd3f20eb4de | 439 | rate = game.frameCount; |
trelemar | 0:8bd3f20eb4de | 440 | } |
trelemar | 0:8bd3f20eb4de | 441 | spr = 2 + (rate)%4; |
trelemar | 0:8bd3f20eb4de | 442 | if (game.frameCount%8==0) { |
trelemar | 0:8bd3f20eb4de | 443 | parts.push_back(Particle(x + (w&&flip==1||0), y + h, 13, random(0,1)+.5)); |
trelemar | 0:8bd3f20eb4de | 444 | } |
trelemar | 0:8bd3f20eb4de | 445 | } |
trelemar | 0:8bd3f20eb4de | 446 | //------// |
trelemar | 0:8bd3f20eb4de | 447 | |
trelemar | 0:8bd3f20eb4de | 448 | if (btn.pressed(BTN_A)) { |
trelemar | 0:8bd3f20eb4de | 449 | for (int i = 0; i<ents.size(); i++) { |
trelemar | 0:8bd3f20eb4de | 450 | ents[i].target = NULL; |
trelemar | 0:8bd3f20eb4de | 451 | } |
trelemar | 0:8bd3f20eb4de | 452 | } |
trelemar | 0:8bd3f20eb4de | 453 | }; |
trelemar | 0:8bd3f20eb4de | 454 | |
trelemar | 0:8bd3f20eb4de | 455 | void updateBody(vector<Entity> * ents, int index) { |
trelemar | 0:8bd3f20eb4de | 456 | |
trelemar | 0:8bd3f20eb4de | 457 | for (int i = 0; i<ents->size();i++) { |
trelemar | 0:8bd3f20eb4de | 458 | Entity * other = &ents->at(i); |
trelemar | 0:8bd3f20eb4de | 459 | if (i!=index&&game.collideRectRect(x + vx, y + vy, w-1, h-1, other->x + other->vx, other->y + other->vy, other->w-1, other->h-1)) { |
trelemar | 0:8bd3f20eb4de | 460 | if (i == 0) { |
trelemar | 0:8bd3f20eb4de | 461 | target = other; |
trelemar | 0:8bd3f20eb4de | 462 | } |
trelemar | 0:8bd3f20eb4de | 463 | } |
trelemar | 0:8bd3f20eb4de | 464 | if (i!=index&&game.collideRectRect(x + vx, y + vy, w, h, other->x, other->y, other->w, other->h)) { |
trelemar | 0:8bd3f20eb4de | 465 | if (x+vx<other->x) { |
trelemar | 0:8bd3f20eb4de | 466 | vx-=.1; |
trelemar | 0:8bd3f20eb4de | 467 | } |
trelemar | 0:8bd3f20eb4de | 468 | else vx+=.1; |
trelemar | 0:8bd3f20eb4de | 469 | |
trelemar | 0:8bd3f20eb4de | 470 | if (y+vy<other->y) { |
trelemar | 0:8bd3f20eb4de | 471 | vy-=.1; |
trelemar | 0:8bd3f20eb4de | 472 | } |
trelemar | 0:8bd3f20eb4de | 473 | else vy+=.1; |
trelemar | 0:8bd3f20eb4de | 474 | } |
trelemar | 0:8bd3f20eb4de | 475 | } |
trelemar | 0:8bd3f20eb4de | 476 | |
trelemar | 0:8bd3f20eb4de | 477 | if (index>=1&&target!=NULL) { |
trelemar | 0:8bd3f20eb4de | 478 | float distance = dist(x, y, target->x, target->y); |
trelemar | 0:8bd3f20eb4de | 479 | if (distance>=16) { |
trelemar | 0:8bd3f20eb4de | 480 | float ang = angle(target->x, target->y, x, y); |
trelemar | 0:8bd3f20eb4de | 481 | vx = lerp(vx, vx + cos(ang), distance/100); |
trelemar | 0:8bd3f20eb4de | 482 | vy = lerp(vy, vy + sin(ang), distance/100); |
trelemar | 0:8bd3f20eb4de | 483 | target->vx = lerp(target->vx, target->vx + (-cos(ang)), distance/200); |
trelemar | 0:8bd3f20eb4de | 484 | target->vy = lerp(target->vy, target->vy + (-sin(ang)), distance/200); |
trelemar | 0:8bd3f20eb4de | 485 | } |
trelemar | 0:8bd3f20eb4de | 486 | else { |
trelemar | 0:8bd3f20eb4de | 487 | vx = lerp(vx, 0, 0.05); |
trelemar | 0:8bd3f20eb4de | 488 | vy = lerp(vy, 0, 0.05); |
trelemar | 0:8bd3f20eb4de | 489 | } |
trelemar | 0:8bd3f20eb4de | 490 | |
trelemar | 0:8bd3f20eb4de | 491 | } |
trelemar | 0:8bd3f20eb4de | 492 | else if (index>=1) { |
trelemar | 0:8bd3f20eb4de | 493 | vx = lerp(vx, 0, 0.05); |
trelemar | 0:8bd3f20eb4de | 494 | vy = lerp(vy, 0, 0.05); |
trelemar | 0:8bd3f20eb4de | 495 | } |
trelemar | 0:8bd3f20eb4de | 496 | |
trelemar | 0:8bd3f20eb4de | 497 | |
trelemar | 0:8bd3f20eb4de | 498 | char x_offset = 0; |
trelemar | 0:8bd3f20eb4de | 499 | if (vx>0) {x_offset+=(w-1);} |
trelemar | 0:8bd3f20eb4de | 500 | if (Map::checkSolid((x + vx + x_offset) / 10, y / 10) |
trelemar | 0:8bd3f20eb4de | 501 | || |
trelemar | 0:8bd3f20eb4de | 502 | Map::checkSolid((x + vx + x_offset)/10, (y + h - 1) / 10) |
trelemar | 0:8bd3f20eb4de | 503 | ) |
trelemar | 0:8bd3f20eb4de | 504 | { |
trelemar | 0:8bd3f20eb4de | 505 | vx = 0; |
trelemar | 0:8bd3f20eb4de | 506 | } |
trelemar | 0:8bd3f20eb4de | 507 | char y_offset = 0; |
trelemar | 0:8bd3f20eb4de | 508 | if (vy>0) {y_offset += (h - 1);} |
trelemar | 0:8bd3f20eb4de | 509 | if (Map::checkSolid(x / 10, (y + vy + y_offset) / 10) |
trelemar | 0:8bd3f20eb4de | 510 | || |
trelemar | 0:8bd3f20eb4de | 511 | Map::checkSolid((x + w - 1) / 10, (y + vy + y_offset) / 10) |
trelemar | 0:8bd3f20eb4de | 512 | ) |
trelemar | 0:8bd3f20eb4de | 513 | { |
trelemar | 0:8bd3f20eb4de | 514 | vy = 0; |
trelemar | 0:8bd3f20eb4de | 515 | } |
trelemar | 0:8bd3f20eb4de | 516 | |
trelemar | 0:8bd3f20eb4de | 517 | x+=vx; |
trelemar | 0:8bd3f20eb4de | 518 | y+=vy; |
trelemar | 0:8bd3f20eb4de | 519 | }; |
trelemar | 0:8bd3f20eb4de | 520 | void drawShadow() { |
trelemar | 0:8bd3f20eb4de | 521 | disp.setColor(11); |
trelemar | 0:8bd3f20eb4de | 522 | int dx, dy; |
trelemar | 0:8bd3f20eb4de | 523 | dx = x + Map::cam_x; |
trelemar | 0:8bd3f20eb4de | 524 | dy = y + Map::cam_y; |
trelemar | 0:8bd3f20eb4de | 525 | disp.drawLine(dx+1, dy + h, dx + w-1, dy + h); |
trelemar | 0:8bd3f20eb4de | 526 | disp.drawLine(dx+2, dy + h+1, dx + w-2, dy + h+1); |
trelemar | 0:8bd3f20eb4de | 527 | } |
trelemar | 0:8bd3f20eb4de | 528 | void drawRope() { |
trelemar | 0:8bd3f20eb4de | 529 | disp.setColor(15); |
trelemar | 0:8bd3f20eb4de | 530 | if (target) { |
trelemar | 0:8bd3f20eb4de | 531 | disp.setColor(3); |
trelemar | 0:8bd3f20eb4de | 532 | disp.drawLine(x+ Map::cam_x + w/2, y + Map::cam_y + h/2, target->x + Map::cam_x + target->w/2, target->y + Map::cam_y + target->h/2); |
trelemar | 0:8bd3f20eb4de | 533 | } |
trelemar | 0:8bd3f20eb4de | 534 | }; |
trelemar | 0:8bd3f20eb4de | 535 | void draw() { |
trelemar | 0:8bd3f20eb4de | 536 | if (type==ID_BEAR) { |
trelemar | 0:8bd3f20eb4de | 537 | disp.drawBitmap(x + Map::cam_x, y + Map::cam_y, bear[spr], 0, flip); |
trelemar | 0:8bd3f20eb4de | 538 | if (given_hat) { |
trelemar | 0:8bd3f20eb4de | 539 | disp.drawBitmap(x + Map::cam_x, y + Map::cam_y-1, sprites[40], 0, flip); |
trelemar | 0:8bd3f20eb4de | 540 | } |
trelemar | 0:8bd3f20eb4de | 541 | } |
trelemar | 0:8bd3f20eb4de | 542 | else { |
trelemar | 0:8bd3f20eb4de | 543 | int ox = 0; |
trelemar | 0:8bd3f20eb4de | 544 | #ifdef POK_SIM |
trelemar | 0:8bd3f20eb4de | 545 | //not really sure why the sprite draws at the wrong coords in the sim. draws as expected on HW. |
trelemar | 0:8bd3f20eb4de | 546 | ox = -4; |
trelemar | 0:8bd3f20eb4de | 547 | #endif // POK_SIM |
trelemar | 0:8bd3f20eb4de | 548 | disp.drawBitmap(x + Map::cam_x + ox, y + Map::cam_y + (cos(game.frameCount*.2)), sprites[spr], 0, flip); |
trelemar | 0:8bd3f20eb4de | 549 | } |
trelemar | 0:8bd3f20eb4de | 550 | |
trelemar | 0:8bd3f20eb4de | 551 | }; |
trelemar | 0:8bd3f20eb4de | 552 | |
trelemar | 0:8bd3f20eb4de | 553 | }; |
trelemar | 0:8bd3f20eb4de | 554 | vector<Entity> ents; |
trelemar | 0:8bd3f20eb4de | 555 | |
trelemar | 0:8bd3f20eb4de | 556 | void initEntities() { |
trelemar | 0:8bd3f20eb4de | 557 | for (int i = 0; i<(MAP_WIDTH*MAP_HEIGHT); i++) { |
trelemar | 0:8bd3f20eb4de | 558 | int sx, sy; |
trelemar | 0:8bd3f20eb4de | 559 | sx = i%MAP_WIDTH; |
trelemar | 0:8bd3f20eb4de | 560 | sy = (i-sx)/MAP_WIDTH; |
trelemar | 0:8bd3f20eb4de | 561 | if (Map::data[i]>=ID_PRESENT&&Map::data[i]<=ID_PRESENT+3) { |
trelemar | 0:8bd3f20eb4de | 562 | ents.push_back(Entity(sx*10, sy*10, ID_PRESENT, Map::data[i])); |
trelemar | 0:8bd3f20eb4de | 563 | Map::data[i] = 0; |
trelemar | 0:8bd3f20eb4de | 564 | present_count++; |
trelemar | 0:8bd3f20eb4de | 565 | } |
trelemar | 0:8bd3f20eb4de | 566 | if (Map::data[i]==2) { |
trelemar | 0:8bd3f20eb4de | 567 | Map::data[i]=0; |
trelemar | 0:8bd3f20eb4de | 568 | } |
trelemar | 0:8bd3f20eb4de | 569 | } |
trelemar | 0:8bd3f20eb4de | 570 | } |
trelemar | 0:8bd3f20eb4de | 571 | |
trelemar | 0:8bd3f20eb4de | 572 | int main() { |
trelemar | 0:8bd3f20eb4de | 573 | game.begin(); |
trelemar | 0:8bd3f20eb4de | 574 | game.setFrameRate(30); |
trelemar | 0:8bd3f20eb4de | 575 | disp.setFont(fontTight); |
trelemar | 0:8bd3f20eb4de | 576 | game.wait(10); |
trelemar | 0:8bd3f20eb4de | 577 | splashScreen("@trelemar", 2, 1); |
trelemar | 0:8bd3f20eb4de | 578 | disp.bgcolor = 12; |
trelemar | 0:8bd3f20eb4de | 579 | disp.setInvisibleColor(12); |
trelemar | 0:8bd3f20eb4de | 580 | //disp.load565Palette(sprites_pal); |
trelemar | 0:8bd3f20eb4de | 581 | ents.push_back(Entity(110, 180, ID_BEAR)); |
trelemar | 0:8bd3f20eb4de | 582 | initEntities(); |
trelemar | 0:8bd3f20eb4de | 583 | Entity * player = &ents[0]; |
trelemar | 0:8bd3f20eb4de | 584 | Map::cam_x = 55-player->x; |
trelemar | 0:8bd3f20eb4de | 585 | Map::cam_y = 88-player->y; |
trelemar | 0:8bd3f20eb4de | 586 | |
trelemar | 0:8bd3f20eb4de | 587 | while (game.isRunning()) { |
trelemar | 0:8bd3f20eb4de | 588 | if (game.update()) { |
trelemar | 0:8bd3f20eb4de | 589 | if (game.frameCount<200) { |
trelemar | 0:8bd3f20eb4de | 590 | for (int c = 0; c<16; c++) { |
trelemar | 0:8bd3f20eb4de | 591 | disp.palette[c] = disp.interpolateColor(disp.palette[c], sprites_pal[c], 100); |
trelemar | 0:8bd3f20eb4de | 592 | } |
trelemar | 0:8bd3f20eb4de | 593 | } |
trelemar | 0:8bd3f20eb4de | 594 | |
trelemar | 0:8bd3f20eb4de | 595 | int contained_presents = 0; |
trelemar | 0:8bd3f20eb4de | 596 | |
trelemar | 0:8bd3f20eb4de | 597 | Map::update(player->x, player->y); |
trelemar | 0:8bd3f20eb4de | 598 | Map::drawFast(); |
trelemar | 0:8bd3f20eb4de | 599 | |
trelemar | 0:8bd3f20eb4de | 600 | player->control(ents); |
trelemar | 0:8bd3f20eb4de | 601 | for (int i = 0; i<ents.size(); i++) { |
trelemar | 0:8bd3f20eb4de | 602 | ents[i].drawShadow(); |
trelemar | 0:8bd3f20eb4de | 603 | ents[i].drawRope(); |
trelemar | 0:8bd3f20eb4de | 604 | } |
trelemar | 0:8bd3f20eb4de | 605 | for (int i = 0; i<ents.size(); i++) { |
trelemar | 0:8bd3f20eb4de | 606 | Entity * ent = &ents.at(i); |
trelemar | 0:8bd3f20eb4de | 607 | ent->updateBody(&ents, i); |
trelemar | 0:8bd3f20eb4de | 608 | ent->draw(); |
trelemar | 0:8bd3f20eb4de | 609 | if (ent->type==ID_PRESENT) { |
trelemar | 0:8bd3f20eb4de | 610 | if (Map::getID(ent->x/10, ent->y/10)==ID_PORCH) { |
trelemar | 0:8bd3f20eb4de | 611 | contained_presents++; |
trelemar | 0:8bd3f20eb4de | 612 | } |
trelemar | 0:8bd3f20eb4de | 613 | } |
trelemar | 0:8bd3f20eb4de | 614 | } |
trelemar | 0:8bd3f20eb4de | 615 | if (contained_presents==present_count) { |
trelemar | 0:8bd3f20eb4de | 616 | game_won = true; |
trelemar | 0:8bd3f20eb4de | 617 | } |
trelemar | 0:8bd3f20eb4de | 618 | for (int i = 0; i<parts.size(); i++) { |
trelemar | 0:8bd3f20eb4de | 619 | parts[i].update(); |
trelemar | 0:8bd3f20eb4de | 620 | parts[i].draw(); |
trelemar | 0:8bd3f20eb4de | 621 | if (parts[i].time>20) parts.erase(parts.begin()+i); |
trelemar | 0:8bd3f20eb4de | 622 | } |
trelemar | 0:8bd3f20eb4de | 623 | for (int i = 0; i<20; i++) { |
trelemar | 0:8bd3f20eb4de | 624 | snowflakes[i].update(); |
trelemar | 0:8bd3f20eb4de | 625 | } |
trelemar | 0:8bd3f20eb4de | 626 | if (btn.held(BTN_C, 50)) { |
trelemar | 0:8bd3f20eb4de | 627 | debug_console = ! debug_console; |
trelemar | 0:8bd3f20eb4de | 628 | } |
trelemar | 0:8bd3f20eb4de | 629 | if (debug_console) { |
trelemar | 0:8bd3f20eb4de | 630 | disp.setColor(10); |
trelemar | 0:8bd3f20eb4de | 631 | disp.print("X "); |
trelemar | 0:8bd3f20eb4de | 632 | disp.print(player->x); |
trelemar | 0:8bd3f20eb4de | 633 | disp.print(" Y "); |
trelemar | 0:8bd3f20eb4de | 634 | disp.println(player->y); |
trelemar | 0:8bd3f20eb4de | 635 | disp.print("CAMx "); |
trelemar | 0:8bd3f20eb4de | 636 | disp.println(Map::cam_x); |
trelemar | 0:8bd3f20eb4de | 637 | disp.print("CAMy "); |
trelemar | 0:8bd3f20eb4de | 638 | disp.println(Map::cam_y); |
trelemar | 0:8bd3f20eb4de | 639 | disp.print("#ENTS "); |
trelemar | 0:8bd3f20eb4de | 640 | disp.println(ents.size()+parts.size()); |
trelemar | 0:8bd3f20eb4de | 641 | disp.print("presents "); |
trelemar | 0:8bd3f20eb4de | 642 | disp.println(present_count); |
trelemar | 0:8bd3f20eb4de | 643 | |
trelemar | 0:8bd3f20eb4de | 644 | } |
trelemar | 0:8bd3f20eb4de | 645 | //Present counter for returned ones |
trelemar | 0:8bd3f20eb4de | 646 | disp.setColor(3); |
trelemar | 0:8bd3f20eb4de | 647 | disp.fillRoundRect(1, 1, 28, 7, 2); |
trelemar | 0:8bd3f20eb4de | 648 | disp.drawBitmap(2, 2, sprites[ID_PRESENT]); |
trelemar | 0:8bd3f20eb4de | 649 | disp.setColor(13); |
trelemar | 0:8bd3f20eb4de | 650 | disp.print(9, 2, contained_presents); |
trelemar | 0:8bd3f20eb4de | 651 | disp.print("/"); |
trelemar | 0:8bd3f20eb4de | 652 | disp.print(present_count); |
trelemar | 0:8bd3f20eb4de | 653 | |
trelemar | 0:8bd3f20eb4de | 654 | drawDialog(dialog_draw_y, contained_presents); |
trelemar | 0:8bd3f20eb4de | 655 | } |
trelemar | 0:8bd3f20eb4de | 656 | } |
trelemar | 0:8bd3f20eb4de | 657 | return 1; |
trelemar | 0:8bd3f20eb4de | 658 | } |