Jump to content
IGNORED

Colossal Cave Adventure diary


vprette

Recommended Posts

You really might want to look into Joe's advent.zip file above (in message 33). He has a perl script that makes a dictionary entry for each word, and then makes a string where each word is replaced by single number. The way he has set up the labels makes it easy to still read the text. The text files are much smaller this way.

 

Maybe a similar automated approach could help you with your data entry.

Link to comment
Share on other sites

You really might want to look into Joe's advent.zip file above (in message 33). He has a perl script that makes a dictionary entry for each word, and then makes a string where each word is replaced by single number. The way he has set up the labels makes it easy to still read the text. The text files are much smaller this way.

 

Maybe a similar automated approach could help you with your data entry.

 

Also, as I mentioned before, ideally you want a single routine to display the text and just read the appropriate entry from the look-up table. You can just put all your text blocks in a text file and process them through Joe's script. That will definitely make it easier to complete the entire set of data.

 

We can help in the implementation of the display routine to unpack the strings.

 

-dZ.

Link to comment
Share on other sites

mmm... I downloaded the keyboard demo and run jzintv with ecs option on.... I see the blinking cursor by taping on the keyboard of my notebook has no effect

You have to press the "F7" key to switch the keyboard to ECS mode. Press the"F5" key to switch the keyboard back.

(as described in jzintv/docs/programming/jzintv/jzintv.txt)

Link to comment
Share on other sites

mmm... I downloaded the keyboard demo and run jzintv with ecs option on.... I see the blinking cursor by taping on the keyboard of my notebook has no effect

 

Valter, we need to work on hooking up Joe's keyboard decoder to P-Machinery. It should be simple, but P-Machinery has some expectations as to the input and output registers used, so the code may require some tweaking. I'll try to work on that by next week.

 

I am concurrently working on the new version of P-Machinery, documentation for it, and finishing up Christmas Carol. I am the true poster-boy for Structured Procrastination. :)

 

-dZ.

Link to comment
Share on other sites

mmm... I downloaded the keyboard demo and run jzintv with ecs option on.... I see the blinking cursor by taping on the keyboard of my notebook has no effect

 

Valter, we need to work on hooking up Joe's keyboard decoder to P-Machinery. It should be simple, but P-Machinery has some expectations as to the input and output registers used, so the code may require some tweaking. I'll try to work on that by next week.

 

I am concurrently working on the new version of P-Machinery, documentation for it, and finishing up Christmas Carol. I am the true poster-boy for Structured Procrastination. :)

 

-dZ.

 

dZ,

 

In one program where I added keyboard support, I just added the following into SCANHAND, just after the opening PSHR:

 

   IF DEFINED SCAN_KBD
           CALL    SCAN_KBD
           CMPI    #KEY.NONE, R0
           BEQ     @@no_key

           MOVR    R0,     R1
           MVI     SHDISP, R2
           TSTR    R2
           BEQ     @@no_key

           ADDI    #3,     R2
           MVI@    R2,     R0
           JSRD    R5,     QTASK
@@no_key:
   ENDI

 

And then, in the hand-controller dispatch tables, I added a fourth dispatch vector to handle keyboard events.

 

The best solution in the world? Perhaps not. But it was really really easy.

 

For P-Machinery, you probably want to be able to change input modes between keyboard + controllers and controllers only, if only for the fact that scanning the keyboard is so time consuming.

Link to comment
Share on other sites

   IF DEFINED SCAN_KBD
           CALL    SCAN_KBD
           CMPI    #KEY.NONE, R0
           BEQ     @@no_key

           MOVR    R0,     R1
           MVI     SHDISP, R2
           TSTR    R2
           BEQ     @@no_key

           ADDI    #3,     R2
           MVI@    R2,     R0
           JSRD    R5,     QTASK
@@no_key:
   ENDI

...

For P-Machinery, you probably want to be able to change input modes between keyboard + controllers and controllers only, if only for the fact that scanning the keyboard is so time consuming.

 

Hmm... looking at that code again, if you don't mind burning an add'l word of stack, you could move the tests around and control keyboard scanning via your SHDISP table:

 

   IF DEFINED SCAN_KBD
           MVI     SHDISP, R2
           TSTR    R2
           BEQ     @@no_key

           ADDI    #3,     R2
           MVI@    R2,     R0
           TSTR    R0
           BEQ     @@no_key

           PSHR    R0              
           CALL    SCAN_KBD
           MOVR    R0,     R1
           PULR    R0
           CMPI    #KEY.NONE, R1
           BEQ     @@no_key
           JSRD    R5,     QTASK
@@no_key:
   ENDI

 

Now if the fourth entry in your SHDISP table is 0, it won't scan the keyboard. Sure, it's still a hamfisted solution in many ways, but easy to add in. For a game like Colossal Cave it may be adequate.

Link to comment
Share on other sites

mmm... I downloaded the keyboard demo and run jzintv with ecs option on.... I see the blinking cursor by taping on the keyboard of my notebook has no effect

 

Valter, we need to work on hooking up Joe's keyboard decoder to P-Machinery. It should be simple, but P-Machinery has some expectations as to the input and output registers used, so the code may require some tweaking. I'll try to work on that by next week.

 

I am concurrently working on the new version of P-Machinery, documentation for it, and finishing up Christmas Carol. I am the true poster-boy for Structured Procrastination. :)

 

-dZ.

 

dZ,

 

In one program where I added keyboard support, I just added the following into SCANHAND, just after the opening PSHR:

 

IF DEFINED SCAN_KBD
		CALL	SCAN_KBD
		CMPI	#KEY.NONE, R0
		BEQ	 @@no_key

		MOVR	R0,	 R1
		MVI	 SHDISP, R2
		TSTR	R2
		BEQ	 @@no_key

		ADDI	#3,	 R2
		MVI@	R2,	 R0
		JSRD	R5,	 QTASK
@@no_key:
ENDI

 

And then, in the hand-controller dispatch tables, I added a fourth dispatch vector to handle keyboard events.

 

The best solution in the world? Perhaps not. But it was really really easy.

 

For P-Machinery, you probably want to be able to change input modes between keyboard + controllers and controllers only, if only for the fact that scanning the keyboard is so time consuming.

 

Joe, P-Machinery doesn't use SCANHAND. It re-implements it to break it out into different "decoders" and uses the state dispatch table to assign a decoder to each sub-state. This makes it even simpler to add ECS Keyboard support exactly when it is wanted only.

 

It should be real easy to take your code as is and add it to P-Machinery. I just need to mind the output register in order to be consistent. I also want to take the time and understand the code before incorporating it and this may take a couple of days.

 

-dZ.

Link to comment
Share on other sites

 

For P-Machinery, you probably want to be able to change input modes between keyboard + controllers and controllers only, if only for the fact that scanning the keyboard is so time consuming.

 

Joe, P-Machinery doesn't use SCANHAND. It re-implements it to break it out into different "decoders" and uses the state dispatch table to assign a decoder to each sub-state. This makes it even simpler to add ECS Keyboard support exactly when it is wanted only.

 

It should be real easy to take your code as is and add it to P-Machinery. I just need to mind the output register in order to be consistent. I also want to take the time and understand the code before incorporating it and this may take a couple of days.

 

-dZ.

 

Also, P-Machinery's input decoder framework could use a bit of work. It merges both the left and right controller, but has no capabilities for games that require two controllers simultaneously. It also only treats the disc as either a 4-way joystick with rolling-thumb heuristics, or a 4-direction switch with dead-zone diagonals.

 

These were the requirements for Pac-Man and Christmas Carol; it's time for it to break out of that box. :)

 

-dZ.

Link to comment
Share on other sites

 

Joe, P-Machinery doesn't use SCANHAND. It re-implements it to break it out into different "decoders" and uses the state dispatch table to assign a decoder to each sub-state. This makes it even simpler to add ECS Keyboard support exactly when it is wanted only.

 

