Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- OPTION _Explicit
- ' === MAIN VARIABLES ===
- CONST MAXPLANETS = 1000
- CONST MAXGOODS = 1000
- CONST MAXCARGO = 1000
- CONST MAX_NODES = 1000
- DIM SHARED nodeLinks(1 TO MAX_NODES, 1 TO 3) AS INTEGER ' stores up to 3 links per node
- DIM SHARED isPlanet(1 TO MAX_NODES) AS INTEGER
- DIM SHARED planetName$(1 TO MAX_NODES)
- DIM SHARED planetExport1$(1 TO MAX_NODES), planetExport2$(1 TO MAX_NODES), planetuserInputort$(1 TO MAX_NODES)
- DIM SHARED visited(1 TO MAX_NODES) AS INTEGER
- DIM SHARED currentNode AS INTEGER
- DIM SHARED AS INTEGER i, j
- DIM SHARED x AS INTEGER, y AS INTEGER
- DIM SHARED fuel AS INTEGER, credits AS LONG
- DIM SHARED cargoMax AS INTEGER
- DIM SHARED planet$(MAXPLANETS)
- DIM SHARED planetX(MAXPLANETS), planetY(MAXPLANETS)
- DIM SHARED goods$(MAXGOODS)
- DIM SHARED goodMin(MAXGOODS), goodMax(MAXGOODS)
- DIM SHARED cargo(1 TO MAXCARGO) AS INTEGER
- DIM SHARED numGoods AS INTEGER
- RANDOMIZE (-TIMER)
- InitGoods
- IF _FileExists("planets.txt") THEN
- LoadPlanetsFromFile
- ELSE
- GenerateStarterPlanets
- LoadPlanetsFromFile
- END IF
- InitGame
- ShipConsole
- GoodsList:
- DATA Ore,80,150
- DATA Food,30,75
- DATA Tech,150,300
- DATA Medicine,100,250
- DATA Water,10,40
- DATA Crystals,200,400
- DATA Fuel,50,120
- DATA Alcohol,100,180
- DATA Tobacco,90,170
- DATA LuxuryGoods,300,500
- DATA Nanotubes,120,220
- DATA CircuitBoards,110,190
- DATA Jewelry,250,600
- DATA Perfume,180,350
- DATA SurgeryKits,400,700
- DATA FrozenMeals,60,130
- DATA QuantumChips,450,800
- DATA Coolant,85,160
- DATA AncientRelics,800,1500
- DATA AlienEggs,1000,1800
- DATA Titanium,140,250
- DATA Uranium,300,550
- DATA Carbon,90,160
- DATA Silicon,75,140
- DATA Iron,70,130
- DATA Copper,60,120
- DATA Zinc,55,110
- DATA Lithium,130,220
- DATA Quartz,50,100
- DATA Plastics,45,90
- DATA SyntheticFibers,80,150
- DATA Processors,200,320
- DATA WireSpools,70,140
- DATA AIcores,600,1000
- DATA Datadrives,300,600
- DATA NavigationModules,220,420
- DATA DefenseGrids,400,700
- DATA Holograms,150,290
- DATA Mechs,750,1100
- DATA Books,20,80
- DATA ReligiousIcons,60,140
- DATA Propaganda,30,100
- DATA IllicitSoftware,500,900
- DATA AncientTexts,600,1200
- DATA Sculptures,350,700
- DATA Instruments,180,350
- DATA DesignerClothes,220,400
- DATA FineWines,250,420
- DATA VintageTech,500,850
- DATA Antivirals,120,220
- DATA Painkillers,100,180
- DATA ProteinPaste,40,90
- DATA Gold,800,1200
- DATA Silver,300,500
- DATA Diamonds,1200,2000
- DATA Pearls,600,900
- DATA Spices,150,270
- DATA Tea,60,110
- DATA Coffee,70,130
- DATA ExoticFruits,90,160
- DATA ShipParts,300,600
- DATA PowerCells,150,300
- DATA GravityCores,500,900
- DATA LaserCrystals,400,800
- DATA BioGel,350,700
- DATA CloneTissues,700,1200
- DATA AndroidParts,600,1000
- DATA DroidCores,450,850
- DATA HackerTools,320,600
- DATA SurveillanceGear,300,580
- DATA Explosives,700,1100
- DATA Rockets,800,1400
- DATA Ballistics,400,700
- DATA PlasmaCores,1000,1600
- DATA EMPDevices,850,1500
- DATA FusionRods,600,1000
- DATA TerraformKits,1200,2000
- DATA IceSamples,90,170
- DATA GasSamples,70,150
- DATA AlienTech,1500,2200
- DATA SpaceArt,350,650
- DATA MartianDust,180,320
- DATA NeuralLinks,800,1400
- DATA CargoPods,90,160
- DATA AsteroidDebris,30,70
- DATA MoonRocks,100,200
- DATA XenoBones,600,1000
- DATA CreatureDNA,950,1500
- DATA ExoticLiquids,500,900
- DATA Stims,110,210
- DATA Vaccines,130,250
- DATA Fertilizer,60,100
- DATA IndustrialWaste,10,30
- DATA ScrapMetal,20,60
- DATA ShinyRocks,5,15
- DATA ProgrammablePets,400,700
- DATA Holobooks,90,180
- DATA CyberLimbs,700,1200
- DATA RealityChips,600,1000
- DATA TimeCapsules,1500,2500
- DATA 0,0,0
- SUB ConsoleMenu
- DIM choice$
- DO
- CLS
- PRINT "=== Ship Console ==="
- PRINT "1. View Cargo"
- PRINT "2. Planet Directory"
- PRINT "3. Return to Main Menu"
- INPUT "Choice: ", choice$
- SELECT CASE choice$
- CASE "1": ShowCargo
- CASE "2": ShowPlanetLinks
- CASE "3": EXIT DO
- END SELECT
- LOOP
- END SUB
- SUB ShowCargo
- CLS
- PRINT "=== Cargo Hold ==="
- FOR i = 1 TO numGoods
- IF cargo(i) > 0 THEN
- PRINT goods$(i); " = "; cargo(i)
- END IF
- NEXT
- PRINT: PRINT "Press any key...": SLEEP
- END SUB
- SUB ShowPlanetLinks
- DIM pname1$, pname2$, dx, dy
- CLS
- PRINT "=== PLANET DIRECTORY ===": PRINT
- FOR i = 1 TO MAXPLANETS
- IF planet$(i) <> "" THEN
- pname1$ = SplitString$(planet$(i), "|", 1)
- PRINT pname1$; " ("; planetX(i); ","; planetY(i); ") ? ";
- DIM linkLine$
- linkLine$ = ""
- FOR j = 1 TO MAXPLANETS
- IF planet$(j) <> "" THEN
- dx = ABS(planetX(j) - planetX(i))
- dy = ABS(planetY(j) - planetY(i))
- IF (dx = 1 AND dy = 0) OR (dx = 0 AND dy = 1) THEN
- pname2$ = SplitString$(planet$(j), "|", 1)
- IF linkLine$ <> "" THEN linkLine$ = linkLine$ + ", "
- linkLine$ = linkLine$ + pname2$
- END IF
- END IF
- NEXT
- PRINT linkLine$
- END IF
- NEXT
- PRINT: PRINT "Press any key...": SLEEP
- END SUB
- ' === INIT ===
- SUB InitGame ()
- x = 0: y = 0
- fuel = 100
- credits = 5000
- cargoMax = 20
- END SUB
- SUB InitGoods
- DIM g AS STRING, i AS INTEGER
- RESTORE GoodsList
- i = 1
- DO
- READ g, goodMin(i), goodMax(i)
- IF g = "0" THEN EXIT DO
- goods$(i) = g
- i = i + 1
- LOOP
- numGoods = i - 1
- END SUB
- ' === TRAVEL ===
- ' === TRADE ===
- SUB Trade
- DIM pname AS STRING
- DIM ex1 AS STRING
- DIM ex2 AS STRING
- DIM userInput AS STRING
- DIM g AS STRING
- DIM buyPrice AS INTEGER, sellPrice AS INTEGER
- DIM i AS INTEGER, choice AS INTEGER, found AS INTEGER
- found = 0
- FOR i = 1 TO MAXPLANETS
- IF x = planetX(i) AND y = planetY(i) THEN found = i: EXIT FOR
- NEXT
- IF found = 0 THEN PRINT "No market here.": SLEEP: EXIT SUB
- pname$ = SplitString$(planet$(found), "|", 1)
- ex1$ = SplitString$(planet$(found), "|", 2)
- ex2$ = SplitString$(planet$(found), "|", 3)
- userInput$ = SplitString$(planet$(found), "|", 4)
- DO
- CLS
- PRINT "Welcome to "; pname$; " Trade Post"
- PRINT "Cargo space: "; (cargoMax - (cargo(1) + cargo(2) + cargo(3)))
- PRINT "Credits: "; credits: PRINT
- FOR i = 1 TO MAXGOODS
- g$ = goods$(i)
- buyPrice = (goodMin(i) + goodMax(i)) \ 2
- sellPrice = buyPrice - 20
- IF g$ = ex1$ OR g$ = ex2$ THEN buyPrice = goodMin(i): sellPrice = goodMin(i) - 10
- IF g$ = userInput$ THEN buyPrice = goodMax(i): sellPrice = goodMax(i) - 10
- PRINT i; ". Buy "; g$; " - "; buyPrice; " cr"
- PRINT " Sell "; g$; " - "; sellPrice; " cr"
- NEXT
- PRINT numGoods + 1; ". Exit"
- INPUT "Choice:", choice
- IF choice >= 1 AND choice <= numGoods THEN
- g$ = goods$(choice)
- buyPrice = (goodMin(choice) + goodMax(choice)) \ 2
- sellPrice = buyPrice - 20
- IF g$ = ex1$ OR g$ = ex2$ THEN buyPrice = goodMin(choice): sellPrice = goodMin(choice) - 10
- IF g$ = userInput$ THEN buyPrice = goodMax(choice): sellPrice = goodMax(choice) - 10
- PRINT "[B]uy or [S]ell "; g$; "?";: userInput = UCASE$(LEFT$(_Trim$(userInput$), 1))
- IF userInput$ = "B" THEN
- IF (cargo(1) + cargo(2) + cargo(3)) < cargoMax AND credits >= buyPrice THEN
- cargo(choice) = cargo(choice) + 1
- credits = credits - buyPrice
- ELSE
- PRINT "Not enough space or credits.": SLEEP
- END IF
- ELSEIF userInput$ = "S" THEN
- IF cargo(choice) > 0 THEN
- cargo(choice) = cargo(choice) - 1
- credits = credits + sellPrice
- ELSE
- PRINT "You have none to sell.": SLEEP
- END IF
- END IF
- END IF
- LOOP UNTIL choice = numGoods + 1
- END SUB
- ' === MAP VIEW ===
- SUB ShowMap
- DIM pname AS STRING
- DIM n AS STRING
- PRINT "Known planets:"
- FOR i = 1 TO MAXPLANETS
- IF planet$(i) <> "" THEN
- pname$ = SplitString$(planet$(i), "|", 1)
- PRINT pname$; " at ("; planetX(i); ","; planetY(i); ")"
- END IF
- NEXT
- PRINT "Press any key.": SLEEP
- END SUB
- ' === NAME GENERATOR ===
- FUNCTION GenPlanetName$
- DIM pre$(5), midd$(5), suf$(5)
- DIM n AS STRING
- pre$(1) = "Zor": pre$(2) = "Vel": pre$(3) = "Xan": pre$(4) = "Tor": pre$(5) = "Lum"
- midd$(1) = "an": midd$(2) = "or": midd$(3) = "ul": midd$(4) = "ex": midd$(5) = ""
- suf$(1) = "ia": suf$(2) = "on": suf$(3) = "ar": suf$(4) = "is": suf$(5) = "us"
- n$ = pre$(INT(RND * 5) + 1) + midd$(INT(RND * 5) + 1) + suf$(INT(RND * 5) + 1)
- IF RND < 0.2 THEN n$ = n$ + "-" + CHR$(INT(RND * 10) + 48)
- GenPlanetName$ = n$
- END FUNCTION
- ' === SAVE PLANET ===
- SUB SavePlanetToFile (x AS INTEGER, y AS INTEGER, NAME$, ex1$, ex2$, userInput$)
- PRINT "here"
- OPEN "planets.txt" FOR APPEND AS #1
- PRINT #1, x; ","; y; ","; NAME$; ","; ex1$; ","; ex2$; ","; userInput$
- CLOSE #1
- END SUB
- ' === LOAD PLANETS ===
- SUB LoadPlanetsFromFile ()
- PRINT "here"
- DIM LINE$, xPart$, yPart$, namePart$, ex1$, ex2$, userInput$
- DIM i AS INTEGER
- i = 1
- IF _FileExists("planets.txt") THEN
- OPEN "planets.txt" FOR INPUT AS #1
- DO WHILE NOT EOF(1)
- LINE INPUT #1, LINE$
- xPart$ = SplitString$(LINE$, ",", 1)
- yPart$ = SplitString$(LINE$, ",", 2)
- namePart$ = SplitString$(LINE$, ",", 3)
- ex1$ = SplitString$(LINE$, ",", 4)
- ex2$ = SplitString$(LINE$, ",", 5)
- userInput$ = SplitString$(LINE$, ",", 6)
- planetX(i) = VAL(xPart$)
- planetY(i) = VAL(yPart$)
- planet$(i) = namePart$ + "|" + ex1$ + "|" + ex2$ + "|" + userInput$
- i = i + 1
- LOOP
- CLOSE #1
- END IF
- END SUB
- ' === SPLIT FUNCTION ===
- FUNCTION SplitString$ (userInput$, delim$, index)
- DIM start AS INTEGER, count AS INTEGER, i AS INTEGER
- start = 1: count = 1
- FOR i = 1 TO LEN(userInput$)
- IF MID$(userInput$, i, 1) = delim$ THEN
- IF count = index THEN
- SplitString$ = MID$(userInput$, start, i - start)
- EXIT FUNCTION
- END IF
- count = count + 1
- start = i + 1
- END IF
- NEXT
- IF count = index THEN
- SplitString$ = MID$(userInput$, start)
- ELSE
- SplitString$ = ""
- END IF
- END FUNCTION
- SUB GenerateStarterPlanets
- DIM p$, ex1$, ex2$, userInput$
- DIM i AS INTEGER
- FOR i = 1 TO 3
- x = i: y = i * 2
- p$ = GenPlanetName$
- ex1$ = goods$(INT(RND * numGoods) + 1)
- DO: ex2$ = goods$(INT(RND * numGoods) + 1): LOOP WHILE ex2$ = ex1$
- DO: userInput$ = goods$(INT(RND * numGoods) + 1): LOOP WHILE userInput$ = ex1$ OR userInput$ = ex2$
- planet$(i) = p$ + "|" + ex1$ + "|" + ex2$ + "|" + userInput$
- planetX(i) = x: planetY(i) = y
- SavePlanetToFile x, y, p$, ex1$, ex2$, userInput$
- NEXT
- END SUB
- FUNCTION SelectPlanetByName$ ()
- DIM typed$, pname$, matchList(1 TO MAXPLANETS), matchCount, i, KEY$
- CLS
- PRINT "Travel - Type Planet Name:"
- typed$ = ""
- DO
- LOCATE 2, 1
- PRINT SPACE$(40);
- LOCATE 2, 1
- PRINT "> "; typed$;
- ' find matches
- matchCount = 0
- FOR i = 1 TO MAXPLANETS
- IF planet$(i) <> "" THEN
- pname$ = SplitString$(planet$(i), "|", 1)
- IF UCASE$(LEFT$(pname$, LEN(typed$))) = UCASE$(typed$) THEN
- matchCount = matchCount + 1
- matchList(matchCount) = i
- END IF
- END IF
- NEXT
- ' show up to 10 matches
- FOR i = 1 TO 10
- LOCATE 4 + i, 4: PRINT SPACE$(40);
- NEXT
- FOR i = 1 TO matchCount
- IF i > 10 THEN EXIT FOR
- pname$ = SplitString$(planet$(matchList(i)), "|", 1)
- LOCATE 4 + i, 4
- PRINT pname$; " ("; planetX(matchList(i)); ","; planetY(matchList(i)); ")"
- NEXT
- KEY$ = INKEY$
- IF KEY$ <> "" THEN
- IF KEY$ = CHR$(13) THEN ' ENTER
- IF matchCount = 1 THEN
- SelectPlanetByName$ = SplitString$(planet$(matchList(1)), "|", 1)
- EXIT FUNCTION
- ELSE
- PRINT: PRINT "Ambiguous or not found.": SLEEP
- SelectPlanetByName$ = ""
- EXIT FUNCTION
- END IF
- ELSEIF KEY$ = CHR$(8) AND LEN(typed$) > 0 THEN
- typed$ = LEFT$(typed$, LEN(typed$) - 1)
- ELSEIF ASC(KEY$) >= 32 AND ASC(KEY$) <= 126 THEN
- typed$ = typed$ + KEY$
- END IF
- END IF
- _Limit 30
- LOOP
- END FUNCTION
- SUB GenerateNearbyPlanets
- DIM dx, dy, px, py, exists, p$, ex1$, ex2$, userInput$
- DIM planetSlotFound AS INTEGER
- DIM attempts AS INTEGER
- PRINT ">> Starting nearby planet generation..."
- FOR dx = -1 TO 1
- FOR dy = -1 TO 1
- IF dx <> 0 OR dy <> 0 THEN
- px = x + dx
- py = y + dy
- exists = 0
- FOR i = 1 TO MAXPLANETS
- IF planet$(i) <> "" AND planetX(i) = px AND planetY(i) = py THEN exists = 1: EXIT FOR
- NEXT
- IF exists = 0 THEN
- planetSlotFound = 0
- FOR i = 1 TO MAXPLANETS
- IF planet$(i) = "" THEN
- p$ = GenPlanetName$
- ex1$ = goods$(INT(RND * numGoods) + 1)
- '=== EXPORTS
- attempts = 0
- DO
- ex2$ = goods$(INT(RND * numGoods) + 1)
- attempts = attempts + 1
- IF attempts > 100 THEN
- PRINT "FAILED to get unique ex2$ after 100 tries."
- EXIT SUB
- END IF
- LOOP WHILE ex2$ = ex1$
- '=== userInputORTS
- attempts = 0
- DO
- userInput$ = goods$(INT(RND * numGoods) + 1)
- attempts = attempts + 1
- IF attempts > 100 THEN
- PRINT "FAILED to get unique userInput$ after 100 tries."
- EXIT SUB
- END IF
- LOOP WHILE userInput$ = ex1$ OR userInput$ = ex2$
- planet$(i) = p$ + "|" + ex1$ + "|" + ex2$ + "|" + userInput$
- planetX(i) = px
- planetY(i) = py
- SavePlanetToFile px, py, p$, ex1$, ex2$, userInput$
- planetSlotFound = 1
- EXIT FOR
- END IF
- NEXT
- IF planetSlotFound = 0 THEN
- PRINT "No more space in planet list. Skipping generation."
- EXIT SUB
- END IF
- END IF
- END IF
- NEXT
- NEXT
- END SUB
- SUB ShipConsole
- DIM choice$
- DIM dockStatus$
- DIM docked AS INTEGER
- DIM dist AS INTEGER
- DIM banked AS INTEGER
- dist = ABS(x) + ABS(y)
- DO
- CLS
- PRINT "+================================================+"
- PRINT "| DELIVERANCE - SHIP CONSOLE INTERFACE |"
- PRINT "+================================================+"
- PRINT USING "| LOCATION : X: ### Y: ### SECTOR DIST : ### |"; x; y; dist
- PRINT USING "| FUEL : ### / ### CREDITS : ##### |"; fuel; 100; credits
- dockStatus$ = "IN ORBIT"
- IF docked THEN dockStatus$ = "DOCKED"
- PRINT "| SHIP MODEL : CARGO SCOUT MK I STATUS : \ |"; dockStatus$
- PRINT USING "| CARGO BAY : ### / ### BANKED : ##### |"; GetCargoCount; cargoMax; banked
- PRINT "+------------------------------------------------+"
- PRINT "| [1] Cargo Manifest [2] Planet Directory |"
- PRINT "| [3] Nav Range Monitor [4] Exit Console |"
- PRINT "| [5] Travel to Another Planet |"
- PRINT "+================================================+"
- INPUT "SELECT OPTION: ", choice$
- SELECT CASE choice$
- CASE "1": ShowCargo
- CASE "2": ShowPlanetLinks
- CASE "3": CheckTravelRange
- CASE "4": EXIT DO
- CASE "5": Travel
- END SELECT
- LOOP
- END SUB
- SUB CheckTravelRange
- CONST MAX_TRAVEL_DISTANCE = 50
- DIM dist AS INTEGER
- CLS
- PRINT "=== NAVIGATION RANGE ==="
- dist = ABS(x) + ABS(y)
- PRINT "Current Coordinates: ("; x; ","; y; ")"
- PRINT "Distance from Core (0,0): "; dist; " sectors"
- IF dist >= MAX_TRAVEL_DISTANCE THEN
- PRINT "!! WARNING: You are at or beyond safe navigation limits !!"
- ELSEIF dist >= MAX_TRAVEL_DISTANCE - 10 THEN
- PRINT ">> Caution: Approaching maximum safe range."
- ELSE
- PRINT "[OK] You are within operational range."
- END IF
- PRINT: PRINT "Press any key to return...": SLEEP
- END SUB
- FUNCTION GetCargoCount
- DIM total AS INTEGER
- total = 0
- FOR i = 1 TO numGoods
- total = total + cargo(i)
- NEXT
- GetCargoCount = total
- END FUNCTION
- SUB GenerateGalaxy (nodeCount AS INTEGER)
- DIM i AS INTEGER, j AS INTEGER, k AS INTEGER, n1 AS INTEGER, n2 AS INTEGER
- ' Initialize all node links to 0
- FOR i = 1 TO nodeCount
- FOR j = 1 TO 3
- nodeLinks(i, j) = 0
- NEXT
- visited(i) = 0
- NEXT
- ' Build connections
- RANDOMIZE TIMER
- FOR i = 1 TO nodeCount
- DO WHILE CountLinks(i) < 3
- n2 = INT(RND * nodeCount) + 1
- IF n2 <> i AND NotLinked(i, n2) AND CountLinks(n2) < 3 THEN
- AddLink i, n2
- END IF
- LOOP
- NEXT
- ' Assign planet status ~70%
- FOR i = 1 TO nodeCount
- IF RND < 0.7 THEN
- isPlanet(i) = -1
- planetName$(i) = GenPlanetName$
- planetExport1$(i) = goods$(INT(RND * numGoods) + 1)
- DO: planetExport2$(i) = goods$(INT(RND * numGoods) + 1)
- LOOP WHILE planetExport2$(i) = planetExport1$(i)
- DO: planetuserInputort$(i) = goods$(INT(RND * numGoods) + 1)
- LOOP WHILE planetuserInputort$(i) = planetExport1$(i) OR planetuserInputort$(i) = planetExport2$(i)
- ELSE
- isPlanet(i) = 0
- END IF
- NEXT
- ' Save data (optional)
- OPEN "galaxy.txt" FOR OUTPUT AS #1
- FOR i = 1 TO nodeCount
- PRINT #1, i; ","; isPlanet(i); ","; nodeLinks(i, 1); ","; nodeLinks(i, 2); ","; nodeLinks(i, 3); ",";
- IF isPlanet(i) THEN
- PRINT #1, planetName$(i); ","; planetExport1$(i); ","; planetExport2$(i); ","; planetuserInputort$(i)
- ELSE
- PRINT #1, "EMPTY"
- END IF
- NEXT
- CLOSE #1
- PRINT "Galaxy generated with "; nodeCount; " nodes."
- END SUB
- FUNCTION CountLinks (n AS INTEGER)
- DIM c AS INTEGER
- c = 0
- FOR i = 1 TO 3
- IF nodeLinks(n, i) > 0 THEN c = c + 1
- NEXT
- CountLinks = c
- END FUNCTION
- FUNCTION NotLinked (a AS INTEGER, b AS INTEGER)
- FOR i = 1 TO 3
- IF nodeLinks(a, i) = b THEN NotLinked = 0: EXIT FUNCTION
- NEXT
- NotLinked = -1
- END FUNCTION
- SUB AddLink (a AS INTEGER, b AS INTEGER)
- FOR i = 1 TO 3
- IF nodeLinks(a, i) = 0 THEN nodeLinks(a, i) = b: EXIT FOR
- NEXT
- FOR i = 1 TO 3
- IF nodeLinks(b, i) = 0 THEN nodeLinks(b, i) = a: EXIT FOR
- NEXT
- END SUB
- SUB Travel
- DIM i AS INTEGER, dest AS INTEGER
- DIM userInput$, pname$, exitCount AS INTEGER
- DIM docked AS INTEGER
- CLS
- PRINT "=== NAVIGATION CONSOLE ==="
- PRINT "CURRENT LOCATION: ";
- IF isPlanet(currentNode) THEN
- PRINT planetName$(currentNode); " (Node "; currentNode; ")"
- ELSE
- PRINT "UNKNOWN SPACE (Node "; currentNode; ")"
- END IF
- PRINT: PRINT "CONNECTED EXITS:"
- FOR i = 1 TO 3
- IF nodeLinks(currentNode, i) > 0 THEN
- dest = nodeLinks(currentNode, i)
- pname$ = "???"
- IF visited(dest) THEN pname$ = planetName$(dest)
- PRINT " ["; i; "] "; pname$; " (Node "; dest; ")"
- END IF
- NEXT
- PRINT: INPUT "Enter exit number to travel: ", userInput$
- dest = VAL(userInput$)
- IF dest < 1 OR dest > 3 THEN PRINT "Invalid exit.": SLEEP: EXIT SUB
- dest = nodeLinks(currentNode, dest)
- IF dest = 0 THEN PRINT "Link does not exist.": SLEEP: EXIT SUB
- ' Travel
- PRINT "Engaging jump drive..."
- _Delay 1.5
- currentNode = dest
- visited(currentNode) = -1
- IF isPlanet(currentNode) THEN
- docked = -1
- PRINT "Arrived at "; planetName$(currentNode); ". Docked."
- ELSE
- docked = 0
- PRINT "Arrived in deep space."
- END IF
- SLEEP
- END SUB
- ' === SUB TO DISPLAY LOCAL RADIAL GALAXY MAP ===
- SUB ShowGalaxyMap
- DIM queue(1 TO MAX_NODES) AS INTEGER
- DIM depth(1 TO MAX_NODES) AS INTEGER
- DIM seen(1 TO MAX_NODES) AS INTEGER
- DIM head AS INTEGER, tail AS INTEGER, i AS INTEGER, n AS INTEGER, link AS INTEGER
- CONST MAX_DEPTH = 5
- CLS
- PRINT "=== LOCAL GALACTIC MAP ("; MAX_DEPTH; " JUMPS) ==="
- PRINT "You are at node "; currentNode; ".": PRINT
- ' BFS traversal from currentNode
- FOR i = 1 TO MAX_NODES
- depth(i) = -1
- seen(i) = 0
- NEXT
- head = 1: tail = 1
- queue(1) = currentNode
- depth(currentNode) = 0
- seen(currentNode) = -1
- DO WHILE head <= tail
- n = queue(head): head = head + 1
- FOR i = 1 TO 3
- link = nodeLinks(n, i)
- IF link > 0 AND seen(link) = 0 THEN
- depth(link) = depth(n) + 1
- IF depth(link) <= MAX_DEPTH THEN
- tail = tail + 1
- queue(tail) = link
- seen(link) = -1
- END IF
- END IF
- NEXT
- LOOP
- ' Display map as list-style for now (grid later if needed)
- FOR i = 1 TO MAX_NODES
- IF depth(i) >= 0 AND depth(i) <= MAX_DEPTH THEN
- SELECT CASE depth(i)
- CASE 0: PRINT "[ @ ] ";
- CASE ELSE
- PRINT "[ ";
- IF visited(i) = 0 THEN
- PRINT "?"
- ELSEIF isPlanet(i) THEN
- PRINT "*"
- ELSE
- PRINT "."
- END IF
- PRINT " ] Node "; i; " Depth: "; depth(i)
- END SELECT
- END IF
- NEXT
- PRINT: PRINT "LEGEND: @ = You, * = Planet, . = Empty, ? = Unknown"
- PRINT "Press any key to return...": SLEEP
- END SUB
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement