Jump to content
hlabrand

New text adventure for the TI-99/4A using Infocom's tools

Recommended Posts

Hi TI-99/4Aers!

I am currently writing a text adventure, "Tristam Island", for retro (and some handheld) systems. I am aiming for about two dozen of different ports: Commodore 64, PET, VIC-20, Apple II, Amstrad CPC, TRS-80 CoCo, Atari 8-bit, Atari ST, Amiga, Spectrum, etc. (but also Dreamcast, Game Boy Color, Game Boy Advance, and Nintendo DS !).

Today, I have exciting news to share with you: I will be releasing this text adventure for the TI-99/4A! As far as I know (correct me if I'm wrong), this will be the first text adventure that uses Infocom's tools to be released in 30odd years! :D

If you recall, Barry Boone was the first to figure out how to reuse Infocom's interpreter with different game data; this was used to release post-1984 Infocom games like Ballyhoo or Leather Goddesses of Phobos, after Infocom stopped making official versions. Boone's interpreter also provided fixes, and compatibility with 80-column displays, and the Geneve.
The tricky part was managing to massage the game file into the format chosen by Infocom (two D/F 255 files). With help from Boone himself, and from Shift838 (who helped me getting started with the TI-99/4A and hacked the disk image to load the correct things), I wrote a Python script that takes a ".z3" Z-Machine file, and outputs the two files needed by the TI-99/4A interpreter, in the correct format.
I am happy to release this script for all to use, on my Github account. The simplest way to use it is to take an Infocom file (zork1.dsk for instance) and name your game ZRK1.z3; the Python script will give you 2 files that you can copy (using TI99dir) inside zork1.dsk, overwriting the Infocom game files. All that remains is hacking the other files to get it to display something else than "Zork" in the title menu; if you bug Shift838 enough, I am told he might consider building a user-friendly tool which does that hacking for you :)

I hope you're as excited by this as I am! If you want more regular updates on the game, you should follow me on Twitter (@hlabrande); if you want to get notified of the release, you should follow me on itch.io! And of course, a big thank you to Barry Boone and Shift838

49-TI994A.png

49-TI994A-80col.png

  • Like 13

Share this post


Link to post
Share on other sites

Oh this is awesome! A new Z-machine adventure ported! I think you are right that you are first to port new content!

I look forward to putting it on real hardware!

  • Like 1

Share this post


Link to post
Share on other sites

@FarmerPotato Thanks! I'm exploring the possibility of a physical release, big box and disk and feelies and all 😁

 

@InsaneMultitasker Thank you 😁 Also the hard work of Barry Boone and @Shift838 ! But yeah, I figured that my Python script should be given back to the community; it's only fair!


If anyone is interested about going this route to make games, you should look at Inform 6. The latest version of the compiler (here or here) fixed the ability to compile for the Z-Machine v3 (the only one supported by the TI-99/4A); there's lots of documentation, and the library PunyInform is a compact alternative to the standard library, allowing you to pack even more in a game.

The only thing I'm worried about is the fact that some of the Infocom games required a Supercart. Can anyone recall when an Infocom game needs a supercart or not?

(I think it has to do with the Z-machine's virtual memory, not the game file size, but I can't find that information again. 48K max? I don't remember.)

  • Like 2
  • Thanks 1

Share this post


Link to post
Share on other sites

On a related note, the F18A-compatible 80 column interpreter is in this thread.  I don't think I added the F18A interpreter option to the LOAD program at the time.    When you are closer to a release, if you want to also test this version and need to adjust anything, let me know.  IIRC, the interpreter I modified is slightly older than Barry's final release. I had to work within F18A 'constraints' i.e., 16K vram versus 128k+ vram.

 

Share this post


Link to post
Share on other sites

Nice to see a new Infocom Z3 game released that supports multiple classic systems.

Many thanks to your efforts there!!

 

I'm also glad to see that Inform 6 is finally fixed for proper Z3 creation.

Share this post


Link to post
Share on other sites
Posted (edited)
11 hours ago, jrhodes said:

Wasn't there pong and tetris versions done inside the infocom engine?

Tetris, yeah, under the name "Freefall". (And also "ZTrek", the very old Star Trek game.) But it uses "Z-Machine version 5" (interpreters post 1986), whose specification that has support for real-time delays (used in Border Zone, for instance); the "Z-Machine version 3" (the only one compatible with the TI-99/4A) sadly doesn't support this. (It doesn't support much: no bold or underlining, no color, no "wait for a key" if I remember correctly... It's a text-spitting machine, that's all :D)

