[Type_ins] The Valley of adventure: Poster Programs 1

Any discussions related to the creation of new hardware or software for the ZX80 or ZX81
User avatar
XavSnap
Posts: 1941
Joined: Sat May 10, 2008 4:23 pm
Location: 'Zx81 France' Fb group.

Re: A 15.999K Adventure game: The Valley of adventure.

Post by XavSnap »

Something's wrong in 2000:

Code: Select all

   2000 LET H=W
H=1 >> Constant value.
Seem to be "M"

Code: Select all

   2000 LET M=W

Edit:

Code: Select all

  4160 LET G=INT((((MS*75*RND)-(10*CS)-E)/100)*Z)
Attachments
valley2.JPG
valley2.JPG (10.08 KiB) Viewed 1462 times
valley1.JPG
Last edited by XavSnap on Thu Dec 22, 2022 9:06 am, edited 2 times in total.
Xavier ...on the Facebook groupe : "Zx81 France"(fr)
User avatar
XavSnap
Posts: 1941
Joined: Sat May 10, 2008 4:23 pm
Location: 'Zx81 France' Fb group.

Re: A 15.999K Adventure game: The Valley of adventure.

Post by XavSnap »

Code: Select all

 4710 IF S=K+H OR S=B+B THEN LET H=HW

Code: Select all

  5405 IF Q=CODE"X" THEN LET H=HW
Xavier ...on the Facebook groupe : "Zx81 France"(fr)
User avatar
XavSnap
Posts: 1941
Joined: Sat May 10, 2008 4:23 pm
Location: 'Zx81 France' Fb group.

Re: A 15.999K Adventure game: The Valley of adventure.

Post by XavSnap »

Run 8000 to start, Goto 10 to continue...
Steal awfully buggy... and horrible to fix!

Code: Select all

# *** THE VALLEY OF ADVENTURE ***
# *******************************
#  (C) ZX81 POSTER PROGRAM
#      ZX81 + 16K RAMPAK.
#
#        TYPED BY XAVSNAP
#            AND YOU.
# 
#
# ERRORS : 
#          LINE 2   : OFFSET DECAY.
#                     (23 REPEATED TWICE)=>ORIGINAL 
#          LINE 5   : OK (END OF LINE=BUFFER)
#          LINE 490 : S$=??? => INIT TO " " 
#
#
# RESERVED REM 36 BYTES.
#1 REM XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     1  REM [HEX:\
0E,06,2A,0C,40,06,20,23,\
71,10,FC,23,23,11,1F,00,\
06,0D,71,19,71,23,23,10,\
F9,11,DF,FF,19,06,1E,23,\
71,10,FC,C9 ]
#
#
# RESERVED REM 41 BYTES.(REAL LENGHT 41 <>42)
#2 REM XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     2  REM [HEX:\
3E,80,2A,0C,40,23,06,16,\
23,77,10,FC,06,0C,11,0C,\
00,ED,5A,77,11,15,00,ED,\
5A,77,10,F2,11,0C,00,ED,\
5A,06,16,77,23,10,FC,C9,\
3D ]
#
#
# RESERVED REM 240 BYTES. (<>239)
#3 REM XXXXXXXXXXXXXXXXXXXXXXXXXXXIT MISSESXXXXXXXXXXXXYOU AVOID THE BLOWXXXXXXXXXXXXIT HESITATESXXXXXXXXXXXXIT STRIKES YOUR HEADXXXXXXXXXXXXXXXXYOUR CHEST IS STRUCKXXXXXXXXXXXXXXXXYOUR ARM IS HITXXXXXXXXXXXXA BODY BLOWXXXXXXXXYOUR LEG IS HITXXXXX
     3  REM [HEX:\
E1,7E,23,E5,FE,FF,C8,D7,\
18,F6,06,0A,3A,34,40,90,\
30,FD,80,3C,FE,01,20,11,\
CD,DB,40,2E,39,00,32,2E,\
38,38,2A,38,FF,01,00,00,\
C9,FE,02,20,1A,CD,DB,40,\
3E,34,3A,00,26,3B,34,2E,\
29,00,39,2D,2A,00,27,31,\
34,3C,FF,01,00,00,C9,FE,\
03,20,14,CD,DB,40,2E,39,\
00,2D,2A,38,2E,39,26,39,\
2A,38,FF,01,00,00,C9,FE,\
04,20,1C,CD,DB,40,2E,39,\
00,38,39,37,2E,30,2A,38,\
00,3E,34,3A,37,00,2D,2A,\
26,29,FF,01,03,00,C9,FE,\
05,28,04,FE,06,20,1C,CD,\
DB,40,3E,34,3A,37,00,28,\
2D,2A,38,39,00,2E,38,00,\
38,39,37,3A,28,30,FF,01,\
02,00,C9,FE,07,28,04,FE,\
08,20,17,CD,DB,40,3E,34,\
3A,37,00,26,37,32,00,2E,\
38,00,2D,2E,39,FF,01,01,\
00,C9,FE,09,20,13,CD,DB,\
40,26,00,27,34,29,3E,00,\
27,31,34,3C,FF,01,02,00,\
C9,CD,DB,40,3E,34,3A,37,\
00,31,2A,2C,00,2E,38,00,\
2D,2E,39,FF,01,01,00,C9,\
 ]
