Pokitto turn based strategy game.
wars.cpp@1:189e78ff65b1, 2017-12-05 (annotated)
- Committer:
- trelemar
- Date:
- Tue Dec 05 03:24:36 2017 +0000
- Revision:
- 1:189e78ff65b1
- Parent:
- 0:86d8ece873ca
- Child:
- 2:af768faf5329
removed subfolder
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
trelemar | 0:86d8ece873ca | 1 | #include "Pokitto.h" |
trelemar | 1:189e78ff65b1 | 2 | #include "warsprites.h" |
trelemar | 1:189e78ff65b1 | 3 | #include "warfont.cpp" |
trelemar | 0:86d8ece873ca | 4 | #include <vector> |
trelemar | 0:86d8ece873ca | 5 | #include <stdint.h> |
trelemar | 0:86d8ece873ca | 6 | |
trelemar | 0:86d8ece873ca | 7 | float solids[64] { |
trelemar | 0:86d8ece873ca | 8 | 0,1,1,1,1,0,0,0, |
trelemar | 0:86d8ece873ca | 9 | 0,0,1,0,1,0,0,0, |
trelemar | 0:86d8ece873ca | 10 | 0,0,1,1,1,0,0,0, |
trelemar | 0:86d8ece873ca | 11 | 0,0,0,0,0,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 | }; |
trelemar | 0:86d8ece873ca | 17 | //Sprite sheet:2x1 |
trelemar | 0:86d8ece873ca | 18 | const uint8_t cursor_sprites [][244] ={ |
trelemar | 0:86d8ece873ca | 19 | //[0] cell:0x0 |
trelemar | 0:86d8ece873ca | 20 | { |
trelemar | 0:86d8ece873ca | 21 | 22,22, |
trelemar | 0:86d8ece873ca | 22 | 204,0,12,204,204,204,204,204,192,0,204, |
trelemar | 0:86d8ece873ca | 23 | 192,255,240,204,204,204,204,204,15,255,12, |
trelemar | 0:86d8ece873ca | 24 | 15,160,12,204,204,204,204,204,192,10,240, |
trelemar | 0:86d8ece873ca | 25 | 15,12,204,204,204,204,204,204,204,192,240, |
trelemar | 0:86d8ece873ca | 26 | 15,12,204,204,204,204,204,204,204,192,240, |
trelemar | 0:86d8ece873ca | 27 | 192,204,204,204,204,204,204,204,204,204,12, |
trelemar | 0:86d8ece873ca | 28 | 204,204,204,204,204,204,204,204,204,204,204, |
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 | 192,204,204,204,204,204,204,204,204,204,12, |
trelemar | 0:86d8ece873ca | 39 | 15,12,204,204,204,204,204,204,204,192,240, |
trelemar | 0:86d8ece873ca | 40 | 15,12,204,204,204,204,204,204,204,192,240, |
trelemar | 0:86d8ece873ca | 41 | 15,160,12,204,204,204,204,204,192,10,240, |
trelemar | 0:86d8ece873ca | 42 | 192,255,240,204,204,204,204,204,15,255,12, |
trelemar | 0:86d8ece873ca | 43 | 204,0,12,204,204,204,204,204,192,0,204, |
trelemar | 0:86d8ece873ca | 44 | }, |
trelemar | 0:86d8ece873ca | 45 | //[1] cell:1x0 |
trelemar | 0:86d8ece873ca | 46 | { |
trelemar | 0:86d8ece873ca | 47 | 22,22, |
trelemar | 0:86d8ece873ca | 48 | 204,204,204,204,204,204,204,204,204,204,204, |
trelemar | 0:86d8ece873ca | 49 | 204,192,0,204,204,204,204,204,0,12,204, |
trelemar | 0:86d8ece873ca | 50 | 204,15,255,12,204,204,204,192,255,240,204, |
trelemar | 0:86d8ece873ca | 51 | 192,250,0,204,204,204,204,204,0,175,12, |
trelemar | 0:86d8ece873ca | 52 | 192,240,204,204,204,204,204,204,204,15,12, |
trelemar | 0:86d8ece873ca | 53 | 192,240,204,204,204,204,204,204,204,15,12, |
trelemar | 0:86d8ece873ca | 54 | 204,12,204,204,204,204,204,204,204,192,204, |
trelemar | 0:86d8ece873ca | 55 | 204,204,204,204,204,204,204,204,204,204,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,12,204,204,204,204,204,204,204,192,204, |
trelemar | 0:86d8ece873ca | 64 | 192,240,204,204,204,204,204,204,204,15,12, |
trelemar | 0:86d8ece873ca | 65 | 192,240,204,204,204,204,204,204,204,15,12, |
trelemar | 0:86d8ece873ca | 66 | 192,250,0,204,204,204,204,204,0,175,12, |
trelemar | 0:86d8ece873ca | 67 | 204,15,255,12,204,204,204,192,255,240,204, |
trelemar | 0:86d8ece873ca | 68 | 204,192,0,204,204,204,204,204,0,12,204, |
trelemar | 0:86d8ece873ca | 69 | 204,204,204,204,204,204,204,204,204,204,204, |
trelemar | 0:86d8ece873ca | 70 | }, |
trelemar | 0:86d8ece873ca | 71 | }; |
trelemar | 0:86d8ece873ca | 72 | |
trelemar | 0:86d8ece873ca | 73 | using namespace std; |
trelemar | 0:86d8ece873ca | 74 | |
trelemar | 0:86d8ece873ca | 75 | int clamp(int low, int n, int high) {return min(max(low, n), high);} |
trelemar | 0:86d8ece873ca | 76 | |
trelemar | 0:86d8ece873ca | 77 | float dist(int x1, int y1, int x2, int y2) { |
trelemar | 0:86d8ece873ca | 78 | int x = x1 - x2; |
trelemar | 0:86d8ece873ca | 79 | int y = y1 - y2; |
trelemar | 0:86d8ece873ca | 80 | float dist; |
trelemar | 0:86d8ece873ca | 81 | dist = pow((float)x,2)+pow((float)y,2); |
trelemar | 0:86d8ece873ca | 82 | dist = sqrt((float)dist); |
trelemar | 0:86d8ece873ca | 83 | return dist; |
trelemar | 0:86d8ece873ca | 84 | } |
trelemar | 0:86d8ece873ca | 85 | |
trelemar | 0:86d8ece873ca | 86 | int lerp(int a, int b, float t) { |
trelemar | 0:86d8ece873ca | 87 | return (1-t)*a + t*b; |
trelemar | 0:86d8ece873ca | 88 | } |
trelemar | 0:86d8ece873ca | 89 | |
trelemar | 1:189e78ff65b1 | 90 | enum GameState {MAIN, PAUSE, MENU} State = MENU; |
trelemar | 0:86d8ece873ca | 91 | |
trelemar | 0:86d8ece873ca | 92 | #define KEY_REPEAT 5 |
trelemar | 0:86d8ece873ca | 93 | |
trelemar | 0:86d8ece873ca | 94 | #define TASK_MOVE 0 |
trelemar | 0:86d8ece873ca | 95 | #define TASK_ITEM 1 |
trelemar | 0:86d8ece873ca | 96 | #define TASK_ATTACK 2 |
trelemar | 0:86d8ece873ca | 97 | #define TASK_WAIT 3 |
trelemar | 0:86d8ece873ca | 98 | #define TASK_NONE 4 |
trelemar | 0:86d8ece873ca | 99 | #define TEAM_USER 0 |
trelemar | 0:86d8ece873ca | 100 | #define TEAM_CPU 1 |
trelemar | 0:86d8ece873ca | 101 | |
trelemar | 0:86d8ece873ca | 102 | int current_team = TEAM_USER; |
trelemar | 0:86d8ece873ca | 103 | uint8_t selected_task = 0; |
trelemar | 0:86d8ece873ca | 104 | uint8_t current_task = TASK_NONE; |
trelemar | 0:86d8ece873ca | 105 | static char task_names[4][7] { |
trelemar | 0:86d8ece873ca | 106 | {"MOVE"}, |
trelemar | 0:86d8ece873ca | 107 | {"ITEM"}, |
trelemar | 0:86d8ece873ca | 108 | {"ATTACK"}, |
trelemar | 0:86d8ece873ca | 109 | {"WAIT"}, |
trelemar | 0:86d8ece873ca | 110 | }; |
trelemar | 0:86d8ece873ca | 111 | int task_colors[4] { |
trelemar | 0:86d8ece873ca | 112 | 11,9,6,8 |
trelemar | 0:86d8ece873ca | 113 | }; |
trelemar | 0:86d8ece873ca | 114 | |
trelemar | 0:86d8ece873ca | 115 | Pokitto::Core game; |
trelemar | 0:86d8ece873ca | 116 | Pokitto::Display disp; |
trelemar | 0:86d8ece873ca | 117 | Pokitto::Buttons btn; |
trelemar | 0:86d8ece873ca | 118 | |
trelemar | 0:86d8ece873ca | 119 | #define SW disp.width |
trelemar | 0:86d8ece873ca | 120 | #define SH disp.height |
trelemar | 0:86d8ece873ca | 121 | |
trelemar | 0:86d8ece873ca | 122 | int map_x, map_y, cursor_x, cursor_y; |
trelemar | 0:86d8ece873ca | 123 | |
trelemar | 0:86d8ece873ca | 124 | bool center_cursor = true; |
trelemar | 0:86d8ece873ca | 125 | |
trelemar | 0:86d8ece873ca | 126 | void centerCursor() { |
trelemar | 0:86d8ece873ca | 127 | map_x = cursor_x - 3; |
trelemar | 0:86d8ece873ca | 128 | map_y = cursor_y - 2; |
trelemar | 0:86d8ece873ca | 129 | } |
trelemar | 0:86d8ece873ca | 130 | |
trelemar | 0:86d8ece873ca | 131 | static void printb(int x, int y, int text) { |
trelemar | 0:86d8ece873ca | 132 | disp.setColor(0); |
trelemar | 0:86d8ece873ca | 133 | disp.print(x,y-1,text); |
trelemar | 0:86d8ece873ca | 134 | disp.print(x,y+1,text); |
trelemar | 0:86d8ece873ca | 135 | disp.print(x+1,y,text); |
trelemar | 0:86d8ece873ca | 136 | disp.print(x-1,y,text); |
trelemar | 0:86d8ece873ca | 137 | disp.setColor(15); |
trelemar | 0:86d8ece873ca | 138 | disp.print(x,y,text); |
trelemar | 0:86d8ece873ca | 139 | } |
trelemar | 0:86d8ece873ca | 140 | static void printb(int x, int y, char 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 | |
trelemar | 0:86d8ece873ca | 150 | struct Dialog { |
trelemar | 0:86d8ece873ca | 151 | char text[20]; |
trelemar | 0:86d8ece873ca | 152 | int start_time; |
trelemar | 0:86d8ece873ca | 153 | int position; |
trelemar | 0:86d8ece873ca | 154 | Dialog(char _text[20]) { |
trelemar | 0:86d8ece873ca | 155 | strcpy(text, _text); |
trelemar | 0:86d8ece873ca | 156 | position = 0; |
trelemar | 0:86d8ece873ca | 157 | start_time = game.frameCount; |
trelemar | 0:86d8ece873ca | 158 | }; |
trelemar | 0:86d8ece873ca | 159 | void update() { |
trelemar | 0:86d8ece873ca | 160 | position = min(position + 1, 19); |
trelemar | 0:86d8ece873ca | 161 | }; |
trelemar | 0:86d8ece873ca | 162 | void draw(int x, int y) { |
trelemar | 0:86d8ece873ca | 163 | disp.setCursor(x, y); |
trelemar | 0:86d8ece873ca | 164 | for (int p=0;p<position;p++) { |
trelemar | 0:86d8ece873ca | 165 | disp.print(text[p]); |
trelemar | 0:86d8ece873ca | 166 | } |
trelemar | 0:86d8ece873ca | 167 | }; |
trelemar | 0:86d8ece873ca | 168 | }; |
trelemar | 0:86d8ece873ca | 169 | |
trelemar | 0:86d8ece873ca | 170 | struct Transition { |
trelemar | 0:86d8ece873ca | 171 | int on_val, off_val, val; |
trelemar | 0:86d8ece873ca | 172 | bool enabled; |
trelemar | 1:189e78ff65b1 | 173 | Transition() {}; |
trelemar | 0:86d8ece873ca | 174 | Transition(int _onv, int _offv, bool _enabled) { |
trelemar | 0:86d8ece873ca | 175 | on_val = _onv; |
trelemar | 0:86d8ece873ca | 176 | off_val = _offv; |
trelemar | 0:86d8ece873ca | 177 | enabled = _enabled; |
trelemar | 0:86d8ece873ca | 178 | if (enabled) val=on_val; |
trelemar | 0:86d8ece873ca | 179 | else val = off_val; |
trelemar | 0:86d8ece873ca | 180 | }; |
trelemar | 0:86d8ece873ca | 181 | void toggle() {enabled=!enabled;}; |
trelemar | 0:86d8ece873ca | 182 | void update() { |
trelemar | 0:86d8ece873ca | 183 | if (enabled) val = lerp(val, on_val, 0.2); |
trelemar | 0:86d8ece873ca | 184 | else val = lerp(val, off_val, 0.2); |
trelemar | 0:86d8ece873ca | 185 | }; |
trelemar | 0:86d8ece873ca | 186 | }; |
trelemar | 0:86d8ece873ca | 187 | |
trelemar | 0:86d8ece873ca | 188 | struct Vec2 { |
trelemar | 0:86d8ece873ca | 189 | int x, y; |
trelemar | 0:86d8ece873ca | 190 | Vec2(int _x, int _y) {x=_x; y=_y;}; |
trelemar | 0:86d8ece873ca | 191 | }; |
trelemar | 0:86d8ece873ca | 192 | |
trelemar | 0:86d8ece873ca | 193 | struct Item { |
trelemar | 0:86d8ece873ca | 194 | int id, x, y; |
trelemar | 0:86d8ece873ca | 195 | Item(int _id, int _x, int _y) { |
trelemar | 0:86d8ece873ca | 196 | id = _id; |
trelemar | 0:86d8ece873ca | 197 | x = _x; |
trelemar | 0:86d8ece873ca | 198 | y = _y; |
trelemar | 0:86d8ece873ca | 199 | }; |
trelemar | 0:86d8ece873ca | 200 | void Draw() { |
trelemar | 0:86d8ece873ca | 201 | int dx = (x-map_x)*16; |
trelemar | 0:86d8ece873ca | 202 | int dy = (y-map_y)*16; |
trelemar | 0:86d8ece873ca | 203 | //disp.setColor(1); |
trelemar | 0:86d8ece873ca | 204 | //disp.fillRectangle(dx+4,dy+12,8,3); |
trelemar | 0:86d8ece873ca | 205 | //disp.drawBitmap(dx, dy+(sin(game.frameCount/4))*2, sprites[id]); |
trelemar | 0:86d8ece873ca | 206 | }; |
trelemar | 0:86d8ece873ca | 207 | }; |
trelemar | 0:86d8ece873ca | 208 | |
trelemar | 1:189e78ff65b1 | 209 | #define ID_SOLDIER 0 |
trelemar | 1:189e78ff65b1 | 210 | #define ID_ORC 1 |
trelemar | 1:189e78ff65b1 | 211 | |
trelemar | 1:189e78ff65b1 | 212 | char id_names[][8] { |
trelemar | 1:189e78ff65b1 | 213 | {"SOLDIER"}, |
trelemar | 1:189e78ff65b1 | 214 | {"ORC"}, |
trelemar | 1:189e78ff65b1 | 215 | }; |
trelemar | 1:189e78ff65b1 | 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 | 1:189e78ff65b1 | 230 | else {spr = 26; flip=true; id = ID_ORC;} |
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 | int Map[MAP_HEIGHT][MAP_WIDTH]; |
trelemar | 0:86d8ece873ca | 356 | void loadTileMap() { |
trelemar | 0:86d8ece873ca | 357 | fileOpen("file_out.war",FILE_MODE_BINARY); |
trelemar | 0:86d8ece873ca | 358 | for (int i = 0; i<144; i++) { |
trelemar | 0:86d8ece873ca | 359 | int x = i%MAP_WIDTH; |
trelemar | 0:86d8ece873ca | 360 | int y = (i-x)/MAP_WIDTH; |
trelemar | 0:86d8ece873ca | 361 | //fileSetPosition(i); |
trelemar | 0:86d8ece873ca | 362 | Map[y][x] = (int)filePeek(i); |
trelemar | 0:86d8ece873ca | 363 | } |
trelemar | 0:86d8ece873ca | 364 | //fileClose(); |
trelemar | 0:86d8ece873ca | 365 | } |
trelemar | 0:86d8ece873ca | 366 | |
trelemar | 0:86d8ece873ca | 367 | void saveTileMap() { |
trelemar | 0:86d8ece873ca | 368 | |
trelemar | 0:86d8ece873ca | 369 | } |
trelemar | 0:86d8ece873ca | 370 | |
trelemar | 0:86d8ece873ca | 371 | void DrawTileMap(int8_t x, int8_t y, Hero * hero) { |
trelemar | 0:86d8ece873ca | 372 | disp.setColor(15); |
trelemar | 0:86d8ece873ca | 373 | for (int map_x=0; map_x<7; map_x++) { |
trelemar | 0:86d8ece873ca | 374 | for (int map_y=0; map_y<6; map_y++) { |
trelemar | 0:86d8ece873ca | 375 | int spr; |
trelemar | 0:86d8ece873ca | 376 | if (map_x+x<0||x+map_x>MAP_WIDTH-1||y+map_y<0||y+map_y>MAP_HEIGHT-1) { |
trelemar | 0:86d8ece873ca | 377 | spr = 9; |
trelemar | 0:86d8ece873ca | 378 | } |
trelemar | 0:86d8ece873ca | 379 | else { |
trelemar | 0:86d8ece873ca | 380 | spr = Map[map_y+y][map_x+x]; |
trelemar | 0:86d8ece873ca | 381 | } |
trelemar | 0:86d8ece873ca | 382 | |
trelemar | 0:86d8ece873ca | 383 | float distance; |
trelemar | 0:86d8ece873ca | 384 | |
trelemar | 0:86d8ece873ca | 385 | disp.drawBitmap((map_x*16), (map_y*16),sprites[spr]); |
trelemar | 0:86d8ece873ca | 386 | |
trelemar | 0:86d8ece873ca | 387 | //RANGE BOXES |
trelemar | 0:86d8ece873ca | 388 | if (hero && (current_task == TASK_MOVE || current_task == TASK_ATTACK)) { |
trelemar | 0:86d8ece873ca | 389 | distance = dist(map_x+x, map_y+y, hero->x, hero->y); |
trelemar | 0:86d8ece873ca | 390 | if (distance<hero->range&&x+map_x<MAP_WIDTH&&y+map_y<MAP_HEIGHT) { |
trelemar | 0:86d8ece873ca | 391 | disp.setColor(8); |
trelemar | 0:86d8ece873ca | 392 | if (solids[Map[map_y+y][map_x+x]]) {disp.setColor(6);} |
trelemar | 0:86d8ece873ca | 393 | disp.drawRoundRect(map_x*16+2, map_y*16+2, 12, 12,3); |
trelemar | 0:86d8ece873ca | 394 | //disp.print(map_x*16,map_y*16,(float)distance); |
trelemar | 0:86d8ece873ca | 395 | } |
trelemar | 0:86d8ece873ca | 396 | } |
trelemar | 0:86d8ece873ca | 397 | } |
trelemar | 0:86d8ece873ca | 398 | } |
trelemar | 0:86d8ece873ca | 399 | } |
trelemar | 0:86d8ece873ca | 400 | |
trelemar | 0:86d8ece873ca | 401 | void DrawCursor(int x, int y) { |
trelemar | 0:86d8ece873ca | 402 | //uint8_t spr = 52 + (game.frameCount/12)%2; |
trelemar | 0:86d8ece873ca | 403 | disp.drawBitmap(x*16-3, y*16-3,cursor_sprites[(game.frameCount/4)%2]); |
trelemar | 0:86d8ece873ca | 404 | } |
trelemar | 0:86d8ece873ca | 405 | |
trelemar | 0:86d8ece873ca | 406 | Hero * getHeroAtCoords(int x, int y, vector<Hero> &herovect) { |
trelemar | 0:86d8ece873ca | 407 | Hero *h = NULL; |
trelemar | 0:86d8ece873ca | 408 | bool found = false; |
trelemar | 0:86d8ece873ca | 409 | for (int i=0;i<herovect.size();i++) { |
trelemar | 0:86d8ece873ca | 410 | if (herovect[i].x==x&&herovect[i].y==y) { |
trelemar | 0:86d8ece873ca | 411 | h = &herovect[i]; |
trelemar | 0:86d8ece873ca | 412 | break; |
trelemar | 0:86d8ece873ca | 413 | } |
trelemar | 0:86d8ece873ca | 414 | } |
trelemar | 0:86d8ece873ca | 415 | return h; |
trelemar | 0:86d8ece873ca | 416 | } |
trelemar | 0:86d8ece873ca | 417 | |
trelemar | 0:86d8ece873ca | 418 | |
trelemar | 0:86d8ece873ca | 419 | |
trelemar | 0:86d8ece873ca | 420 | void CursorInput() { |
trelemar | 0:86d8ece873ca | 421 | int last_x=cursor_x; |
trelemar | 0:86d8ece873ca | 422 | int last_y=cursor_y; |
trelemar | 0:86d8ece873ca | 423 | if (btn.repeat(BTN_UP,KEY_REPEAT)) { |
trelemar | 0:86d8ece873ca | 424 | if (cursor_y-map_y<=0) { |
trelemar | 0:86d8ece873ca | 425 | map_y=max(map_y-1,0); |
trelemar | 0:86d8ece873ca | 426 | } |
trelemar | 0:86d8ece873ca | 427 | cursor_y=max(cursor_y-1,0); |
trelemar | 0:86d8ece873ca | 428 | } |
trelemar | 0:86d8ece873ca | 429 | if (btn.repeat(BTN_DOWN,KEY_REPEAT)) { |
trelemar | 0:86d8ece873ca | 430 | if (cursor_y-map_y>=4) { |
trelemar | 0:86d8ece873ca | 431 | map_y=min(map_y+1,MAP_HEIGHT-6); |
trelemar | 0:86d8ece873ca | 432 | } |
trelemar | 0:86d8ece873ca | 433 | cursor_y=min(cursor_y+1,MAP_HEIGHT-1); |
trelemar | 0:86d8ece873ca | 434 | |
trelemar | 0:86d8ece873ca | 435 | } |
trelemar | 0:86d8ece873ca | 436 | if (btn.repeat(BTN_LEFT,KEY_REPEAT)) { |
trelemar | 0:86d8ece873ca | 437 | if (cursor_x-map_x<=0) { |
trelemar | 0:86d8ece873ca | 438 | map_x=max(map_x-1,0); |
trelemar | 0:86d8ece873ca | 439 | } |
trelemar | 0:86d8ece873ca | 440 | cursor_x=max(cursor_x-1,0); |
trelemar | 0:86d8ece873ca | 441 | } |
trelemar | 0:86d8ece873ca | 442 | if (btn.repeat(BTN_RIGHT,KEY_REPEAT)) { |
trelemar | 0:86d8ece873ca | 443 | if (cursor_x-map_x>=6) { |
trelemar | 0:86d8ece873ca | 444 | map_x=min(map_x+1,MAP_WIDTH-7); |
trelemar | 0:86d8ece873ca | 445 | } |
trelemar | 0:86d8ece873ca | 446 | cursor_x=min(cursor_x+1,MAP_WIDTH-1); |
trelemar | 0:86d8ece873ca | 447 | } |
trelemar | 0:86d8ece873ca | 448 | |
trelemar | 0:86d8ece873ca | 449 | if (center_cursor) { |
trelemar | 0:86d8ece873ca | 450 | centerCursor(); |
trelemar | 0:86d8ece873ca | 451 | } |
trelemar | 0:86d8ece873ca | 452 | } |
trelemar | 0:86d8ece873ca | 453 | |
trelemar | 1:189e78ff65b1 | 454 | struct MainMenu { |
trelemar | 1:189e78ff65b1 | 455 | struct Transition trans; |
trelemar | 1:189e78ff65b1 | 456 | char items[3][10]; |
trelemar | 1:189e78ff65b1 | 457 | int selected_item; |
trelemar | 1:189e78ff65b1 | 458 | MainMenu() { |
trelemar | 1:189e78ff65b1 | 459 | trans.off_val=-16; |
trelemar | 1:189e78ff65b1 | 460 | trans.on_val = 24; |
trelemar | 1:189e78ff65b1 | 461 | trans.val=trans.off_val; |
trelemar | 1:189e78ff65b1 | 462 | trans.enabled=true; |
trelemar | 1:189e78ff65b1 | 463 | strcpy(items[0], "CAMPAIGN"); |
trelemar | 1:189e78ff65b1 | 464 | strcpy(items[1], "SKIRMISH"); |
trelemar | 1:189e78ff65b1 | 465 | strcpy(items[2], "OPTIONS"); |
trelemar | 1:189e78ff65b1 | 466 | selected_item = 0; |
trelemar | 1:189e78ff65b1 | 467 | }; |
trelemar | 1:189e78ff65b1 | 468 | void update() { |
trelemar | 1:189e78ff65b1 | 469 | if (btn.pressed(BTN_RIGHT)) { |
trelemar | 1:189e78ff65b1 | 470 | selected_item = min(selected_item + 1, 2); |
trelemar | 1:189e78ff65b1 | 471 | } |
trelemar | 1:189e78ff65b1 | 472 | if (btn.pressed(BTN_LEFT)) { |
trelemar | 1:189e78ff65b1 | 473 | selected_item = max(selected_item - 1, 0); |
trelemar | 1:189e78ff65b1 | 474 | } |
trelemar | 1:189e78ff65b1 | 475 | |
trelemar | 1:189e78ff65b1 | 476 | if (btn.pressed(BTN_A)) { |
trelemar | 1:189e78ff65b1 | 477 | switch (selected_item){ |
trelemar | 1:189e78ff65b1 | 478 | case (0): //CAMPAIGN |
trelemar | 1:189e78ff65b1 | 479 | break; |
trelemar | 1:189e78ff65b1 | 480 | case (1): //SKIRMISH |
trelemar | 1:189e78ff65b1 | 481 | disp.clear(); |
trelemar | 1:189e78ff65b1 | 482 | disp.print("LOADING"); |
trelemar | 1:189e78ff65b1 | 483 | pokInitSD(); |
trelemar | 1:189e78ff65b1 | 484 | loadTileMap(); |
trelemar | 1:189e78ff65b1 | 485 | State = MAIN; |
trelemar | 1:189e78ff65b1 | 486 | break; |
trelemar | 1:189e78ff65b1 | 487 | case (2): //OPTIONS |
trelemar | 1:189e78ff65b1 | 488 | break; |
trelemar | 1:189e78ff65b1 | 489 | } |
trelemar | 1:189e78ff65b1 | 490 | } |
trelemar | 1:189e78ff65b1 | 491 | }; |
trelemar | 1:189e78ff65b1 | 492 | void draw() { |
trelemar | 1:189e78ff65b1 | 493 | disp.clear(); |
trelemar | 1:189e78ff65b1 | 494 | trans.update(); |
trelemar | 1:189e78ff65b1 | 495 | disp.setColor(15); |
trelemar | 1:189e78ff65b1 | 496 | disp.print(2,trans.val,"POKIT WARS"); |
trelemar | 1:189e78ff65b1 | 497 | disp.print(2,SH/2, items[selected_item]); |
trelemar | 1:189e78ff65b1 | 498 | }; |
trelemar | 1:189e78ff65b1 | 499 | }; |
trelemar | 1:189e78ff65b1 | 500 | |
trelemar | 0:86d8ece873ca | 501 | int main() { |
trelemar | 1:189e78ff65b1 | 502 | MainMenu main_menu; |
trelemar | 0:86d8ece873ca | 503 | Transition tTrans(66,96,false); |
trelemar | 0:86d8ece873ca | 504 | Transition itemlist(40,72,false); |
trelemar | 0:86d8ece873ca | 505 | game.begin(); |
trelemar | 0:86d8ece873ca | 506 | game.setFrameRate(30); |
trelemar | 0:86d8ece873ca | 507 | disp.invisiblecolor = 12; |
trelemar | 0:86d8ece873ca | 508 | disp.bgcolor=12; |
trelemar | 0:86d8ece873ca | 509 | disp.persistence = 1; |
trelemar | 0:86d8ece873ca | 510 | disp.load565Palette(sprite_pal); |
trelemar | 0:86d8ece873ca | 511 | disp.setFont(fontWAR); |
trelemar | 0:86d8ece873ca | 512 | map_x=0; |
trelemar | 0:86d8ece873ca | 513 | map_y=0; |
trelemar | 0:86d8ece873ca | 514 | cursor_x=4; |
trelemar | 0:86d8ece873ca | 515 | cursor_y=6; |
trelemar | 0:86d8ece873ca | 516 | vector<Hero> heros; |
trelemar | 1:189e78ff65b1 | 517 | pokInitSD(); |
trelemar | 0:86d8ece873ca | 518 | loadTileMap(); |
trelemar | 0:86d8ece873ca | 519 | /* |
trelemar | 0:86d8ece873ca | 520 | heros.push_back(Hero(4,5,ID_SOLDIER, TEAM_USER)); |
trelemar | 0:86d8ece873ca | 521 | heros.push_back(Hero(5,6,ID_SOLDIER, TEAM_USER)); |
trelemar | 0:86d8ece873ca | 522 | heros.push_back(Hero(3,8,ID_SOLDIER, TEAM_USER)); |
trelemar | 0:86d8ece873ca | 523 | heros.push_back(Hero(8,5,ID_SOLDIER, TEAM_CPU)); |
trelemar | 0:86d8ece873ca | 524 | heros.push_back(Hero(8,7,ID_SOLDIER, TEAM_CPU)); |
trelemar | 0:86d8ece873ca | 525 | heros.push_back(Hero(6,9,ID_SOLDIER, TEAM_CPU)); |
trelemar | 0:86d8ece873ca | 526 | */ |
trelemar | 0:86d8ece873ca | 527 | |
trelemar | 0:86d8ece873ca | 528 | for (int i=0;i<6;i++) { |
trelemar | 0:86d8ece873ca | 529 | int team = TEAM_USER; |
trelemar | 0:86d8ece873ca | 530 | if (i>2) team = TEAM_CPU; |
trelemar | 0:86d8ece873ca | 531 | heros.push_back(Hero(random(0,MAP_WIDTH-1),random(0,MAP_HEIGHT-1),ID_SOLDIER, team)); |
trelemar | 0:86d8ece873ca | 532 | } |
trelemar | 0:86d8ece873ca | 533 | |
trelemar | 0:86d8ece873ca | 534 | Hero * cursor_hero = NULL; |
trelemar | 0:86d8ece873ca | 535 | Hero * current_hero = NULL; |
trelemar | 0:86d8ece873ca | 536 | Item itest(52, 3, 3); |
trelemar | 0:86d8ece873ca | 537 | |
trelemar | 0:86d8ece873ca | 538 | while (game.isRunning()) { |
trelemar | 0:86d8ece873ca | 539 | if (game.update()) { |
trelemar | 0:86d8ece873ca | 540 | switch (State) { |
trelemar | 1:189e78ff65b1 | 541 | case MENU: |
trelemar | 1:189e78ff65b1 | 542 | main_menu.update(); |
trelemar | 1:189e78ff65b1 | 543 | main_menu.draw(); |
trelemar | 1:189e78ff65b1 | 544 | break; |
trelemar | 0:86d8ece873ca | 545 | case MAIN: |
trelemar | 0:86d8ece873ca | 546 | tTrans.update(); |
trelemar | 0:86d8ece873ca | 547 | itemlist.update(); |
trelemar | 0:86d8ece873ca | 548 | //If no current hero or current task is to move our current hero, accept cursor movement. |
trelemar | 0:86d8ece873ca | 549 | if (!current_hero||current_task==TASK_MOVE||current_task==TASK_ATTACK) { |
trelemar | 0:86d8ece873ca | 550 | CursorInput(); |
trelemar | 0:86d8ece873ca | 551 | cursor_hero = getHeroAtCoords(cursor_x,cursor_y, heros); |
trelemar | 0:86d8ece873ca | 552 | } |
trelemar | 0:86d8ece873ca | 553 | //This will call when there is a current hero and not in a current task |
trelemar | 0:86d8ece873ca | 554 | else if (current_hero) { |
trelemar | 0:86d8ece873ca | 555 | //TASK SELECTOR |
trelemar | 0:86d8ece873ca | 556 | int dir = 0; |
trelemar | 0:86d8ece873ca | 557 | if (btn.pressed(BTN_RIGHT)) { |
trelemar | 0:86d8ece873ca | 558 | selected_task=min(selected_task+1,3); |
trelemar | 0:86d8ece873ca | 559 | } |
trelemar | 0:86d8ece873ca | 560 | if (btn.pressed(BTN_LEFT)) { |
trelemar | 0:86d8ece873ca | 561 | selected_task=max(selected_task-1,0); |
trelemar | 0:86d8ece873ca | 562 | } |
trelemar | 0:86d8ece873ca | 563 | if (selected_task==TASK_ITEM) { |
trelemar | 0:86d8ece873ca | 564 | itemlist.enabled = true; |
trelemar | 0:86d8ece873ca | 565 | } |
trelemar | 0:86d8ece873ca | 566 | else itemlist.enabled = false; |
trelemar | 0:86d8ece873ca | 567 | //selected_task=selected_task%4; |
trelemar | 0:86d8ece873ca | 568 | } |
trelemar | 0:86d8ece873ca | 569 | |
trelemar | 0:86d8ece873ca | 570 | DrawTileMap(map_x, map_y, current_hero); |
trelemar | 0:86d8ece873ca | 571 | for (int i = 0; i<heros.size(); i++) { |
trelemar | 0:86d8ece873ca | 572 | heros[i].Draw(); |
trelemar | 0:86d8ece873ca | 573 | heros[i].update(i); |
trelemar | 0:86d8ece873ca | 574 | } |
trelemar | 0:86d8ece873ca | 575 | itest.Draw(); |
trelemar | 0:86d8ece873ca | 576 | DrawCursor(cursor_x-map_x,cursor_y-map_y); |
trelemar | 0:86d8ece873ca | 577 | disp.setColor(15); |
trelemar | 0:86d8ece873ca | 578 | |
trelemar | 0:86d8ece873ca | 579 | if (btn.pressed(BTN_A)) { |
trelemar | 0:86d8ece873ca | 580 | if (current_hero&¤t_task!=TASK_NONE) { |
trelemar | 0:86d8ece873ca | 581 | //THIS IS WITHIN A TASK, EX: SELECTING A MOVE LOCATION OR ATTACK TARGET. |
trelemar | 0:86d8ece873ca | 582 | switch (current_task) { |
trelemar | 0:86d8ece873ca | 583 | case TASK_MOVE: |
trelemar | 0:86d8ece873ca | 584 | //MOVE HERO TO CURSOR, NO COLISSIONS YET. |
trelemar | 0:86d8ece873ca | 585 | //ONLY IF IN RANGE AND NOT SOLID |
trelemar | 0:86d8ece873ca | 586 | //FIX STACKABLE HEROS |
trelemar | 0:86d8ece873ca | 587 | if (current_hero->inRange(cursor_x, cursor_y)&&!getHeroAtCoords(cursor_x, cursor_y, heros)&&!solids[Map[cursor_y][cursor_x]]) { |
trelemar | 0:86d8ece873ca | 588 | if (cursor_x<current_hero->x) current_hero->flip=true; |
trelemar | 0:86d8ece873ca | 589 | else if (cursor_x>current_hero->x) current_hero->flip=false; |
trelemar | 0:86d8ece873ca | 590 | current_hero->x = cursor_x; |
trelemar | 0:86d8ece873ca | 591 | current_hero->y = cursor_y; |
trelemar | 0:86d8ece873ca | 592 | |
trelemar | 0:86d8ece873ca | 593 | current_task = TASK_NONE; |
trelemar | 0:86d8ece873ca | 594 | current_hero->tasks[TASK_MOVE] = false; |
trelemar | 0:86d8ece873ca | 595 | } |
trelemar | 0:86d8ece873ca | 596 | break; |
trelemar | 0:86d8ece873ca | 597 | case TASK_ATTACK: |
trelemar | 0:86d8ece873ca | 598 | if (cursor_hero&¤t_hero->inRange(cursor_hero)) { |
trelemar | 0:86d8ece873ca | 599 | //FOUND TARGET AT CURSOR. |
trelemar | 0:86d8ece873ca | 600 | cursor_x = current_hero->x; |
trelemar | 0:86d8ece873ca | 601 | cursor_y = current_hero->y; |
trelemar | 0:86d8ece873ca | 602 | int8_t result = cursor_hero->hp - (current_hero->atk-cursor_hero->def); |
trelemar | 0:86d8ece873ca | 603 | cursor_hero->hp = result; |
trelemar | 0:86d8ece873ca | 604 | cursor_hero->hurt_time=game.frameCount; |
trelemar | 0:86d8ece873ca | 605 | if (result<=0) { |
trelemar | 0:86d8ece873ca | 606 | heros.erase(heros.begin()+cursor_hero->index); |
trelemar | 0:86d8ece873ca | 607 | } |
trelemar | 0:86d8ece873ca | 608 | |
trelemar | 0:86d8ece873ca | 609 | current_task = TASK_NONE; |
trelemar | 0:86d8ece873ca | 610 | current_hero->tasks[TASK_ATTACK] = false; |
trelemar | 0:86d8ece873ca | 611 | } |
trelemar | 0:86d8ece873ca | 612 | else { |
trelemar | 0:86d8ece873ca | 613 | //NO TARGET FOUND, ERROR SOUND SHOULD PLAY. |
trelemar | 0:86d8ece873ca | 614 | } |
trelemar | 0:86d8ece873ca | 615 | break; |
trelemar | 0:86d8ece873ca | 616 | |
trelemar | 0:86d8ece873ca | 617 | //DUMMY CODE, THESE ARE CALLED BELOW. NOT HERE. |
trelemar | 0:86d8ece873ca | 618 | case TASK_ITEM: |
trelemar | 0:86d8ece873ca | 619 | current_task = TASK_NONE; |
trelemar | 0:86d8ece873ca | 620 | current_hero->tasks[TASK_ITEM] = false; |
trelemar | 0:86d8ece873ca | 621 | break; |
trelemar | 0:86d8ece873ca | 622 | case TASK_WAIT: |
trelemar | 0:86d8ece873ca | 623 | current_task = TASK_NONE; |
trelemar | 0:86d8ece873ca | 624 | current_hero->tasks[TASK_WAIT] = false; |
trelemar | 0:86d8ece873ca | 625 | break; |
trelemar | 0:86d8ece873ca | 626 | } |
trelemar | 0:86d8ece873ca | 627 | } |
trelemar | 0:86d8ece873ca | 628 | else if (current_hero&¤t_hero->tasks[selected_task]==true) { |
trelemar | 0:86d8ece873ca | 629 | //TASK SWITCH HERE |
trelemar | 0:86d8ece873ca | 630 | //THIS HAPPENS DIRECTLY AFTER PRESSING BTN_A ON A NEW TASK. |
trelemar | 0:86d8ece873ca | 631 | current_task=selected_task; |
trelemar | 0:86d8ece873ca | 632 | |
trelemar | 0:86d8ece873ca | 633 | switch (selected_task) { |
trelemar | 0:86d8ece873ca | 634 | case TASK_ITEM: |
trelemar | 0:86d8ece873ca | 635 | current_task = TASK_NONE; |
trelemar | 0:86d8ece873ca | 636 | current_hero->tasks[TASK_ITEM] = false; |
trelemar | 0:86d8ece873ca | 637 | break; |
trelemar | 0:86d8ece873ca | 638 | case TASK_WAIT: |
trelemar | 0:86d8ece873ca | 639 | current_task = TASK_NONE; |
trelemar | 0:86d8ece873ca | 640 | current_hero->tasks[TASK_WAIT] = false; |
trelemar | 0:86d8ece873ca | 641 | break; |
trelemar | 0:86d8ece873ca | 642 | } |
trelemar | 0:86d8ece873ca | 643 | } |
trelemar | 0:86d8ece873ca | 644 | else if (cursor_hero) { |
trelemar | 0:86d8ece873ca | 645 | //NO CURRENT HERO, SELECT A HERO ONLY IF IN CURSOR HERE. |
trelemar | 0:86d8ece873ca | 646 | if (cursor_hero->team == current_team) { |
trelemar | 0:86d8ece873ca | 647 | current_hero = cursor_hero; |
trelemar | 0:86d8ece873ca | 648 | selected_task = TASK_MOVE; |
trelemar | 0:86d8ece873ca | 649 | tTrans.enabled = true; |
trelemar | 0:86d8ece873ca | 650 | } |
trelemar | 0:86d8ece873ca | 651 | } |
trelemar | 0:86d8ece873ca | 652 | } |
trelemar | 0:86d8ece873ca | 653 | if (btn.pressed(BTN_B)) { |
trelemar | 0:86d8ece873ca | 654 | if (current_task!=TASK_NONE) { |
trelemar | 0:86d8ece873ca | 655 | //BACK OUT OF CURRENT TASK. |
trelemar | 0:86d8ece873ca | 656 | current_task=TASK_NONE; |
trelemar | 0:86d8ece873ca | 657 | cursor_x = current_hero->x; |
trelemar | 0:86d8ece873ca | 658 | cursor_y = current_hero->y; |
trelemar | 0:86d8ece873ca | 659 | } |
trelemar | 0:86d8ece873ca | 660 | else if (current_hero&¤t_task==TASK_NONE) { |
trelemar | 0:86d8ece873ca | 661 | tTrans.enabled=false; current_hero = NULL; //UNSELECT HERO. |
trelemar | 0:86d8ece873ca | 662 | } |
trelemar | 0:86d8ece873ca | 663 | } |
trelemar | 0:86d8ece873ca | 664 | if (btn.pressed(BTN_C)&& !current_hero) { |
trelemar | 0:86d8ece873ca | 665 | //heros.push_back(Hero(cursor_x,cursor_y,0,0)); |
trelemar | 0:86d8ece873ca | 666 | current_team=(current_team+1) % 2; |
trelemar | 0:86d8ece873ca | 667 | for (int i=0;i<heros.size();i++) heros[i].NewTurn(); |
trelemar | 0:86d8ece873ca | 668 | State = PAUSE; |
trelemar | 1:189e78ff65b1 | 669 | disp.print("PAUSED"); |
trelemar | 0:86d8ece873ca | 670 | //tTrans.toggle(); |
trelemar | 0:86d8ece873ca | 671 | } |
trelemar | 0:86d8ece873ca | 672 | if (cursor_hero&&cursor_hero!=current_hero&¤t_task) { |
trelemar | 0:86d8ece873ca | 673 | DrawCursorHeroUI(cursor_hero, (cursor_hero->x-map_x)*16-4,(cursor_hero->y-map_y)*16-7); |
trelemar | 0:86d8ece873ca | 674 | } |
trelemar | 0:86d8ece873ca | 675 | if (tTrans.val==tTrans.on_val) { |
trelemar | 0:86d8ece873ca | 676 | DrawItemList(current_hero, itemlist.val); |
trelemar | 0:86d8ece873ca | 677 | } |
trelemar | 0:86d8ece873ca | 678 | DrawSelectedHeroUI(current_hero, tTrans.val); |
trelemar | 0:86d8ece873ca | 679 | |
trelemar | 0:86d8ece873ca | 680 | disp.setCursor(0,0); |
trelemar | 0:86d8ece873ca | 681 | DrawTurnCounter(heros); |
trelemar | 0:86d8ece873ca | 682 | //disp.print(0,32,dtest.text); |
trelemar | 0:86d8ece873ca | 683 | //disp.print(1,SH-6,(int)game.battery.level); |
trelemar | 0:86d8ece873ca | 684 | //disp.print(" "); |
trelemar | 0:86d8ece873ca | 685 | break; |
trelemar | 0:86d8ece873ca | 686 | case PAUSE: |
trelemar | 0:86d8ece873ca | 687 | if (btn.pressed(BTN_C)) { |
trelemar | 0:86d8ece873ca | 688 | State = MAIN; |
trelemar | 0:86d8ece873ca | 689 | } |
trelemar | 0:86d8ece873ca | 690 | disp.print(isThisFileOpen("file_out.war")); |
trelemar | 0:86d8ece873ca | 691 | break; |
trelemar | 0:86d8ece873ca | 692 | }//GAME STATE SWITCH |
trelemar | 0:86d8ece873ca | 693 | |
trelemar | 0:86d8ece873ca | 694 | }//UPDATE |
trelemar | 0:86d8ece873ca | 695 | }//IS RUNNING |
trelemar | 0:86d8ece873ca | 696 | return 1; |
trelemar | 0:86d8ece873ca | 697 | } |