It should be real easy to take your code as is and add it to P-Machinery. I just need to mind the output register in order to be consistent. I also want to take the time and understand the code before incorporating it and this may take a couple of days.

 

Heck, it should be easy enough to tweak SCAN_KBD to use different registers, too, if it ends up fitting better with the rest of P-Machinery.

 

I don't quite remember why I set KEY.NONE to $FF instead of $00. I don't see anything in the code that precludes that change either, so if that makes your life easier, go with it.

 

Once you get past all the vagaries of the hardware, the code itself is actually pretty simple.

Link to comment
Share on other sites

It should be real easy to take your code as is and add it to P-Machinery.

 

One other thought: For P-Machinery, you probably do want to include the suggested DIS/EIS pairs that I mentioned in the tutorial thread, just to avoid any wackiness between the keyboard code, the SFX engine and the tracker.

Link to comment
Share on other sites

New status (Blue is done, Green is faisable, Yellow is difficult. Red is very hard to code for me)

 

- TITLE SCREEN: ok (custom screen)

- INTRO: ok (welcome message)

- INIT: ok (integrate tracker and start demo music)

- FONT: ok (custom)

- CONTENTS: insert all levels message text descriptions - 79 over 214 [huge task]

- MUSIC: translate mod to decles of custom music "shadows" 0%

- PLAYER STATE: ok (add state PAGE)

- PLAY ENGINE1: ok (implement transition from PAGE to PAGE and PAGE to PLAY by reconnaising disc pressure)

- PLAY ENGINE2: ok (inputs from keypad reconnaise 8 directions, "Clear" as music pause and disc touch)

- PLAY ENGINE3: implement text input from keyboard (must reconnaise ONLY characters not symbols except ?) 0%

- PLAY ENGINE4: implement level transition maps [huge task] - 14 macro_maps - 1%

- PLAY ENGINE5: implement answer logic machine (game walkthrough) [huge task] - 0%

- PLAY ENGINE6: implement the parser to reconnaise text/keypad commands inserted to be used by login transition machine [huge task] 0%

- PLAY ENGINE7: ok (implement music pause)

- SCORE: implement scoring 0%

- BUG TESTING: 1 bug discovered/solved :-)

- BOX: 80%

- OVERLAYS: 0%

- MANUAL: 5%

Overall: 25%

Edited by vprette
Link to comment
Share on other sites

Few initial concepts to be clarified about game engine

 

- the parser will be called from MY_INPUT proc, that is running during play state (right?)

- the map transition is independent from the parser, and can be written in the MY_INPUT as a sequnce of:

if keytab is N then (if youre in level_1 move to leve_2; if youre in LEVEL_4 move to LEVEL_7 etc.)

if keytab is NE then (etc.)

is this the best solution? or this transition must be writte inside the parser itself.... because this part I could already code without thinking of the parser at the moment (that's it, command recognition like TAKE or EAT is different from map movement recognition in my approach)

 

I would define a global variable that say in which level I am (update everytime I enter a level)

in MY_INPUT, when I press of the 9 directions, I check the variable and call another LEVEL depending on which level I am...

Edited by vprette
Link to comment
Share on other sites

Few initial concepts to be clarified about game engine

 

- the parser will be called from MY_INPUT proc, that is running during play state (right?)

 

MY_INPUT was the procedure assigned to a sub-state that handles showing text pages. You need another sub-state for capturing user input.

 

The idea is that you have a state for regular play, let's call it "command," in which you are waiting for input from the user: the user types his command and the characters are displayed.

 

Then the user hits the "ENTER" key and you switch states to "process," in which no input is being accepted, and the game parses the text and tokenizes the command in order to know what to do.

 

When the command is parsed and tokenized and the resulting action is computed, then you switch to the "page" state, in which you display a page of text and wait for user input to switch to the next one.

 

And finally, when all pages are rendered, the game switches back to "command" state and waits for more user input.

 

This is just an example, but the intention is to treat your game as a finite state machine. Each machine state is defined in the state dispatch table and assigned an input decoder or none.

 

- the map transition is independent from the parser, and can be written in the MY_INPUT as a sequnce of:

 

if keytab is N then (if youre in level_1 move to leve_2; if youre in LEVEL_4 move to LEVEL_7 etc.)

if keytab is NE then (etc.)

is this the best solution? or this transition must be writte inside the parser itself.... because this part I could already code without thinking of the parser at the moment (that's it, command recognition like TAKE or EAT is different from map movement recognition in my approach)

 

I'm not sure what the "map transition" is? Apart from the command-line input parser, is there going to be a "map" screen in which the user moves around using the disc? If so, I expect this to be a separate sub-state with its own handler routine:

  • User enters command: "MAP"
  • System switches to "map" sub-state, displays the map and accepts now disc input
  • Player moves around in the map
  • Player hits some "exit" key
  • System switches back to "command" sub-state and waits for more user commands.

I would define a global variable that say in which level I am (update everytime I enter a level)in MY_INPUT, when I press of the 9 directions, I check the variable and call another LEVEL depending on which level I am...

 

 

 

I suppose that by "level" you are referring to the cave "rooms," right? If so, yes, you keep a global variable and update it every time the user moves. The variable should then serve as some sort of index into your game data, to know how the game needs to behave for that specific room.

 

I don't know exactly how Colossal Cave Adventure is arranged, but I imagine that it should be a two-dimensional grid of cave rooms, where each room is a position in which the user can be at any time. If so, you can represent this grid with a look-up table in ROM that points to the routines that handle each room. Your global variable then should serve as an index into this grid. That way, you don't have to write tedious code with multiple "IF...ELSE" branches, you just compose your table pointer and call the function.

 

There's more than one way to skin a cat, though. :)

 

-dZ.

Edited by DZ-Jay
Link to comment
Share on other sites

The state "command" you refer is in fact state PLAY and use MY_INPUT

The page transition is in my program the new state PAGE and use MY_INPUT_DISC... :-)

 

the grid is 3-dimensional, and the table pointer I have to understand how to do.....

 

at the moment I'm a bit lazy and focusing on two more easy part: the hidden novel (I just added, people need to discover how to show it :-) and the manual...

 

also, since P-machinery is started around a pac-man game... I was thinking to work on a third project: Nibbler! nibbler could be more faisable for me and help me learn more about sprites and game sound effects before to work on Empires Collide... what you think? is Nibbler an easy project to approach?

Link to comment
Share on other sites

New status (Blue is done, Green is faisable, Yellow is difficult. Red is very hard to code for me)

 

- TITLE SCREEN: ok (custom screen)

- INTRO: ok (welcome message)

- INIT: ok (integrate tracker and start demo music)

- FONT: ok (custom)

- CONTENTS: insert all levels message text descriptions - 79 over 214 [huge task]

- MUSIC: translate mod to decles of custom music "shadows" 0%

- GAME STATES: ok (add state PAGE)

- PLAY ENGINE1: ok (implement transition from PAGE to PAGE and PAGE to PLAY by reconnaising disc pressure)

- PLAY ENGINE2: ok (inputs from keypad reconnaise 8 directions, "Clear" as music pause and disc touch)

- PLAY ENGINE3: implement text input from keyboard (must reconnaise ONLY characters not symbols except ?) 0%

- PLAY ENGINE4: implement level transition maps [huge task] - 14 macro_maps - 1%

- PLAY ENGINE5: implement answer logic machine (game walkthrough) [huge task] - 0%

- PLAY ENGINE6: implement the parser to reconnaise text/keypad commands inserted to be used by login transition machine [huge task] 0%

- PLAY ENGINE7: ok (implement music pause)

- HIDDEN NOVEL: ok (discover it! :-) )

- SCORE: implement scoring 0%

- BUG TESTING: 1 bug discovered/solved :-)

- BOX: 80%

- OVERLAYS: 0%

- MANUAL: 10% (based on ECS original layout)

 

Overall: 28%

Link to comment
Share on other sites

The state "command" you refer is in fact state PLAY and use MY_INPUT

The page transition is in my program the new state PAGE and use MY_INPUT_DISC... :-)

 

the grid is 3-dimensional, and the table pointer I have to understand how to do.....

 

 

My understanding of Colossal Cave is that it just keeps a table of rooms and exits for each room. Suppose there are only 4 possible exits from each room--North, South, East, West. (I know CC offers more possible exit directions than that, but I want to keep the example simple.)

 

Now suppose you have 4 rooms connected in a square, numbered 1 through 4. 0 means no exit. Then the connectivity table for that might look like this:

 

ROOMS    PROC
@@1      DECLE  2, 0, 3 ,0  ; Room 2 to the north, Room 3 to the east
@@2      DECLE  0, 1, 4, 0  ; Room 1 to the south, Room 4 to the east
@@3      DECLE  4, 0, 0, 1  ; Room 4 to the north, Room 1 to the west
@@4      DECLE  0, 3, 0, 2  ; Room 3 to the south, Room 2 to the west
        ENDP

 

So, that should set up a map that looks like this:

 


2 <====> 4
^        ^
|        |
|        |
v        v
1 <====> 3

 

To move between rooms (what I believe you mean by "map transition"), the lookup goes something like this:

 

       MVI     CUR_ROOM,   R1      ; Get current room (1, 2, 3, 4)
       DECR    R1                  ; make "zero based"
       SLL     R1, 2               ; Multiply by 4, since 4 possible exits per room
       ADD     DIRECTION,  R1      ; 0 = N, 1 = S, 2 = E, 3 = W
       MVI@    R1,         R0      ; Get new room number
       TSTR    R0
       BEQ     @@no_exit           ; 0 means "no exit in this direction"
       MVO     R0,   CUR_ROOM      ; Update current room to new room
       ; do new room stuff here.

 

There are ways to optimize this slightly, but honestly, I wouldn't worry about that too much at this point. Premature optimization is a bad idea. You don't need it yet, and may never need it.

Edited by intvnut
Link to comment
Share on other sites

yes, for map transition I mean going N,S,E,W, and you can also go Up and Down, so it's 6 directions

 

I try to keep separated the map transition from the parser for two reason:

- map transition/movements between levels can be handled by keypad 1-9,clear,enter.. from the controller

- during bug testing, it would be possible to move all around maps without any command, and this is priority before any insertion of command logic.

 

following your example, I should define something like this:

ROOMS PROC

@@1 DECLE 2, 0, 3 ,0, 0, 0 ; Room 2 to the north, Room 3 to the east, no up or down

@@2 DECLE 0, 1, 0, 4, 0, 0 ; Room 1 to the south, Room 4 to the east, no up or down

@@3 DECLE 4, 0, 0, 1, 0, 0 ; Room 4 to the north, Room 1 to the west, no up or down

@@4 DECLE 0, 3, 0, 2, 0, 0 ; Room 3 to the south, Room 2 to the west, no up or down

.......

;THERE WILL BE ALMOST 100 levels....

ENDP

 

I also define 2 global variables:

CUR_ROOM ;WILL BE USED FOR THE COMMAND LOGIC AS WELL

DIRECTION ;IS UPDATED BY RECONNAISING KEYPAD INPUT (MY_INPUT)

 

is this what I need?

Edited by vprette
Link to comment
Share on other sites

yes, for map transition I mean going N,S,E,W, and you can also go Up and Down, so it's 6 directions

 

I try to keep separated the map transition from the parser for two reason:

- map transition/movements between levels can be handled by keypad 1-9,clear,enter.. from the controller

- during bug testing, it would be possible to move all around maps without any command, and this is priority before any insertion of command logic.

 

following your example, I should define something like this:

ROOMS PROC

@@1 DECLE 2, 0, 3 ,0, 0, 0 ; Room 2 to the north, Room 3 to the east, no up or down