#
#
# RESERVED REM 98 BYTES (<>103)
#4 REM XXXXXXXXXXXGOLD =XXXXXXXCOMBAT STR=      SKILL=XXXXXXXPSI.POWER =      TURNS=XXXXXXXSTAMINA   =XXX
     4  REM [HEX:\
06,09,3E,00,D7,10,FD,C9,\
CD,DB,40,2C,34,31,29,00,\
14,FF,CD,D1,41,CD,DB,40,\
28,34,32,27,26,39,00,38,\
39,37,14,00,00,00,00,00,\
00,38,30,2E,31,31,14,FF,\
CD,D1,41,CD,DB,40,35,38,\
2E,1B,35,34,3C,2A,37,00,\
14,00,00,00,00,00,00,39,\
3A,37,33,38,14,FF,CD,D1,\
41,CD,DB,40,38,39,26,32,\
2E,33,26,00,00,00,14,FF,\
C9,00 ]
#
#
# RESERVED REM 109 BYTES
#5 REM XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     5  REM [HEX:\
01,01,01,05,07,05,01,02,\
08,05,04,03,03,06,02,03,\
01,01,05,04,07,08,01,3A,\
34,40,90,30,FD,80,3C,C9,\
06,64,CD,50,42,06,32,90,\
38,04,06,11,18,02,06,09,\
CD,50,42,4F,FE,0F,28,07,\
FE,10,28,0E,06,00,C9,3A,\
4F,42,06,04,90,38,D9,06,\
00,C9,06,64,CD,50,42,06,\
32,90,38,CC,06,00,C9,CD,\
78,42,21,38,42,09,7D,BB,\
C8,15,28,ED,23,18,F7 ]
#
#
#
# XAVSNAP --->

    10 LET V=PEEK 16396+256*PEEK 16397
    20 PRINT"CONTINUE ? y/n"
    30 GOSUB 600
    40 IF G$="Y" THEN GOTO 240
    50 LET EX=K+H
    60 DIM T(B)
    70 LET TS=O
    75 LET TN=O
    80 LET TM=B 
    85 LET CF=O
   115 LET G(H)=O
   116 LET S(H)=O
   120 PRINT ,,"HOW DARES THE VALLEY?"
   123 INPUT J$
   126 CLS
   130 PRINT "CHARACTER TYPE",,,,"WIZARD...(1)",,"THINKER..(2)",,"BARBARIAN(3)","KEY 1-5","WARRIOR..(4)",,"CLERIC...(5)",,,,"        CHOOSE CAREFULLY"
   140 GOSUB 600
   150 IF G$<"1" OR G$>"5" THEN GOTO 140
   155 LET A=VAL(G$)
   160 GOSUB 160+A*10
   162 PRINT AT H+A,CODE"@0A";CHR$ (A+CODE "@9C")
   165 GOTO 230

   168 PRINT "MAY THY GOD PROTECT THREE...."
#
   170 LET P$="WIZARD"
   174 LET P1=H1
   175 LET PS=CODE"0"
   176 LET C1=H/H1
   178 LET CS=R+H 
   179 RETURN
#
   180 LET P$="THINKER"
   184 LET P1=B/H1
   185 LET C1=B/K
   186 LET CS=R+B
   188 LET PS=CODE","
   189 RETURN
#
   190 LET P$="BARBARIAN"
   194 LET P1=H/H1
   195 LET C1=H1
   196 LET CS=CODE"0"
   198 LET PS=R+H
   199 RETURN
#
   200 LET P$="WARRIOR"
   204 LET P1=H
   205 LET C1=H+H/K
   206 LET CS=CODE","
   208 LET PS=R+B
   209 RETURN
#
   210 LET P$="CLERIC"
   214 LET C1=H
   215 LET CS=R-H
   216 LET P1=H+H/K
   218 LET PS=CS
   219 RETURN
#
   220 LET P$="DOLT"
   224 LET P1=H
   225 LET C1=H
   226 LET CS=R-H
   228 LET PS=CS
   229 RETURN
   
#
   235 LET C=CODE"’"
   236 LET RX=77-INT(H1*P1**2.5)
   237 LET RY=INT(42*(P1*H)**LN(P1**3.7))+75
   238 LET RZ=125-INT(INT(P1)*12.5)
   250 POKE 16418,0
   275 GOSUB 5000
   285 GOSUB 380
   290 GOTO 2000
   300 LET TV=O
   303 LET G$=""
   305 FOR I=H TO R*H1
   310 IF INKEY$="" THEN GOTO 330
   315 LET G$=INKEY$
   320 GOTO 350
   330 NEXT I
   340 LET TV=H
   350 GOSUB 490
   355 RETURN
   360 FOR I=H TO K+K
   365 NEXT I
   370 RETURN
   380 PRINT AT R-K-H,O;
   385 LET PZ=USR 16857
   390 IF CS>RX THEN LET CS=RX
   395 IF PS<K+B THEN LET PS=K+B
   400 IF PS>RY THEN LET PS=RY
   410 IF C>RZ THEN LET C=RZ
   420 PRINT AT R-B-K,B+B;J$;",THE ";P$
   425 IF T(H)=H THEN PRINT "AMULET+";T(2)
   430 PRINT AT R-K-H,O;TAB B+B;TS,TAB(R+B);CS;" ",TAB B+B;EX,TAB R+B;PS;" ",TAB B+B;TN,TAB R+B;C;" ";
   460 IF CF=H THEN GOTO 480
   465 PRINT AT R-H,O;S$
   475 GOTO 490
   480 PRINT AT R-H,O;K$;" STR.=";MS;";";N;" "
   490 PRINT AT R,O;S$
   495 PRINT AT R,O;
   499 RETURN
   500 IF T(H1)<>B+B THEN GOTO 520
   505 PRINT AT R,O;"THE AMULET PROTECTS YOU"
   510 GOTO 60
   520 GOSUB 550
   525 GOSUB 490
   530 LET G$="«go«meet«your«god«–"
   533 LET F$=G$(H)
   535 LET D$=G$(H1 TO )
   536 LET G$=D$+F$
   537 PRINT AT R,K;G$
   540 GOTO 533
   550 LET RX=INT(.067*(EX+TS/B)**(H/H1)+LN(EX/((TN+H)**(B/H1)))) 
   560 PRINT AT R-H,O;S$;AT R-H,K;"your«rating«is ";XR
   570 RETURN
   600 LET G$=INKEY$


   605 IF G$="" THEN GOTO 600
   610 RETURN
   650 PRINT AT R,O;"SAFE CASTLE:QUIT(Y/N)"
   660 IF CS<R+H1 THEN LET CS=R+H1
   670 POKE M+V,PK
   680 LET PK=PEEK (W+V)
   690 LET M=W
   700 POKE M+V,QX
   710 GOSUB 550
   720 GOSUB 600
   730 IF G$="Y" THEN GOTO 780
   740 LET C=CODE"’"
   750 PRINT AT R,O;"REFRESHED AND READY  "
   760 GOSUB 390
   770 GOTO 2020
   780 CLS
   782 PRINT "SAVE GAME TO SAVE CHARACTER",,,,"GOTO 10 TO PLAY AGAIN"
   788 STOP
   800 GOSUB 490
   805 PRINT "SPELL NO.˜ OR ™"
   810 GOSUB 300
   815 IF TV=H THEN GOTO 3600
   820 IF CODE G$>CODE "2" THEN GOTO 880
   825 GOSUB 900+(80 AND G$="2")
   830 GOSUB 390
   833 IF C<=O THEN GOTO 3660
   835 GOTO 830+(10*F)
   840 GOTO 2020
   850 GOTO 3830   
