The Snake Temple by RAX
About
10 Line BASIC
=============
Category : PUR-80
TITLE : The Snake Temple
PLATFORM : Oric Atmos
LANGUAGE : BASIC 1.1b
AUTHOR : RAX
Code:
---------1---------2---------3---------4---------5---------6---------7-------- 0D$="$$b$$b$$b,bGb#%###3###+7+7Ea?#1>aS1$a#Ab#Vbb##/#AP/5V":A=#B507:INK6''' 1FORI=1TOLEN(D$):K=ASC(MID$(D$,I,1))-35:POKEA+I,K:NEXT:DEFFNR(X)=INT(RND(1)*X) 2DIMD(999):O=37:B=161:FORI=0TO36:D(I)=B:D(I+888)=B+1:T=INT(I*.65)*O:D(T)=B'''' 3D(T+36)=B:NEXT:PAPER0:H=8:FORY=2TO23STEP2:FORX=2TO34STEP2:D(X+Y*O)=B:R=FNR(5) 4D=(R=0)-(R=1)+O*(R=2)-O*(R=3):D(X+Y*O+D)=B:NEXTX,Y:FORI=0TO924:T=D(I):?".";'' 5IFT=BANDD(I+O)=0THENT=162ELSEIFT=0THENT=FNR(3)+35ELSE:D(I)=T:NEXT:Y=FNR(22)+2 6D(O+1+FNR(35)+FNR(20)*O)=38:X=FNR(35)+2:CLS:REPEAT:GETK$:Q=X:W=Y:K=ASC(K$)''' 7Y=Y+(K=11)-(K=10):X=X+(K=8)-(K=9):IFD(X+Y*O)>99THENX=Q:Y=WELSE:B=X+Y*O:Z=D(B) 8H=H-2*(Z=36)+(FNR(3)+2)*(Z=O):FORG=-1TO1:FORL=-1TO1:PLOT2+X+L,Y+G,D(B+L+G*O)' 9NEXTL,G:D(B)=35:PLOTX+2,Y,39:?@2,25;"HP:"H:UNTILZ=38ORH<1:ZAP:IFH>0THEN?"WIN"RUN
STORY:
You are a young hero named Bocco who has set out in search of treasure in the Temple of the Snakes.
Among the labyrinth of tunnels is a treasure chest that you must find. The temple is full of snakes
so be careful!. A snake inflicts damage on 1 to 4 health points. Each flask you find restores 2 health points.
Use the arrow keys to control Bocco. Have fun :)
CODE EXPLANATION:
----------------------------------------
0D$="$$b$$b$$b,bGb#%###3###+7+7Ea?#1>aS1$a#Ab#Vbb##/#AP/5V":A=#B507:INK6'''
D$="$$b$$b$$b,bGb#%###3###+7+7Ea?#1>aS1$a#Ab#Vbb##/#AP/5V" - characters data
A=#B507 - the start address of characters to be modified
INK6 - set chars color cyan
----------------------------------------
1FORI=1TOLEN(D$):K=ASC(MID$(D$,I,1))-35:POKEA+I,K:NEXT:DEFFNR(X)=INT(RND(1)*X)
FORI=1TOLEN(D$) - change characters
K=ASC(MID$(D$,I,1))-35 - gat data from D$
POKEA+I,K - change line of character
NEXT
DEFFNR(X)=INT(RND(1)*X) - define custon function R to generate random number
----------------------------------------
2DIMD(999):O=37:B=161:FORI=0TO36:D(I)=B:D(I+888)=B+1:T=INT(I*.65)*O:D(T)=B''''
DIMD(999) - maze array
O=37 - maze width
B=161 - brick character (33) with set bit 7 for invers colors
FORI=0TO36 - create maze borders
D(I)=B - set top border
D(I+888)=B+1 - set bottom border
T=INT(I*.65)*O - calc left vertical border
D(T)=B - set left border
----------------------------------------
3D(T+36)=B:NEXT:PAPER0:H=8:FORY=2TO23STEP2:FORX=2TO34STEP2:D(X+Y*O)=B:R=FNR(5)
D(T+36)=B - set right border
NEXT
PAPER0 - set background color to black
H=8
FORY=2TO23STEP2 - generate maze
FORX=2TO34STEP2
D(X+Y*O)=B - set brick
R=FNR(5) - get random number bettwen 0-4
----------------------------------------
4D=(R=0)-(R=1)+O*(R=2)-O*(R=3):D(X+Y*O+D)=B:NEXTX,Y:FORI=0TO924:T=D(I):?".";''
D=(R=0)-(R=1)+O*(R=2)-O*(R=3) - get direction to set next random brick
D(X+Y*O+D)=B - set random brick
NEXTX,Y
FORI=0TO924 - replaces the standard brick in the maze with another one for a more fancy look :), and set flask and snakes
T=D(I) - get currnet char in position
?"." - print "." into the screen to see some processing is performed
----------------------------------------
5IFT=BANDD(I+O)=0THENT=162ELSEIFT=0THENT=FNR(3)+35ELSE:D(I)=T:NEXT:Y=FNR(22)+2
IF T=B AND D(I+O)=0 THEN - if there is a brick in the current position and there is an empty space under it, then
T=162 - set new brick in T
ELSE
IF T=0 THEN - if is only empty block then
T=FNR(3)+35 - set in T random char bettwen (35-37) (ground, flask, snake)
ELSE
: - nothing
D(I)=T - set the modified value in the maze
NEXT
Y=FNR(22)+2 - get random Y position for player
----------------------------------------
6D(O+1+FNR(35)+FNR(20)*O)=38:X=FNR(35)+2:CLS:REPEAT:GETK$:Q=X:W=Y:K=ASC(K$)'''
D(O+1+FNR(35)+FNR(20)*O)=38 - set chest into a maze (char 38)
X=FNR(35)+2 - get random X position for player
CLS - clear screen
REPEAT - game loop
GET K$ - get key into k$
Q=X - old X position
W=Y - old Y position
K=ASC(K$) - get ascii number for pressed key
----------------------------------------
7Y=Y+(K=11)-(K=10):X=X+(K=8)-(K=9):IFD(X+Y*O)>99THENX=Q:Y=WELSE:B=X+Y*O:Z=D(B)
Y=Y+(K=11)-(K=10) - calc new Y position
X=X+(K=8)-(K=9) - calc new X position
IFD(X+Y*O)>99 THEN - if there is a brick in the new position then
X=Q - return the old position into X
Y=W - return the old position into Y
ELSE
: - nothing
B=X+Y*O - calc new player position into maze array
Z=D(B) - takes the chars that is in the current player position
----------------------------------------
8H=H-2*(Z=36)+(FNR(4)+1)*(Z=O):FORG=-1TO1:FORL=-1TO1:PLOT2+X+L,Y+G,D(B+L+G*O)'
H=H-2*(Z=36)+(FNR(4)+1)*(Z=O) - calc player health whit char in playr position
( if it is a flack then add 2 or if a snake then reduced health by 1 to 4 )
FORG=-1TO1 - print player area loop 3х3
FORL=-1TO1
PLOT2+X+L,Y+G,D(B+L+G*O) - print current maze char
----------------------------------------
9NEXTL,G:D(B)=35:PLOTX+2,Y,39:?@2,25;"HP:"H:UNTILZ=38ORH<1:ZAP:IFH>0THEN?"WIN"
NEXTL,G
D(B)=35 - set ground charate into maze (removes snakes and flasks when the player passes them )
PLOTX+2,Y,39 - print player
?@2,25;"HP:"H - print player health on the screen
UNTIL Z=38 OR H<1 - do game loop while Z=38 (take chest) or H<1 (the player has no health)
ZAP - little sound effect
IF H>0 THEN - if the player is healthy then
?"WIN" - print "WIN"