Edited by hlabrand

Share this post


Link to post
Share on other sites

Yep! Stefan is also working on his own z3 game, so I forwarded the tools to him (like he does when he has some!). And he found a way to make the building process automatic, which is very nice (no need to start TIdir99 every time to replace the files on the disk with the newest version when I want to test stuff!).

 

His game is a sequel to Hibernated 1, that he wrote using the DAAD system; both are science-fiction games.

Edited by hlabrand

Share this post


Link to post
Share on other sites

If was great to work with @hlabrande, even though he did all of his py scripting and I just provided insight and explanations.  It did get me thinking to design a python based GUI that is cross-platform compatible like I did for my OoeyGUI v3 for use with MAME.  And @hlabrande gave me permission to integrate his script within it.  

 

With IDE orders almost completely filled I have been able to carve out some time to work on it and I'm about 75% done already. 

 

This GUI will take @hlabrande python script and use it to convert the game data file to the respective required files formats for use on the TI and Geneve systems.  It will then output new binaries and XB LOAD program for use on the TI and Geneve for 40 column, 9938 and F18A Infocom interpreters and deposit them all in a nice project directory.

 

I'm working on the output of the new files now, then I'll know for sure if it works like I think it should or I will have to rethink it.

 

It will end up being a compiled python program again so that all the included libraries are already included in a self contained package and should work on Windows, Linux and Mac.

 

 

 

 

2020-08-24_15-37-14.jpg

Edited by Shift838
  • Like 5

Share this post


Link to post
Share on other sites

So I have the program working to output the interpreters for the correct video displays.  I still need to incorporate @hlabrande but I will change it to a moduled function for python.  Once I get that done then I will have to add some logic to make sure fields are not blank, etc.

 

I have added a few more fields to the form and all inputs will be converted to uppercase for filenames, etc.  since the new interpreters allow for real lower case on the TI, that will not be converted.

 

 

2020-08-25_22-18-41.jpg

  • Like 3

Share this post


Link to post
Share on other sites

Does this XB routine match the Python script?  I found it on one of my disk images.  I never sorted out why C$ was accumulating a byte from each record...

 

100 OPEN #1:"DSK3.DUMP",INPUT,FIXED 128
110 OPEN #2:"DSK1.GAME1",OUTPUT,FIXED 255,RELATIVE90
120 OPEN #3:"DSK1.GAME2",OUTPUT,FIXED 255
125 FOR I=1 TO 24 :: LINPUT #1:A$ :: LINPUT #1:B$ :: NEXT I
130 FOR I=1 TO 88 :: LINPUT #1:A$ :: LINPUT #1:B$ :: PRINT #2:A$&SEG$(B$,1,127) :: C$=C$&SEG$(B$,128,1) :: NEXT I
140 PRINT "GAME1 generated!"
150 FOR I=1 TO 415 :: LINPUT #1:A$ :: LINPUT #1:B$ :: PRINT #3:A$&SEG$(B$,1,127) :: C$=C$&SEG$(B$,128,1) :: IF LEN(C$)=255 THEN CALL NUKE(C$)
160 PRINT "."; :: NEXT I
170 CLOSE #3 :: PRINT #2:C$ :: CLOSE #2 :: CLOSE #1
180 END
190 SUB NUKE(C$)
200 PRINT #2:C$ :: C$=""
210 SUBEND

 

Share this post


Link to post
Share on other sites

