Created
January 17, 2022 22:07
-
-
Save treytomes/907e688642ade470df12b9188a01cf98 to your computer and use it in GitHub Desktop.
ROGLITE2.BAS, now for QB64!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Const X_OFFSET = 1 | |
Const Y_OFFSET = 2 | |
Const SX = 32 | |
Const SY = 24 | |
Const C$ = ".#>" | |
Randomize Timer | |
10 GoSub 1000: 'INITIALIZE STUFF | |
20 GoSub 2000: 'BUILD THE MAP | |
30 GoSub 7000: 'START ON STATUS, THEN DRAW MAP | |
40 GoSub 6000: 'UPDATE THE HUD | |
50 GoSub 4000: 'DRAW THE ENTITIES | |
60 GoSub 5000: 'UPDATE THE PLAYER | |
70 GoSub 8000: 'UPDATE THE MONSTERS | |
80 Let CT = CT + 1 | |
90 If PX = DX And PY = DY Then LV = LV + 1: GoTo 20 | |
100 GoTo 40 | |
Rem INITIALIZE STUFF | |
Rem M(,) CONTAINS THE MAP DATA | |
Rem V(,) ARRAY CONTAINS THE VISIBILITY DATA | |
Rem C$ CONTAINS MAP ASCII CHARACTERS | |
Rem PX,PY=PLAYER POSITION | |
Rem HP=HEALTH POINTS | |
Rem AP=ATTACK POWER | |
Rem DP=DEFENSE POWER | |
Rem LV=LEVEL | |
Rem XP=EXPERIENCE | |
Rem MAP DATA: 1=FLOOR, 2=WALL | |
Rem CT=COUNTER | |
1000 Rem Poke 65495, 1 | |
1010 On BRK GOTO 9000 | |
1020 Width 32 | |
1050 Dim M(SX, SY) | |
1060 Dim V(SX, SY) | |
1070 Let PX = Int(SX / 2) | |
1080 Let PY = Int(SY / 2) | |
1090 Let HP = 10 | |
1100 Let AP = 1 | |
1110 Let DP = 1 | |
1120 Let LV = 10 | |
1130 Let XP = 0 | |
1150 Let CT = 0 | |
1160 Dim EX(100) | |
1170 Dim EY(100) | |
1180 Dim ET(100) | |
1190 Dim EH(100) | |
1300 Return | |
Rem BUILD THE MAP | |
2000 For X = 0 To SX - 1 | |
2010 Let M(X, 0) = 2 | |
2020 Let M(X, SY - 1) = 2 | |
2030 Next X | |
2040 For Y = 0 To SY - 1 | |
2050 Let M(0, Y) = 2 | |
2060 Let M(SX - 1, Y) = 2 | |
2070 Next Y | |
2100 For Y = 1 To SY - 2 | |
2110 For X = 1 To SX - 2 | |
2120 Let M(X, Y) = 1 | |
2130 Next X | |
2140 Next Y | |
Rem ADD BETWEEN 3 AND 8 PILLARS | |
2150 NP = Int(Rnd * 5) + 2 | |
2160 For P = 1 To NP | |
2170 Let X0 = Int(Rnd * (SX - 2)) + 1 | |
2180 Let Y0 = Int(Rnd * (SY - 2)) + 1 | |
2190 Let M(X0, Y0) = 2 | |
2200 Let M(X0 - 1, Y0) = 2 | |
2210 Let M(X0 + 1, Y0) = 2 | |
2220 Let M(X0, Y0 - 1) = 2 | |
2230 Let M(X0, Y0 + 1) = 2 | |
2240 Next P | |
Rem FIND A PLAYER SPAWN POINT | |
2250 Let PX = Int(Rnd * SX) | |
2260 Let PY = Int(Rnd * SY) | |
2270 If M(PX, PY) <> 1 Then 2250 | |
Rem SPAWN SOME MONSTERS | |
Rem EM=MAX ENTITIES | |
Rem EC=# ENTITIES | |
Rem EX()=ENTITY X | |
Rem EY()=ENTITY Y | |
Rem ET()=ENTITY TYPE | |
Rem EH()=ENTITY HEALTH | |
2280 Let EM = LV | |
2290 Let EC = EM: 'RND(EM) | |
2300 For N = 0 To EC - 1 | |
2310 Let ET(N) = 1 | |
2320 Let EH(N) = 1 | |
2330 Let EX(N) = Int(Rnd * SX) | |
2340 Let EY(N) = Int(Rnd * SY) | |
2350 If M(EX(N), EY(N)) <> 1 Or (EX(N) = PX And EY(N) = PY) Then 2330 | |
2360 Next N | |
Rem CLEAR THE VISIBILITY MAP | |
2370 For Y = 0 To SY - 1 | |
2380 For X = 0 To SX - 1 | |
2390 Let V(X, Y) = 0 | |
2400 Next X | |
2410 Next Y | |
Rem PLACE THE STAIRS | |
Rem DX,DY IS THE LOCATION OF THE STAIRS TO THE NEXT LEVEL | |
2420 Let DX = Int(Rnd * SX) | |
2430 Let DY = Int(Rnd * SY) | |
2440 If M(DX, DY) <> 1 Then 2420 | |
2450 Let M(DX, DY) = 3 | |
2900 Return | |
Rem DRAW THE MAP | |
3000 For Y = 0 To SY - 1 | |
3010 For X = 0 To SX - 1 | |
3020 If V(X, Y) = 0 Then Locate Y + Y_OFFSET, X + X_OFFSET: Print "*"; | |
3030 If V(X, Y) = 1 Then Locate Y + Y_OFFSET, X + X_OFFSET: Print Mid$(C$, M(X, Y), 1); | |
3040 Next X | |
3060 Next Y | |
3100 Return | |
Rem DRAW THE ENTITIES | |
4000 For Y = PY - 1 To PY + 1 | |
4010 For X = PX - 1 To PX + 1 | |
4020 Let V(X, Y) = 1 | |
4030 If Not ((X = PX) And (Y = PY)) Then Locate Y + Y_OFFSET, X + X_OFFSET: Print Mid$(C$, M(X, Y), 1); | |
4040 Next X | |
4050 Next Y | |
4060 Locate PY + Y_OFFSET, PX + X_OFFSET: Print "@"; | |
4070 If CT / 2 = Int(CT / 2) Then C0 = 219 Else C0 = 220 | |
4080 For N = 0 To EC - 1 | |
4090 If EH(N) = 0 Then 4110 | |
4100 If V(EX(N), EY(N)) = 1 Then Locate EY(N) + Y_OFFSET, EX(N) + X_OFFSET: Print Chr$(C0); | |
4110 Next N | |
4200 Return | |
Rem UPDATE THE PLAYER | |
Rem ARROW UP=94 | |
Rem ARROW DOWN=10 | |
Rem ARROW LEFT=8 | |
Rem ARROW RIGHT=9 | |
5000 If HP = 0 Then 9000 | |
5010 A$ = InKey$ | |
5020 If Len(A$) = 0 Then 5010 | |
5030 If A$ = "W" And (M(PX, PY - 1) = 1 Or M(PX, PY - 1) = 3) Then GoSub 5500: Let PY = PY - 1 | |
5040 If A$ = "S" And (M(PX, PY + 1) = 1 Or M(PX, PY + 1) = 3) Then GoSub 5500: Let PY = PY + 1 | |
5050 If A$ = "A" And (M(PX - 1, PY) = 1 Or M(PX - 1, PY) = 3) Then GoSub 5500: Let PX = PX - 1 | |
5060 If A$ = "D" And (M(PX + 1, PY) = 1 Or M(PX + 1, PY) = 3) Then GoSub 5500: Let PX = PX + 1 | |
5070 If A$ = " " Then GoSub 7000 | |
5080 Return | |
Rem ERASE THE PLAYER | |
5500 Locate PY + Y_OFFSET, PX + X_OFFSET: Print Mid$(C$, 1, 1); | |
5510 Return | |
Rem UPDATE THE HUD | |
6000 Locate 1, 1 | |
6010 Print "HP:"; HP; "AP:"; AP; "DP:"; DP; "LV:"; LV; "XP:"; EX; | |
6020 Return | |
Rem THE STATUS SCREEN | |
7000 Cls | |
7010 Print "PLAYER STATUS" | |
7020 Print "====================" | |
7030 Print "EXPERIENCE:"; XP | |
7040 Print "LEVEL:"; LV | |
7050 Print "HEALTH:"; HP | |
7060 Print "ATTACK:"; AP | |
7070 Print "DEFENSE:"; DP | |
7080 Print | |
7090 Print "INSTRUCTIONS" | |
7100 Print "==================" | |
7110 Print "WASD TO MOVE" | |
7120 Print "SPACE FOR STATUS SCREEN" | |
7130 Print | |
7140 Print "PRESS ANY KEY TO CONTINUE" | |
7150 If Len(InKey$) = 0 Then 7150 | |
7160 GoSub 3000: 'REDRAW THE MAP | |
7200 Return | |
Rem UPDATE THE MONSTERS | |
8000 For N = 0 To EC - 1 | |
8010 If EH(N) = 0 Then 8100: 'THE MONSTER IS DEAD | |
8020 If EX(N) = PX And EY(N) = PY Then EH(N) = EH(N) - 1: HP = HP - 1 | |
8030 Let X0 = Int(Rnd * 3) - 1 | |
8040 If X0 = 0 Then Y0 = Int(Rnd * 3) - 1 Else Y0 = 0 | |
8050 If M(EX(N) + X0, EY(N) + Y0) <> 1 And M(EX(N) + X0, EY(N) + Y0) <> 3 Then 8110 | |
8060 Locate EY(N) + Y_OFFSET, EX(N) + X_OFFSET | |
'8070 If V(EX(N), EY(N)) = 0 Then Print "*" Else Print Mid$(C$, M(EX(N), EY(N)), 1): 'ERASE THE MONSTER | |
8070 If V(EX(N), EY(N)) = 0 Then Print "*"; Else Print ".";: 'ERASE THE MONSTER | |
8080 Let EX(N) = EX(N) + X0 | |
8090 Let EY(N) = EY(N) + Y0 | |
8100 If EX(N) = PX And EY(N) = PY Then EH(N) = EH(N) - 1: HP = HP - 1 | |
8110 Next N | |
8200 Return | |
9000 Width 32 | |
9010 If HP = 0 Then Print "YOU ARE DEAD." | |
9020 Print "GOODBYE!" | |
9030 Rem Poke 65494, 1 | |
9040 End |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment