Request for help interpreting a value from Cutthroats source code

Hello, all. Some of you probably know that I’ve been working on transcribing Infocom’s player documentation to be more usable by screen readers.

I’m working on Cutthroats now, and the “Tide Table” feelie is very difficult to transcribe: 122 rows and 14(ish) columns.

I believe/hope that the program doesn’t use all of the information. It may only use one value, in fact.

The way this works:

  • Player makes a bank withdrawal
  • Bank teller stamps date on bank passbook
  • Player references date on tide table
  • Player knows what time “high tide” is

The two places of interest I’ve found in the source are ISLAND.ZAP and TOASTR.ZAP

ISLAND.ZAP:

?ELS10:	PRINTI	"This is a distinctive "
	CALL	DPRINT,BANK
	PRINTI	" passbook"
	IN?	PASSBOOK,MCGINTY /?CND15
	IN?	PASSBOOK,WEASEL /?CND15
	PRINTI	" which shows a balance of $"
	PRINTN	PASSBOOK-BALANCE
	PRINTI	". The last date stamped in it is "
	PRINT	STUPID-PROBLEM-STRING

and ISLAND.ZAP

?ELS27:	SUB	PASSBOOK-BALANCE,P-AMOUNT >PASSBOOK-BALANCE
	ADD	POCKET-CHANGE,P-AMOUNT >POCKET-CHANGE
	SET	'STUPID-PROBLEM-STRING,STR?291
	PRINTR	"The teller takes your passbook, enters the withdrawal, hands you the money and your passbook, and says ""Have a good day."""

TOASTR.ZAP

.GSTR STR?291,"September 19"

This seems pretty straightforward, but ZIL proficiency isn’t part of my skillset. Is the date always September 19? The starting date, I know, is April 23 (Shakespeare’s birthday). If so, the table seems like overkill.

I just want to be sure I’m providing accurate information before I turn this documentation loose on the world. Thanks!

All this below is in ISLAND.ZIL

The variable is initialized at line 768

<GLOBAL STUPID-PROBLEM-STRING "April 23">

The variable is only used in the below two cases:

When you examine your passbook (line 739-766)

<ROUTINE PASSBOOK-F ()
	 <COND ;(<VERB? TAKE>
		<COND (<ITAKE <>>
		       <TELL 
"Taken. You notice that it's a little too big to be carried inconspicuously."
CR>)
		      (T <RFALSE>)>)
	       (<VERB? EXAMINE>
		<COND (<FSET? ,PASSBOOK ,RMUNGBIT>
		       <TELL-SOGGY>)
		      (T
		       <TELL "This is a distinctive " D ,BANK " passbook">
		       <COND (<AND <NOT <IN? ,PASSBOOK ,MCGINTY>>
			    	   <NOT <IN? ,PASSBOOK ,WEASEL>>>
			      <TELL
" which shows a balance of $" N ,PASSBOOK-BALANCE ". The last date stamped in
it is " ,STUPID-PROBLEM-STRING>)>
		       <TELL "." CR>)>)
	       (<VERB? READ OPEN LOOK-INSIDE>
		<COND (<OR <IN? ,PASSBOOK ,WEASEL>
			   <IN? ,PASSBOOK ,MCGINTY>>
		       <START-SENTENCE <LOC ,PASSBOOK>>
		       <TELL " has it." CR>)
		      (T
		       <PERFORM ,V?EXAMINE ,PASSBOOK>
		       <RTRUE>)>)
	       (<VERB? CLOSE>
		<TELL "It's closed." CR>)>>

And when you withdraw/deposit money at the bank (line 2222-2280)

<ROUTINE BANK-F (RARG)
	 <COND (<EQUAL? .RARG ,M-ENTER>
		<MOVE ,SPEAR-CARRIER ,BANK>
		<PUTP ,SPEAR-CARRIER ,P?SDESC "teller">
		<PUTP ,SPEAR-CARRIER ,P?LDESC
"A teller sits behind the window.">)
	       (<EQUAL? .RARG ,M-BEG>
		<COND (<VERB? WITHDRAW>
		       <COND ;(<PRSO? ,RIDICULOUS-MONEY-KLUDGE>
			      <TELL "You should specify an amount." CR>)
			     (<NOT <PRSO? ,INTNUM>>
			      <RFALSE>)
			     (<NOT ,P-DOLLAR-FLAG>
			      <TELL-YOU-CANT "withdraw that!">)
			     (<L? ,P-AMOUNT 1>
			      <TELL-SERIOUS>)
			     (<NOT <IN? ,PASSBOOK ,PLAYER>>
			      <TELL 
"The teller points out that you don't have your passbook." CR>)
			     (<G? ,P-AMOUNT ,PASSBOOK-BALANCE>
			      <TELL 
"The teller takes your passbook, checks the balance, tells you that there's not
enough to cover your planned withdrawal, and returns it." CR>)
			     (T
			      <SETG PASSBOOK-BALANCE <- ,PASSBOOK-BALANCE
							,P-AMOUNT>>
			      <SETG POCKET-CHANGE <+ ,POCKET-CHANGE ,P-AMOUNT>>
			      <SETG STUPID-PROBLEM-STRING "September 19">
			      <TELL 
"The teller takes your passbook, enters the withdrawal, hands you the
money and your passbook, and says \"Have a good day.\"" CR>)>)
		      (<VERB? DEPOSIT>
		       <COND (<AND ,PRSI <NOT <PRSI? ,GLOBAL-BANK>>>
			      <PERFORM ,V?PUT ,PRSO ,PRSI>
			      <RTRUE>)
			     (<OR <NOT ,P-DOLLAR-FLAG>
				  <NOT <PRSO? ,INTNUM>>>
			      <COND (<NOT <HELD? ,PRSO>>
				     <TELL-DONT-HAVE <>>
				     <THE? ,PRSO>
				     <TELL D ,PRSO "." CR>)
				    (T <TELL
"The teller looks at the " D ,PRSO " and returns it, pointing out
that you don't have a safe deposit box." CR>)>)
			     (<G? ,P-AMOUNT ,POCKET-CHANGE>
			      <TELL-YOU-CANT "deposit more than you have.">)
			     (<L? ,P-AMOUNT 1>
			      <TELL-SERIOUS>)
			     (<NOT <IN? ,PASSBOOK ,PLAYER>>
			      <TELL
"The teller points out that you need to have your passbook." CR>)
			     (T
			      <SETG PASSBOOK-BALANCE
				    <+ ,PASSBOOK-BALANCE ,P-AMOUNT>>
			      <SETG POCKET-CHANGE <- ,POCKET-CHANGE ,P-AMOUNT>>
			      <SETG STUPID-PROBLEM-STRING "September 19">
			      <TELL
"The teller takes your money and passbook, records the deposit, returns
the passbook, and says \"Thank you for banking at " D ,BANK ".\"" CR>)>)>)>>

I havn’t played he game but as I understand it the last date in the passbook is April 23 and the only way you can get the current date is by going to the bank.

The game don’t contain any other months (January-December) except in these three instances.

2 Likes

OK. So it does sound like there is a single starting date (April 23) as well as a single updated date (September 19).

Thank you very much for checking–and so quickly, too!–I really appreciate your help.

2 Likes

There is also (in people.zil these two strings (line 681 & 1105):

"We'll all meet at the ship at 2:30."

and

"We're supposed to meet at 2:30 at the ship, I think."

This is the time of the high tide for September 19 and the time is hardcoded in the strings and won’t change.

2 Likes

Now that is interesting. In my two transcripts (two shipwrecks), I was asked to meet at “high tide.” Since there are multiple strings, it may be is possible to get the information by asking other shipmates. I never attempted that.

High tide is 2:30 on September 19 according to the tide table provided with the game, so there is not a contradiction.

As an aside, I wonder if they originally intended to do something more devious with the feelie. It has a ton of values on it. Seems like a lot of work for such a limited purpose.

1 Like

I imagine it’s a photocopy of a genuine tide table.

Yes, I would guess that too.

Sure, that makes sense.

It is very soft copy protection anyway. It’s not like there are a lot of ways to stay busy after the outfitters. Deadline’s “search near” or Enchanter’s “reach” verbs from the manual were more restrictive gates than this (at least, I never tried them before buying my own copies).

I’m always up for a bit of Infocom game hacking if we want to remove or edit elements to make the games more playable for people. :slightly_smiling_face::v:

Adam

2 Likes

I have "deconstructed’ Cutthroats (and other Infocom games). You are correct that the tide tables is only used as a simple copy protection scheme. The time to meet (high tide) depends on the current date. However, the only way for the Player to find the date is to see an updated one after the passbook is used by the Player (withdrawing or depositing money) or The Weasel.

Since the current date is always September 19, the high tide is always 2:30pm.