The accumulated byte is the 256th byte of all records in the original Z3 DAT file.  All these bytes are appended at the end of the GAME1 file, which is loaded into memory and are indexed for GAME1 & GAME2 to make 256 byte records -- 128 bytes + 127 bytes + indexed byte.  Hence the usage of the Super Cart requirements for certain games that needed the extra memory for indexing and interpreter usage.

 

--INFOCOM 32K-----

 

GAME1 (Orig Z3-DAT $0000-57FF)

0000-57FF  128+127+empty-byte (either $EF or $00)

5800-end  missing 256th end-bytes

 

GAME2 (Orig Z3-DAT $5800-end)

0000-end  128+127+empty-byte (either $EF or $00)

 

--INFOCOM 32K + 8K SuperCart-----

 

GAME1 (Orig Z3-DAT $0000-5FFF)

0000-5FFF  128+127+empty-byte (either $EF or $00)

6000-end  missing 256th end-bytes

 

GAME2 (Orig Z3-DAT $6000-end)

0000-end  128+127+empty-byte (either $EF or $00)

 

Also the end of GAME2 is padded out to 512 bytes or the $VERIFY command fails (Barry Boones Interpreter must be assuming a PC Floppy 512 byte sector size).

 

  • Like 1

Share this post


Link to post
Share on other sites

Classic 99 makes this a lot easier.  It's best to use a separate directory and turn overdrive on.

 

Just take an original Z3 DAT file and rename it to Z3.  And use the first program below.

The padding logic is missing as I used a windows hex editor (HxD Hex Editor) for this.

Two files are created named ZDAT1 and ZDAT2 which can be renamed to GAME1 and GAME2.

 

The second program is used if the files fail to load in the regular or 80 column interpreters.

It will create two files for use with the SuperCart interpreter.

 

The third one will recreate the Z3 file from two ZDAT1 and ZDAT2 files.

I used this as several Master's conversions were different from the official releases.

 

There are various Z3 files on the net that will not work with Barry Boone's TI Infocom Interpreters.

 

 

INFOCOM Z3-2-TI CONVERTOR

100 ! INFOCOM Z3-2-TI CONVERTOR
110 I=0 :: A$,B$,C$=""
120 OPEN #1:"DSK1.Z3",INPUT ,FIXED 128
130 OPEN #2:"DSK1.ZDAT1",OUTPUT,FIXED 255
140 OPEN #3:"DSK1.ZDAT2",OUTPUT,FIXED 255
145 PRINT :"Creating ... GAME1"
150 FOR I=1 TO 88
160 LINPUT #1:A$ :: LINPUT #1:B$
170 C$=A$&SEG$(B$,1,127):: E$=E$&SEG$(B$,128,1)
180 PRINT #2:C$
190 NEXT I
195 PRINT "Creating ... GAME2"
200 A$,B$=""
210 LINPUT #1:A$ :: C$=A$ :: IF EOF(1)THEN 230
220 LINPUT #1:B$
230 IF LEN(B$)<128 THEN C$=C$&B$ ELSE C$=C$&SEG$(B$,1,127)
240 IF LEN(E$)<=254 THEN E$=E$&SEG$(B$,128,1)ELSE PRINT #2:E$ :: E$=SEG$(B$,128,1)
250 PRINT #3:C$
260 IF EOF(1)THEN 280
270 GOTO 200
280 PRINT #2:E$
285 PRINT "Finished!!!"
290 CLOSE #3 :: CLOSE #2 :: CLOSE #1
999 END

 

INFOCOM Z3-2-TI SC CONVERTOR