#
#
   860 GOTO 3575
   870 PRINT"IT IS BEYOND YOUR POWER"
   875 GOTO 3830
   880 PRINT"NO SUCH SPELL"
   882 GOTO 3830
   890 PRINT"THE SPELL FAILS"
   895 GOTO 3830
#
   900 GOTO 928
   902 PRINT"SLEEP YE BEAST"
   906 IF RND>H/H1 THEN GOTO 918
   907 GOSUB 430
   908 PRINT"IT COLLAPSES"
   910 LET EX=INT(EX+U/H1)
   912 LET CF= O
   914 LET F=H
   916 RETURN
   918 LET F=B+B
   920 RETURN
   922 IF C<=21 THEN GOTO 966
   924 LET C=C-(R+B)
   926 GOTO 982
   928 IF C<=6 THEN GOTO 966
   930 LET C=C-K-H
   932 GOTO 902
   940 PRINT"MISSED IT.."
   942 GOTO 3830
   950 IF MS<=O THEN LET MS=O
   952 IF N<=O THEN LET N=O
   954 GOSUB 410
   956 GOTO 991
   966 LET F=K
   968 RETURN
   970 LET F=H1
   972 RETURN
   980 IF PS<55 OR EX<2000 THEN GOTO 966
   981 GOTO 922
   982 PRINT"BURN YE DAMNED BEAST...."
   983 IF RND<H/B THEN GOTO 918
   984 LET D=INT((CS+PS*RND)-(10*N*RND))
   985 IF D<=O THEN GOTO 982
   986 IF MS=O THEN LET N=N-D
   987 IF MS=O THEN GOTO 990
   988 LET MS=MS-D
   989 IF D>10 THEN LET N=INT(N-(D/B))
   990 GOTO 950
   991 PRINT"YOU INFLICT ";D;" DAMAGE"
   992 IF MS+N>O THEN GOTO 970
   993 GOSUB 410
   994 PRINT"IT EXPIRES IN FLAMES"
   995 LET EX=EX+U
   996 LET CF=O
   997 GOTO 914
#
   1000 LET F=INT(H+RND*6)
   1005 IF F=H1 OR F=K THEN LET F=F+H
   1010 GOSUB 1020+(20*F)
   1025 GOSUB 390
   1030 GOTO 2020
   1040 PRINT"CIRCLE OF EVIL"
   1045 LET CS=CS+INT((FL+H)/H1)
   1050 LET PS=PS-INT((FL+H)/H1)
   1055 LET C=C-R+B
   1060 IF C<=O THEN GOTO 500
   1070 RETURN
   1080 PRINT"A HORD OF GOLD"
   1090 LET TS=TS+INT(FL*RND*100+100)
#
   1100 RETURN
   1120 PRINT"A MAGICAL AREA"
   1125 GOTO 1150
   1140 PRINT"AN ANCIENT POWER AREA"
   1150 LET PS=PS+H+H+INT(FL*P1)
   1160 LET CS=CS+H+INT(FL*C1)
   1170 LET C=C+R
   1180 RETURN
#
   1505 POKE M+V,O
   1506 LET M=W
   1507 LET PK=0
   1508 POKE M+V,52
   1510 LET RN=RND
   1520 GOSUB 490
   1535 IF S=B+B AND RN>.95 AND T(H1)=S AND T(B)=O THEN GOTO 1580 
   1545 IF S=K+H AND RN>.85 AND T(H)=O THEN GOTO 1590
   1550 IF S=K AND RN>.7 AND T(H)=H AND T(H1)<B+B AND FL>T(H1) THEN GOTO 1600
   1555 IF RN>.43 THEN PRINT "A WORTHLESS STONE"
   1560 IF RN>.43 THEN GOTO 1650
   1570 PRINT"A PRECIOUS STONE";
   1575 GOTO 1630
   1580 LET T(B)=H
   1583 PRINT"the«helm«of«evanna"
   1585 GOTO 1630
   1590 LET T(H)=H
   1593 PRINT"AMULET OF ALARIAN."
   1595 GOTO 1630
#
   1600 PRINT"AN AMULET STONE";
   1610 IF RN>.85 THEN PRINT" WRONG ONE"
   1615 IF RN>.85 THEN GOTO 1640
   1620 PRINT" IT FITS."
   1625 LET T(H1)=T(H1)-H
   1630 LET TS=TS+100*(T(H)+T(H1)+T(B)+FL)
   1660 GOTO 2370
#
   2000 LET M=W
   2010 LET PK=PEEK(W+V)
   2015 POKE M+V,CODE"O"
   2020 LET C=C+K+B+B
   2024 GOSUB 490
   2025 IF PK=CODE"." THEN GOTO 2040
   2030 PRINT"WHICH DIRECTION ?"
   2035 GOTO 2050
   2040 PRINT"ON THE PATH: WHICH WAY ?"
   2050 GOSUB 600
   2055 IF G$<"1" OR G$>"9" THEN GOTO 2050
   2060 LET A=VAL G$
   ##2065 IF A=O THEN GOTO 2050
   2070 IF A>B THEN LET A=A-B
   2075 IF A>B THEN GOTO 2070
   2080 LET W=M+A-H1-33*(INT((VAL(G$)-H)/B)-H)
   2090 LET TN=TN+H
   2095 GOSUB 490
