|
|
1.1 ! root 1: #include <jerq.h> ! 2: #include "ship.h" ! 3: #include "rock.h" ! 4: extern Bitmap *buildimage(); ! 5: extern Rock *collision(); ! 6: extern death; ! 7: extern notdrawn; ! 8: ! 9: Bitmap *ship; ! 10: ! 11: char nothrust[]={ ! 12: 'R', -20, -20, 21, 21, ! 13: 'm', 20, 0, /* must be tip of ship, where bombs go from */ ! 14: 'l', -11, 7, ! 15: 'l', -11, -7, ! 16: 'l', 20, 0, ! 17: 0, ! 18: }; ! 19: char thrust[]={ ! 20: 'R', -20, -20, 21, 21, ! 21: 'm', 20, 0, ! 22: 'l', -11, 7, ! 23: 'l', -11, -7, ! 24: 'l', 20, 0, ! 25: 'm', -11, 5, ! 26: 'l', -20, 0, ! 27: 'l', -11, -5, ! 28: 0 ! 29: }; ! 30: char shipim[sizeof thrust]; /* rotated into position */ ! 31: int angle=270; /* up, actually */ ! 32: int costheta=0, sintheta= -1024; ! 33: int oldangle; ! 34: int thrusting; ! 35: int oldthrusting; ! 36: Point pos; ! 37: Point oldpos; ! 38: int reloading; ! 39: Point vel; ! 40: Point resid; ! 41: shipfree() ! 42: { ! 43: bfree(ship); ! 44: } ! 45: initship() ! 46: { ! 47: pos.x=Drect.corner.x/2; ! 48: pos.y=Drect.corner.y/2; ! 49: oldpos=pos; ! 50: vel.x=0; ! 51: vel.y=0; ! 52: angle=270; ! 53: thrusting=0; ! 54: oldangle=angle; ! 55: costheta=cos(angle); ! 56: sintheta=sin(angle); ! 57: oldthrusting=0; ! 58: reloading=0; ! 59: resid=vel; ! 60: genship(nothrust); ! 61: drawship(); ! 62: } ! 63: genship(p) ! 64: register char *p; ! 65: { ! 66: register char *q=shipim; ! 67: register i; ! 68: bfree(ship); /* safe if ship==0 */ ! 69: for(i=0; i<5; i++) ! 70: *q++ = *p++; /* copy bounding rectangle */ ! 71: while(*q++ = *p++){ /* copy opcode */ ! 72: *q++=m(sext(p[0]), costheta)-m(sext(p[1]), sintheta); ! 73: *q++=m(sext(p[1]), costheta)+m(sext(p[0]), sintheta); ! 74: p+=2; ! 75: } ! 76: ship=buildimage(shipim); ! 77: } ! 78: quickcheck() ! 79: { register but=mouse.buttons&7; /* sleazy, but avoid button1, etc. */ ! 80: if(death) ! 81: return 0; ! 82: if(computer && curthreat>=0) ! 83: strat(), but = compbut; ! 84: if((but&(4|1))==(4|1)) /* button1() && button3() ==> thrust */ ! 85: thrusting=1; ! 86: else{ ! 87: thrusting=0; ! 88: if(but&(4|1)){ ! 89: if(but&4){ /* button1() ==> turn left */ ! 90: angle-=DTHETA; ! 91: if(angle < 0) ! 92: angle += 360; ! 93: }else{ ! 94: angle+=DTHETA; ! 95: if(angle > 360) ! 96: angle -= 360; ! 97: } ! 98: costheta=cos(angle); ! 99: sintheta=sin(angle); ! 100: } ! 101: } ! 102: if(!reloading && (but&2)){ ! 103: shoot(); ! 104: reloading=RELOAD; ! 105: } ! 106: if(reloading>0) ! 107: --reloading; ! 108: if(thrusting){ ! 109: vel.x+=m(THRUST, costheta); ! 110: vel.y+=m(THRUST, sintheta); ! 111: } ! 112: pos.x+=(vel.x+resid.x)/VSCALE; ! 113: pos.y+=(vel.y+resid.y)/VSCALE; ! 114: resid.x=(resid.x+vel.x)&(VSCALE-1); ! 115: resid.y=(resid.y+vel.y)&(VSCALE-1); ! 116: onscreen(&pos); ! 117: if(collision(pos, hash(pos), RADSHIP)){ ! 118: allover(pos); ! 119: return 0; ! 120: }else ! 121: return 1; ! 122: } ! 123: shoot() ! 124: { ! 125: /* VSCALE/3 reflects the difference in updates between bombs and ship */ ! 126: startbomb(add(pos, Pt(sext(shipim[6]), sext(shipim[7]))), div(vel, VSCALE/3), angle); ! 127: } ! 128: longcheck() ! 129: { ! 130: if(death) ! 131: return 0; ! 132: drawship(); ! 133: if(angle!=oldangle || thrusting!=oldthrusting){ ! 134: genship(thrusting? thrust : nothrust); ! 135: notdrawn-=2; ! 136: } ! 137: oldpos=pos; ! 138: oldangle=angle; ! 139: oldthrusting=thrusting; ! 140: drawship(); ! 141: if(vel.x > C) ! 142: vel.x = C; ! 143: if(vel.y > C) ! 144: vel.y = C; ! 145: if(vel.x < -C) ! 146: vel.x = -C; ! 147: if(vel.y < -C) ! 148: vel.y = -C; ! 149: return 1; ! 150: } ! 151: drawship() ! 152: { ! 153: bitblt(ship, ship->rect, &display, add(transform(oldpos), ship->rect.origin), F_XOR); ! 154: if(notdrawn>-20) ! 155: --notdrawn; ! 156: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.