100 ! INFOCOM Z3-2-TI SC CONVERTOR
110 I=0 :: A$,B$,C$=""
120 OPEN #1:"DSK1.Z3",INPUT ,FIXED 128
130 OPEN #2:"DSK1.ZDAT1",OUTPUT,FIXED 255
140 OPEN #3:"DSK1.ZDAT2",OUTPUT,FIXED 255
145 PRINT :"Creating ... GAME1"
150 FOR I=1 TO 96
160 LINPUT #1:A$ :: LINPUT #1:B$
170 C$=A$&SEG$(B$,1,127):: E$=E$&SEG$(B$,128,1)
180 PRINT #2:C$
190 NEXT I
195 PRINT "Creating ... GAME2"
200 A$,B$=""
210 LINPUT #1:A$ :: C$=A$ :: IF EOF(1)THEN 230
220 LINPUT #1:B$
230 IF LEN(B$)<128 THEN C$=C$&B$ ELSE C$=C$&SEG$(B$,1,127)
240 IF LEN(E$)<=254 THEN E$=E$&SEG$(B$,128,1)ELSE PRINT #2:E$ :: E$=SEG$(B$,128,1)
250 PRINT #3:C$
260 IF EOF(1)THEN 280
270 GOTO 200
280 PRINT #2:E$
285 PRINT "Finished!!!"
290 CLOSE #3 :: CLOSE #2 :: CLOSE #1
999 END

 

INFOCOM TI-2-Z3 CONVERTOR
 

100 ! INFOCOM TI-2-Z3 CONVERTOR
105 ! IDX=88  Normal
106 ! IDX=96  Super Cart
110 I,A,C,F=0 :: A$,B$,C$="" :: IDX=96
120 OPEN #3:"DSK1.Z3",OUTPUT,FIXED 128
130 OPEN #1:"DSK1.ZDAT1",RELATIVE,INPUT ,FIXED 255
140 OPEN #2:"DSK1.ZDAT2",RELATIVE,INPUT ,FIXED 255
145 PRINT :"Creating ... Z3 DAT"
150 C=96 :: LINPUT #1,REC C:C1$ :: LINPUT #1,REC(C+1):C2$ :: C$=C1$
160 FOR I=0 TO (C-1)
170 LINPUT #1,REC I:B$
180 A$=SEG$(B$,1,128):: PRINT #3:A$
190 A=A+1 :: A$=SEG$(B$,129,255)&SEG$(C$,A,1):: PRINT #3:A$
200 NEXT I
210 I=-1
220 I=I+1 :: LINPUT #2,REC I:B$ :: IF EOF(2)THEN F=1
230 A$=SEG$(B$,1,128):: PRINT #3:A$
240 A=A+1 :: A$=SEG$(B$,129,255)&SEG$(C$,A,1):: PRINT #3:A$ :: IF A=255 THEN C$=C2$ :: A=0
250 IF F=0 THEN 220
285 PRINT "Finished!!!"
290 CLOSE #3 :: CLOSE #2 :: CLOSE #1
999 END

 

 

Tyler

Edited by Torrax
fixes
  • Like 1
  • Thanks 2

Share this post


Link to post
Share on other sites

Now I have a complete working application.  Still need to test more to make sure there are no errors.  But I have converted successfully 3 different z3 infocom game files for use on the TI for 40 column, 9938 nd F18A.

 

If the z3 file is too small a message box will pop up letting you know too.  See attached screenshots and I have attached the disk image as well.

 

 

 

 

 

 

 

 

 

 

 

GUSS.dsk

xb-boot.jpg

40-1.jpg

40-2.jpg

9938-2.jpg

f18a-2.jpg

Edited by Shift838
  • Like 9

Share this post


Link to post
Share on other sites

Chris,

 

Here's the latest XB loader and a conversion of a Z3 game called Adventure (based on the original 1977 version).

The menu format is slightly different -- displays the Title Bar; Game Name; and Interpreter versions.

Looks a lot cleaner with the removal of the game name in the menu options and being displayed just once.

Also the EA5 loader is updated to the latest and removal of the large fonts (dead source disk).

ADVENTURE.zip

Share this post


Link to post
Share on other sites
13 hours ago, Torrax said:

Chris,

 

Here's the latest XB loader and a conversion of a Z3 game called Adventure (based on the original 1977 version).

The menu format is slightly different -- displays the Title Bar; Game Name; and Interpreter versions.

