Christmas pokitto game

Dependencies:   PokittoLib

Committer:
trelemar
Date:
Tue Dec 26 23:46:15 2017 +0000
Revision:
0:8bd3f20eb4de
opensource commit

Who changed what in which revision?

UserRevisionLine numberNew 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 }