# 
   2100 LET QX=CODE"O"
   2110 LET Q=PEEK(W+V)
   2120 IF Q=O OR Q=K+K+H THEN GOTO 2250
   2130 IF Q=CODE"" THEN GOTO 650
   2135 IF S>B AND Q=CODE"«" THEN LET Q=B+B
   2140 IF Q=B+B OR Q=K+K OR Q=CODE"T" THEN LET TN=TN-H
   2145 IF Q=B+B OR Q=K+K OR Q=CODE"T" THEN GOTO 2030
   2150 IF Q=CODE"W" OR Q=CODE"t" OR Q=CODE"S" OR Q=CODE"H" THEN GOTO 4500
   2160 IF Q=CODE"X" OR Q=CODE"«" THEN GOTO 4600
   2180 IF Q=R-B THEN GOTO 6000
   2185 IF Q=CODE"«" OR (G$="5" AND PK=CODE"«") THEN LET QX=CODE"g"
   2190 IF Q=CODE"«" OR (G$="5" AND PK=CODE"«") THEN LET C=C-R+B
#
   2200 IF C<=O THEN GOTO 500
   2260 POKE M+V,PK
   2265 LET PK=PEEK(W+V)
   2270 LET M=W
   2280 POKE M+V,QX
   2295 IF PK=CODE"." THEN GOTO 2350
#
   2300 LET F=RND
   2305 GOSUB 490
   2310 IF F<H/(H+K) THEN GOTO 3000
   2320 IF F>B+K THEN GOTO 1000
#
  2350 PRINT"THERES NOTHING HERE"
  2370 GOSUB 410
  2380 GOTO 2020
  3000 PRINT "BEWARE......."
  3010 LET CF=H
  3020 IF Q=CODE"«" OR PK=CODE"«" THEN GOTO 3050
  3030 POKE 16975,FL
  3040 LET F=USR 16985
  3045 GOTO 3051
  3050 LET F=INT(R-K-H+RND*H1)
  3051 LET CX=H
  3052 FOR I=H TO F-H
  3053 LET CX=CX+CODE M$(CX)
  3054 NEXT I
  3110 LET K$=M$(CX+K TO CX+CODE M$(CX)-H) 
  3115 LET MS=CODE M$(CX+H)
  3120 IF MS=0 THEN GOTO 3140
  3130 LET MS=INT((CS/B)+MS*FL**.2/(RND+H))
  3140 LET N=CODE M$(CX+H1)
  3145 IF N=0 THEN GOTO 3160
  3150 LET N=INT(N*FL**.2/(RND+H))
  3160 LET U=INT((F+H)*(FL**(B/H1)))
  3180 PRINT AT R,O;"AN EVIL ";K$
  3190 LET E=39*LN(EX)/3.14
  3195 GOSUB 480
  3500 IF RND>.6 THEN GOTO 4000
  3510 PRINT "aTTACK/rETREAT ?"
  3520 GOSUB 300
  3530 IF G$="R" THEN GOTO 3900
  3540 IF TV=H THEN GOTO 3600
  3550 IF G$<>"A" THEN GOTO 4000
  3570 GOSUB 490
  3575 PRINT AT R,K+B;"*STRIKE QUICKLY*"
  3580 GOSUB 300
  3590 IF TV=O THEN GOTO 3620
  3600 PRINT"TOO SLOW....TOO SLOW.."
  3610 LET HF=O
  3615 GOTO 3830
  3620 IF G$="S" THEN GOTO 800
  3640 IF MS=O THEN PRINT "YOUR SWORD IS USELESS"
  3645 IF MS=O THEN GOTO 3830
  3650 LET C=C-H
  3660 IF C<=O THEN PRINT "YOU ARE EXHAUSTED"
  3665 IF C<=O THEN GOTO 500
  3670 LET F=RND*10
  3675 LET Z=O
  3680 IF G$="H" AND (F<5 OR CS>MS*K) THEN LET Z=H1
  3690 IF G$="B" AND (F<7 OR CS>MS*K) THEN LET Z=H   
  3700 IF G$="L" AND (F<9 OR CS>MS*K) THEN LET Z=.3
  3705 IF Z<>O THEN GOTO 3730
  3710 PRINT "YOU MISSED IT"
  3720 LET HF=O
  3725 GOTO 3830
  3730 IF HF=0 THEN GOTO 3740
  3732 LET D=MS+INT(RND*9)
  3734 LET HF=O
  3735 GOTO 3760
  3740 LET D=INT((((CS*50*RND)-(10*MS)+E)/100)*Z)
  3745 IF D<O THEN LET D=O
  3750 IF CS>(MS-D)*K THEN LET HF=H
  3760 LET MS=MS-D
  3765 IF MS<=O THEN LET MS=O
  3770 PRINT "A HIT ..."
  3790 IF D<>O THEN  GOTO 3600
  3792 PRINT "BUT NO DAMAGE"
  3793 LET HF=O
  3795 GOTO 3830
  3800 PRINT D;" DAMAGE"
  3802 GOSUB 390
  3805 IF MS<=O THEN GOTO 3860
  3820 IF HF=H THEN PRINT"THE ";K$;" STAGGERS..."
  3830 GOSUB 390
  3840 IF HF=H THEN GOTO 3570
  3850 GOTO 4000
  3860 PRINT "....KILLING THE MONSTER"
  3870 LET EX=EX+U
  3875 LET HF=O
  3876 LET CF=O
  3890 GOTO 2370
  3900 PRINT "KNAVISH COWARD"
  3905 LET CF=O
  3910 GOTO 2370
  4000 GOSUB 490
  4005 PRINT "THE CREATURE ATTACKS"
  4010 GOSUB 360
  4020 IF MS=O THEN GOTO 4300
  4030 IF MS<N AND N>B+B AND RND*H/H1 THEN GOTO 4300
  4040 LET MS=MS-H
  4045 IF MS<=O THEN GOTO 4240
  4060 GOSUB 490
  4070 LET Z=USR 16613
  4080 IF Z=O THEN GOTO 4280
  4160 LET G=INT((((MS*75*RND)-(10*CS)-E)/100)*Z)
  4164 GOSUB 360 
  4165 GOSUB 490
  4170 IF G<=O THEN LET G=O
  4175 IF G=O THEN PRINT"...SAVED BY YOUR ARMOUR"
  4177 IF G=O THEN GOTO 4280
  4180 LET C=C-G
  4190 IF G>9 THEN LET CS=INT(CS-G/6)
  4210 PRINT "YOUR TAKE ";G;" DAMAGE"
  4220 IF CS<=O OR C<=O THEN GOTO 500
  4230 GOTO 4280
  4240 PRINT AT R,O;"IN ITS DYING ATTEMPT"
  4250 LET EX=INT(EX+U/H1)
  4255 LET CF=O
  4270 GOTO 2370
  4280 GOSUB 390
  4290 GOTO 2370
  4300 PRINT AT R,O;"HURLING A LIGHTNING BOLT"
  4310 LET G=INT (((180*N*RND)-(PS+E))/100)
  4313 LET N=N-K-H
  4315 IF G>9 THEN LET N=N-INT(G/5)
  4320 GOSUB 360
  4325 GOSUB 490
  4330 IF N<=O THEN LET N=O
  4335 IF N=O THEN GOTO 4240
  4340 IF RND<H/K THEN GOTO 4410
  4350 IF G<=O THEN LET G=O
  4355 IF G=O THEN GOTO 4400
  4360 PRINT "IT STRIKES HOME "
  4370 GOSUB 390
  4380 LET C=C-G
  4385 IF G>9 THEN LET PS=INT(PS-G/K)
  4390 GOTO 4210
  4400 PRINT"YOUR PSI SHIELD PROTECTS YOU"
  4405 GOTO 4280
  4410 PRINT "MISSED YOU"
  4415 GOTO 4280
  4500 IF Q=CODE"H" AND PK=CODE"«" THEN GOTO 2020
  4510 FOR I=B TO K+K
  4520 LET N(I)=INT (K+RND*5)
  4530 IF N(I)=K+H THEN GOTO 4520
  4540 NEXT I
  4550 IF S=H THEN LET HP=H
  4560 LET P(B)=INT(R*RND*H1)
  4650 LET C=C-K-B-B
  4660 POKE M+V,O
  4670 POKE W+V,QX
  4680 IF Q=CODE"«" THEN LET S=H 
  4685 IF Q=CODE"«" THEN LET FL=H
  4690 IF Q<>CODE"X" THEN GOTO 4720
  4693 IF S=K THEN LET S=H
  4695 IF S=K THEN LET FL=H
  4700 IF S=K+H OR S=B+B THEN LET S=S-B
  4705 IF S=K+H OR S=B+B THEN LET FL=FL-K
  4710 IF S=K+H OR S=B+B THEN LET M=HW
  4715 LET XP=O
  4720 IF Q<>CODE"W" AND Q<>CODE"S" THEN GOTO 4750
  4726 IF Q=CODE"W" THEN LET S=B
  4728 IF Q=CODE"W" THEN LET FL=B
  4730 IF Q=CODE"S" THEN LET S=H1
  4732 IF Q=CODE"S" THEN LET FL=S
  4734 LET X=INT(H+5*RND)
  4740 LET Y=P(B)
  4750 IF Q=CODE"t" THEN LET S=K
  4755 IF Q=CODE"t" THEN LET FL=H1
  4760 IF Q<>CODE"H" THEN GOTO 4780
  4763 LET S=S+B
  4765 LET FL=FL+K
  4770 LET HW=M
  4780 IF FL>K+K THEN LET FL=FL-K
  4781 GOSUB 5000+\
(300 AND S=H1)+\
(310 AND S=B)+\
(500 AND S=K)+\
(510 AND S>=K+H)
  
  4793 GOSUB 380
  4795 GOTO 2000
  5000 CLS
  5001 POKE ZZ,H
  5002 POKE ZZ+H,K+H
  5003 POKE ZZ+H1,K
  5004 POKE ZZ+B,K+B
  5005 POKE ZZ+K,K+K
  5006 LET S=H
  5007 LET FL=H
  5010 POKE 16515,6
  5020 LET ZP=USR 16514
  5040 IF G(H)<>O THEN GOTO 5160
  5050 LET M=H+(33*INT(11*RND+H))
  5051 LET L=M
  5052 LET MP=M
  5053 LET W=M
  5054 LET G(H)=M
  5060 POKE M+V,149
  5070 FOR I=B TO 33
  5075 IF RND>H/H1 THEN GOTO 5090
  5080 LET L1=L+34
  5085 GOTO 5100
  5090 LET L1=L-32
  5100 IF L1<34 OR L1>396 THEN GOTO 5075
  5110 LET G(I)=L1
  5120 LET L=L1
  5130 POKE G(I)+V,27
  5140 NEXT I
  5150 POKE G(33)+V,149
  5155 GOTO 5200
  5165 POKE G(H)+V,149
  5170 FOR I=B TO 33
  5175 POKE G(I)+V,27
  5180 NEXT I
  5190 POKE G(33)+V,149
  5200 IF S(H)<>O THEN GOTO 5250
  5210 FOR I=H TO K+H
  5220 LET S(I)=33*INT(H+RND*11)+INT (H1+RND*28)
  5230 IF PEEK(S(I)+V)<>O OR PEEK(S(I)+H+V)<>O THEN GOTO 5220
  5240 NEXT I
  5250 POKE S(H)+V,60
  5255 POKE S(H)+H+V,60
  5260 POKE S(2)+V,60
  5265 POKE S(2)+H+V,60
  5270 POKE S(B)+V,56
  5275 POKE S(B)+H+V,56
  5280 POKE S(K)+V,56
  5285 POKE S(K)+V,56
  5290 POKE S(5)+V,185
  5292 LET M=MP
  5294 LET W=M
  5297 RETURN
  5300 POKE ZZ,H
  5301 POKE ZZ+H,B+B
  5302 POKE ZZ+H1,O
  5303 POKE ZZ+B,O
  5304 POKE ZZ+K,O
  5307 LET PD=O
  5308 LET PC=CODE"®"
  5309 GOTO 5320
  5310 POKE ZZ,H
  5311 POKE ZZ+H,H+K
  5312 POKE ZZ+H1,B+B
  5313 POKE ZZ+B,K+K
  5314 POKE ZZ+K,O
  5315 LET PC=CODE"T"
  5320 LET PK=O
  5325 CLS
  5330 FOR I=H TO 50
  5335 LET N=33*INT(H1+RND*11)+INT(H1+RND*28)
  5340 POKE N+V,PC
  5345 NEXT I
  5350 PRINT AT X,Y;"««"
  5355 PRINT AT X+H,Y-H;"«««««"
  5360 PRINT AT X+H1,Y-H1;"««  ««"
  5365 PRINT AT X+B,Y-H1;"««H  ««"
  5370 PRINT AT X+K,Y-H;"«««« ««"
  5375 PRINT AT X+K+H,Y;" ««"
  5380 PRINT AT X+B+B,Y+H1;"«"
  5385 POKE 16515,136
  5390 LET ZP=USR 16514
  5399 POKE 345+V,O
  5400 LET W=345
  5405 IF Q=CODE"X" THEN LET M=HW
  5407 IF Q=CODE"X" THEN LET W=H
  5410 RETURN