@@2 DECLE 0, 1, 0, 4, 0, 0 ; Room 1 to the south, Room 4 to the east, no up or down

@@3 DECLE 4, 0, 0, 1, 0, 0 ; Room 4 to the north, Room 1 to the west, no up or down

@@4 DECLE 0, 3, 0, 2, 0, 0 ; Room 3 to the south, Room 2 to the west, no up or down

.......

;THERE WILL BE ALMOST 100 levels....

ENDP

 

I also define 2 global variables:

CUR_ROOM ;WILL BE USED FOR THE COMMAND LOGIC AS WELL

DIRECTION ;IS UPDATED BY RECONNAISING KEYPAD INPUT (MY_INPUT)

 

is this what I need?

 

That would give you basic room to room travel.

 

I'm looking at this code, though: http://www.rickmurphy.net/advent/INITAD.FT

 

It looks like the rules might be a little more complicated. But, if you stick to the algorithm they describe there in sections 3 and 4, you can use the database in ADVENT.TX directly with minor modification (ie. use a script to convert it to appropriate assembly directives).

 

Because we're dealing with binary numbers, we might want to consider tweaking the numeric ranges slightly, but whatever conversion script we use can do that under the hood. For example, 1024 is far more convenient than 1000 for division and modulo.

 

I think if you read through this, it'll be clearer how to deal with the database. They lay out the algorithms and meanings in English, so it should be easier to reason about the code.

 

Indexing into the database would be as I showed above, but it looks like the actual logic to decide whether you can move or not is a bit more involved. Fortunately, they spell it all out there.

 

EDIT:

BTW, here's the database itself. It appears that pretty much 90% of the game logic is encoded into this database: http://www.rickmurphy.net/advent/ADVENT.TX The other 10% is in that special computed goto, it appears.

 

So if we can script the conversion of this database (possibly modifying its format slightly to pack into ROM better, since there are is a lot of wasted space in there), that captures the meat of the game very quickly. Then you can focus on all the Intellivision-specific enhancements after that.

Edited by intvnut
Link to comment
Share on other sites

the problem is that I'm not sure which version fo the game is described there (not the original for sure , that has only 6 sections on the database)

 

What I do now is proceed on paper: I have a solution of the game described in map, and the C64 version of the original game: Using Vice c64 emulator, I try to follow the map solution and build on paper a better described map. After this I should know exaclty movements from room to room, than I can translate to code.... this is for map transitions

this job is for almost 100 rooms and 10 directions: 1000 combinations.... it's huge but my mind can handle

 

 

about the game logic, this is based on the parser... I guess the parser must reconnaise the command and update consequently a COMMAND_INSERTED variables that goes from 0 to 200 (200 commands and word reconnaised) (this if command was made of only 1 word) and I combine COMMAND_INSERTED with CUR_ROOM to know what to do...

this job is for almost 100 rooms and 200 commands: 20000 combinations!!!!.. and in the game the command is made by 2 words not 1 so it will be be much more!! I need the matrix and pointer for sure! better not to think about this part now :-0

 

it's not an easy task.... but now is time to play the game on c64 emulator to understand the logic :-)

Edited by vprette
Link to comment
Share on other sites

Valter,

 

Trying to reverse the map in this way sounds exceptionally painful. It also isn't guaranteed to capture all of the subtlety. Some rooms have rules that prevent you from doing certain things unless you have a certain object, for example, or you've set some other flag elsewhere. Also, you have fun verbs like XYZZY and PLUGH... There's one other challenging thing: Some actions only have a certain percentage chance of succeeding.

 

The version I've been examining is the OS/8 version, because it's easy to bring up the files for in the web browser. It's the "350 point" version. There's a 550 point and 581 point version beyond this.

 

This appears to be source for a version of the 550-point cave: https://code.google.com/p/colossal-cave/source/browse/trunk/adv5/ . If you toggle open the ADV_DB, everything looks like it's in a much friendlier format. There isn't much C code to it, really. And, most of the game is compiled to a simple byte code, which may make the overall result more dense.

 

