Meteor defense project

Dependencies:   N5110 mbed

Committer:
jasper0712
Date:
Thu May 04 16:55:26 2017 +0000
Revision:
50:082feedcdd22
converted library to folder

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jasper0712 50:082feedcdd22 1 #include "Weapon.h"
jasper0712 50:082feedcdd22 2
jasper0712 50:082feedcdd22 3 Weapon::Weapon()
jasper0712 50:082feedcdd22 4 {
jasper0712 50:082feedcdd22 5
jasper0712 50:082feedcdd22 6 }
jasper0712 50:082feedcdd22 7
jasper0712 50:082feedcdd22 8 Weapon::~Weapon()
jasper0712 50:082feedcdd22 9 {
jasper0712 50:082feedcdd22 10
jasper0712 50:082feedcdd22 11 }
jasper0712 50:082feedcdd22 12 void Weapon::init() { //the wonderful thing about structs.
jasper0712 50:082feedcdd22 13 //printf("ld = %d, bd = %d, br = %d, bc = %d, dd = %d, dr = %d, sc = %d, srr = %d \n",laser.damage, bomb.damage, bomb.range, bomb.cooldown, drone.damage, drone.range, shield.capacity, shield.regenRate);
jasper0712 50:082feedcdd22 14 _bombRange = 10 + 2 * bomb.range ;
jasper0712 50:082feedcdd22 15 _laserDamage = 8 + laser.damage * 4;
jasper0712 50:082feedcdd22 16 _bombDamage = 40 + bomb.damage * 10;
jasper0712 50:082feedcdd22 17 _bombCooldown = 70 - bomb.cooldown * 5;
jasper0712 50:082feedcdd22 18 _shieldCapacity = 80 + shield.capacity * 50;
jasper0712 50:082feedcdd22 19 _shieldRegenRate = 4 + shield.regenRate;
jasper0712 50:082feedcdd22 20 _droneDamage = 1 + drone.damage;
jasper0712 50:082feedcdd22 21 _droneRange = 30 + drone.range;
jasper0712 50:082feedcdd22 22 _cannonDamage = 20 + 10 * cannon.damage;
jasper0712 50:082feedcdd22 23 _cannonCapacity = 1280 + 320 * cannon.capacity;
jasper0712 50:082feedcdd22 24 _cannonRegenRate = 4 + cannon.regenRate;
jasper0712 50:082feedcdd22 25 //printf("bombRange = %d \n",_bombRange);
jasper0712 50:082feedcdd22 26 //printf("shield init complete \n");
jasper0712 50:082feedcdd22 27 }
jasper0712 50:082feedcdd22 28 void Weapon::droneInit(int x, int y, int a, int b, int damage, int range){
jasper0712 50:082feedcdd22 29 d_x = x;
jasper0712 50:082feedcdd22 30 d_y = y;
jasper0712 50:082feedcdd22 31 d_side = a;
jasper0712 50:082feedcdd22 32 d_scan = b;
jasper0712 50:082feedcdd22 33 _droneDamage = damage;
jasper0712 50:082feedcdd22 34 _droneRange = range;
jasper0712 50:082feedcdd22 35 //printf("drone.damage = %d, drone.range = %d \n",drone.damage.drone.range);
jasper0712 50:082feedcdd22 36 //printf("actual drone damage = %d, drone range = %d \n",_droneDamage,_droneRange);
jasper0712 50:082feedcdd22 37 //printf("drone init done");
jasper0712 50:082feedcdd22 38 }
jasper0712 50:082feedcdd22 39 void Weapon::drawPlayer(Gamepad &pad, N5110 &lcd){
jasper0712 50:082feedcdd22 40 float angle = pad.get_direction();
jasper0712 50:082feedcdd22 41 int lala = pad.get_angle();
jasper0712 50:082feedcdd22 42 //printf("Direction = %f, Magnitude = %f \n",angle,mag);
jasper0712 50:082feedcdd22 43 //player position - fixed.
jasper0712 50:082feedcdd22 44 lcd.drawRect(42,46,3,2,FILL_BLACK);
jasper0712 50:082feedcdd22 45 //weapon position
jasper0712 50:082feedcdd22 46 if (angle == 0) { //
jasper0712 50:082feedcdd22 47 //printf("do nothing \n");
jasper0712 50:082feedcdd22 48 } else if (angle == 1) {
jasper0712 50:082feedcdd22 49 lcd.setPixel(43,45); lcd.setPixel(43,44);
jasper0712 50:082feedcdd22 50 } else if (angle == 2 ) {
jasper0712 50:082feedcdd22 51 lcd.setPixel(45,45); lcd.setPixel(46,44);
jasper0712 50:082feedcdd22 52 } else if (angle == 8){
jasper0712 50:082feedcdd22 53 lcd.setPixel(41,45); lcd.setPixel(40,44);
jasper0712 50:082feedcdd22 54 } else if (angle == 7){
jasper0712 50:082feedcdd22 55 lcd.setPixel(41,46); lcd.setPixel(40,46);
jasper0712 50:082feedcdd22 56 } else if (angle == 3){
jasper0712 50:082feedcdd22 57 lcd.setPixel(45,46); lcd.setPixel(46,46);
jasper0712 50:082feedcdd22 58 }
jasper0712 50:082feedcdd22 59 }
jasper0712 50:082feedcdd22 60 void Weapon::weaponMath(Gamepad &pad) {
jasper0712 50:082feedcdd22 61 //_laserDamage = 8 + var.laserDamage * 2;
jasper0712 50:082feedcdd22 62 //if button A is pressed. shoot laser
jasper0712 50:082feedcdd22 63 int joyangle = pad.get_angle();
jasper0712 50:082feedcdd22 64 Vector2D mapped_coord = pad.get_mapped_coord();
jasper0712 50:082feedcdd22 65 //printf("mapped coord = %f, %f\n",mapped_coord.x,mapped_coord.y);
jasper0712 50:082feedcdd22 66 //printf("pad.get_angle = %d \n",joyangle);
jasper0712 50:082feedcdd22 67
jasper0712 50:082feedcdd22 68 //calculate the gradient of line
jasper0712 50:082feedcdd22 69 m = mapped_coord.y / mapped_coord.x ;
jasper0712 50:082feedcdd22 70 int x1 = 43;
jasper0712 50:082feedcdd22 71 int y1 = 46;
jasper0712 50:082feedcdd22 72 //printf("m = %f \n",m);
jasper0712 50:082feedcdd22 73 //calculate the y-intercept of the line
jasper0712 50:082feedcdd22 74 c = y1 + m * x1;
jasper0712 50:082feedcdd22 75 }
jasper0712 50:082feedcdd22 76 void Weapon::laser_Main(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 77 //screen is divided into 4 parts for better line resolution
jasper0712 50:082feedcdd22 78 //and gradient sign is always changing.
jasper0712 50:082feedcdd22 79 if ( m > 1) {
jasper0712 50:082feedcdd22 80 laser1and4(Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 81 }
jasper0712 50:082feedcdd22 82 else if (m > 0){
jasper0712 50:082feedcdd22 83 laser2(Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 84 }
jasper0712 50:082feedcdd22 85 else if ( m > -1 ){
jasper0712 50:082feedcdd22 86 laser3(Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 87 }
jasper0712 50:082feedcdd22 88 else if (m < -1){
jasper0712 50:082feedcdd22 89 laser1and4(Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 90 }
jasper0712 50:082feedcdd22 91 lineBreak = 0;
jasper0712 50:082feedcdd22 92 }
jasper0712 50:082feedcdd22 93 void Weapon::laser1and4(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 94 for (int y = 46; y > 0; y--) {
jasper0712 50:082feedcdd22 95 //draw straight line
jasper0712 50:082feedcdd22 96 x = -(y - c)/m;
jasper0712 50:082feedcdd22 97 lcd.setPixel(x,y);
jasper0712 50:082feedcdd22 98 if( cArr2[x-1][y-1] == 'r' || cArr2[x+1][y-1] == 'l' ) {
jasper0712 50:082feedcdd22 99 laser_detectSpawnC(x, y, Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 100 } else {
jasper0712 50:082feedcdd22 101 laser_detectSpawn(x, y, Arr2, lcd);
jasper0712 50:082feedcdd22 102 }
jasper0712 50:082feedcdd22 103 if (lineBreak == 1) {
jasper0712 50:082feedcdd22 104 break;
jasper0712 50:082feedcdd22 105 }
jasper0712 50:082feedcdd22 106 }
jasper0712 50:082feedcdd22 107
jasper0712 50:082feedcdd22 108 //printf("Part 1 is drawing line \n");
jasper0712 50:082feedcdd22 109 }
jasper0712 50:082feedcdd22 110 void Weapon::laser2(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 111 for (int x = 43; x < 83; x++) {
jasper0712 50:082feedcdd22 112 //draw straight line
jasper0712 50:082feedcdd22 113 y = -m * x + c;
jasper0712 50:082feedcdd22 114 lcd.setPixel(x,y);
jasper0712 50:082feedcdd22 115 if( cArr2[x-1][y-1] == 'r' || cArr2[x+1][y-1] == 'l' ) {
jasper0712 50:082feedcdd22 116 laser_detectSpawnC(x, y, Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 117 } else {
jasper0712 50:082feedcdd22 118 laser_detectSpawn(x, y, Arr2, lcd);
jasper0712 50:082feedcdd22 119 }
jasper0712 50:082feedcdd22 120 if (lineBreak == 1) {
jasper0712 50:082feedcdd22 121 break;
jasper0712 50:082feedcdd22 122 }
jasper0712 50:082feedcdd22 123 }
jasper0712 50:082feedcdd22 124 //printf("Part 2 is drawing line \n");
jasper0712 50:082feedcdd22 125 }
jasper0712 50:082feedcdd22 126 void Weapon::laser3(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 127 for (int x = 43; x > 0; x--) {
jasper0712 50:082feedcdd22 128 //draw a straight line for the laser
jasper0712 50:082feedcdd22 129 y = -m * x + c;
jasper0712 50:082feedcdd22 130 lcd.setPixel(x,y);
jasper0712 50:082feedcdd22 131 if( cArr2[x-1][y-1] == 'r' || cArr2[x+1][y-1] == 'l') {
jasper0712 50:082feedcdd22 132 laser_detectSpawnC(x, y, Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 133 } else {
jasper0712 50:082feedcdd22 134 laser_detectSpawn(x, y, Arr2, lcd);
jasper0712 50:082feedcdd22 135 }
jasper0712 50:082feedcdd22 136 if (lineBreak == 1) {
jasper0712 50:082feedcdd22 137 break;
jasper0712 50:082feedcdd22 138 }
jasper0712 50:082feedcdd22 139 }
jasper0712 50:082feedcdd22 140 //printf("part 3 is drawing line \n");
jasper0712 50:082feedcdd22 141 }
jasper0712 50:082feedcdd22 142 //this piece of code to stop drawing the line when a spawn is detected.
jasper0712 50:082feedcdd22 143 //hit box of the laser is only 5 pixel.
jasper0712 50:082feedcdd22 144 void Weapon::laser_detectSpawn(int i, int j, int Arr2[][Rows], N5110 & lcd) {
jasper0712 50:082feedcdd22 145 //printf("drawing at x= %d, y= %d \n",x,y);
jasper0712 50:082feedcdd22 146 if ( Arr2[i][j-1] > 0) {
jasper0712 50:082feedcdd22 147 //printf("spawn detected at x = %d, y= %d \n",i,j-1);
jasper0712 50:082feedcdd22 148 lineBreak = 1;
jasper0712 50:082feedcdd22 149 Arr2[i][j-1] = Arr2[i][j-1] - _laserDamage;
jasper0712 50:082feedcdd22 150 } else if (Arr2[i-1][j-1] > 0){
jasper0712 50:082feedcdd22 151 //printf("spawn detected at x = %d, y= %d \n",i-1,j-1);
jasper0712 50:082feedcdd22 152 lineBreak = 1;
jasper0712 50:082feedcdd22 153 Arr2[i-1][j-1] = Arr2[i-1][j-1] - _laserDamage;
jasper0712 50:082feedcdd22 154 } else if (Arr2[i+1][j-1] > 0) {
jasper0712 50:082feedcdd22 155 //printf("spawn detected at x = %d, y= %d \n",i+1,j-1);
jasper0712 50:082feedcdd22 156 lineBreak = 1;
jasper0712 50:082feedcdd22 157 Arr2[i+1][j-1] = Arr2[i+1][j-1] - _laserDamage;
jasper0712 50:082feedcdd22 158 } else if (Arr2[i+1][j] > 0) {
jasper0712 50:082feedcdd22 159 lineBreak = 1;
jasper0712 50:082feedcdd22 160 Arr2[i+1][j] = Arr2[i+1][j] - _laserDamage;
jasper0712 50:082feedcdd22 161 } else if (Arr2[i-1][j] > 0) {
jasper0712 50:082feedcdd22 162 lineBreak = 1;
jasper0712 50:082feedcdd22 163 Arr2[i-1][j] = Arr2[i-1][j] - _laserDamage;
jasper0712 50:082feedcdd22 164 }
jasper0712 50:082feedcdd22 165 }
jasper0712 50:082feedcdd22 166 void Weapon::laser_detectSpawnC(int i, int j, int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 167 //printf("either L or R is detected \n");
jasper0712 50:082feedcdd22 168 if (cArr2[i+1][j-1] == 'l'){
jasper0712 50:082feedcdd22 169 //printf("cArr2[%d][%d] = %c \n",i+1,j-1,cArr2[i+1][j-1]);
jasper0712 50:082feedcdd22 170 lineBreak = 1;
jasper0712 50:082feedcdd22 171 Arr2[i+2][j] = Arr2[i+2][j] - _laserDamage;
jasper0712 50:082feedcdd22 172 //printf("L found \n");
jasper0712 50:082feedcdd22 173 } else if (cArr2[i-1][j-1] == 'r') {
jasper0712 50:082feedcdd22 174 //printf("cArr2[%d][%d] = %c \n",i-1,j-1,cArr2[i-1][j-1]);
jasper0712 50:082feedcdd22 175 lineBreak = 1;
jasper0712 50:082feedcdd22 176 Arr2[i-2][j] = Arr2[i-2][j] - _laserDamage;
jasper0712 50:082feedcdd22 177 //printf("R found \n");
jasper0712 50:082feedcdd22 178 }
jasper0712 50:082feedcdd22 179 }
jasper0712 50:082feedcdd22 180 void Weapon::bomb_main(int Arr2[][Rows], Gamepad &pad, N5110 &lcd) {
jasper0712 50:082feedcdd22 181 if (_bomb < _bombCooldown) {
jasper0712 50:082feedcdd22 182 //printf("bomb not ready yet \n");
jasper0712 50:082feedcdd22 183 _bomb += 1;
jasper0712 50:082feedcdd22 184 int cd = 3 + ((30* _bomb) / _bombCooldown);
jasper0712 50:082feedcdd22 185 for (int x = 3; x < cd; x++) { //draw a line
jasper0712 50:082feedcdd22 186 lcd.setPixel(x,47);
jasper0712 50:082feedcdd22 187 }
jasper0712 50:082feedcdd22 188 } else { //allow bomb when cooldown is done.
jasper0712 50:082feedcdd22 189 //printf("bomb is ready to detonate \n");
jasper0712 50:082feedcdd22 190 for (int x = 3; x < 34; x++) { //draw a line
jasper0712 50:082feedcdd22 191 lcd.setPixel(x,47);
jasper0712 50:082feedcdd22 192 }
jasper0712 50:082feedcdd22 193 checkBombTarget(pad);
jasper0712 50:082feedcdd22 194 if (bombTarget_flag == 1) {
jasper0712 50:082feedcdd22 195 drawBombTarget(pad, lcd);
jasper0712 50:082feedcdd22 196 if (pad.check_event(Gamepad::X_PRESSED)) {
jasper0712 50:082feedcdd22 197 spawnDamageByBomb(Arr2, lcd);
jasper0712 50:082feedcdd22 198 }
jasper0712 50:082feedcdd22 199 }
jasper0712 50:082feedcdd22 200 }
jasper0712 50:082feedcdd22 201 }
jasper0712 50:082feedcdd22 202 void Weapon::checkBombTarget(Gamepad &pad) {
jasper0712 50:082feedcdd22 203 if (pad.check_event(Gamepad::L_PRESSED)) { //press L button to toggle flag
jasper0712 50:082feedcdd22 204 if (bombTarget_flag == 1) {
jasper0712 50:082feedcdd22 205 //printf("button L pressed and flag toggled \n");
jasper0712 50:082feedcdd22 206 bombTarget_flag = 0;
jasper0712 50:082feedcdd22 207 } else if(bombTarget_flag == 0) {
jasper0712 50:082feedcdd22 208 bombTarget_flag = 1;
jasper0712 50:082feedcdd22 209 }
jasper0712 50:082feedcdd22 210 }
jasper0712 50:082feedcdd22 211 }
jasper0712 50:082feedcdd22 212 Target Weapon::targetCoord(Gamepad &pad) {
jasper0712 50:082feedcdd22 213 Vector2D coord = pad.get_coord();
jasper0712 50:082feedcdd22 214 //coord is used instead of mappedcoord because the bomb has to be able to go to the screen corner
jasper0712 50:082feedcdd22 215 int yy = 24 - coord.y * 24;
jasper0712 50:082feedcdd22 216 int xx = 42 + coord.x * 42;
jasper0712 50:082feedcdd22 217
jasper0712 50:082feedcdd22 218 Target _coord = {xx,yy};
jasper0712 50:082feedcdd22 219 return _coord;
jasper0712 50:082feedcdd22 220 }
jasper0712 50:082feedcdd22 221 void Weapon::drawBombTarget(Gamepad &pad, N5110 &lcd) {
jasper0712 50:082feedcdd22 222 Target _coord = targetCoord(pad); //get the coordinate on the screen.
jasper0712 50:082feedcdd22 223 _y = _coord.yy;
jasper0712 50:082feedcdd22 224 _x = _coord.xx;
jasper0712 50:082feedcdd22 225 //draw a "+" on the screen using the coordinate for the target
jasper0712 50:082feedcdd22 226 lcd.setPixel(_x,_y);
jasper0712 50:082feedcdd22 227 lcd.setPixel(_x+1,_y);
jasper0712 50:082feedcdd22 228 lcd.setPixel(_x-1,_y);
jasper0712 50:082feedcdd22 229 lcd.setPixel(_x,_y+1);
jasper0712 50:082feedcdd22 230 lcd.setPixel(_x,_y-1);
jasper0712 50:082feedcdd22 231 }
jasper0712 50:082feedcdd22 232 void Weapon::spawnDamageByBomb(int Arr2[][Rows], N5110 &lcd){ //draw the bombed area and deal damage to the area when X is pressed.
jasper0712 50:082feedcdd22 233 _bomb = 0;
jasper0712 50:082feedcdd22 234 bombTarget_flag = 0; //clear flag
jasper0712 50:082feedcdd22 235 //printf("why u not working now?? omg \n");
jasper0712 50:082feedcdd22 236 //printf("x = %d, y = %d, bombRange = %d \n",a,b,r);
jasper0712 50:082feedcdd22 237 printf("bombRange = %d \n",_bombRange);
jasper0712 50:082feedcdd22 238 _bombRange = 10 + bomb.range ;
jasper0712 50:082feedcdd22 239 int a = _x; //a and b is the origin of the circle,
jasper0712 50:082feedcdd22 240 int b = _y;
jasper0712 50:082feedcdd22 241 int r = _bombRange; //r is radius of circle
jasper0712 50:082feedcdd22 242 int c2 = r * r;
jasper0712 50:082feedcdd22 243 int x2 = a + r +1;
jasper0712 50:082feedcdd22 244 int y2 = b + r +1;
jasper0712 50:082feedcdd22 245
jasper0712 50:082feedcdd22 246 drawCircle(a, b, r, c2, x2, y2, Arr2, lcd);
jasper0712 50:082feedcdd22 247 //printf("bomb detonated \n");
jasper0712 50:082feedcdd22 248 }
jasper0712 50:082feedcdd22 249 void Weapon::drawCircle(int a, int b, int r, int c2, int x2, int y2, int Arr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 250 //had to use this instead of lcd.drawcircle because it has to be able to manipulate the array.
jasper0712 50:082feedcdd22 251 //find all the coordinate in a square depending on the radius of circle.
jasper0712 50:082feedcdd22 252 for (int x1 = a - r; x1 < x2; x1 ++){
jasper0712 50:082feedcdd22 253 for (int y1 = b - r; y1 < y2; y1 ++) {
jasper0712 50:082feedcdd22 254 //this code because when y1 get negative. The game crash.
jasper0712 50:082feedcdd22 255 int x3 = x1; int y3 = y1;
jasper0712 50:082feedcdd22 256 if (y3 < 0) {
jasper0712 50:082feedcdd22 257 y3 = 40;
jasper0712 50:082feedcdd22 258 } if (x3 < 0) {
jasper0712 50:082feedcdd22 259 x3 = 40;
jasper0712 50:082feedcdd22 260 }
jasper0712 50:082feedcdd22 261 int a2 = (x3 - a) * (x3 - a);
jasper0712 50:082feedcdd22 262 int b2 = (y3 - b) * (y3 - b);
jasper0712 50:082feedcdd22 263 if (a2 + b2 <= c2 +1) { //if the coordinate is within the circle ( c2 = a2 + b2 )
jasper0712 50:082feedcdd22 264 //draw circle and deal damage to it .
jasper0712 50:082feedcdd22 265 lcd.setPixel(x3,y3);
jasper0712 50:082feedcdd22 266 Arr2[x3][y3] = Arr2[x3][y3] - _bombDamage;
jasper0712 50:082feedcdd22 267 }
jasper0712 50:082feedcdd22 268 }
jasper0712 50:082feedcdd22 269 }
jasper0712 50:082feedcdd22 270 }
jasper0712 50:082feedcdd22 271 void Weapon::shield_main(int Arr2[][Rows], char cArr2[][Rows], Gamepad &pad, N5110 &lcd) {
jasper0712 50:082feedcdd22 272 if (pad.buttonhold_B == 1) { //if B pressed, generate shield. Shield doesnt have to be fully charged to be activated
jasper0712 50:082feedcdd22 273 if (_shield > 0) { //shield will only activate if the shield has not depleted.
jasper0712 50:082feedcdd22 274 shield_Rule(Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 275 } else { //or else, deactivate the shield and recharge the shield.
jasper0712 50:082feedcdd22 276 pad.buttonhold_B = 0;
jasper0712 50:082feedcdd22 277 }
jasper0712 50:082feedcdd22 278 }
jasper0712 50:082feedcdd22 279 if (pad.buttonhold_B == 0) { // recharge shield
jasper0712 50:082feedcdd22 280 if (_shield < _shieldCapacity ) {
jasper0712 50:082feedcdd22 281 _shield = _shield + _shieldRegenRate;
jasper0712 50:082feedcdd22 282 //printf("current shield = %d \n",weap._shield);
jasper0712 50:082feedcdd22 283 //printf("shield regen rate = %d \n",weap._shieldRegenRate);
jasper0712 50:082feedcdd22 284 } else { //when the shield is fully charged. It will automatically activate the shield.
jasper0712 50:082feedcdd22 285 pad.buttonhold_B = 1;
jasper0712 50:082feedcdd22 286 }
jasper0712 50:082feedcdd22 287 }
jasper0712 50:082feedcdd22 288 shieldMeter(lcd);
jasper0712 50:082feedcdd22 289 }
jasper0712 50:082feedcdd22 290 void Weapon::shield_Rule(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 291 drawEnergyShield(lcd);
jasper0712 50:082feedcdd22 292 for (int x = 0; x < Cols; x++) { //from x = 0 to x = 83
jasper0712 50:082feedcdd22 293 if (cArr2[x][45] == 'b') { //scan for spawn B
jasper0712 50:082feedcdd22 294 Arr2[x][45] = 0;
jasper0712 50:082feedcdd22 295 cArr2[x][45] = '\0';
jasper0712 50:082feedcdd22 296 _shield -= 20;
jasper0712 50:082feedcdd22 297 } else if ( cArr2[x][45] == 'd' || cArr2[x][45] == 'e' ) { //scan for spawn D&E
jasper0712 50:082feedcdd22 298 Arr2[x][45] = 0;
jasper0712 50:082feedcdd22 299 cArr2[x][45] = '\0';
jasper0712 50:082feedcdd22 300 _shield -= 30;
jasper0712 50:082feedcdd22 301 }
jasper0712 50:082feedcdd22 302 }
jasper0712 50:082feedcdd22 303 }
jasper0712 50:082feedcdd22 304 //draw a simple barrier at y = 45
jasper0712 50:082feedcdd22 305 void Weapon::drawEnergyShield(N5110 &lcd) {
jasper0712 50:082feedcdd22 306 for (int x = 0; x < Cols; x++) {
jasper0712 50:082feedcdd22 307 lcd.setPixel(x,45);
jasper0712 50:082feedcdd22 308 }
jasper0712 50:082feedcdd22 309 for (int x = 0; x < Cols; x += 3) {
jasper0712 50:082feedcdd22 310 lcd.setPixel(x,44);
jasper0712 50:082feedcdd22 311 }
jasper0712 50:082feedcdd22 312 }
jasper0712 50:082feedcdd22 313 void Weapon::shieldMeter(N5110 &lcd) {
jasper0712 50:082feedcdd22 314 int cd = 50 + ((30 * _shield) / _shieldCapacity);
jasper0712 50:082feedcdd22 315 lcd.drawLine(50,47,cd,47,1);
jasper0712 50:082feedcdd22 316 }
jasper0712 50:082feedcdd22 317 void Weapon::drone_main(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 318 lcd.setPixel(d_x,d_y);
jasper0712 50:082feedcdd22 319 //prioritize spawn D&E
jasper0712 50:082feedcdd22 320 droneScanForDE(Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 321 if (d_foundDE == 0) {
jasper0712 50:082feedcdd22 322 droneScanForAB(Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 323 }
jasper0712 50:082feedcdd22 324 d_foundDE = 0;
jasper0712 50:082feedcdd22 325 }
jasper0712 50:082feedcdd22 326 void Weapon::droneScanForAB(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 327 for (int y = d_y; y > d_y - _droneRange; y--) { //scan through the given drone range from left to right
jasper0712 50:082feedcdd22 328 for (int x = d_side; x < d_scan; x++) {
jasper0712 50:082feedcdd22 329 if (cArr2[x][y] == 'a' || cArr2[x][y] == 'c') { //if detect something
jasper0712 50:082feedcdd22 330 //printf("drone detected spawn A/C at x = %d, y = %d \n",x ,y);
jasper0712 50:082feedcdd22 331 droneLaser(x, y, Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 332 Arr2[x][y] = Arr2[x][y] - _droneDamage;
jasper0712 50:082feedcdd22 333 breakout = 1;
jasper0712 50:082feedcdd22 334 break; //break out of the first for loop.
jasper0712 50:082feedcdd22 335 }
jasper0712 50:082feedcdd22 336 }
jasper0712 50:082feedcdd22 337 if (breakout == 1){
jasper0712 50:082feedcdd22 338 breakout = 0;
jasper0712 50:082feedcdd22 339 break; //break out of the second for loop.
jasper0712 50:082feedcdd22 340 }
jasper0712 50:082feedcdd22 341 }
jasper0712 50:082feedcdd22 342 }
jasper0712 50:082feedcdd22 343 void Weapon::droneScanForDE(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) { //drone prioritize in killing spawnDE
jasper0712 50:082feedcdd22 344 for (int y = d_y; y > d_y - _droneRange; y--) { //scan through the given drone range from left to right
jasper0712 50:082feedcdd22 345 for (int x = d_side; x < d_scan; x++) {
jasper0712 50:082feedcdd22 346 if (cArr2[x][y] == 'd' || cArr2[x][y] == 'e') { //if detect something
jasper0712 50:082feedcdd22 347 //printf("drone detected spawn D&E at x = %d, y = %d \n",x ,y);
jasper0712 50:082feedcdd22 348 droneLaser(x, y, Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 349 Arr2[x][y] = Arr2[x][y] - _droneDamage;
jasper0712 50:082feedcdd22 350 breakout = 1;
jasper0712 50:082feedcdd22 351 d_foundDE = 1;
jasper0712 50:082feedcdd22 352 break; //break out of the first for loop.
jasper0712 50:082feedcdd22 353 }
jasper0712 50:082feedcdd22 354 }
jasper0712 50:082feedcdd22 355 if (breakout == 1){
jasper0712 50:082feedcdd22 356 breakout = 0;
jasper0712 50:082feedcdd22 357 break; //break out of the second for loop.
jasper0712 50:082feedcdd22 358 }
jasper0712 50:082feedcdd22 359 }
jasper0712 50:082feedcdd22 360 }
jasper0712 50:082feedcdd22 361 void Weapon::droneLaser(int x, int y, int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) { //this is used to draw line (laser) for the drone
jasper0712 50:082feedcdd22 362 float m;
jasper0712 50:082feedcdd22 363 if ( x != d_x) { //to prevent m (gradient) from going to infinity.
jasper0712 50:082feedcdd22 364 m = (((float)y) - d_y) / (((float)x) - d_x); //to get the gradient of the line. y = mx + c
jasper0712 50:082feedcdd22 365 } else {
jasper0712 50:082feedcdd22 366 m = 50; //50 is more than enough since screen height is only 48 pixel.
jasper0712 50:082feedcdd22 367 }
jasper0712 50:082feedcdd22 368 int c = d_y - m * d_x; // y-intercept of the line
jasper0712 50:082feedcdd22 369 //printf("y intercept = %d and gradient = %f \n",c,m);
jasper0712 50:082feedcdd22 370 /*int lala = x - d_x;
jasper0712 50:082feedcdd22 371 if ( lala == 0 ) {
jasper0712 50:082feedcdd22 372 printf("m = %d at x = %d \n",m,x);
jasper0712 50:082feedcdd22 373 }*/
jasper0712 50:082feedcdd22 374 for (int j = d_y ; j > y ; j--) {
jasper0712 50:082feedcdd22 375 int i = (j - c) / m;
jasper0712 50:082feedcdd22 376 lcd.setPixel(i,j);
jasper0712 50:082feedcdd22 377 }
jasper0712 50:082feedcdd22 378 }
jasper0712 50:082feedcdd22 379 void Weapon::cannon_main(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) { //dividing the screen into 4 parts like the laser
jasper0712 50:082feedcdd22 380 //printf("cannonFiring_flag = %d, cannon_y = %d, cannon_x = %d \n",cannonFiring_flag,cannon_y,cannon_x);
jasper0712 50:082feedcdd22 381 if ( cannonFiring_flag == 0) { //save the current gradient and also the y-intercept
jasper0712 50:082feedcdd22 382 cannonDirection = m;
jasper0712 50:082feedcdd22 383 cannon_c = c;
jasper0712 50:082feedcdd22 384 cannon_y = 46; //initial pos of cannon
jasper0712 50:082feedcdd22 385 cannon_x = 43;
jasper0712 50:082feedcdd22 386 cannonFiring_flag = 1;
jasper0712 50:082feedcdd22 387 cannon_Damage = _cannonDamage;
jasper0712 50:082feedcdd22 388 _cannon = _cannon - 320; //each cannon clip costs 320.
jasper0712 50:082feedcdd22 389 //printf("firing a new cannon \n");
jasper0712 50:082feedcdd22 390 }
jasper0712 50:082feedcdd22 391 //dividing the screen into 4 parts like the laser
jasper0712 50:082feedcdd22 392 if ( cannonFiring_flag == 1) { //cannon fired
jasper0712 50:082feedcdd22 393 if ( cannonDirection > 1) {
jasper0712 50:082feedcdd22 394 cannon1and4(Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 395 }
jasper0712 50:082feedcdd22 396 else if ( cannonDirection > 0){
jasper0712 50:082feedcdd22 397 cannon2(Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 398 }
jasper0712 50:082feedcdd22 399 else if ( cannonDirection > -1 ){
jasper0712 50:082feedcdd22 400 cannon3(Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 401 }
jasper0712 50:082feedcdd22 402 else if ( cannonDirection < -1){
jasper0712 50:082feedcdd22 403 cannon1and4(Arr2, cArr2, lcd);
jasper0712 50:082feedcdd22 404 }
jasper0712 50:082feedcdd22 405 }
jasper0712 50:082feedcdd22 406 }
jasper0712 50:082feedcdd22 407 void Weapon::cannon1and4(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 408 if ( cannon_y > 0 ) {
jasper0712 50:082feedcdd22 409 cannon_y --;
jasper0712 50:082feedcdd22 410 //printf("printing cannonball at (%d,%d) \n",x,cannon_y);
jasper0712 50:082feedcdd22 411 int x = -(cannon_y - cannon_c) / cannonDirection;
jasper0712 50:082feedcdd22 412 draw_CannonBall(x, cannon_y, lcd);
jasper0712 50:082feedcdd22 413 //search for spawn A, B and C
jasper0712 50:082feedcdd22 414 cannon_HitBox(x, cannon_y, Arr2, cArr2);
jasper0712 50:082feedcdd22 415 } else {
jasper0712 50:082feedcdd22 416 cannonFiring_flag = 0;
jasper0712 50:082feedcdd22 417 //printf("cannon1and4 is done \n");
jasper0712 50:082feedcdd22 418 }
jasper0712 50:082feedcdd22 419 }
jasper0712 50:082feedcdd22 420 void Weapon::cannon2(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 421 if ( cannon_x < 83 ) {
jasper0712 50:082feedcdd22 422 cannon_x ++;
jasper0712 50:082feedcdd22 423 int y = - cannonDirection * cannon_x + cannon_c;
jasper0712 50:082feedcdd22 424 //printf("printing cannonball at (%d,%d) \n",cannon_x,y);
jasper0712 50:082feedcdd22 425 draw_CannonBall(cannon_x, y, lcd);
jasper0712 50:082feedcdd22 426 //search for spawn A, B and C.
jasper0712 50:082feedcdd22 427 cannon_HitBox(cannon_x, y, Arr2, cArr2);
jasper0712 50:082feedcdd22 428 } else {
jasper0712 50:082feedcdd22 429 cannonFiring_flag = 0;
jasper0712 50:082feedcdd22 430 //printf("cannon2 is done \n");
jasper0712 50:082feedcdd22 431 }
jasper0712 50:082feedcdd22 432 }
jasper0712 50:082feedcdd22 433 void Weapon::cannon3(int Arr2[][Rows], char cArr2[][Rows], N5110 &lcd) {
jasper0712 50:082feedcdd22 434 if ( cannon_x > 0 ) {
jasper0712 50:082feedcdd22 435 cannon_x --;
jasper0712 50:082feedcdd22 436 int y = - cannonDirection * cannon_x + cannon_c;
jasper0712 50:082feedcdd22 437 //printf("printing cannonball at (%d,%d) \n",cannon_x,y);
jasper0712 50:082feedcdd22 438 draw_CannonBall(cannon_x, y, lcd);
jasper0712 50:082feedcdd22 439 //search for spawn A, B and C.
jasper0712 50:082feedcdd22 440 cannon_HitBox(cannon_x, y, Arr2, cArr2);
jasper0712 50:082feedcdd22 441 } else {
jasper0712 50:082feedcdd22 442 cannonFiring_flag = 0;
jasper0712 50:082feedcdd22 443 //printf("cannon3 is done \n");
jasper0712 50:082feedcdd22 444 }
jasper0712 50:082feedcdd22 445 }
jasper0712 50:082feedcdd22 446 void Weapon::cannon_HitBox(int i, int j, int Arr2[][Rows], char cArr2[][Rows]) {
jasper0712 50:082feedcdd22 447 for (int x = i - 4; x < i + 5; x ++) {
jasper0712 50:082feedcdd22 448 for (int y = j - 4; y < j + 5; y ++) {
jasper0712 50:082feedcdd22 449 if (cannon_Damage > 0 ) { //if cannon can still deal damage, continue search for spawn
jasper0712 50:082feedcdd22 450 if (cArr2[x][y] == 'a') {
jasper0712 50:082feedcdd22 451 cannon_Damage = cannon_Damage - 2;
jasper0712 50:082feedcdd22 452 Arr2[x][y] = 0;
jasper0712 50:082feedcdd22 453 cArr2[x][y] = '\0';
jasper0712 50:082feedcdd22 454 }
jasper0712 50:082feedcdd22 455 if (cArr2[x][y] == 'b') {
jasper0712 50:082feedcdd22 456 cannon_Damage = cannon_Damage - 5;
jasper0712 50:082feedcdd22 457 Arr2[x][y] = 0;
jasper0712 50:082feedcdd22 458 cArr2[x][y] = '\0';
jasper0712 50:082feedcdd22 459 }
jasper0712 50:082feedcdd22 460 if (cArr2[x][y] == 'c') {
jasper0712 50:082feedcdd22 461 cannon_Damage = cannon_Damage - 5;
jasper0712 50:082feedcdd22 462 Arr2[x][y] = 0;
jasper0712 50:082feedcdd22 463 cArr2[x][y] = '\0';
jasper0712 50:082feedcdd22 464 }
jasper0712 50:082feedcdd22 465 } else { //if the cannon cant deal any more damage, terminate search and clear flag
jasper0712 50:082feedcdd22 466 cannonFiring_flag = 0;
jasper0712 50:082feedcdd22 467 break;
jasper0712 50:082feedcdd22 468 }
jasper0712 50:082feedcdd22 469 }
jasper0712 50:082feedcdd22 470 }
jasper0712 50:082feedcdd22 471 }
jasper0712 50:082feedcdd22 472 void Weapon::cannon_recharge() {
jasper0712 50:082feedcdd22 473 if ( _cannon < _cannonCapacity ) {
jasper0712 50:082feedcdd22 474 _cannon = _cannon + _cannonRegenRate;
jasper0712 50:082feedcdd22 475 }
jasper0712 50:082feedcdd22 476 //printf("_cannon = %d \n",_cannon);
jasper0712 50:082feedcdd22 477 }
jasper0712 50:082feedcdd22 478 void Weapon::cannon_Meter(N5110 &lcd) {
jasper0712 50:082feedcdd22 479 float zz = 83 * ( ((float)_cannon) / _cannonCapacity) ;
jasper0712 50:082feedcdd22 480 //printf(" zz = %f \n",zz);
jasper0712 50:082feedcdd22 481 for ( int x = 0 ; x < zz; x ++) {
jasper0712 50:082feedcdd22 482 lcd.setPixel(x,0);
jasper0712 50:082feedcdd22 483 }
jasper0712 50:082feedcdd22 484 }
jasper0712 50:082feedcdd22 485 void Weapon::draw_CannonBall(int x, int y, N5110 &lcd) {
jasper0712 50:082feedcdd22 486 //draw a diamond shape
jasper0712 50:082feedcdd22 487 lcd.setPixel(x-1,y-1); lcd.setPixel(x,y-1); lcd.setPixel(x+1,y+1);
jasper0712 50:082feedcdd22 488 lcd.setPixel(x-1,y); lcd.setPixel(x,y); lcd.setPixel(x+1,y);
jasper0712 50:082feedcdd22 489 lcd.setPixel(x-1,y+1); lcd.setPixel(x,y+1); lcd.setPixel(x+1,y-1);
jasper0712 50:082feedcdd22 490 lcd.setPixel(x-2,y); lcd.setPixel(x+2,y);
jasper0712 50:082feedcdd22 491 lcd.setPixel(x,y+2); lcd.setPixel(x,y-2);
jasper0712 50:082feedcdd22 492 }
jasper0712 50:082feedcdd22 493 void Weapon::setVar(int up, int up1) {
jasper0712 50:082feedcdd22 494 //printf("HI, ME FROM WEAP. up = %d, up1 = %d \n",up,up1);
jasper0712 50:082feedcdd22 495 if (up == 0){ //if laser picked
jasper0712 50:082feedcdd22 496 laser.damage ++;
jasper0712 50:082feedcdd22 497 } else if (up == 1) { //if bomb picked
jasper0712 50:082feedcdd22 498 if (up1 == 0) {
jasper0712 50:082feedcdd22 499 bomb.damage ++;
jasper0712 50:082feedcdd22 500 } else if (up1 == 1) {
jasper0712 50:082feedcdd22 501 bomb.range ++;
jasper0712 50:082feedcdd22 502 } else {
jasper0712 50:082feedcdd22 503 bomb.cooldown++;
jasper0712 50:082feedcdd22 504 }
jasper0712 50:082feedcdd22 505 } else if (up == 2) { //if drone picked
jasper0712 50:082feedcdd22 506 if (up1 == 0) {
jasper0712 50:082feedcdd22 507 drone.damage++;
jasper0712 50:082feedcdd22 508 } else {
jasper0712 50:082feedcdd22 509 drone.range++;
jasper0712 50:082feedcdd22 510 }
jasper0712 50:082feedcdd22 511 } else if (up == 3) { //if shield picked
jasper0712 50:082feedcdd22 512 if (up1 == 0) {
jasper0712 50:082feedcdd22 513 shield.capacity ++;
jasper0712 50:082feedcdd22 514 } else {
jasper0712 50:082feedcdd22 515 shield.regenRate ++;
jasper0712 50:082feedcdd22 516 }
jasper0712 50:082feedcdd22 517 } else if (up == 4) { //if cannon picked
jasper0712 50:082feedcdd22 518 if (up1 == 0) {
jasper0712 50:082feedcdd22 519 cannon.damage ++;
jasper0712 50:082feedcdd22 520 } else if (up1 == 1) {
jasper0712 50:082feedcdd22 521 cannon.capacity ++;
jasper0712 50:082feedcdd22 522 } else if (up1 == 2) {
jasper0712 50:082feedcdd22 523 cannon.regenRate ++;
jasper0712 50:082feedcdd22 524 }
jasper0712 50:082feedcdd22 525 }
jasper0712 50:082feedcdd22 526 }
jasper0712 50:082feedcdd22 527 void Weapon::reset_WeaponVariables() {
jasper0712 50:082feedcdd22 528 laser.damage = 0;
jasper0712 50:082feedcdd22 529 bomb.damage = 0;
jasper0712 50:082feedcdd22 530 bomb.range = 0;
jasper0712 50:082feedcdd22 531 bomb.cooldown = 0;
jasper0712 50:082feedcdd22 532 drone.damage = 0;
jasper0712 50:082feedcdd22 533 drone.range = 0;
jasper0712 50:082feedcdd22 534 shield.capacity = 0;
jasper0712 50:082feedcdd22 535 shield.regenRate = 0;
jasper0712 50:082feedcdd22 536 bomb.damage = 0;
jasper0712 50:082feedcdd22 537 bomb.capacity = 0;
jasper0712 50:082feedcdd22 538 bomb.regenRate = 0;
jasper0712 50:082feedcdd22 539 _cannon = 0;
jasper0712 50:082feedcdd22 540 _shield = 0;
jasper0712 50:082feedcdd22 541 _bomb = 0;
jasper0712 50:082feedcdd22 542 }