SCI

I Wanna Go Fast

  • 141
  • 0
Most SCI games keep track of CPU speed. They do this at startup in a room commonly known as speedTest, and save the recorded speed in a global variable commonly known as machineSpeed.

Initially, there was no upper limit. This leads to bugs in Leisure Suit Larry 3.
In the exercise room, the amount of exercise you needed to become fit depends on your computer's speed; the slower your system, the less exercise required. At the time of release, this was reasonable, but as computers grew faster, it became practically impossible to get past this.
At the hotel lobby, the slower your computer, the less time it takes for the elevator to arrive. On faster computers, the elevator never arrives, leading to another bug that makes the unwinnable.

Fortunately, the developers soon realized this, and added the howFast global. This is set at the speed tester, based on the machineSpeed value. It has only a few values that determine the approximate speed, and has an upper limit if the speed is any...

A Fresh Restart

  • 187
  • 0
Restarting a 16-bit SCI game is pretty simple. In Game:restart...

Code:
   (method (restart)
        (if modelessDialog
            (modelessDialog dispose:)
        )
        (RestartGame)
    )

In other words, it clears any modeless dialog, and invokes the kernel call RestartGame to clear everything - globals, cast, sounds, etc. Then the game is re-initialized.
This behavior is unchanged from early SCI0 to late SCI1.1.

When SCI moved to 32-bit, however, things changed. While the interpreter still has the RestartGame kernel call, it does absolutely nothing!
For this reason, restarting had to be re-implemented in script code. Each game had its own restart code that re-initializes everything that needs to be cleared on restart.

"Put bag in bottle"

  • 288
  • 0
In Leisure Suit Larry 2, an oversight in the game's vocab makes it so that mere "put bag in bottle" doesn't work... supposedly. From the Leisure Suit Larry Collection's readme:

When you reach the top of the volcano at the end of the game, be sure to include the word "the" in your commands, such as "put THE bag in THE bottle" or "drop THE bottle in THE crevice." A subtle bug slipped into Larry 2 just before it shipped. This eliminates it.

Is there any truth to this? Let's find out.

The most common version of the game (the one included in collections) is 1.200 (January 11, 1989). It's not the absolute newest version (the Amiga port is), but that's a subject for another post.

"The" is just an article, so I think the parser just ignores it. None of the said specs in rm82:handleEvent use it.
"Put" is an imperative verb.
"Bag" is both a noun and an imperative verb.
"Airsick" is a qualifying adjective, but it only appears as an optional said spec for the inventory...

Flagged: A History of SCI Game Flags

  • 187
  • 0
KQ4 and LSL2, the first-ever SCI games, did not have many of the luxuries that later games did.

For starters, there were no special procedures to handle event flags. All events were flagged using global variables directly. This way is obviously inefficient and a waste of heap space.

To address this issue, PQ2 introduced the Bset, Bclr, and Btst procedures, which use a global array in which each variable could have 16 flags. That saves a lot of heap space!
Of course, the downside of global variables is that the original programmers could not declare them as arrays with square brackets. This required them to take an educated guess as to how many flags they would need for their games, and note the beginning and end points for the gameFlags array. (SCICompanion has no such limitation.)

Also noteworthy is a procedure or method that not only gives puzzle points, but sets a flag so that the points for that puzzle are only given once. Its name and implementation vary, but the basic idea...

The Virgin Suicide

  • 186
  • 0
We all know how, in the original Leisure Suit Larry, the title character would commit suicide if he didn't lose his virginity by sunrise. I even uploaded a video of this on YouTube.


But what causes this? When does it happen? Does sleeping with the prostitute prevent it? And can this happen in the VGA remake?

Well, let's look at the game's code, in any sidewalk room:

Code:
if (initLog)
    {
    if  (watchHours > 4 &&            [    Anything after 5 am.
        watchHours < 10)
        {
        NewRoom( rmSunrise);
        }
So we know that it happens at 5 AM, when entering any sidewalk room.
Contrary to popular belief, doing the deed with the prostitute does NOT remove this time limit, since the code doesn't check for that.

Also contrary to popular belief, this death DOES occur in the VGA remake. From script 700, sidewalk:init...
Code:
        (if (> (GameHour) 7)    ;anytime after 5 am
            (self setScript: virginScript)...
Top