I still think you should consider scripting all this stuff. If you have to do something 20,000 times, and you're correct 99.9% of the time, you've still make 20 mistakes that you now have to go find.

Link to comment
Share on other sites

Ok

a little step forward:

 

the so called travel table resume all teh allowed movement, not only by choosing a direction, but also in few cases by a condition.

This table is resuming togheter the map transition logic and the game walkthrough logic, so I have to modify the project a bit.

 

The correct table is the one below, since the advent.tx is the Woods expanded version:

 

1 2 2 44

1 3 3 12 19 43

1 4 4 5 13 14 46 30

1 5 6 45 43

1 8 49

2 1 8 2 12 7 43 45 30

2 5 6 45 46

3 1 3 11 32 44

3 11 48

3 33 65

3 79 5 14

4 1 4 45

4 5 6 43 44 29

4 7 5 46 30

4 8 49

5 4 9 43 30

5 300 6 7 8 45

5 5 44 46

6 1 2 45

6 4 9 43 44 30

6 5 6 46

7 1 12

7 4 4 45

7 5 6 43 44

7 8 5 15 16 46 30

7 24 47 14 30

8 5 6 43 44 46

8 1 12

8 7 4 13 45

8 301 3 5 19 30

9 302 11 12

9 10 17 18 19 44

9 14 31

9 11 51

10 9 11 20 21 43

10 11 19 22 44 51

10 14 31

11 310 49

11 10 17 18 23 24 43

11 12 25 305 19 29 44

11 3 48

11 14 31

12 310 49

12 11 30 43 51

12 13 19 29 44

12 14 31

13 310 49

13 11 51

13 12 25 305 43

13 14 23 31 44

14 310 49

14 11 51

14 13 23 43

14 303 30 31 34

14 16 33 44

15 18 36 46

15 17 7 38 44

15 19 10 30 45

15 304 29 31 34 35 23 43

15 34 55

15 62 69

16 14 1

17 15 8 38 43

17 305 7

17 306 40 41 42 44 19 39

18 15 38 11 8 45

19 15 10 29 43

19 307 45 36

19 308 46 37

19 309 44 7

19 74 66

20 26 1

21 26 1

22 15 1

23 8 1

24 7 1

25 9 1

27 17 8 11 38

27 40 45

27 41 44

28 19 38 11 46

28 33 45

28 36 30 52

29 19 38 11 45

30 19 38 11 43

30 62 44 29

31 17 1

32 19 1

33 3 65

33 28 46

33 34 43 53 54

33 35 44

34 33 30

34 15 29

35 33 43 55

36 37 43 17

36 28 29 52

36 39 44

37 36 44 17

37 38 30 31 56

38 37 56 29

39 36 43

39 64 30 52 58

39 65 70

40 41 1

41 42 46 29 23 56

41 27 43

41 59 45

41 60 44 17

42 41 44

42 43 43

42 44 46

43 42 44

43 44 46

43 45 43

44 42 45

44 43 43

44 48 30

44 50 46

45 43 45

45 46 43

45 47 46

46 45 44 11

47 45 45 11

48 44 29 11

49 50 30 43

49 51 44

50 44 43

50 49 44 29

50 52 46

51 49 44

51 52 43

51 53 46

52 50 45

52 51 44

52 53 29

52 55 43

53 51 44

53 52 45

53 54 46

54 53 43 11

55 52 44

55 56 30

55 57 43

56 55 29 11

57 55 44

57 58 46

57 13 30 56

58 57 44 11

59 27 1

60 41 43 29

60 61 44

60 62 45 30

61 60 43 11

62 60 44

62 63 45

62 30 43

62 15 46

63 62 46 11

64 39 29 56 59

64 65 44

65 64 43

65 66 44

65 68 61

65 311 46

65 312 29

66 313 45

66 65 60

66 67 44

66 77 25

66 314 46

67 66 43

67 72 60

68 66 46

68 69 29

69 68 30

69 74 46

70 71 45

