Skip to content

Instantly share code, notes, and snippets.

@treytomes
Created January 17, 2022 22:07
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save treytomes/907e688642ade470df12b9188a01cf98 to your computer and use it in GitHub Desktop.
Save treytomes/907e688642ade470df12b9188a01cf98 to your computer and use it in GitHub Desktop.
ROGLITE2.BAS, now for QB64!
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