#
  5500 POKE ZZ,H
  5501 POKE ZZ+H,H+K
  5502 POKE ZZ+H1,B
  5503 POKE ZZ+B,B+K
  5504 POKE ZZ+B,O
  5505 GOTO 5515
#
  5510 POKE ZZ,K+H
  5511 POKE ZZ+H,H1
  5512 POKE ZZ+H1,B
  5513 POKE ZZ+B,O
  5514 LET P(FL)=P(B)
  5515 LET HX=N(FL)
  5516 LET PK=O
  5518 LET P=O
  5520 CLS
  5540 LET PZ=USR 16556
  5560 LET L1=CODE"9"
  5570 FOR J=H TO B
  5575 IF P(FL)>32 OR P(FL)<H THEN LET P(FL)=H
  5580 LET D(J)=VAL Z$(P(FL))
  5585 LET P(FL)=P(FL)+H
  5590 IF D(J)<>9 THEN GOTO 5595
  5592 LET P(FL)=H
  5593 LET D(J)=B
  5595 LET P=P+H
  5600 NEXT J
  5610 FOR I=O TO HX
  5615 LET PC=CODE"«"
  5620 LET L=L1+(33*I)
  5625 IF L>386 THEN GOTO 5720
  5630 IF I=H THEN LET PC=0
  5640 IF D(H)=O THEN LET PC=CODE"«"
  5645 IF D(H)=O THEN GOTO 5660
  5650 POKE L+D(H)+V,PC
  5655 LET PC=CODE"«"
  5660 IF I=B THEN LET PC=O
  5670 POKE L+D(H)+D(H1)+V,PC
  5675 LET PC=CODE"«"
  5680 IF I=K THEN LET PC=0
  5690 POKE L+D(H)+D(H1)+D(B)+V,PC
  5695 LET PC=CODE"«"
  5700 NEXT I
  5710 LET L1=L1+(33*HX)+33
  5715 GOTO 5610
  5720 LET L1=CODE"9"
  5730 FOR J=H TO K 
  5740 LET L=L1+(33*J*(HX+H))
  5750 FOR I=H TO R-K
  5760 IF L>353 THEN GOTO 5810
  5770 IF I=H1 OR I=B*HX OR I=R-B-B THEN GOTO 5790
  5780 POKE L+I+V,PC
  5790 NEXT I
  5800 NEXT J
  5810 IF S=K+H OR S=B+B THEN GOTO 5840
  5820 IF FL/H1=INT(FL/H1) THEN POKE 418+V,R-B
  5825 IF FL/H1=INT(FL/H1) THEN GOTO 5840
  5830 POKE 36+V,R-B
  5840 IF FL=H1 OR S=K+H OR S=B+B THEN POKE 446+V,61
  5850 IF XP=O THEN LET W=413
  5855 LET XP=H
  5860 PRINT AT K*B+H1,H;
  5865 IF S=K+H THEN GOTO 5930
  5870 IF S=B+B THEN GOTO 5910
  5880 PRINT "ZAEXON/S TOWER,L=";FL-H
  5890 GOTO 5940
  5910 PRINT "VOUNIM/S LAIR"
  5920 GOTO 5960
  5930 PRINT "Y/NAGIOTH TEMPLE"
  5940 LET P(FL+H)=P(FL)+P
  5960 IF FL<K OR RND<.3 THEN RETURN
  5970 FOR I=H TO INT(RND*S+H1)
  5980 LET N1=33*INT(H+RND*12)+INT(K+RND*17)
  5992 IF PEEK(V+H1)<>O THEN GOTO 5980
  5993 POKE H1+V,23
  5995 NEXT I
  5997 RETURN
  6000 POKE W+V,52
  6010 POKE M+V,O
  6020 PRINT AT R,O;"STAIRS u/d ?"
  6030 LET TV=FL
  6040 GOSUB 600
  6050 IF G$="U" THEN LET FL=FL+H
  6055 IF G$="U" THEN GOTO 6070
  6056 IF G$<>"D" THEN GOTO 6040
  6060 LET FL=FL-H
  6070 IF FL>K+B OR FL<H1 THEN GOTO 6090
  6080 GOTO 4780
  6090 PRINT AT R,O;"IT/S BLOCKED"
  6092 GOSUB 360
  6095 LET FL=TV
  6099 GOTO 6020 
#<--- XAVSNAP.
#
#
#
# 7000 REM ** LOAD MC CODES **
 7000 FAST
#.
#---------------------
# 7002 REM INIT REM 1
#---------------------
# 7003 LET OFFSET=16514
# 7004 LET  C=256
# 7005 LET C$="\
#0E062A0C40062023\
#7110FC2323111F00\
#060D711971232310\
#F911DFFF19061E23\
#7110FCC9"
# CHECK OK.
#.