Looks a lot cleaner with the removal of the game name in the menu options and being displayed just once.

Also the EA5 loader is updated to the latest and removal of the large fonts (dead source disk).

ADVENTURE.zip 70.26 kB · 5 downloads

Nicely done!

 

And thank you for posting that code to convert a z3 for SuperCart version.  That helped a lot, now I have standard and SuperCart size working on my GUI.

 

I still have not been able to get the smaller games to convert correctly though.

 

 

Share this post


Link to post
Share on other sites

Hi all!

 

Today I released the free demo for my game "Tristam Island"! You can find it here.

It's about ~90 minutes of gameplay (the final game will be 3-4 times larger). If you like it, you can preorder the full game here !

I'm also currently in talks with a publisher for a physical release; we're hoping to have a box that looks similar to the Infocom style :)

 

The demo uses the TI-99/4A interpreter, so it should work in a variety of settings (40-col, 80-col, Geneve, etc). But please let me know if you're having any trouble!

And a big thank you to the TI-99/4A community for their warm welcome and their work on the tools! :)

  • Like 4

Share this post


Link to post
Share on other sites
11 hours ago, hlabrand said:

Hi all!

 

Today I released the free demo for my game "Tristam Island"! You can find it here.

It's about ~90 minutes of gameplay (the final game will be 3-4 times larger). If you like it, you can preorder the full game here !

I'm also currently in talks with a publisher for a physical release; we're hoping to have a box that looks similar to the Infocom style :)

 

The demo uses the TI-99/4A interpreter, so it should work in a variety of settings (40-col, 80-col, Geneve, etc). But please let me know if you're having any trouble!

And a big thank you to the TI-99/4A community for their warm welcome and their work on the tools! :)

Very cool.  I downloaded the disk image so that I can try it out soon.  I noticed that the F18A 80 column interpreter is not present on the disk image.  Most of the TI users who leverage 80 columns on 'real iron' will have the F18A video upgrade and unfortunately, the version on the disk will not work with that hardware update.

 

One other note/question:  in your documentation, what is the specific reason for requiring Extended BASIC 2.5?  I did not see anything in the LOAD program that would preclude using the standard XB cartridge.

Share this post


Link to post
Share on other sites

Uh... you know, I think it's just habit actually. I did it like that the first time and it worked, and I've never tried to do it differently lol.

Would it be LOAD and then the interpreter file name? And I should write the name of each file in the manual just to be clear?

 

As for the F18A 80 col interpreter, I have a note somewhere in my dev folder that says "closer to release, ask InsaneMultitasker on AtariAge about the F18A 80 col interpreter". So I guess I forgot to do that... Oops. Thanks for reminding me!

 

I hope you enjoy the demo :D

Share this post


Link to post
Share on other sites
5 minutes ago, hlabrand said:

Uh... you know, I think it's just habit actually. I did it like that the first time and it worked, and I've never tried to do it differently lol.

Would it be LOAD and then the interpreter file name? And I should write the name of each file in the manual just to be clear?

 

As for the F18A 80 col interpreter, I have a note somewhere in my dev folder that says "closer to release, ask InsaneMultitasker on AtariAge about the F18A 80 col interpreter". So I guess I forgot to do that... Oops. Thanks for reminding me!

 

I hope you enjoy the demo :D

Got it!  My guess is standard XB works just fine.  I'll add the F18A version to your disk image and test with standard XB; when done, I'll PM it to you for testing and you can place on your site.  

 

I've been otherwise occupied the past 2 weeks and things are finally winding down, so I will return to work on the updated interpreter this week provided I am not too distracted by the demo :) 

  • Like 3

Share this post


Link to post
Share on other sites

PM'd you an updated disk image.   The LOAD program works fine with standard Extended BASIC. 

 

FYI, the loader did not work for me under Geneve emulation. Has anyone else successfully used this specific LOAD program with a Geneve?

 

Edit:   @Torrax uploaded an updated loader in post #18. I missed that earlier.  I'll grab it and test with a Geneve tomorrow. 

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...