'TITLE: THERMOSPHERE 'AUTHOR: NOUSERNAME010 'THIS PLANS TO USE DYNAMIC SPRITE MANAGEMENT. 'THAT SAID, I KEPT THIS FOR SCOPE REFERENCE. 'SPRITES: '0 - PLAYER '1 - CROSSHEIR '2-20 - ENEMEIES '21-63 - MISC. 'CHAR NOTES '80 = BULLET HIT PARTICLE 'VARAIBLE DECLARATIONS 'P0-2 - PARAMETER DUMPS GLOBAL P0,P1,P2,PANGLE,PSPEED,PMAXSP,PMINSP,PSLWSP,PTSPED,PCOLDN,PMSLCD,PLCKCD,PHELTH,PX,PY,MAPWID,MAPHGT,CAMERX,CAMERY,PBULET,PMISLE,FOCUSE,EMAXSP,EMINSP,ENEMCT, MSLTSP,LCKENM,MSNAM$,EAGGRO,MISACT,DIALG$,MSDCCD,DIALLN,WATCON,WAVNUM,WAVCDN,MISCDN,ALRTCD,ALERT$,WAVCNT 'ENTITY VARIABLES '0 - TYPE ' -- 0 - NOT INITIATED ' -- 1 - BULLET ' -- 2 - MISSILE ' -- 3 - ENEMY ' -- 4 - EMPTY FOR NOW. PLANNING WELL DOESN'T PAY OFF AT ALL. THIS WILL JUST BE A PLACEHOLDER. ' -- 5 - PARTICLE '1 - MISC VAR '2 - MISC VAR '3 - X POS '4 - Y POS '5 - ANGLE '6 - SPEED '7 - COUNTER '8 - COUNTER '9 - COUNTER '10 - COUNTER DIM GLOBAL ENTITY(61, 10) EMAXSP = 3 EMINSP = 1.5 MSLTSP = PI/120 'LIST ARRAYS '-1 = NOT INITIATED '0-61 = REPRESENTS ENTITY ON SAID NUMBER. DIM GLOBAL ENMLST(18) FOR I=0 TO UBOUND(ENMLST) ENMLST(I)=-1 NEXT I 'MAP VARIABLES MAPWID = 800 MAPHGT = 640 'PLAYER VARIABLES PMAXSP = 3.5 PMINSP = 2 PSLWSP = 1.5 PSPEED = 1 PANGLE = 0 PTSPED = PI/60 PCOLDN = 0 PMSLCD = 0 PLCKCD = -20 PHELTH = 20 PBULET = 600 PMISLE = 50 FOCUSE = -1 LCKENM = -1 'MISSION VARIABLES ENEMCT = 0 MISACT = -1 DIALCD = 0 DIALG$ = "" WATCON = 0 WAVNUM = 0 WAVCDN = 0 MISCDN = 0 ALRTCD = 0 ALERT$ = "" WAVCNT = 0 PX = 400 PY = 320 GAMEPAD 1 RANDOMIZE TIMER MAIN: P0 = 0 CALL DECODE_MISSION(1*P0) PRINT "MISSION "+STR$(P0+1) PRINT MSNAM$ WAIT 120 CALL DECODE_MISSION(0) BG 1 BG COPY 0,0,32,32 TO 0,0 BG 0 PRIO 1 PAL 4 BG FILL 18,0 TO 18,1 CHAR 129 CELL 18,2,128 CELL 19,2,130 CELL 19,0,131 CELL 19,1,132 PAL 0 BG SOURCE ROM(4) DO PRIO 0 'COMPUTES PLAYER CALL CALC_PLAYER 'COMPUTES ENTITIES CALL CALC_ENTITIES 'SCROLL BACKGROUND SCROLL 1,MIN(760,MAX(40,CAMERX))++INT((TIMER/30)),MIN(576,MAX(64,CAMERY)) 'SPAWN ENEMIES IF WAVNUM > 0 THEN IF TIMER MOD MAX(WAVCDN,1) = 0 THEN CALL MAKE_ENEMY(RND(MAPWID-80)+40,RND(MAPHGT-128)+64) DEC WAVNUM END IF END IF 'UI PRIO 1 BG FILL 0,0 TO 17,2 CHAR 0 PAL 4 CALL RIGHT_TEXT(STR$(PBULET),17,0) CALL RIGHT_TEXT(STR$(PMISLE),17,1) CALL RIGHT_TEXT(STR$(PHELTH),17,2) IF PMSLCD<0 THEN TEXT 4,2,"LOADING" ELSE IF PLCKCD = 0 THEN TEXT 4,2,"LOCKED" END IF 'DISPLAY CURRENT PLAYER ANGLE. I = PANGLE+((PI/4)/2) I = INT(I/(PI/4)) I = I MOD 8 INC I CELL 1,1,I PAL 0 'DISPLAY DIALOG BG FILL 4,4 TO 19,4 CHAR 0 IF ALRTCD<0 THEN TEXT 4,4,ALERT$ INC ALRTCD END IF 'DECODES NEXT EVENTS IN THE CURRENT MISSION 'PARAMETER DOESN'T MATTER AT THIS POINT 'BUT FIRST DETERMINES IF SHOULD WAIT _W = 1 IF NOT MSDCCD=0 THEN _W=0 IF _W>0 AND NOT WATCON=0 THEN _W = 0 IF WATCON=-1 AND ENEMCT=0 AND WAVNUM=0 THEN _W=1 WATCON=0 END IF END IF IF _W>0 THEN CALL DECODE_MISSION(0) 'DISPLAY DIALOG CALL DECODE_DIALOG WAIT VBL LOOP 'SUB THAT COMPUTES PLAYER MOVEMENT SUB CALC_PLAYER 'INPUT 'CONTROLS SPEED IF UP(0) THEN PSPEED=PSPEED+0.05 ELSE PSPEED=PSPEED-0.05 END IF 'CLAMP SPEED IF PSPEED > PMAXSP THEN PSPEED = PMAXSP IF PSPEED < PMINSP THEN PSPEED = PMINSP 'CONTROLS ANGLE 'ANGLE MODIFIER _AM = 1 IF DOWN(0) THEN _AM = 2 IF LEFT(0) THEN PANGLE=PANGLE-PTSPED*_AM ELSE IF RIGHT(0) THEN PANGLE=PANGLE+PTSPED*_AM END IF 'LOOPS ANGLE IF PANGLE>(PI*2) THEN PANGLE = PANGLE - (PI*2) IF PANGLE<0 THEN PANGLE=PANGLE+(PI*2) 'CONTROLS SHOOTING 'IF B IS PRESSED, FIRES MISSILE INSTEAD. IF BUTTON(0,0) AND BUTTON(0,1) AND PMSLCD >= 0 AND PMISLE>0 THEN PMSLCD=-300 DEC PMISLE IF PLCKCD<0 THEN _L=-1 ELSE _L=FOCUSE CALL SHOOT_MISSILE(PX+(COS(PANGLE)*2),PY+(SIN(PANGLE)*2),PANGLE,0,_L) ELSE IF BUTTON(0,0) AND NOT BUTTON(0,1) AND PCOLDN >= 0 AND PBULET>0 THEN PCOLDN=-6 DEC PBULET CALL SHOOT_BULLET(PX+(COS(PANGLE)*2),PY+(SIN(PANGLE)*2),PANGLE,0) ELSE IF PCOLDN < 0 THEN INC PCOLDN IF PMSLCD < 0 THEN INC PMSLCD END IF 'MOVES PLAYER ADD PX,COS(PANGLE)*PSPEED ADD PY,SIN(PANGLE)*PSPEED 'DRAW PLAYER 'SELECTS PLAYER SPRITE PSPRIT = PANGLE+((PI/4)/2) PSPRIT = INT(PSPRIT/(PI/4)) PSPRIT = PSPRIT MOD 8 INC PSPRIT 'IF FOCUSED, THEN CAMERA CENTERS ON NEAREST ENEMY. 'IF UNFOCUSED, CAMERA AJUSTS DEPENDING ON PLAYER DIRECTION AND SPEED IF BUTTON(0,1) THEN IF FOCUSE<0 THEN 'FINDS NEAREST ENEMY TO FOCUS ON. _L = -1 FOR I=0 TO UBOUND(ENMLST) IF ENMLST(I)>=0 THEN 'CHECKS IF IN DISTANCE AND ANGLE RANGE CALL GET_DIST(PX,PY,ENTITY(ENMLST(I),3),ENTITY(ENMLST(I),4),P0) CALL GET_ANGLE(PX,PY,ENTITY(ENMLST(I),3),ENTITY(ENMLST(I),4),P1) CALL RAY_WITHIN_ANGLE(P1,PANGLE,(7*PI)/18,P2) IF (_L > P0 OR _L<0) AND P2>0 THEN _L = P0 FOCUSE=ENMLST(I) END IF END IF NEXT I ELSE 'IF STILL FOCUSING, INCREASE LOCK COOLDOWN IF PLCKCD<0 THEN INC PLCKCD END IF ELSE IF FOCUSE>=0 THEN FOCUSE=-1 END IF 'RESETS LOCK COOLDOWN IF FOCUSE<0 THEN PLCKCD=-60 IF FOCUSE>=0 THEN CALL SET_CAM(ENTITY(FOCUSE,3),ENTITY(FOCUSE,4)) ELSE CALL SET_CAM((PX+4)+(COS(PANGLE)*40*((PSPEED-PMINSP)/(PMAXSP-PMINSP))),(PY+4)+(SIN(PANGLE)*32*((PSPEED-PMINSP)/(PMAXSP-PMINSP)))) END IF CALL DRAW_SPRITE(0,PX,PY,PSPRIT,P0) 'DRAW PLAYER INDICATOR IF OFF CAM. IF P0>0 THEN CALL GET_ANGLE(CAMERX,CAMERY,PX,PY,P1) P2=P1+((PI/4)/2) P2=INT(P1/(PI/4)) P2=P2 MOD 8 ADD P2,16 CALL DRAW_SPRITE(0,CAMERX+COS(P1)*32,CAMERY+SIN(P1)*32,P2,P0) END IF 'DRAW CROSSHEIR IF FOCUSE<0 THEN CALL DRAW_SPRITE(1,PX+(COS(PANGLE)*56),PY+(SIN(PANGLE)*56),64+(INT(TIMER/30) MOD 2),P0) ELSE CALL DRAW_SPRITE(1,ENTITY(FOCUSE,3),ENTITY(FOCUSE,4),64+(INT(TIMER/30) MOD 2),P0) END IF END SUB 'SUB FOR COMPUTING ENTITIES SUB CALC_ENTITIES FOR I=0 TO UBOUND(ENTITY) IF ENTITY(I,0) > 0 THEN IF ENTITY(I,0) = 1 THEN CALL HANDLE_BULLET(I) IF ENTITY(I,0) = 2 THEN CALL HANDLE_MISSILE(I) IF ENTITY(I,0) = 3 THEN CALL HANDLE_ENEMY(I) IF ENTITY(I,0) = 5 THEN CALL HANDLE_PARTICLE(I) END IF NEXT I END SUB 'SUB FOR SHOOTING BULLETS SUB SHOOT_BULLET(XPOS,YPOS,ANG,TEAM) CALL MAKE_ENTITY(1,XPOS,YPOS,P0) ENTITY(P0,7) = -11 ENTITY(P0,2) = TEAM ENTITY(P0,5) = ANG ENTITY(P0,6) = 8 END SUB 'SUB FOR SHOOTING MISSILES SUB SHOOT_MISSILE(XPOS,YPOS,ANG,TEAM,LOCK) CALL MAKE_ENTITY(2,XPOS,YPOS,P0) ENTITY(P0,1) = TEAM ENTITY(P0,2) = LOCK ENTITY(P0,5) = ANG ENTITY(P0,6) = 4 ENTITY(P0,7) = -300 END SUB 'SUB FOR MAKING ENEMIES SUB MAKE_ENEMY(XPOS,YPOS) CALL MAKE_ENTITY(3,XPOS,YPOS,P0) 'ASSIGNS ENEMY TO ENEMY LIST FOR I=0 TO UBOUND(ENMLST) IF ENMLST(I)<0 THEN ENMLST(I)=P0 I=UBOUND(ENMLST)+1 END IF NEXT I 'ADDS ENEMY COUNT. INC ENEMCT 'DEBUG, SETS HEALTH ENTITY(P0,8)=2 END SUB 'SUB FOR MAKING PARTICLES SUB MAKE_PARTICLE(XPOS,YPOS,PT,DC,C,P) CALL MAKE_ENTITY(5,XPOS,YPOS,P0) ENTITY(P0,1)=DC ENTITY(P0,2)=PT ENTITY(P0,7)=-DC ENTITY(P0,8)=C ENTITY(P0,9)=C ENTITY(P0,10)=P END SUB 'SUB FOR MAKING ENTITIES SUB MAKE_ENTITY(TYPE,XPOS,YPOS,DUMP) FOR I=0 TO UBOUND(ENTITY) IF ENTITY(I,0) = 0 THEN ENTITY(I,0) = TYPE ENTITY(I,3) = XPOS ENTITY(I,4) = YPOS CALL GET_ANGLE(XPOS,YPOS,PX,PY,P0) ENTITY(I,5) = P0 DUMP = I I=UBOUND(ENTITY)+1 END IF NEXT I END SUB 'DELETES ENTITIES SUB DEL_ENTITY(E_NUM) SPRITE E_NUM+2 PAL 0 SPRITE OFF E_NUM+2 'ENEMY SPECIAL CODE 'P0 MUST BE SET BEFORE DELETION. P0 = POSITION IN ENMLST 'NOTE: ENEMIES ***MUST*** BE DELETED THROUGH THIS SUB ***ONLY*** 'SINCE IT UPDATES ENEMY COUNT AND CUTS PLAYER FOCUS 'WILL MAKE EXPLOSION UPON DELETION. IF ENTITY(E_NUM,0)=3 THEN ENMLST(P0)=-1 CALL MAKE_PARTICLE(ENTITY(E_NUM,3),ENTITY(E_NUM,4),4,2,81,1) IF FOCUSE=E_NUM THEN FOCUSE=-1 DEC ENEMCT END IF ENTITY(E_NUM, 0) = 0 END SUB 'SUB FOR DRAWING SPRITES IN CAMERA SUB DRAW_SPRITE(NUM,XPOS,YPOS,SPR,DUMP) _SX = XPOS-CAMERX+80 _SY = YPOS-CAMERY+64 IF _SX < 167 AND _SX > -7 AND _SY < 135 AND _SY > -7 THEN SPRITE NUM,_SX,_SY,SPR DUMP=0 ELSE SPRITE OFF NUM DUMP=1 END IF END SUB 'BULLET ENTITY CODE 'MISC VAR 2 = TEAM (0 = PLAYER. ELSE = ENEMY) 'COUNTER 7 = TIMEOUT SUB HANDLE_BULLET(E_NUM) _S = 0 IF ENTITY(E_NUM,7) >= 0 THEN CALL DEL_ENTITY(E_NUM) ELSE _S = 0 ADD ENTITY(E_NUM,3),(COS(ENTITY(E_NUM,5))*ENTITY(E_NUM,6)) ADD ENTITY(E_NUM,4),(SIN(ENTITY(E_NUM,5))*ENTITY(E_NUM,6)) 'CHECKS COLLISION 'NOTE TO SELF: PLAYER BULLETS TAKE A LOT MORE CPU THAN ENEMY BULLETS. 'DOESN'T TAKE A LOT TO SEE WHY. IF ENTITY(E_NUM,2)=0 THEN FOR I=0 TO UBOUND(ENMLST) IF ENMLST(I)>=0 THEN _E = ENMLST(I) TRACE _E IF (ENTITY(_E,3) < ENTITY(E_NUM,3)+4) AND (ENTITY(_E,3)+8>ENTITY(E_NUM,3)+4) AND (ENTITY(_E,4) ENTITY(E_NUM,4)+4) THEN DEC ENTITY(_E,8) IF ENTITY(_E,8)<=0 THEN P0 = I CALL DEL_ENTITY(_E) 'I DONT WANT IT MAKING PARTICLES IF THE ENEMY DIES _S = 2 ELSE _S = 1 END IF I = UBOUND(ENMLST) END IF END IF NEXT I ELSE IF (PXENTITY(E_NUM,3)+4) AND (PYENTITY(E_NUM,4)+4) THEN DEC PHELTH _S = 1 END IF END IF 'DELETES IF USED IF _S > 0 THEN IF _S < 2 THEN CALL MAKE_PARTICLE(ENTITY(E_NUM,3),ENTITY(E_NUM,4),0,10,80,0) CALL DEL_ENTITY(E_NUM) END IF 'THIS IF STATEMENT IS IMPORTANT SINCE DELETION BEFORE DRAWING IS POSSIBLE IF ENTITY(E_NUM,0) > 0 THEN CALL DRAW_SPRITE(E_NUM+2,ENTITY(E_NUM,3),ENTITY(E_NUM,4),66,P0) INC ENTITY(E_NUM,7) END IF END IF END SUB 'SUB FOR HANDLING MISSILES 'MISC VAR 1 = TEAM, 0=PLAYER, ELSE=ENEMY 'MISC VAR 2 = LOCKED ENTITY. -1 IF NONE. ' = ENEMY MISSILES WILL ALWAYS LOCK ONTO PLAYER 'COUNTER 7 = TIMEOUT SUB HANDLE_MISSILE(E_NUM) _S = 0 IF ENTITY(E_NUM,7)>=0 THEN CALL DEL_ENTITY(E_NUM) ELSE 'GETS ANGLE TO TARGET IF ANY. P0 IS ANGLE TO TARGET P0=-1 IF ENTITY(E_NUM,2)>=0 THEN IF ENTITY(E_NUM,1)>=0 THEN _L = ENTITY(E_NUM,2) CALL GET_ANGLE(ENTITY(E_NUM,3),ENTITY(E_NUM,4),ENTITY(_L,3),ENTITY(_L,4),P0) ELSE CALL GET_ANGLE(ENTITY(E_NUM,3),ENTITY(E_NUM,4),PX,PY,P0) END IF END IF 'ROTATES TO ANGLE IF THERE IS ANY. 'MORE DETAILS ON ENEMY SUB. IF P0>=0 THEN IF P0>ENTITY(E_NUM,5) THEN IF P0-ENTITY(E_NUM,5)>PI THEN ADD ENTITY(E_NUM,5),-MSLTSP ELSE ADD ENTITY(E_NUM,5),MSLTSP END IF ELSE IF P0<=ENTITY(E_NUM,5) THEN IF ENTITY(E_NUM,5)-P0>PI THEN ADD ENTITY(E_NUM,5),MSLTSP ELSE ADD ENTITY(E_NUM,5),-MSLTSP END IF END IF END IF 'CLAMP ANGLE IF ENTITY(E_NUM,5)>=2*PI THEN ADD ENTITY(E_NUM,5),-2*PI IF ENTITY(E_NUM,5)<0 THEN ADD ENTITY(E_NUM,5),2*PI 'MOVES MISSILE ADD ENTITY(E_NUM,3),ENTITY(E_NUM,6)*COS(ENTITY(E_NUM,5)) ADD ENTITY(E_NUM,4),ENTITY(E_NUM,6)*SIN(ENTITY(E_NUM,5)) 'CHECKS COLLISION IF ENTITY(E_NUM,1)=0 THEN FOR I=0 TO UBOUND(ENMLST) IF ENMLST(I)>=0 THEN _E = ENMLST(I) TRACE _E IF (ENTITY(_E,3) < ENTITY(E_NUM,3)+4) AND (ENTITY(_E,3)+8>ENTITY(E_NUM,3)+4) AND (ENTITY(_E,4) ENTITY(E_NUM,4)+4) THEN ADD ENTITY(_E,8),-5 IF ENTITY(_E,8)<=0 THEN P0 = I CALL DEL_ENTITY(_E) _S=1 ELSE _S = 1 END IF I = UBOUND(ENMLST) END IF END IF NEXT I ELSE IF (PXENTITY(E_NUM,3)+4) AND (PYENTITY(E_NUM,4)+4) THEN ADD PHELTH,-5 _S = 1 END IF END IF 'DELETES IF USED IF _S > 0 THEN CALL DEL_ENTITY(E_NUM) END IF 'DELETION BEFORE DRAWING IS POSSIBLE IF ENTITY(E_NUM,0)>0 THEN 'GET MISSILE SPRITE _E = ENTITY(E_NUM,5)+((PI/4)/2) _E = INT(_E/(PI/4)) MOD 8 ADD _E,32 CALL DRAW_SPRITE(E_NUM+2,ENTITY(E_NUM,3)-4,ENTITY(E_NUM,4)-4,_E,P0) INC ENTITY(E_NUM,7) END IF END IF END SUB 'ENEMY PLANE ENTITY CODE 'MISC VAR 1 = MODE 'MISC VAR 2 = RANDOM MODIFIER 'COUNTER 7 = ATTACK COOLDOWN 'COUNTER 8 = HEALTH SUB HANDLE_ENEMY(E_NUM) IF ENTITY(E_NUM,8)<=0 THEN CALL DEL_ENTITY(E_NUM) ELSE SPRITE E_NUM+2 PAL 1 'GETS ANGLE TO PLAYER. P0=ANGLE TO PLAYER CALL GET_ANGLE(ENTITY(E_NUM,3),ENTITY(E_NUM,4),PX,PY,P0) 'TODO. 70% PLAYER TURN SPEED IS USED AS DEBUG FOR NOW. 'ROTATES PLANE TOWARD P0 'SINCE RANGE IS INCLUSIVE 0 TO 2*PI EXCLUSIVE, 'AND POSITIVE CHANGE = CCW; NEGATIVE CHANGE = CW, 'IF P0>EANGLE, THEN IT WILL ROTATE CCW. 'IF CCW, BUT P0-EANGLE>180DEG, IT WILL ROTATE CW INSTEAD. 'IF P0180DEG, THEN IT WILL ROTATE CCW INSTEAD. IF P0>ENTITY(E_NUM,5) THEN IF P0-ENTITY(E_NUM,5)>PI THEN ADD ENTITY(E_NUM,5),-PTSPED*0.7 ELSE ADD ENTITY(E_NUM,5),PTSPED*0.7 END IF ELSE IF P0<=ENTITY(E_NUM,5) THEN IF ENTITY(E_NUM,5)-P0>PI THEN ADD ENTITY(E_NUM,5),PTSPED*0.7 ELSE ADD ENTITY(E_NUM,5),-PTSPED*0.7 END IF END IF 'CLAMP ANGLE IF ENTITY(E_NUM,5)>=2*PI THEN ADD ENTITY(E_NUM,5),-2*PI IF ENTITY(E_NUM,5)<0 THEN ADD ENTITY(E_NUM,5),2*PI 'MOVEMENT ADD ENTITY(E_NUM,3),COS(ENTITY(E_NUM,5))*EMINSP ADD ENTITY(E_NUM,4),SIN(ENTITY(E_NUM,5))*EMINSP 'CHECKS IF PLAYER IS "SEEN". 'SHOOTS IF NEAR ENOUGH 'AGAIN, RANGE IS IN 0 TO EX 2*PI. 'MUST SHOOT WITHIN 60 DEGREES VISION. PI/3 'DIFFERENCE BETWEEN UPPER AND LOWER ANGLE IS 30 DEG. DEVIANCE FROM CENTER IS 30 OR PI/6. 'IF DIFFERENCE IS NOT DEGREES, THEN 0-2*PI BORDER HAS BEEN REACHED. 'IN THIS CASE, COMPARISONS ARE INVERTED AND COMPARED WITH "OR" INSTEAD OF "AND" 'WILL ONLY WORK IN CASES WHERE ANGLES ARE NOT >2*PI 'P1 = BOOL OF VISIBILITY 'P2 = DISTANCE FROM PLAYER CALL RAY_WITHIN_ANGLE(ENTITY(E_NUM,5),P0,PI/3,P1) CALL GET_DIST(ENTITY(E_NUM,3),ENTITY(E_NUM,4),PX,PY,P2) 'COOLDOWN TRIGGER IS NOT EXACTLY 0 TO GIVE PLAYER TIME TO GET OUT OF THE WAY IF P1>0 AND P2<64 AND ENTITY(E_NUM,7)>=20 THEN CALL SHOOT_BULLET(ENTITY(E_NUM,3),ENTITY(E_NUM,4),ENTITY(E_NUM,5),1) ENTITY(E_NUM,7) = -10 ELSE IF ENTITY(E_NUM,7)<20 AND P1>0 AND P2<64 THEN INC ENTITY(E_NUM,7) ELSE ENTITY(E_NUM,7)=0 END IF 'SELECTS PLANE SPRITE TO DRAW _ES = ENTITY(E_NUM,5)+((PI/4)/2) _ES = INT(_ES/(PI/4)) _ES = _ES MOD 8 INC _ES 'P1 IS NOW INVERSE BOOL OF ENEMY IN CAMERA CALL DRAW_SPRITE(E_NUM+2,ENTITY(E_NUM,3),ENTITY(E_NUM,4),_ES,P1) 'DRAWS INDICATOR IF IN RANGE. IF P1>0 AND P2<200 THEN 'P0 IS NOW CAMERA ANGLE TO ENEMY CALL GET_ANGLE(CAMERX,CAMERY,ENTITY(E_NUM,3),ENTITY(E_NUM,4),P0) _ES = P0+((PI/4)/2) _ES = INT(_ES/(PI/4)) _ES = _ES MOD 8 ADD _ES,16 CALL DRAW_SPRITE(E_NUM+2,CAMERX+COS(P0)*32,CAMERY+SIN(P0)*32,_ES,P1) END IF END IF END SUB 'PARTICLE CODE 'MISC VAR 1 = DECAY 'MISC VAR 2 = PARTICLE TYPE ' = -1 = MOVING, ALTERNATING ABS(N) CHARACTERS. ' = 0 = STATIONARY. ' = 1+ = STATIONARY, PROGRESSING N CHARACTERS 'COUNTER 7 = DECAY TIMER 'COUNTER 8 = CHARACTER 'COUNTER 9 = INITIAL CHARACTER 'COUNTER 10 = PALETTE SUB HANDLE_PARTICLE(E_NUM) IF ENTITY(E_NUM,7)>=0 AND ENTITY(E_NUM,2)>-1 THEN IF ENTITY(E_NUM,2)=0 THEN CALL DEL_ENTITY(E_NUM) ELSE DEC ENTITY(E_NUM,2) INC ENTITY(E_NUM,8) ENTITY(E_NUM,7)=-ENTITY(E_NUM,1) END IF ELSE SPRITE E_NUM+2 PAL ENTITY(E_NUM,10) CALL DRAW_SPRITE(E_NUM+2,ENTITY(E_NUM,3),ENTITY(E_NUM,4),ENTITY(E_NUM,8),P0) 'DELETE IF OFF CAMERA IF P0>1 THEN CALL DEL_ENTITY(E_NUM) ELSE INC ENTITY(E_NUM,7) END IF END IF END SUB 'TRIGO SUBS SUB GET_DIST(X1,Y1,X2,Y2,DUMP) DUMP = SQR(((X2-X1)^2)+((Y2-Y1)^2)) END SUB SUB GET_ANGLE(X1,Y1,X2,Y2,DUMP) 'SHOUTOUT TO WIKIPEDIA FOR THIS. _X = X1-X2 _Y = Y1-Y2 IF _X > 0 THEN DUMP = ATAN(_Y/_X) ELSE IF _X<0 AND _Y>=0 THEN DUMP = ATAN(_Y/_X)+PI ELSE IF _X<0 AND _Y<0 THEN DUMP = ATAN(_Y/_X)-PI ELSE IF _X=0 AND _Y>0 THEN DUMP = PI/2 ELSE IF _X=0 AND _Y<0 THEN DUMP = -PI/2 ELSE TRACE "WHY THE FUCK WOULD YOU DO THAT" END END IF 'CLAMPS IT TO PI*2 DUMP=DUMP+PI IF DUMP>=(PI*2) THEN DUMP=DUMP-(PI*2) END SUB 'PRACTICAL APPLICATION IN ENEMY SUB SUB RAY_WITHIN_ANGLE(AN,RA,R,DUMP) DUMP = 0 'GETS UPPER AND LOWER ANGLES _UA = AN+(R/2) IF _UA >= PI*2 THEN ADD _UA,-2*PI _LA = AN-(R/2) IF _LA < 0 THEN ADD _LA,2*PI 'TAKES INTO ACCOUNT DECIMAL INACCURACY IF MAX(_UA,_LA)-MIN(_UA,_LA)>R-0.1 AND MAX(_UA,_LA)-MIN(_UA,_LA)_LA THEN DUMP = 1 ELSE IF RA>_UA OR RA<_LA THEN DUMP = 1 END IF END SUB 'UI SUBS 'SUB FOR SETTING CAMERA LOCATION SUB SET_CAM(XPOS,YPOS) CAMERX = XPOS CAMERX = MAX(80,MIN(CAMERX,MAPWID-80)) CAMERY = YPOS CAMERY = MAX(64,MIN(CAMERY,MAPHGT-64)) END SUB 'RIGHT ALIGNED TEXT SUB RIGHT_TEXT(T$,X,Y) TEXT X-LEN(T$)+1,Y,T$ END SUB 'GIVES ALERT. NOT TO BE CONFUSED WITH WARNING. SUB GIVE_ALERT(T$) ALERT$ = T$ ALRTCD = -300 END SUB 'MISSION SUBS 'HANDLES WAVES AND OTHER STUFF 'MUST FIND MISSION DATA BEFORE MAIN LOOP TO AVOID CPU DEATH. 'WAVE FLAGS(ALL FLAGS ARE NEGATIVE) '-1 = MISSION START ' = FOLLOWED BY MISSION NAME. '-2 = WAVE START ' = ENEMY NUM, AGGRESSION, SPAWN COOLDOWN '-3 = PUT DIALOG ' 4 = WAIT FOR CONDITIONS ' = IF POSITIVE NUMBER, THEN WAIT X TICKS. ' = -1, WAIT FOR ENEMY COUNT TO DROP TO 0 'IDX = WHICH MISSION NUMBER DECODED. MUST BE >= 0 SUB DECODE_MISSION(IDX) I=0 IF MISACT<0 THEN RESTORE MISSIONDATA WHILE MISACT = -1 READ I IF I=-1 OR I=-3 THEN IF IDX>0 THEN DEC IDX IF I=-3 THEN READ I READ I END IF READ _D$ ELSE IF I=-3 THEN READ I,_D$ READ _D$ ELSE IF I=-1 THEN MISACT = 0 READ MSNAM$ END IF ELSE I = 0 END IF WEND ELSE READ I IF I=-1 THEN PRINT "MISSION DATA" PRINT "ERROR" END END IF IF I=-2 THEN 'DECODE WAVE NUMBER READ WAVNUM,EAGGRO,WAVCDN INC WAVCNT CALL GIVE_ALERT("WAVE "+STR$(WAVCNT)) ELSE IF I=-3 THEN 'DECODE DIALOG DIALG$ = "" READ DIALLN FOR I=0 TO DIALLN-1 READ _D$ DIALG$=DIALG$+_D$+"\" NEXT I MSDCCD = -100*DIALLN ELSE IF -4 THEN 'DECODE WAIT CONDITION READ WATCON END IF END IF END SUB 'HANDLES DIALOG SUB DECODE_DIALOG _Y = 13 _P = 0 _Q = 1 BG FILL 0,13 TO 19,15 CHAR 0 IF MSDCCD<0 THEN 'TODO: DISPLAY SPEAKER ICON BG COPY 0,2,2,3 TO 0,13 FOR I=0 TO DIALLN-1 _P = INSTR(DIALG$,"\",_Q) TEXT 2,_Y,MID$(DIALG$,_Q,_P-_Q) INC _Y _Q = _P+1 NEXT I INC MSDCCD END IF END SUB MISSIONDATA: DATA -1,"AZURE SKIES" DATA -2,5,1,300 DATA -3,3,"YOU KNOW THE","DRILL, X1. GET","AZURE QUARRIES OUT." DATA -3,3,"THEY'VE BEEN","TRESSPASSING","IN METRICA FOR" DATA -3,1,"FAR TOO LONG NOW." DATA -3,3,"WE'VE SPENT LOTS","ON YOUR JET.","DON'T WASTE IT." DATA -4,-1 DATA -2,10,3,200 DATA -3,2,"THE HELL! WORLD","UNITED'S HERE!" DATA -3,3,"THEY ARE","DESTROYING OUR","SHIT!!!" DATA -3,3,"CALM DOWN. WE","JUST KILL HIM","SIMPLE." DATA -4,-1 DATA -2,15,4,120 DATA -3,2,"DAMN, HE'S","GOOD!" DATA -3,2,"DON'T BE","INTIMIDATED!" DATA -3,2,"IT'S JUST","WORLD UNITED!" DATA -4,-1 DATA -3,3,"IF YOU'RE","READING THIS","CONGRATS!" DATA -3,3,"THAT'S THE","END OF THIS","DEMO MISSION." DATA -3,3,"IF HEALTH'S","STILL OK,","GOOD JOB!!!" DATA -4,2 #1:MAIN PALETTES 073F1F3000341B3C003F2A15003F3C00 073F2F1B003F2A15003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 00000000F9FEF8000000000C8786F800 0060F0F87808040000200080740E0600 FFFFFF7E2424001899818142183C1818 00060F1F1E102000000400012E706000 000000009F7F1F0000000030E1611F00 000040383C1E0C040060702020120804 180024247EFFFFFF18183C1842818199 0000021C3C78302000060E0404481020 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000010080C0810000000100804081000 000000040C1C000000000004041C0000 00000044381000000000004428100000 00000020303800000000002020380000 00081030100800000008102010080000 00003830200000000000382020000000 0000081C220000000000081422000000 00001C0C0400000000001C0404000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000E07F7FE000000000000A0A000000 2030F8783C0E07030000000818020600 243C3C18181818180000000018001800 040C1F1E3C70E0C00000001018406000 000007FEFE0700000000005050000000 C0E0703C1E1F0C040060401810000000 18181818183C3C240018001800000000 03070E3C78F830200006021808000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 080800D81B0010100000001818000000 00422418182442000000001818000000 0000183C3C1800000000000810000000 0000001E716F3F00000000000E100000 00000001E1FFFF000000000000000000 000000F0C8BFFF000000000030400000 0000000000F0FC000000000000000000 00187C7F5FDFE77C0000000020201800 000000C0F0E8D8600000000000102000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00FFFFFFFFFFFFFFFFFFFF9999999999 00FEFEFEFEFEFEFEFEFFFF9F9F9F9F9F 00422400002442000000000000000000 00000018180000000000000000000000 0000183C3C1800000000001818000000 3C7EFFFFFFFF7E3C003C7E7E7E7E3C00 3C3CE7C3C3E73C3C003C664242663C00 18244281814224181824428181422418 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FFFFFFFFFFE1F7E39999C0E0DFDFDEDE FEFEF6C6D68EDEDE9F973B7BFBFF7373 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 F7FBFFFFFFFFFFFFEEF6FAFEFEFEFFFF DEDEFEFEFEFEFEFE73735373730307FF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 7F7F7F7F7F7F3F00FFFFFFFFFFFF7F3F 7F7F7F7F7F7F7F7FFFFFFFFFFFFFFFFF E7FF99FFFFFFFF00FFE7E78181E7E7FF FFF9F5FBFFFFFFFFFFFFFBE7C78FDFFF FFF9F1FBFF9FDFFFFFFFFF870767E7CF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FFFFFF2F01010101FF50502E01010101 FFFFFFFFE0E0E0E0FF01011F20202020 E1F3F3F3F3FFFFFFE1929292929E8080 FFFFFFFFFCFCFFFFFF60606764646760 FFEFEFEF0F0FEFCFFF2828E90909E948 F3FBFFFF3F3FFFFBF30A06E62626E60A 87CFCFFFFFFFFFFF8749493101014979 3F7FFFFFFFFFFFFE3F478B9393939392 FFFFFFFFE6E0F8FCFF83011926201884 FFFFFFE7E7EFFFFEFF83B9A5A5A9B386 FFFFF3F3F3FFFFFFFF9E9292929E8080 FFFFFFFFFCFCFFFFFF60606764646760 FFFFEFEF0F0FEFCFFF3828E90909E948 FFFFFFFF3F3FFFFBFF0E06E62626E60A FFFFFFFFC0C0FEFFFF00007F40407E01 FFDF870100000000FF5F870100000000 0101010181E1FFFF0101010181E1FFFF E0E0E0E0E0E0FFFF2020202020203FFF FFF3F3F3F3F3FFFF9E92929292929EFF FFFFFCFCFFFFFFFF60676464676060FF CFEF0F0FEFEFFFFF48E80809E92939FF F3C3E3F3FB7FFFFFF24222128A46E6FF CFCFCFCFCFCFFFFF49494949494979FF FEFEFEFEFFFFFCF89292929293A3C4F8 7E3F0FCFFFFFFE7C423109C93101827C FCF0F0F0F0F0F0F09C909090909090F0 FFF3F3F3F3F3F3E19E929292929292E1 FFFFFCFCFFFFFFFF60676464676060FF CFEF0F0FEFEFEFFF48E80809E92929FF F3C3E3F3FB7F3F3FF24222128A46263F FFFEC0C0FFFFFFFF017E40407F0000FF 0000000024F4FAF60000000024D068F6 00000000000000000000000000000000 00181818100010000000000000000000 006C2400000000000000000000000000 00143E14287C28000000000000000000 00187E781E7E18000000000000000000 0072640810264E000000000000000000 001C24384E443A000000000000000000 00103000000000000000000000000000 00081010101008000000000000000000 00100808080810000000000000000000 000024183C1824000000000000000000 000018187E1818000000000000000000 00000000000810000000000000000000 000000007E0000000000000000000000 00000000001818000000000000000000 00040808101020000000000000000000 0018242C342418000000000000000000 0018280808083C000000000000000000 0018240408103C000000000000000000 00182408042418000000000000000000 001828283C0808000000000000000000 003C2038040438000000000000000000 001C2038242418000000000000000000 003C0408101010000000000000000000 00182418242418000000000000000000 0018241C042418000000000000000000 00000010001000000000000000000000 00000010001020000000000000000000 00000810201008000000000000000000 00003C00003C00000000000000000000 00001008040810000000000000000000 00182408100010000000000000000000 001C264A4E201C000000000000000000 001824243C2424000000000000000000 00382438242438000000000000000000 00182420202418000000000000000000 00382424242438000000000000000000 003C203820203C000000000000000000 003C2020382020000000000000000000 001C20202C2418000000000000000000 002424243C2424000000000000000000 001C080808081C000000000000000000 001E0404042418000000000000000000 00242830302824000000000000000000 0020202020201C000000000000000000 00243C3C3C2424000000000000000000 0024343C2C2424000000000000000000 00182424242418000000000000000000 00382438202020000000000000000000 001824242C241A000000000000000000 00382438302824000000000000000000 001C2018040438000000000000000000 007C1010101010000000000000000000 00242424242418000000000000000000 00242424243C18000000000000000000 002424243C3C24000000000000000000 00242418182424000000000000000000 00444428101010000000000000000000 003C040810203C000000000000000000 00181010101018000000000000000000 00201010080804000000000000000000 00180808080818000000000000000000 00182442000000000000000000000000 0000000000007E000000000000000000 #3:MAIN BG 00002020000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000004702480200000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 43024402450246020000000000000000 00000000000000004302440245024602 00000000000000000000000000000000 00004702480200000000000000000000 00000000000000000000000000004702 48020000000000000000000000000000 00000000000000000000000000000000 00005702580200000000000000000000 00000000000000000000000000000000 00000000000000006302640265026602 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000047024802740275027602 00000000000000000000000000000000 00000000000000000000000043024402 45024602000000000000000000000000 00000000000000000000000000000000 00000000000000000000470248020000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000570200000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000470248020000 00000000000000000000000000000000 47024802000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 57025802000000000000000000004302 44024502460200000000000000000000 43024402450246020000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00004302440245024602000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000004702480200000000 00000000000000000000000000000000 47024802000000000000000000000000 00000000000000004702480200000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 43024402450246020000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000043024402 45024602000043024402450246020000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000004702480200000000 00000000000000000000000000004702 48020000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000047024802 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000430244024502460200000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000430244024502 46020000000000000000470248020000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000470248020000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000 #4:BG PLACEHOLD 00001410A000A100A200A300A400A500 A600A700A800A900AA00AB00AC00AD00 AE00AF000000000000000000B000B100 B200B300B400B500B600B700B800B900 BA00BB00BC00BD00BE00BF0000000000 000000004E244F240000000000000000 00000000000000000000000000000000 0000000000000000000000005E245F24 00000000000000000000000000000000 00000000000000000000000000000000 000000006E246F240000000000000000 00000000000000000000000000000000 0000000000000000000000007E047F04 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000