# 7006 FOR R=OFFSET TO OFFSET+35
# 7007 POKE R,CODE C$(1)*16+CODE C$(2)-476
# 7008 LET C$=C$(3 TO )
# 7009 NEXT R
#.
#---------------------
# 7010 REM INIT REM 2
#---------------------
# 7011 LET OFFSET=16556
# TWO REDUNDENT "23"
# 7012 LET C$="\
#3E802A0C402306\
#16237710FC060C11\
#0C00ED5A77111500\
#ED5A7710F2110C00\
#ED5A0616772310FC\
#C9"
# CHECK OK.
# 7013 FOR R=OFFSET TO OFFSET+39
# 7014 POKE R,CODE C$(1)*16+CODE C$(2)-476
# 7015 LET C$=C$(3 TO )
# 7016 NEXT R
#.
#---------------------
# 7020 REM INIT REM 3
#---------------------
# 7021 LET OFFSET=16603
# 7022 LET C$="\
#E17E23E5FEFFC8D7\
#18F6060A3A344090\
#30FD803CFE022011\
#CDDB40$$$$00$$$$$$$$$$$$FF\
#010000C9FE02201A\
#CDDB40$$$$$$00$$$$$$$$$$00$$$$$$00$$$$$$$$FF\
#010000C9FE032014\
#CDDB40$$$$00$$$$$$$$$$$$$$$$$$FF\
#010000C9FE04201C\
#CDDB40$$$$00$$$$$$$$$$$$$$00$$$$$$$$00$$$$$$$$FF\
#010300C9FE052804\
#FE06201CCDDB40\
#$$$$$$$$00$$$$$$$$$$00$$$$00$$$$$$$$$$$$FF010200\
#C9FE072804FE0820\
#17CDDB40$$$$$$$$00$$$$$$00$$$$00$$$$$$\
#FF010100C9FE0920\
#13CDDB40$$00$$$$$$$$00$$$$$$$$FF\
#010200C9CDDB40\
#$$$$$$$$00$$$$$$00$$$$00$$$$$$FF010100C9"
# CHECK OK.
#.
# 7023 FOR R=OFFSET TO OFFSET+239
# 7024 IF C$(1)+C$(2)="$$" THEN GOTO 7026
# 7025 POKE R,CODE C$(1)*16+CODE C$(2)-476
# 7026 LET C$=C$(3 TO )
# 7027 NEXT R
#.
#---------------------
# 7030 REM INIT REM 4
#---------------------
#7031 LET OFFSET=16849
# 7032 LET C$="\
#06093E00D710FDC9\
#CDDB40$$$$$$$$00$$FFCDD1\
#41CDDB40$$$$$$$$$$$$00$$$$$$$$000000000000\
#$$$$$$$$$$$$FFCDD141CDDB\
#40$$$$$$$$$$$$$$$$$$00$$000000000000$$$$$$$$$$$$FF\
#CDD141CDDB40$$$$$$$$$$$$$$000000$$\
#FFC9"
# CHECK OK.
#.
# 7033 FOR R=OFFSET TO OFFSET+96
# 7034 IF C$(1)+C$(2)="$$" THEN GOTO 7026
# 7035 POKE R,CODE C$(1)*16+CODE C$(2)-476
# 7036 LET C$=C$(3 TO )
# 7037 NEXT R
#.
#---------------------
# 7040 REM INIT REM 5
#---------------------
# 7041 LET OFFSET=16953
# 7042 LET C$="\
#0101010507050102\
#0805040303060203\
#010000000000013A\
#34409030FD803CC9\
#0664CD5042063290\
#3804061118020609\
#CD50424FFE0F2807\
#FE10280E0600C93A\
#4F4206049038D906\
#00C90664CD504206\
#329038CC0600C9\
#0000000000000000\
#0000000000000000\
#000000000000"
# CHECK OK.
#.
# 7043 FOR R=OFFSET TO OFFSET+108
# 7045 POKE R,CODE C$(1)*16+CODE C$(2)-476
# 7046 LET C$=C$(3 TO )
# 7047 NEXT R
#.
#..
 8010 LET O=PI-PI
 8020 LET H=PI/PI
 8030 LET B=INT PI
 8040 LET K=CODE"¹"
 8050 LET H1=CODE"·"
 8060 LET R=CODE"*"
 8065 LET XP=O
 8070 LET ZZ=16970
 8080 DIM D(4)
 8090 DIM G(33)
 8100 DIM P(9)
 8110 DIM N(9)
 8120 DIM S(5)
 8125 LET S$="                                "
 8130 LET Z$="47364465360384355383450636464749"

 8140 LET M$="\
@0A¾ AWOLFEN\
@0E¾ AHOB-GOBLIN\
@07¾ AORC\
@0C¼¸EFIRE-IMP\
@0E< GROCK-TROLL\
@09¿£EHARPY\
@08* AOGRE\
@10 ;BBARROW-WIGHT\
@0A>:HLIZARD\
@0E,=EFIRE-GIANT\
@12H VTHUNDER-LIZARD\
@0C7;CMINOTAUR\
@0A 2CWRAITH\
@0A8£FWYVERN\
@0AM=BDRAGON\
@0F HCRING-WRAITH\
@0AMMABALROG\
@0D??LWATER-IMP\
@0AM LKRAKEN "
8200 SLOW 
9000 SAVE "VALLEY"
9001 GOTO 10
Attachments
VALLEY.P
(14.4 KiB) Downloaded 57 times
Xavier ...on the Facebook groupe : "Zx81 France"(fr)
David G
Posts: 387
Joined: Thu Jul 17, 2014 7:58 am
Location: 21 North, 156 West

Re: A 15.999K Adventure game: The Valley of adventure.

Post by David G »

wow lots of typo fixes. Looks like you also made a few logic fixes


Any ideas what the monster data (M$) format is? Four bytes are associated with each name i.e.:

Code: Select all

defbyte 0A 09 00 26 'WOLFEN'
Perhaps the four bytes are room location, or character attributes, or fighting attributes
User avatar
XavSnap
Posts: 1941
Joined: Sat May 10, 2008 4:23 pm
Location: 'Zx81 France' Fb group.

Re: A 15.999K Adventure game: The Valley of adventure.

Post by XavSnap »

defbyte 0A 09 00 26 'WOLFEN'
'0A
' jump lenght to retrive Idxmonster datas (DATA/READ function)
'09
3115 LET MS=CODE M$(CX+1)
'00
3140 LET N=CODE M$(CX+2)

'26 (ASM) ???
CODE M$(CX+3)

'Monster name:'WOLFEN'
3110 LET K$=M$(CX+5 TO CX+CODE M$(CX)-1)
Xavier ...on the Facebook groupe : "Zx81 France"(fr)
David G
Posts: 387
Joined: Thu Jul 17, 2014 7:58 am
Location: 21 North, 156 West

Re: A 15.999K Adventure game: The Valley of adventure.

Post by David G »

monster_element[0] byte length of this element
monster_element[1] VAL of this is copied to MS, this is the monster_strength_factor
monster_element[2] VAL is copied to N
monster_element[3] string_monster-name. The length specified by sub-element 0 less 3. Copied to K$

