' "Portal" in Applesoft BASIC ' by Vince Weaver (vince@deater.net) ' http://www.deater.net/weave/vmwprod/portal/ ' ' Variable Summary ' ' CX,CY = Chell X, Y OX,OY = Old Chell X,Y ' CD = Chell Direction OD = Old Direction ' VX,VY = Chell Velocity X/Y ' SX,SY = Cursor X,Y LX,LY = Old Cursor X,Y ' BO=Blue Portal Out BX,BY = Blue Portal X,Y ' GO=Orange Portal Out GX,GY = Orange Portal X,Y ' ZY,PY=Laser Y ZX,PX = Laser Begin/End ' T = TIME L = Current Level ' ' Title Screen ' 1 HOME:HGR:PRINT CHR$(4)+"BLOAD PORTAL_TITLE.HGR" ' ' Load Sound Library ' Violin sound, based on: https://gist.github.com/thelbane/9291cc81ed0d8e0266c8 5 DATA 172,1,3,173,0,3,133,250,174,0,3,228,250,208,3,173,48,192,202,208,246,173,48,192,136,240,7,198,250,208,233,76,5,3,96 6 FOR L=770 TO 804:READ V:POKE L,V:NEXT L ' ' Load Shape Table ' 8 POKE 232,0:POKE 233,29 9 PRINT CHR$(4)+"BLOAD OBJECTS.SHAPE,A$1D00" ' ' Wait a few seconds, or until keypressed ' 10 I=0:VTAB 24:PRINT "H FOR HELP" 11 IF PEEK(-16384)>=128 THEN GET A$:GOTO 13 12 I=I+1:IF I<500 GOTO 11 13 HGR ' 14 L=1 ' PRINT LEVEL INFO 15 TEXT:GOSUB 9000 ' Clear screen to black#2 16 HOME:HGR:SCALE=2:ROT=0:HCOLOR=4:HPLOT 0,0:CALL 62454 ' ' Initialize Variables ' 20 CX=21:CY=100:CD=0:VX=0:VY=0:SX=140:SY=80:BO=0:GO=0:T=0:ZY=42:ZX=0:PX=0:PY=0 ' ' Draw Level Background ' 21 GOSUB 1000 ' ' Draw Initial Chell and Gun Cursor ' 22 SCALE=2:XDRAW 1 AT SX,SY 25 SCALE=1:XDRAW 3 AT CX,CY ' 30 REM MAIN LOOP ' ' Time related activities 32 T=T+1:IF T>100 THEN T=0:GOSUB 8000 ' 35 OX=CX:OY=CY:OD=CD:LX=SX:LY=SY ' ' Check keyboard ' 37 IF PEEK(-16384)<128 THEN GOTO 100 40 GET A$ 42 IF A$="I" AND SY>4 THEN SY=SY-4 44 IF A$="J" AND SX>4 THEN SX=SX-4 46 IF A$="K" AND SX<275 THEN SX=SX+4 48 IF A$="M" AND SY<150 THEN SY=SY+4 50 IF A$="D" AND VX<0 THEN VX=0:CD=0:GOTO 52 51 IF A$="D" THEN VX=8:CD=0 52 IF A$="A" AND VX>0 THEN VX=0:CD=1:GOTO 54 53 IF A$="A" THEN VX=-8:CD=1 54 IF A$="Q" THEN GOTO 800 56 IF A$=" " THEN VY=5:POKE 768,240:POKE 769,10:CALL 770 58 IF A$="H" THEN GOSUB 5000 60 IF A$="," THEN GOSUB 6000 62 IF A$="." THEN GOSUB 6100 ' ' PHYSICS ENGINE ' 100 CY=CY-VY 105 VY=VY-4.5 ' Move X. Ensure we are always odd so colors are right 107 IF VX<2 AND VX>-2 THEN VX=0 110 CX=CX+VX ' ' COLLISION DETECTION ' ' Portals 200 IF BO=0 OR GO=0 GOTO 210 202 IF CX>BX-5 AND CXBY-12 THEN CX=GX+5*VX:CY=GY:POKE 768,180:POKE 769,40:CALL 770 204 IF CX>GX-5 AND CXGY-12 THEN CX=BX+5*VX:CY=BY:POKE 768,180:POKE 769,40:CALL 770 ' Edges 210 IF CX<7 THEN CX=7:VX=0 212 IF CX>271 THEN CX=271:VX=0 214 IF CY<7 THEN CY=7:VY=-VY ' Floors 220 IF CX < 119 AND CY > 112 THEN CY=112:VY=0:VX=VX/2 225 IF CX > 161 AND CY > 112 THEN CY=112:VY=0:VX=VX/2 230 IF CX > 119 AND CX < 161 AND CY>140 THEN GOTO 800 ' LASER ' 232 IF ZY>CY-8 AND ZYZX AND CX-6<240 THEN GOTO 700 234 IF PY>CY-8 AND PY0 AND CX-6CX THEN M=ZX 720 FOR I=240 TO M STEP -6:HPLOT I,ZY TO I+3,ZY:X=PEEK(-16336):NEXT I 730 FOR I=PX TO CX STEP -6:HPLOT I,PY TO I+3,PY:X=PEEK(-16336):NEXT I ' 800 REM DEAD 805 VTAB 22:PRINT "YOU DIED!":PRINT "TRY AGAIN? (Y/N) "; 810 GET A$ 815 IF A$="Y" THEN GOTO 15 820 IF A$="N" THEN GOTO 999 830 GOTO 810 ' 999 END 1000 REM LEVEL 1 ' FLOOR 1005 HCOLOR=3 1010 HPLOT 0,120 TO 112,120 TO 112,159 TO 168,159 TO 168,120 TO 279,120 ' "WATER" 1015 HCOLOR=1 1020 FOR I=113 TO 167:HPLOT I,130 TO I,158:NEXT I ' PLATFORM 1030 HCOLOR=2:FOR I=230 TO 279:HPLOT I,50 TO I,56:NEXT I ' SENTRY 1035 HCOLOR=3:HPLOT 242,40 TO 242,46:HPLOT 243,40 TO 243,46:HPLOT 247,40 TO 247,46:HPLOT 248,40 TO 248,46 1037 HPLOT 243,39 TO 247,39:HPLOT 242,46 TO 248,46 1038 HPLOT 240,47 TO 241,47:HPLOT 239,48 TO 240,48:HPLOT 239,49 TO 240,49 1039 HPLOT 249,47 TO 250,47:HPLOT 250,48 TO 251,48:HPLOT 250,49 TO 251,49 1040 HCOLOR=5:HPLOT 244,41 TO 245,41:HPLOT 244,43 TO 245,43 ' LASER 1042 HPLOT ZX,ZY TO 240,ZY ' ' COMPANION CUBE ' 0123456789012 '0 #### ### #### '1 ### ### '2 ## ## '3 ## ## '4 ## ##### ## '5 ## ##### ## '6 ### '7 ## # # '8 ### ### '9 #### ### #### 1050 HCOLOR=3:X=261:Y=39 1052 HPLOT X,Y TO X+3,Y :HPLOT X+5,Y TO X+7,Y:HPLOT X+9,Y TO X+12,Y 1054 HPLOT X,Y+1 TO X+2,Y+1: HPLOT X+10,Y+1 TO X+12,Y+1 1056 HPLOT X,Y+2 TO X+1,Y+2: HPLOT X+11,Y+2 TO X+12,Y+2 1058 HPLOT X,Y+4 TO X+1,Y+4: HPLOT X+11,Y+4 TO X+12,Y+4 1060 HPLOT X,Y+5 TO X+1,Y+5: HPLOT X+11,Y+5 TO X+12,Y+5 1062 HPLOT X,Y+7 TO X+1,Y+7: HPLOT X+11,Y+7 TO X+12,Y+7 1064 HPLOT X,Y+8 TO X+2,Y+8: HPLOT X+10,Y+8 TO X+12,Y+8 1066 HPLOT X,Y+9 TO X+3,Y+9:HPLOT X+5,Y+9 TO X+7,Y+9:HPLOT X+9,Y+9 TO X+12,Y+9 1068 HPLOT X+4,Y+3 TO X+5,Y+3:HPLOT X+7,Y+3 TO X+8,Y+3 1070 HPLOT X+4,Y+4 TO X+8,Y+4 1072 HPLOT X+4,Y+5 TO X+8,Y+5 1074 HPLOT X+5,Y+6 TO X+7,Y+6 1076 HPLOT X+6,Y+7 1099 RETURN ' HELP 5000 REM HELP 5010 TEXT:HOME 5020 PRINT " **** HELP ****" 5025 PRINT 5030 PRINT " CHELL PORTAL GUN" 5035 PRINT " ~~~~~~~~~~~~~ ~~~~~~~~~~~~~" 5040 PRINT " A = MOVE LEFT I = UP" 5050 PRINT " D = MOVE RIGHT J = LEFT" 5060 PRINT " SPACE = JUMP K = RIGHT" 5070 PRINT " M = DOWN" 5080 PRINT " , = SHOOT BLUE" 5090 PRINT " Q = QUIT . = SHOOT ORANGE" 5100 PRINT:GET A$ ' return to hires 5110 POKE -16304,0 5120 RETURN ' DRAW BLUE PORTAL 6000 REM DRAW BLUE 6002 POKE 768,143:POKE 769,40:CALL 770 ' Erase old 6004 SCALE=2 6005 IF BO=1 THEN XDRAW 2 AT BX,BY 6010 BX=SX:BY=SY 6020 BO=1:XDRAW 2 AT BX,BY 6025 IF BO=1 AND GO=1 THEN GOTO 7000 6030 RETURN ' DRAW ORANGE PORTAL 6100 REM DRAW ORANGE 6102 POKE 768,72:POKE 769,40:CALL 770 ' Erase old 6104 SCALE=2 6105 IF GO=1 THEN XDRAW 2 AT GX,GY 6110 GX=SX+1:GY=SY 6120 GO=1:XDRAW 2 AT GX,GY 6125 IF BO=1 AND GO=1 THEN GOTO 7000 6130 RETURN ' ' Handle Laser/Portal Interaction 7000 REM ' ERASE OLD 7010 HCOLOR=4:HPLOT ZX,ZY TO 240,ZY:HPLOT PX,PY TO 0,PY ' Check if hitting Blue 7010 IF (ZY>BY-7 AND ZYGY-7 AND ZY | *" 9066 PRINT"* *" 9068 PRINT"************************" 9090 POKE 32,0 9091 FOR I=1 TO 2500:NEXT I 9099 RETURN ' ' BUGS: ' Shouldn't be able to create portals underground ' Artifacts when deleting portals ' ' TODO: ' ' Opening: ' General: ' Parametric Levels (Generic Game Engine) ' ' Level 1/19: ' Walking animation? ' Sentries shoot/laser through portal ' Walk on platform ' Sentries can be knocked over from behind ' Sentries an object that can go through portal ' Objects can be picked up with gun? ' Chell changes color (turns into Mel) going through O->B portal? ' ' End level: ' GLADOS ' Have GLADOS talk? ' Objects through portal ' Incinerator ' Die if go into incinerator ' Call out to Still Alive '