71 39 29

71 65 62

71 70 46

72 67 63

72 73 45

73 72 46

74 19 43

74 69 44

74 75 30

75 76 46

75 77 45

76 75 45

77 75 43

77 78 44

77 66 45

78 77 46

79 3 1

 

the first and second numbers are rooms (from and to) where the second number can include a condition; from third number are the verbs (command passed by the parser) that result in the movement from room to room

 

I have to make this TRAVEL_TABLE like the ROOMS PROC exemple of Joe?

 

also: some room allow for a short descrition, so I also work on the short messages and need to introduce several variables to set when and if I have already been in the rooms (in which case I show the short description)

 

New status (Blue is done, Green is faisable, Yellow is difficult. Red is very hard to code for me)

 

- TITLE SCREEN: ok (custom screen)

- INTRO: ok (welcome message)

- INIT: ok (integrate tracker and start demo music)

- FONT: ok (custom)

- CONTENTS: insert long descriptions (done) + short descriptions + verbs (reconnaised commands) + conditional messages + additional messages - 79 over 214 [huge task]

- MUSIC: translate mod to decles of custom music "shadows" 0%

- GAME STATES: ok (add state PAGE)

- PLAY ENGINE1: ok (implement transition from PAGE to PAGE and PAGE to PLAY by reconnaising disc pressure)

- PLAY ENGINE2: ok (inputs from keypad reconnaise 8 directions, "Clear" as music pause and disc touch)

- PLAY ENGINE3: implement text input from keyboard (must reconnaise ONLY characters not symbols except ?) 0%

- PLAY ENGINE4: implement TRAVEL_TABLE (where unconditional and conditional movements from room to room are described) 0%

- PLAY ENGINE5: implement logic machine (to change object inventory and change conditional variables to be used by the TRAVEL_TABLE) [huge task] - 0%

- PLAY ENGINE6: implement the parser to reconnaise text/keypad commands inserted (VERBS) to be used by login machine [huge task] 0%

- PLAY ENGINE7: ok (implement music pause)

- HIDDEN NOVEL: ok (discover it! :-) )

- SCORE: implement scoring 0%

- BUG TESTING: 1 bug discovered/solved :-)

- BOX: 80%

- OVERLAYS: 0%

- MANUAL: 15% (based on ECS original layout, made with Indesign)

 

Overall: 28%

Edited by vprette
Link to comment
Share on other sites

Valter,

 

I stumbled across a version of the 550-pt Colossal Cave that had all the original C code for the bytecode interpreter based game. I spent some time off and on over the last week porting it all to the Intellivision.

 

It's not 100% bug-free, but so far it works pretty well. Check it out!

 

This version requires the ECS and JLP. It also uses bank switching to store the 144K byte database. This database contains both the text phrases and the bytecode for all the game logic. This leaves you about 100K bytes (50K words) to program up graphics and music to go with it. :-)

 

The driver program that's in there now just reuses my ANSI terminal code to display text. That's easily replaced with something else. There are some other changes that should be made to fit it into P-Machinery or the like, but again, those are minor. The major point is that the bytecode engine runs just fine on the Intellivision and is ready to go.

 

I haven't optimized this one bit. You might notice it's a little slow. It shouldn't be too hard to speed it up at least a little.

 

To run this in one of the recent builts of jzintv:

   jzintv -s1 --jlp -m2 advent

The "-m2" switches to the ECS keyboard map at startup. You can add more flags, of course (such as -z# to change the resolution of the display).

 

The ZIP file contains all the C source and adventure database files I consulted when writing the Intellivision version. The Intellivision version is under the directory "adv5/intv/." I apologize for its messiness. This was meant to be a quick and dirty port. It needs some work to make it into a complete game. I'm hoping it'll kick-start your efforts, so you can focus on making this a nice game for Intellivision.

 

Happy adventuring!

 

--Joe

adv5_for_inty.zip

  • Like 2
Link to comment
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.
Note: Your post will require moderator approval before it will be visible.

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...