As you traverse the map, if you land on an empty square, there is a random 20% chance (1/5) a monster will appear

Code: Select all

2300 LET F=RND 
...
2310 IF F<1/5 THEN GOTO 3000 //MONSTER APPEARS
The routine at 3000 chooses a monster type, and re-uses F to store the number. F can be 1 up to 19 -- there are 19 types of monsters
David G
Posts: 387
Joined: Thu Jul 17, 2014 7:58 am
Location: 21 North, 156 West

Valley of Adventure: program structure

Post by David G »

I guess this might be classified as a "graphical adventure"?

In this adventure, there is no conception of a "room". Instead there is a randomly generated map on the display, and symbols are on the map for various things like swamps, woods, or Tower

Ive been trying to work out an overview of the structure of the game, the game loop. and how it all works. It seems like is is heavily based on percentages, like the aforementioned 20% chance of a monster appearing. Ditto for the combat parts where the outcome is based on percentages

The various character types:

Code: Select all

WIZARD...(1)
THINKER..(2)
BARBARIAN(3)
WARRIOR..(4)
CLERIC...(5)

CHOOSE CAREFULLY
Does the poster instructions explain how you would choose carefully? From the screenshots I have compiled this list:

character type initialization:

Code: Select all

                GOLD SKILL TURNS COMBAT.STR PSI.POWER STAMINA
 WIZARD 	0    5     0     24         28        100
 THINKER        0    5     0     26         26        113
 BARBARIAN      0    5     0     28         24        125
 WARRIOR        0    5     0     26         26        113
 CLERIC         0    5     0     22         22        113
 DOLT           0    5     0     22         22        113
David G
Posts: 387
Joined: Thu Jul 17, 2014 7:58 am
Location: 21 North, 156 West

Valley of Adventure: machine code

Post by David G »

When i first saw this thread (thanks, xavsnap!), my first thought was "i love adventure games, let me look at that code". The first thing that caught my attention was the machine code REM statements


There are five REM statements that contain machine code, which according to the Poster Program text are used to "speed up the running of the game":
  • 1 REM draws a non-solid border 32x14 (USR 16514). This is used for the main map
  • 2 REM draws solid black border 22x14 (USR 16556). Used for the various sub-maps (towers/arenas)
  • 3 REM has routines for:
    * "print an FF-terminated string"
    * "display the various 'hit and miss' messages during a fight"
  • 4 REM check and display the characters's status
  • 5 REM the "speed up the combat" routine

It is a little tricky getting an accurate disassembly because there are in-line text strings throughout, and the disassembler doesn't know that. So it tries to interpret the strings as code, and the result is non-compiling code. Using ZxList showed me not only the disassembly but also the text strings. Once I hand-edited the machine code and spelled out each text string (a tedious process), then the assembly language would compile


The "hashBRDR" routine (USR 16514) is interesting, it's a fine gray square, but the BASIC program changes the character used to a checkerboard square for a Wood or Swamp map

The main gamefield uses hashBRDR with character 6 (NE CHECKER, GRAPHICS-SHIFT T)
conec.png

Some other places it uses character 136 (INVERSE GRAY SQUARE, GRAPHICS-SHIFT H)
MIREE, IN THE WOODS
MIREE, IN THE WOODS
You can run the Border routines standalone. After loading Valley.p, press BREAK and enter

Code: Select all

RAND USR 16514
or

Code: Select all

RAND USR 16556

A curious thing about the two "draw border" routines: they don't share any code.
1. They draw the north border in one go
2. Then draw the west and east borders -- all the way down for drawBRDR, but one less line for hashBRDR
3. hashBRDR draws the entire southern border
drawBRDR.png
... while drawBRDR only fills in the south border between the west & east stubs
hashBRDR.png
The first routine is 40 bytes long. The second routine is 36, saving 4 bytes. However, combining them would save how many bytes? Perhaps 32 bytes?
User avatar
XavSnap
Posts: 1941
Joined: Sat May 10, 2008 4:23 pm
Location: 'Zx81 France' Fb group.

Re: A 15.999K Adventure game: The Valley of adventure.

Post by XavSnap »

Hi David,
That's interesting...

It's a good game, but the main projet was is Basic.
Like many big Basic games, the author tried to code it, and had to delete many functionalities to finish it.
He had to use the machine code to save memory space, and use variables to get extra bytes "O" & "H"...
But the game steel trimmed.

This orphan code:

Code: Select all

  5970 FOR I=H TO INT(RND*5+H1)
  5980 LET N1=33*INT(H+RND*12)+INT(K+RND*17)
  5992 IF PEEK(V+N1)<>O THEN GOTO 5980
  # put "*" on random places on the screen
  5993 POKE N1+V,23
  5995 NEXT I
...Is not test in the main moving routine...

I things we don't need to save memory in the ASM routine. It will decay all "pokes", CALLs and ASM DATAs in the code.(BASIC/ASM). The "Garphics Tools 1" Can make personalized windows and save bytes.

But, i worked in the BASIC program to save and retrieve memory room.
S$="[32 spaces]"=DIM S$(32)

My release keeps all variables initializations at 8000 BASIC line...
It can be deleted to save more memory.

If the memory room was a problem, actually, the program can be optimised and... finished.
But, i tried to debugged all the game functionalities, and i add many bugs too.

This release seem working, but the fight routine don't loop, and don't jump to get the monster death.
The temple bug steel a problem, based on 3 arrays variables...

Updated: [WH=WM]
VALLEY.P
(14.42 KiB) Downloaded 66 times
I stell woking on this game, but it's an hypnotic BASIC code, based on an unfinished and truncated base.
:x
Have fun.
Xavier ...on the Facebook groupe : "Zx81 France"(fr)
User avatar
GCHarder
Posts: 427
Joined: Sat Dec 14, 2013 7:46 pm

Re: A 15.999K Adventure game: The Valley of adventure.

Post by GCHarder »

I haven't downloaded the latest version of "Valley" yet but found these errors in the last one...

120 HOW should be WHO
1080 HORD should be HOARD
1625 -H should be +H

I don't know if this is some kind of alteration by you but...

Lines 2180 to 2200 are miss numbered and line 2200 is missing.

I need to look at the 2nd half still.

Regards;

Greg
Post Reply