From da035e656d6a7945c32f29cd9b550c0be434120d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hans=20H=C3=BCbner?= Date: Fri, 10 May 2024 18:29:05 +0200 Subject: [PATCH] Adapt to VT100/ANSI escape codes --- README.md | 18 ++++++++------- trek52.bas => fstrek.bas | 47 +++++++++++++++++++++++++++++++++------ trek52cr.bas.zip | Bin 11548 -> 0 bytes 3 files changed, 50 insertions(+), 15 deletions(-) rename trek52.bas => fstrek.bas (95%) delete mode 100644 trek52cr.bas.zip diff --git a/README.md b/README.md index f9a0531..8102fa0 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ -# Trek52 +# Fullscreen TREK for RSTS/E -Trek52 is a re-creation of the classic text-based Star Trek game that uses VT52 escape codes to make the game more graphical on that terminal. +fstrek is a re-creation of the classic text-based Star Trek game that +supports full-screen gameplay for VT52 and VT100 (ANSI compatible) +terminals. -It is written in Digital Equipment Corporation's BASIC Plus. +It is written in Digital Equipment Corporation's BASIC Plus for the +RSTS/E operating system. -You can see a video demo at [Star Trek, and the evolution of a BASIC programmer - YouTube](https://youtu.be/ksL232PHivI) +This program was originally written by Bob Flanders and released on +June 3, 2022. -Bob Flanders June 3, 2022 +You can see a video demo at +[Star Trek, and the evolution of a BASIC programmer - YouTube](https://youtu.be/ksL232PHivI) -The trek52cr.bas.zip contains a the .bas program that has carriage returns only and is more suitable for loading into RSTS/E Basic-Plus. (Line feeds mess up the load.) - -https://groups.google.com/g/pidp-11/c/K-DzzAX4x70 and the entry on 6/3/2022 at midnight has directions how to use it. diff --git a/trek52.bas b/fstrek.bas similarity index 95% rename from trek52.bas rename to fstrek.bas index 63ca3f8..7c90be1 100644 --- a/trek52.bas +++ b/fstrek.bas @@ -1,10 +1,11 @@ -! TREK52 - A version of Star Trek for the VT52 terminal +! TREK - A version of Star Trek for RSTS/E ! Written by Bob Alexander - bob@GalacticStudios.org ! Implemented in DEC BASIC-PLUS. ! Inspired by the original Star Trek game written by ! Mike Mayfield. ! Written in 2022. Released to the public domain. No rights reserved. +! Adapted from TREK52 to also support VT100 sequences by Hans Huebner. ! Set up the environment 110 extend @@ -32,7 +33,11 @@ ! damage report 185 commandX% = 25% : commandY% = 14% : damageX% = 0% : damageY% = 14% -! Initialize the VT52 escape codes +! Determine terminal type +186 terminalType% = fnGetTerminalType%() +187 if terminalType% = 0 then print "Unknown terminal, can't continue" : stop + +! Initialize the terminal escape codes 190 q = fnInitializeEscapeCodes ! Use RSTS' input trick for getting a single character from the @@ -224,8 +229,30 @@ ! Modulo function 2210 def fnmod%(n%, d%) = n% - n% / d% * d% +! Terminal handling +2220 def fnGetTerminalType%() +2225 dim returned%(30) +2230 change sys(chr$(6%)+chr$(16%)+chr$(0%)+chr$(255%)+chr$(0%)) to returned% +2235 if returned%(11%) = 128% then goto 2255 ! Hardcopy +2240 change sys(chr$(6%)+chr$(16%)+chr$(1%)+chr$(255%)+chr$(0%)) to returned% +2245 if returned%(5) = 3% then fnGetTerminalType% = 1 : goto 2260 ! VT52 +2250 if returned%(25) and 1% then fnGetTerminalType% = 2 : goto 2260 ! ANSI +2255 fnTerminalType% = 0 +2260 fnend + +2300 def fnBareNum$(n%) +2301 rn$ = num$(n%) +2302 l% = len(rn$) +2303 fnBareNum$ = mid(rn$, 2, l% - 2) +2304 fnend + ! Return a string that will position cursor at x, y -2310 def fnCursor$(x%, y%) = esc$ + "Y" + chr$(y% + 32%) + chr$(x% + 32%) +2310 def fnCursor$(x%, y%) +2320 if terminalType% = 1 then & + fnCursor$ = esc$ + "Y" + chr$(y% + 32%) + chr$(x% + 32%) +2330 if terminalType% = 2 then & + fnCursor$ = esc$ + "[" + fnBareNum$(y%+1) + ";" + fnBareNum$(x%+1) + "H" +2340 fnend ! Return a right justified NUM$ 2410 def fnRNum$(n%, width%) @@ -935,7 +962,7 @@ ! Welcome the user and print instructions 32010 def fnWelcome 32015 print clearScreen$; -32020 print " * * * VT52 STAR TREK * * *" : print +32020 print " * * * RSTS/E STAR TREK * * *" : print 32030 print "Do you want instructions (Y, [N])? "; 32035 a$ = fnGetChar$() : a$ = cvt$$(left(a$, 1), 32%) : print clearScreen$; 32040 for dummy% = 1% while a$ <> "N" @@ -964,12 +991,18 @@ 32255 q$ = sys(chr$(2%)) ! Re-enable echoing 32260 fnend -! Initialize VT52 escape codes +! Initialize terminal escape codes 32410 def fnInitializeEscapeCodes 32420 esc$ = chr$(27% + 128%) 32430 startOfLine$ = chr$(13%) -32440 clearLine$ = esc$ + "K" -32450 clearScreen$ = esc$ + "H" + esc$ + "J" +! VT52 +32440 if terminalType% = 1% then & + clearLine$ = esc$ + "K" : & + clearScreen$ = esc$ + "H" + esc$ + "J" +! VT100 +32450 if terminalType% = 2% then & + clearLine$ = esc$ + "[K" : & + clearScreen$ = esc$ + "[H" + esc$ + "[2J" 32490 fnend 32500 data " Instructions", & diff --git a/trek52cr.bas.zip b/trek52cr.bas.zip deleted file mode 100644 index b80756bd31207340227ecb16804698e6833b17df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11548 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 L{u`wk{