Pokitto turn based strategy game.

Dependencies:   PokittoLib

Committer:
trelemar
Date:
Mon Dec 04 06:18:19 2017 +0000
Revision:
0:86d8ece873ca
Child:
1:189e78ff65b1
loadhelp;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
trelemar 0:86d8ece873ca 1 #include "Pokitto.h"
trelemar 0:86d8ece873ca 2 #include "Wars/warsprites.h"
trelemar 0:86d8ece873ca 3 #include "Wars/warfont.cpp"
trelemar 0:86d8ece873ca 4 #include <vector>
trelemar 0:86d8ece873ca 5 #include <stdint.h>
trelemar 0:86d8ece873ca 6
trelemar 0:86d8ece873ca 7
trelemar 0:86d8ece873ca 8 float solids[64] {
trelemar 0:86d8ece873ca 9 0,1,1,1,1,0,0,0,
trelemar 0:86d8ece873ca 10 0,0,1,0,1,0,0,0,
trelemar 0:86d8ece873ca 11 0,0,1,1,1,0,0,0,
trelemar 0:86d8ece873ca 12 0,0,0,0,0,0,0,0,
trelemar 0:86d8ece873ca 13 0,0,0,0,0,0,0,0,
trelemar 0:86d8ece873ca 14 0,0,0,0,0,0,0,0,
trelemar 0:86d8ece873ca 15 0,0,0,0,0,0,0,0,
trelemar 0:86d8ece873ca 16 0,0,0,0,0,0,0,0,
trelemar 0:86d8ece873ca 17 };
trelemar 0:86d8ece873ca 18 //Sprite sheet:2x1
trelemar 0:86d8ece873ca 19 const uint8_t cursor_sprites [][244] ={
trelemar 0:86d8ece873ca 20 //[0] cell:0x0
trelemar 0:86d8ece873ca 21 {
trelemar 0:86d8ece873ca 22 22,22,
trelemar 0:86d8ece873ca 23 204,0,12,204,204,204,204,204,192,0,204,
trelemar 0:86d8ece873ca 24 192,255,240,204,204,204,204,204,15,255,12,
trelemar 0:86d8ece873ca 25 15,160,12,204,204,204,204,204,192,10,240,
trelemar 0:86d8ece873ca 26 15,12,204,204,204,204,204,204,204,192,240,
trelemar 0:86d8ece873ca 27 15,12,204,204,204,204,204,204,204,192,240,
trelemar 0:86d8ece873ca 28 192,204,204,204,204,204,204,204,204,204,12,
trelemar 0:86d8ece873ca 29 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 30 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 31 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 32 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 33 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 34 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 35 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 36 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 37 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 38 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 39 192,204,204,204,204,204,204,204,204,204,12,
trelemar 0:86d8ece873ca 40 15,12,204,204,204,204,204,204,204,192,240,
trelemar 0:86d8ece873ca 41 15,12,204,204,204,204,204,204,204,192,240,
trelemar 0:86d8ece873ca 42 15,160,12,204,204,204,204,204,192,10,240,
trelemar 0:86d8ece873ca 43 192,255,240,204,204,204,204,204,15,255,12,
trelemar 0:86d8ece873ca 44 204,0,12,204,204,204,204,204,192,0,204,
trelemar 0:86d8ece873ca 45 },
trelemar 0:86d8ece873ca 46 //[1] cell:1x0
trelemar 0:86d8ece873ca 47 {
trelemar 0:86d8ece873ca 48 22,22,
trelemar 0:86d8ece873ca 49 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 50 204,192,0,204,204,204,204,204,0,12,204,
trelemar 0:86d8ece873ca 51 204,15,255,12,204,204,204,192,255,240,204,
trelemar 0:86d8ece873ca 52 192,250,0,204,204,204,204,204,0,175,12,
trelemar 0:86d8ece873ca 53 192,240,204,204,204,204,204,204,204,15,12,
trelemar 0:86d8ece873ca 54 192,240,204,204,204,204,204,204,204,15,12,
trelemar 0:86d8ece873ca 55 204,12,204,204,204,204,204,204,204,192,204,
trelemar 0:86d8ece873ca 56 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 57 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 58 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 59 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 60 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 61 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 62 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 63 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 64 204,12,204,204,204,204,204,204,204,192,204,
trelemar 0:86d8ece873ca 65 192,240,204,204,204,204,204,204,204,15,12,
trelemar 0:86d8ece873ca 66 192,240,204,204,204,204,204,204,204,15,12,
trelemar 0:86d8ece873ca 67 192,250,0,204,204,204,204,204,0,175,12,
trelemar 0:86d8ece873ca 68 204,15,255,12,204,204,204,192,255,240,204,
trelemar 0:86d8ece873ca 69 204,192,0,204,204,204,204,204,0,12,204,
trelemar 0:86d8ece873ca 70 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 71 },
trelemar 0:86d8ece873ca 72 };
trelemar 0:86d8ece873ca 73
trelemar 0:86d8ece873ca 74 using namespace std;
trelemar 0:86d8ece873ca 75
trelemar 0:86d8ece873ca 76 int clamp(int low, int n, int high) {return min(max(low, n), high);}
trelemar 0:86d8ece873ca 77
trelemar 0:86d8ece873ca 78 float dist(int x1, int y1, int x2, int y2) {
trelemar 0:86d8ece873ca 79 int x = x1 - x2;
trelemar 0:86d8ece873ca 80 int y = y1 - y2;
trelemar 0:86d8ece873ca 81 float dist;
trelemar 0:86d8ece873ca 82 dist = pow((float)x,2)+pow((float)y,2);
trelemar 0:86d8ece873ca 83 dist = sqrt((float)dist);
trelemar 0:86d8ece873ca 84 return dist;
trelemar 0:86d8ece873ca 85 }
trelemar 0:86d8ece873ca 86
trelemar 0:86d8ece873ca 87 int lerp(int a, int b, float t) {
trelemar 0:86d8ece873ca 88 return (1-t)*a + t*b;
trelemar 0:86d8ece873ca 89 }
trelemar 0:86d8ece873ca 90
trelemar 0:86d8ece873ca 91 enum GameState {MAIN, PAUSE, MENU} State = MAIN;
trelemar 0:86d8ece873ca 92
trelemar 0:86d8ece873ca 93 #define KEY_REPEAT 5
trelemar 0:86d8ece873ca 94
trelemar 0:86d8ece873ca 95 #define TASK_MOVE 0
trelemar 0:86d8ece873ca 96 #define TASK_ITEM 1
trelemar 0:86d8ece873ca 97 #define TASK_ATTACK 2
trelemar 0:86d8ece873ca 98 #define TASK_WAIT 3
trelemar 0:86d8ece873ca 99 #define TASK_NONE 4
trelemar 0:86d8ece873ca 100 #define TEAM_USER 0
trelemar 0:86d8ece873ca 101 #define TEAM_CPU 1
trelemar 0:86d8ece873ca 102
trelemar 0:86d8ece873ca 103 int current_team = TEAM_USER;
trelemar 0:86d8ece873ca 104 uint8_t selected_task = 0;
trelemar 0:86d8ece873ca 105 uint8_t current_task = TASK_NONE;
trelemar 0:86d8ece873ca 106 static char task_names[4][7] {
trelemar 0:86d8ece873ca 107 {"MOVE"},
trelemar 0:86d8ece873ca 108 {"ITEM"},
trelemar 0:86d8ece873ca 109 {"ATTACK"},
trelemar 0:86d8ece873ca 110 {"WAIT"},
trelemar 0:86d8ece873ca 111 };
trelemar 0:86d8ece873ca 112 int task_colors[4] {
trelemar 0:86d8ece873ca 113 11,9,6,8
trelemar 0:86d8ece873ca 114 };
trelemar 0:86d8ece873ca 115
trelemar 0:86d8ece873ca 116 #define ID_SOLDIER 0
trelemar 0:86d8ece873ca 117 #define ID_ORC 1
trelemar 0:86d8ece873ca 118
trelemar 0:86d8ece873ca 119 char id_names[][8] {
trelemar 0:86d8ece873ca 120 {"SOLDIER"},
trelemar 0:86d8ece873ca 121 {"ORC"},
trelemar 0:86d8ece873ca 122 };
trelemar 0:86d8ece873ca 123
trelemar 0:86d8ece873ca 124 Pokitto::Core game;
trelemar 0:86d8ece873ca 125 Pokitto::Display disp;
trelemar 0:86d8ece873ca 126 Pokitto::Buttons btn;
trelemar 0:86d8ece873ca 127
trelemar 0:86d8ece873ca 128 #define SW disp.width
trelemar 0:86d8ece873ca 129 #define SH disp.height
trelemar 0:86d8ece873ca 130
trelemar 0:86d8ece873ca 131 int map_x, map_y, cursor_x, cursor_y;
trelemar 0:86d8ece873ca 132
trelemar 0:86d8ece873ca 133 bool center_cursor = true;
trelemar 0:86d8ece873ca 134
trelemar 0:86d8ece873ca 135 void centerCursor() {
trelemar 0:86d8ece873ca 136 map_x = cursor_x - 3;
trelemar 0:86d8ece873ca 137 map_y = cursor_y - 2;
trelemar 0:86d8ece873ca 138 }
trelemar 0:86d8ece873ca 139
trelemar 0:86d8ece873ca 140 static void printb(int x, int y, int text) {
trelemar 0:86d8ece873ca 141 disp.setColor(0);
trelemar 0:86d8ece873ca 142 disp.print(x,y-1,text);
trelemar 0:86d8ece873ca 143 disp.print(x,y+1,text);
trelemar 0:86d8ece873ca 144 disp.print(x+1,y,text);
trelemar 0:86d8ece873ca 145 disp.print(x-1,y,text);
trelemar 0:86d8ece873ca 146 disp.setColor(15);
trelemar 0:86d8ece873ca 147 disp.print(x,y,text);
trelemar 0:86d8ece873ca 148 }
trelemar 0:86d8ece873ca 149 static void printb(int x, int y, char text[]) {
trelemar 0:86d8ece873ca 150 disp.setColor(0);
trelemar 0:86d8ece873ca 151 disp.print(x,y-1,text);
trelemar 0:86d8ece873ca 152 disp.print(x,y+1,text);
trelemar 0:86d8ece873ca 153 disp.print(x+1,y,text);
trelemar 0:86d8ece873ca 154 disp.print(x-1,y,text);
trelemar 0:86d8ece873ca 155 disp.setColor(15);
trelemar 0:86d8ece873ca 156 disp.print(x,y,text);
trelemar 0:86d8ece873ca 157 }
trelemar 0:86d8ece873ca 158
trelemar 0:86d8ece873ca 159 struct Dialog {
trelemar 0:86d8ece873ca 160 char text[20];
trelemar 0:86d8ece873ca 161 int start_time;
trelemar 0:86d8ece873ca 162 int position;
trelemar 0:86d8ece873ca 163 Dialog(char _text[20]) {
trelemar 0:86d8ece873ca 164 strcpy(text, _text);
trelemar 0:86d8ece873ca 165 position = 0;
trelemar 0:86d8ece873ca 166 start_time = game.frameCount;
trelemar 0:86d8ece873ca 167 };
trelemar 0:86d8ece873ca 168 void update() {
trelemar 0:86d8ece873ca 169 position = min(position + 1, 19);
trelemar 0:86d8ece873ca 170 };
trelemar 0:86d8ece873ca 171 void draw(int x, int y) {
trelemar 0:86d8ece873ca 172 disp.setCursor(x, y);
trelemar 0:86d8ece873ca 173 for (int p=0;p<position;p++) {
trelemar 0:86d8ece873ca 174 disp.print(text[p]);
trelemar 0:86d8ece873ca 175 }
trelemar 0:86d8ece873ca 176 };
trelemar 0:86d8ece873ca 177 };
trelemar 0:86d8ece873ca 178
trelemar 0:86d8ece873ca 179 struct Transition {
trelemar 0:86d8ece873ca 180 int on_val, off_val, val;
trelemar 0:86d8ece873ca 181 bool enabled;
trelemar 0:86d8ece873ca 182 Transition(int _onv, int _offv, bool _enabled) {
trelemar 0:86d8ece873ca 183 on_val = _onv;
trelemar 0:86d8ece873ca 184 off_val = _offv;
trelemar 0:86d8ece873ca 185 enabled = _enabled;
trelemar 0:86d8ece873ca 186 if (enabled) val=on_val;
trelemar 0:86d8ece873ca 187 else val = off_val;
trelemar 0:86d8ece873ca 188 };
trelemar 0:86d8ece873ca 189 void toggle() {enabled=!enabled;};
trelemar 0:86d8ece873ca 190 void update() {
trelemar 0:86d8ece873ca 191 if (enabled) val = lerp(val, on_val, 0.2);
trelemar 0:86d8ece873ca 192 else val = lerp(val, off_val, 0.2);
trelemar 0:86d8ece873ca 193 };
trelemar 0:86d8ece873ca 194 };
trelemar 0:86d8ece873ca 195
trelemar 0:86d8ece873ca 196 struct Vec2 {
trelemar 0:86d8ece873ca 197 int x, y;
trelemar 0:86d8ece873ca 198 Vec2(int _x, int _y) {x=_x; y=_y;};
trelemar 0:86d8ece873ca 199 };
trelemar 0:86d8ece873ca 200
trelemar 0:86d8ece873ca 201 struct Item {
trelemar 0:86d8ece873ca 202 int id, x, y;
trelemar 0:86d8ece873ca 203 Item(int _id, int _x, int _y) {
trelemar 0:86d8ece873ca 204 id = _id;
trelemar 0:86d8ece873ca 205 x = _x;
trelemar 0:86d8ece873ca 206 y = _y;
trelemar 0:86d8ece873ca 207 };
trelemar 0:86d8ece873ca 208 void Draw() {
trelemar 0:86d8ece873ca 209 int dx = (x-map_x)*16;
trelemar 0:86d8ece873ca 210 int dy = (y-map_y)*16;
trelemar 0:86d8ece873ca 211 //disp.setColor(1);
trelemar 0:86d8ece873ca 212 //disp.fillRectangle(dx+4,dy+12,8,3);
trelemar 0:86d8ece873ca 213 //disp.drawBitmap(dx, dy+(sin(game.frameCount/4))*2, sprites[id]);
trelemar 0:86d8ece873ca 214 };
trelemar 0:86d8ece873ca 215 };
trelemar 0:86d8ece873ca 216
trelemar 0:86d8ece873ca 217 struct Hero {
trelemar 0:86d8ece873ca 218 unsigned int index, team, id, x, y;
trelemar 0:86d8ece873ca 219 uint8_t atk, def, hp, max_hp;
trelemar 0:86d8ece873ca 220 float range;
trelemar 0:86d8ece873ca 221 int spr;
trelemar 0:86d8ece873ca 222 int hurt_time;
trelemar 0:86d8ece873ca 223 bool tasks[4], flip;
trelemar 0:86d8ece873ca 224 Hero(int _x, int _y, int _id, int _team) {
trelemar 0:86d8ece873ca 225 x = _x; y = _y; flip = false;
trelemar 0:86d8ece873ca 226 id = _id; team = _team;
trelemar 0:86d8ece873ca 227 if (_team == TEAM_USER) {
trelemar 0:86d8ece873ca 228 spr = 32;
trelemar 0:86d8ece873ca 229 }
trelemar 0:86d8ece873ca 230 else {spr = 26; flip=true;}
trelemar 0:86d8ece873ca 231 max_hp = 10;
trelemar 0:86d8ece873ca 232 hp = max_hp;
trelemar 0:86d8ece873ca 233 atk = random(4,6);
trelemar 0:86d8ece873ca 234 def = random(1,3);
trelemar 0:86d8ece873ca 235 range = 2.1;
trelemar 0:86d8ece873ca 236 NewTurn();
trelemar 0:86d8ece873ca 237 };
trelemar 0:86d8ece873ca 238 void NewTurn() {
trelemar 0:86d8ece873ca 239 for (int i=0;i<4;i++) {tasks[i]=true;}
trelemar 0:86d8ece873ca 240 };
trelemar 0:86d8ece873ca 241 void update(int i) {
trelemar 0:86d8ece873ca 242 index = i;
trelemar 0:86d8ece873ca 243 };
trelemar 0:86d8ece873ca 244 void Draw() {
trelemar 0:86d8ece873ca 245 int ox = 0;
trelemar 0:86d8ece873ca 246 int oy = 0;
trelemar 0:86d8ece873ca 247 int dx = (x-map_x)*16;
trelemar 0:86d8ece873ca 248 int dy = (y-map_y)*16;
trelemar 0:86d8ece873ca 249 bool draw = true;
trelemar 0:86d8ece873ca 250 if (game.frameCount-hurt_time<10) {
trelemar 0:86d8ece873ca 251 ox = random(-2,2);
trelemar 0:86d8ece873ca 252 oy = random(-2,2);
trelemar 0:86d8ece873ca 253 if (game.frameCount%2==0) {draw=false;}
trelemar 0:86d8ece873ca 254 }
trelemar 0:86d8ece873ca 255 int spr_id = spr + (game.frameCount/6)%2;
trelemar 0:86d8ece873ca 256 disp.invisiblecolor = 13;
trelemar 0:86d8ece873ca 257 if (draw) disp.drawBitmap((dx)+ox,(dy)+oy,sprites[spr_id], 0, flip);
trelemar 0:86d8ece873ca 258 disp.invisiblecolor = 12;
trelemar 0:86d8ece873ca 259 };
trelemar 0:86d8ece873ca 260 bool inRange(Hero * enemy) {
trelemar 0:86d8ece873ca 261 return (dist(x, y, enemy->x, enemy->y)<=range);
trelemar 0:86d8ece873ca 262 };
trelemar 0:86d8ece873ca 263 bool inRange(int dx, int dy) {
trelemar 0:86d8ece873ca 264 return (dist(x, y, dx, dy)<=range);
trelemar 0:86d8ece873ca 265 }
trelemar 0:86d8ece873ca 266 };
trelemar 0:86d8ece873ca 267
trelemar 0:86d8ece873ca 268 void DrawCursorHeroUI (Hero * h, int x, int y) {
trelemar 0:86d8ece873ca 269 int bw = 24;
trelemar 0:86d8ece873ca 270 int hw = (bw/h->max_hp) * h->hp;
trelemar 0:86d8ece873ca 271 disp.setColor(0);
trelemar 0:86d8ece873ca 272 disp.drawRoundRect(x-1,y-1,bw+2,5,2); //HEALTH BAR
trelemar 0:86d8ece873ca 273 disp.fillRoundRect(x-1, y+26,bw+2,7,2); //TEXT BG BOX
trelemar 0:86d8ece873ca 274 disp.setColor(6);
trelemar 0:86d8ece873ca 275 disp.fillRect(x, y, bw, 2);
trelemar 0:86d8ece873ca 276 disp.setColor(11);
trelemar 0:86d8ece873ca 277 disp.fillRect(x, y, hw+4, 2);
trelemar 0:86d8ece873ca 278 disp.setColor(11);
trelemar 0:86d8ece873ca 279 disp.print(x,y+27,"^");
trelemar 0:86d8ece873ca 280 disp.setColor(15);
trelemar 0:86d8ece873ca 281 disp.print((int)h->atk);
trelemar 0:86d8ece873ca 282 disp.setColor(6);
trelemar 0:86d8ece873ca 283 disp.print("n");
trelemar 0:86d8ece873ca 284 disp.setColor(15);
trelemar 0:86d8ece873ca 285 disp.print((int)h->def);
trelemar 0:86d8ece873ca 286 }
trelemar 0:86d8ece873ca 287
trelemar 0:86d8ece873ca 288 void DrawSelectedHeroUI(Hero * h, int y) {
trelemar 0:86d8ece873ca 289 disp.setColor(0);
trelemar 0:86d8ece873ca 290 //disp.fillRect(0,66,SW,88-66);
trelemar 0:86d8ece873ca 291 disp.fillRoundRect(1,y,SW-2,88-67,3);
trelemar 0:86d8ece873ca 292 //disp.setColor(15);
trelemar 0:86d8ece873ca 293 if (!h) return;
trelemar 0:86d8ece873ca 294 printb(3,y-3,id_names[h->id]);
trelemar 0:86d8ece873ca 295 disp.setColor(8);
trelemar 0:86d8ece873ca 296 disp.print(3,y+3,">");
trelemar 0:86d8ece873ca 297 disp.setColor(15);
trelemar 0:86d8ece873ca 298 disp.print((int)h->atk);
trelemar 0:86d8ece873ca 299 disp.print(" ATK");
trelemar 0:86d8ece873ca 300 disp.setColor(6);
trelemar 0:86d8ece873ca 301 disp.print(3,y+9,"n");
trelemar 0:86d8ece873ca 302 disp.setColor(15);
trelemar 0:86d8ece873ca 303 disp.print((int)h->def);
trelemar 0:86d8ece873ca 304 disp.print(" DEF");
trelemar 0:86d8ece873ca 305 disp.setColor(11);
trelemar 0:86d8ece873ca 306 disp.print(3,y+15,"^");
trelemar 0:86d8ece873ca 307 disp.setColor(15);
trelemar 0:86d8ece873ca 308 disp.print((int)h->range);
trelemar 0:86d8ece873ca 309 disp.print(" RNG");
trelemar 0:86d8ece873ca 310 printb(16,(-y)+68,task_names[selected_task]);
trelemar 0:86d8ece873ca 311
trelemar 0:86d8ece873ca 312 for (int i=0;i<4;i++) {
trelemar 0:86d8ece873ca 313 int spr = i+48;
trelemar 0:86d8ece873ca 314 if (!h->tasks[i]) spr-=8;
trelemar 0:86d8ece873ca 315 else if (selected_task==i) spr+=8;
trelemar 0:86d8ece873ca 316 disp.drawBitmap(44+(i*16), y+4, sprites[spr]);
trelemar 0:86d8ece873ca 317 }
trelemar 0:86d8ece873ca 318 int bw = 62;
trelemar 0:86d8ece873ca 319 int hw = (bw/h->max_hp) * h->hp;
trelemar 0:86d8ece873ca 320 disp.setColor(0);
trelemar 0:86d8ece873ca 321 disp.drawRoundRect(44,y-4,bw+2,7,3);
trelemar 0:86d8ece873ca 322 disp.setColor(6);
trelemar 0:86d8ece873ca 323 disp.fillRoundRect(45,y-3,bw,5,2);
trelemar 0:86d8ece873ca 324 disp.setColor(11);
trelemar 0:86d8ece873ca 325 disp.fillRoundRect(45,y-3,hw+2,5,2);
trelemar 0:86d8ece873ca 326 disp.setColor(15);
trelemar 0:86d8ece873ca 327 printb(50+(bw/2)-10,y-3,(int)h->hp);
trelemar 0:86d8ece873ca 328 }
trelemar 0:86d8ece873ca 329
trelemar 0:86d8ece873ca 330 void DrawItemList(Hero * h, int y) {
trelemar 0:86d8ece873ca 331 disp.setColor(0);
trelemar 0:86d8ece873ca 332 disp.fillRoundRect(32,y,SW-63,12,3);
trelemar 0:86d8ece873ca 333 disp.setColor(15);
trelemar 0:86d8ece873ca 334 for (int i = 0; i<4; i++) {
trelemar 0:86d8ece873ca 335 disp.drawRoundRect(34+(i*11),y+1,10,10,2);
trelemar 0:86d8ece873ca 336 }
trelemar 0:86d8ece873ca 337
trelemar 0:86d8ece873ca 338 }
trelemar 0:86d8ece873ca 339
trelemar 0:86d8ece873ca 340 void DrawTurnCounter(vector<Hero> &_heros) {
trelemar 0:86d8ece873ca 341 disp.invisiblecolor = 13;
trelemar 0:86d8ece873ca 342 int spr = 44;
trelemar 0:86d8ece873ca 343 if (current_team==TEAM_CPU) spr = 45;
trelemar 0:86d8ece873ca 344 disp.drawBitmap(0, 0, sprites[spr]);
trelemar 0:86d8ece873ca 345 disp.invisiblecolor = 12;
trelemar 0:86d8ece873ca 346 int count = 0;
trelemar 0:86d8ece873ca 347 for (int i=0; i<_heros.size();i++) {
trelemar 0:86d8ece873ca 348 if (_heros[i].team == current_team) count++;
trelemar 0:86d8ece873ca 349 }
trelemar 0:86d8ece873ca 350 printb(11,10,(int)count);
trelemar 0:86d8ece873ca 351 }
trelemar 0:86d8ece873ca 352
trelemar 0:86d8ece873ca 353 #define MAP_WIDTH 12
trelemar 0:86d8ece873ca 354 #define MAP_HEIGHT 12
trelemar 0:86d8ece873ca 355
trelemar 0:86d8ece873ca 356 int Map[MAP_HEIGHT][MAP_WIDTH];
trelemar 0:86d8ece873ca 357
trelemar 0:86d8ece873ca 358 void loadTileMap() {
trelemar 0:86d8ece873ca 359 fileOpen("file_out.war",FILE_MODE_BINARY);
trelemar 0:86d8ece873ca 360 for (int i = 0; i<144; i++) {
trelemar 0:86d8ece873ca 361 int x = i%MAP_WIDTH;
trelemar 0:86d8ece873ca 362 int y = (i-x)/MAP_WIDTH;
trelemar 0:86d8ece873ca 363 //fileSetPosition(i);
trelemar 0:86d8ece873ca 364 Map[y][x] = (int)filePeek(i);
trelemar 0:86d8ece873ca 365 }
trelemar 0:86d8ece873ca 366 //fileClose();
trelemar 0:86d8ece873ca 367 }
trelemar 0:86d8ece873ca 368
trelemar 0:86d8ece873ca 369 void saveTileMap() {
trelemar 0:86d8ece873ca 370
trelemar 0:86d8ece873ca 371 }
trelemar 0:86d8ece873ca 372
trelemar 0:86d8ece873ca 373 void DrawTileMap(int8_t x, int8_t y, Hero * hero) {
trelemar 0:86d8ece873ca 374 disp.setColor(15);
trelemar 0:86d8ece873ca 375 for (int map_x=0; map_x<7; map_x++) {
trelemar 0:86d8ece873ca 376 for (int map_y=0; map_y<6; map_y++) {
trelemar 0:86d8ece873ca 377 int spr;
trelemar 0:86d8ece873ca 378 if (map_x+x<0||x+map_x>MAP_WIDTH-1||y+map_y<0||y+map_y>MAP_HEIGHT-1) {
trelemar 0:86d8ece873ca 379 spr = 9;
trelemar 0:86d8ece873ca 380 }
trelemar 0:86d8ece873ca 381 else {
trelemar 0:86d8ece873ca 382 spr = Map[map_y+y][map_x+x];
trelemar 0:86d8ece873ca 383 }
trelemar 0:86d8ece873ca 384
trelemar 0:86d8ece873ca 385 float distance;
trelemar 0:86d8ece873ca 386
trelemar 0:86d8ece873ca 387 disp.drawBitmap((map_x*16), (map_y*16),sprites[spr]);
trelemar 0:86d8ece873ca 388
trelemar 0:86d8ece873ca 389 //RANGE BOXES
trelemar 0:86d8ece873ca 390 if (hero && (current_task == TASK_MOVE || current_task == TASK_ATTACK)) {
trelemar 0:86d8ece873ca 391 distance = dist(map_x+x, map_y+y, hero->x, hero->y);
trelemar 0:86d8ece873ca 392 if (distance<hero->range&&x+map_x<MAP_WIDTH&&y+map_y<MAP_HEIGHT) {
trelemar 0:86d8ece873ca 393 disp.setColor(8);
trelemar 0:86d8ece873ca 394 if (solids[Map[map_y+y][map_x+x]]) {disp.setColor(6);}
trelemar 0:86d8ece873ca 395 disp.drawRoundRect(map_x*16+2, map_y*16+2, 12, 12,3);
trelemar 0:86d8ece873ca 396 //disp.print(map_x*16,map_y*16,(float)distance);
trelemar 0:86d8ece873ca 397 }
trelemar 0:86d8ece873ca 398 }
trelemar 0:86d8ece873ca 399 }
trelemar 0:86d8ece873ca 400 }
trelemar 0:86d8ece873ca 401 }
trelemar 0:86d8ece873ca 402
trelemar 0:86d8ece873ca 403 void DrawCursor(int x, int y) {
trelemar 0:86d8ece873ca 404 //uint8_t spr = 52 + (game.frameCount/12)%2;
trelemar 0:86d8ece873ca 405 disp.drawBitmap(x*16-3, y*16-3,cursor_sprites[(game.frameCount/4)%2]);
trelemar 0:86d8ece873ca 406 }
trelemar 0:86d8ece873ca 407
trelemar 0:86d8ece873ca 408 Hero * getHeroAtCoords(int x, int y, vector<Hero> &herovect) {
trelemar 0:86d8ece873ca 409 Hero *h = NULL;
trelemar 0:86d8ece873ca 410 bool found = false;
trelemar 0:86d8ece873ca 411 for (int i=0;i<herovect.size();i++) {
trelemar 0:86d8ece873ca 412 if (herovect[i].x==x&&herovect[i].y==y) {
trelemar 0:86d8ece873ca 413 h = &herovect[i];
trelemar 0:86d8ece873ca 414 break;
trelemar 0:86d8ece873ca 415 }
trelemar 0:86d8ece873ca 416 }
trelemar 0:86d8ece873ca 417 return h;
trelemar 0:86d8ece873ca 418 }
trelemar 0:86d8ece873ca 419
trelemar 0:86d8ece873ca 420
trelemar 0:86d8ece873ca 421
trelemar 0:86d8ece873ca 422 void CursorInput() {
trelemar 0:86d8ece873ca 423 int last_x=cursor_x;
trelemar 0:86d8ece873ca 424 int last_y=cursor_y;
trelemar 0:86d8ece873ca 425 if (btn.repeat(BTN_UP,KEY_REPEAT)) {
trelemar 0:86d8ece873ca 426 if (cursor_y-map_y<=0) {
trelemar 0:86d8ece873ca 427 map_y=max(map_y-1,0);
trelemar 0:86d8ece873ca 428 }
trelemar 0:86d8ece873ca 429 cursor_y=max(cursor_y-1,0);
trelemar 0:86d8ece873ca 430 }
trelemar 0:86d8ece873ca 431 if (btn.repeat(BTN_DOWN,KEY_REPEAT)) {
trelemar 0:86d8ece873ca 432 if (cursor_y-map_y>=4) {
trelemar 0:86d8ece873ca 433 map_y=min(map_y+1,MAP_HEIGHT-6);
trelemar 0:86d8ece873ca 434 }
trelemar 0:86d8ece873ca 435 cursor_y=min(cursor_y+1,MAP_HEIGHT-1);
trelemar 0:86d8ece873ca 436
trelemar 0:86d8ece873ca 437 }
trelemar 0:86d8ece873ca 438 if (btn.repeat(BTN_LEFT,KEY_REPEAT)) {
trelemar 0:86d8ece873ca 439 if (cursor_x-map_x<=0) {
trelemar 0:86d8ece873ca 440 map_x=max(map_x-1,0);
trelemar 0:86d8ece873ca 441 }
trelemar 0:86d8ece873ca 442 cursor_x=max(cursor_x-1,0);
trelemar 0:86d8ece873ca 443 }
trelemar 0:86d8ece873ca 444 if (btn.repeat(BTN_RIGHT,KEY_REPEAT)) {
trelemar 0:86d8ece873ca 445 if (cursor_x-map_x>=6) {
trelemar 0:86d8ece873ca 446 map_x=min(map_x+1,MAP_WIDTH-7);
trelemar 0:86d8ece873ca 447 }
trelemar 0:86d8ece873ca 448 cursor_x=min(cursor_x+1,MAP_WIDTH-1);
trelemar 0:86d8ece873ca 449 }
trelemar 0:86d8ece873ca 450
trelemar 0:86d8ece873ca 451 if (center_cursor) {
trelemar 0:86d8ece873ca 452 centerCursor();
trelemar 0:86d8ece873ca 453 }
trelemar 0:86d8ece873ca 454 }
trelemar 0:86d8ece873ca 455
trelemar 0:86d8ece873ca 456 int main() {
trelemar 0:86d8ece873ca 457 Transition tTrans(66,96,false);
trelemar 0:86d8ece873ca 458 Transition itemlist(40,72,false);
trelemar 0:86d8ece873ca 459 game.begin();
trelemar 0:86d8ece873ca 460 game.setFrameRate(30);
trelemar 0:86d8ece873ca 461 disp.invisiblecolor = 12;
trelemar 0:86d8ece873ca 462 disp.bgcolor=12;
trelemar 0:86d8ece873ca 463 disp.persistence = 1;
trelemar 0:86d8ece873ca 464 disp.load565Palette(sprite_pal);
trelemar 0:86d8ece873ca 465 disp.setFont(fontWAR);
trelemar 0:86d8ece873ca 466 map_x=0;
trelemar 0:86d8ece873ca 467 map_y=0;
trelemar 0:86d8ece873ca 468 cursor_x=4;
trelemar 0:86d8ece873ca 469 cursor_y=6;
trelemar 0:86d8ece873ca 470 vector<Hero> heros;
trelemar 0:86d8ece873ca 471 loadTileMap();
trelemar 0:86d8ece873ca 472 /*
trelemar 0:86d8ece873ca 473 heros.push_back(Hero(4,5,ID_SOLDIER, TEAM_USER));
trelemar 0:86d8ece873ca 474 heros.push_back(Hero(5,6,ID_SOLDIER, TEAM_USER));
trelemar 0:86d8ece873ca 475 heros.push_back(Hero(3,8,ID_SOLDIER, TEAM_USER));
trelemar 0:86d8ece873ca 476 heros.push_back(Hero(8,5,ID_SOLDIER, TEAM_CPU));
trelemar 0:86d8ece873ca 477 heros.push_back(Hero(8,7,ID_SOLDIER, TEAM_CPU));
trelemar 0:86d8ece873ca 478 heros.push_back(Hero(6,9,ID_SOLDIER, TEAM_CPU));
trelemar 0:86d8ece873ca 479 */
trelemar 0:86d8ece873ca 480
trelemar 0:86d8ece873ca 481 for (int i=0;i<6;i++) {
trelemar 0:86d8ece873ca 482 int team = TEAM_USER;
trelemar 0:86d8ece873ca 483 if (i>2) team = TEAM_CPU;
trelemar 0:86d8ece873ca 484 heros.push_back(Hero(random(0,MAP_WIDTH-1),random(0,MAP_HEIGHT-1),ID_SOLDIER, team));
trelemar 0:86d8ece873ca 485 }
trelemar 0:86d8ece873ca 486
trelemar 0:86d8ece873ca 487 Hero * cursor_hero = NULL;
trelemar 0:86d8ece873ca 488 Hero * current_hero = NULL;
trelemar 0:86d8ece873ca 489 Item itest(52, 3, 3);
trelemar 0:86d8ece873ca 490
trelemar 0:86d8ece873ca 491 while (game.isRunning()) {
trelemar 0:86d8ece873ca 492 if (game.update()) {
trelemar 0:86d8ece873ca 493 switch (State) {
trelemar 0:86d8ece873ca 494 case MAIN:
trelemar 0:86d8ece873ca 495 tTrans.update();
trelemar 0:86d8ece873ca 496 itemlist.update();
trelemar 0:86d8ece873ca 497 //If no current hero or current task is to move our current hero, accept cursor movement.
trelemar 0:86d8ece873ca 498 if (!current_hero||current_task==TASK_MOVE||current_task==TASK_ATTACK) {
trelemar 0:86d8ece873ca 499 CursorInput();
trelemar 0:86d8ece873ca 500 cursor_hero = getHeroAtCoords(cursor_x,cursor_y, heros);
trelemar 0:86d8ece873ca 501 }
trelemar 0:86d8ece873ca 502 //This will call when there is a current hero and not in a current task
trelemar 0:86d8ece873ca 503 else if (current_hero) {
trelemar 0:86d8ece873ca 504 //TASK SELECTOR
trelemar 0:86d8ece873ca 505 int dir = 0;
trelemar 0:86d8ece873ca 506 if (btn.pressed(BTN_RIGHT)) {
trelemar 0:86d8ece873ca 507 selected_task=min(selected_task+1,3);
trelemar 0:86d8ece873ca 508 }
trelemar 0:86d8ece873ca 509 if (btn.pressed(BTN_LEFT)) {
trelemar 0:86d8ece873ca 510 selected_task=max(selected_task-1,0);
trelemar 0:86d8ece873ca 511 }
trelemar 0:86d8ece873ca 512 if (selected_task==TASK_ITEM) {
trelemar 0:86d8ece873ca 513 itemlist.enabled = true;
trelemar 0:86d8ece873ca 514 }
trelemar 0:86d8ece873ca 515 else itemlist.enabled = false;
trelemar 0:86d8ece873ca 516 //selected_task=selected_task%4;
trelemar 0:86d8ece873ca 517 }
trelemar 0:86d8ece873ca 518
trelemar 0:86d8ece873ca 519 DrawTileMap(map_x, map_y, current_hero);
trelemar 0:86d8ece873ca 520 for (int i = 0; i<heros.size(); i++) {
trelemar 0:86d8ece873ca 521 heros[i].Draw();
trelemar 0:86d8ece873ca 522 heros[i].update(i);
trelemar 0:86d8ece873ca 523 }
trelemar 0:86d8ece873ca 524 itest.Draw();
trelemar 0:86d8ece873ca 525 DrawCursor(cursor_x-map_x,cursor_y-map_y);
trelemar 0:86d8ece873ca 526 disp.setColor(15);
trelemar 0:86d8ece873ca 527
trelemar 0:86d8ece873ca 528 if (btn.pressed(BTN_A)) {
trelemar 0:86d8ece873ca 529 if (current_hero&&current_task!=TASK_NONE) {
trelemar 0:86d8ece873ca 530 //THIS IS WITHIN A TASK, EX: SELECTING A MOVE LOCATION OR ATTACK TARGET.
trelemar 0:86d8ece873ca 531 switch (current_task) {
trelemar 0:86d8ece873ca 532 case TASK_MOVE:
trelemar 0:86d8ece873ca 533 //MOVE HERO TO CURSOR, NO COLISSIONS YET.
trelemar 0:86d8ece873ca 534 //ONLY IF IN RANGE AND NOT SOLID
trelemar 0:86d8ece873ca 535 //FIX STACKABLE HEROS
trelemar 0:86d8ece873ca 536 if (current_hero->inRange(cursor_x, cursor_y)&&!getHeroAtCoords(cursor_x, cursor_y, heros)&&!solids[Map[cursor_y][cursor_x]]) {
trelemar 0:86d8ece873ca 537 if (cursor_x<current_hero->x) current_hero->flip=true;
trelemar 0:86d8ece873ca 538 else if (cursor_x>current_hero->x) current_hero->flip=false;
trelemar 0:86d8ece873ca 539 current_hero->x = cursor_x;
trelemar 0:86d8ece873ca 540 current_hero->y = cursor_y;
trelemar 0:86d8ece873ca 541
trelemar 0:86d8ece873ca 542 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 543 current_hero->tasks[TASK_MOVE] = false;
trelemar 0:86d8ece873ca 544 }
trelemar 0:86d8ece873ca 545 break;
trelemar 0:86d8ece873ca 546 case TASK_ATTACK:
trelemar 0:86d8ece873ca 547 if (cursor_hero&&current_hero->inRange(cursor_hero)) {
trelemar 0:86d8ece873ca 548 //FOUND TARGET AT CURSOR.
trelemar 0:86d8ece873ca 549 cursor_x = current_hero->x;
trelemar 0:86d8ece873ca 550 cursor_y = current_hero->y;
trelemar 0:86d8ece873ca 551 int8_t result = cursor_hero->hp - (current_hero->atk-cursor_hero->def);
trelemar 0:86d8ece873ca 552 cursor_hero->hp = result;
trelemar 0:86d8ece873ca 553 cursor_hero->hurt_time=game.frameCount;
trelemar 0:86d8ece873ca 554 if (result<=0) {
trelemar 0:86d8ece873ca 555 heros.erase(heros.begin()+cursor_hero->index);
trelemar 0:86d8ece873ca 556 }
trelemar 0:86d8ece873ca 557
trelemar 0:86d8ece873ca 558 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 559 current_hero->tasks[TASK_ATTACK] = false;
trelemar 0:86d8ece873ca 560 }
trelemar 0:86d8ece873ca 561 else {
trelemar 0:86d8ece873ca 562 //NO TARGET FOUND, ERROR SOUND SHOULD PLAY.
trelemar 0:86d8ece873ca 563 }
trelemar 0:86d8ece873ca 564 break;
trelemar 0:86d8ece873ca 565
trelemar 0:86d8ece873ca 566 //DUMMY CODE, THESE ARE CALLED BELOW. NOT HERE.
trelemar 0:86d8ece873ca 567 case TASK_ITEM:
trelemar 0:86d8ece873ca 568 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 569 current_hero->tasks[TASK_ITEM] = false;
trelemar 0:86d8ece873ca 570 break;
trelemar 0:86d8ece873ca 571 case TASK_WAIT:
trelemar 0:86d8ece873ca 572 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 573 current_hero->tasks[TASK_WAIT] = false;
trelemar 0:86d8ece873ca 574 break;
trelemar 0:86d8ece873ca 575 }
trelemar 0:86d8ece873ca 576 }
trelemar 0:86d8ece873ca 577 else if (current_hero&&current_hero->tasks[selected_task]==true) {
trelemar 0:86d8ece873ca 578 //TASK SWITCH HERE
trelemar 0:86d8ece873ca 579 //THIS HAPPENS DIRECTLY AFTER PRESSING BTN_A ON A NEW TASK.
trelemar 0:86d8ece873ca 580 current_task=selected_task;
trelemar 0:86d8ece873ca 581
trelemar 0:86d8ece873ca 582 switch (selected_task) {
trelemar 0:86d8ece873ca 583 case TASK_ITEM:
trelemar 0:86d8ece873ca 584 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 585 current_hero->tasks[TASK_ITEM] = false;
trelemar 0:86d8ece873ca 586 break;
trelemar 0:86d8ece873ca 587 case TASK_WAIT:
trelemar 0:86d8ece873ca 588 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 589 current_hero->tasks[TASK_WAIT] = false;
trelemar 0:86d8ece873ca 590 break;
trelemar 0:86d8ece873ca 591 }
trelemar 0:86d8ece873ca 592 }
trelemar 0:86d8ece873ca 593 else if (cursor_hero) {
trelemar 0:86d8ece873ca 594 //NO CURRENT HERO, SELECT A HERO ONLY IF IN CURSOR HERE.
trelemar 0:86d8ece873ca 595 if (cursor_hero->team == current_team) {
trelemar 0:86d8ece873ca 596 current_hero = cursor_hero;
trelemar 0:86d8ece873ca 597 selected_task = TASK_MOVE;
trelemar 0:86d8ece873ca 598 tTrans.enabled = true;
trelemar 0:86d8ece873ca 599 }
trelemar 0:86d8ece873ca 600 }
trelemar 0:86d8ece873ca 601 }
trelemar 0:86d8ece873ca 602 if (btn.pressed(BTN_B)) {
trelemar 0:86d8ece873ca 603 if (current_task!=TASK_NONE) {
trelemar 0:86d8ece873ca 604 //BACK OUT OF CURRENT TASK.
trelemar 0:86d8ece873ca 605 current_task=TASK_NONE;
trelemar 0:86d8ece873ca 606 cursor_x = current_hero->x;
trelemar 0:86d8ece873ca 607 cursor_y = current_hero->y;
trelemar 0:86d8ece873ca 608 }
trelemar 0:86d8ece873ca 609 else if (current_hero&&current_task==TASK_NONE) {
trelemar 0:86d8ece873ca 610 tTrans.enabled=false; current_hero = NULL; //UNSELECT HERO.
trelemar 0:86d8ece873ca 611 }
trelemar 0:86d8ece873ca 612 }
trelemar 0:86d8ece873ca 613 if (btn.pressed(BTN_C)&& !current_hero) {
trelemar 0:86d8ece873ca 614 //heros.push_back(Hero(cursor_x,cursor_y,0,0));
trelemar 0:86d8ece873ca 615 current_team=(current_team+1) % 2;
trelemar 0:86d8ece873ca 616 for (int i=0;i<heros.size();i++) heros[i].NewTurn();
trelemar 0:86d8ece873ca 617 State = PAUSE;
trelemar 0:86d8ece873ca 618 //tTrans.toggle();
trelemar 0:86d8ece873ca 619 }
trelemar 0:86d8ece873ca 620 if (cursor_hero&&cursor_hero!=current_hero&&current_task) {
trelemar 0:86d8ece873ca 621 DrawCursorHeroUI(cursor_hero, (cursor_hero->x-map_x)*16-4,(cursor_hero->y-map_y)*16-7);
trelemar 0:86d8ece873ca 622 }
trelemar 0:86d8ece873ca 623 if (tTrans.val==tTrans.on_val) {
trelemar 0:86d8ece873ca 624 DrawItemList(current_hero, itemlist.val);
trelemar 0:86d8ece873ca 625 }
trelemar 0:86d8ece873ca 626 DrawSelectedHeroUI(current_hero, tTrans.val);
trelemar 0:86d8ece873ca 627
trelemar 0:86d8ece873ca 628 disp.setCursor(0,0);
trelemar 0:86d8ece873ca 629 DrawTurnCounter(heros);
trelemar 0:86d8ece873ca 630 //disp.print(0,32,dtest.text);
trelemar 0:86d8ece873ca 631 //disp.print(1,SH-6,(int)game.battery.level);
trelemar 0:86d8ece873ca 632 //disp.print(" ");
trelemar 0:86d8ece873ca 633 break;
trelemar 0:86d8ece873ca 634 case PAUSE:
trelemar 0:86d8ece873ca 635 if (btn.pressed(BTN_C)) {
trelemar 0:86d8ece873ca 636 State = MAIN;
trelemar 0:86d8ece873ca 637 }
trelemar 0:86d8ece873ca 638 disp.print(isThisFileOpen("file_out.war"));
trelemar 0:86d8ece873ca 639 break;
trelemar 0:86d8ece873ca 640 }//GAME STATE SWITCH
trelemar 0:86d8ece873ca 641
trelemar 0:86d8ece873ca 642 }//UPDATE
trelemar 0:86d8ece873ca 643 }//IS RUNNING
trelemar 0:86d8ece873ca 644 return 1;
trelemar 0:86d8ece873ca 645 }