Community
General and Everything Else => The Games and other Sierra Adventure stuff => Topic started by: MusicallyInspired on November 30, 2018, 11:16:08 AM
-
He said "none of my kids want this junk" and it took a fan to convince him that the community would find it invaluable.
https://www.ebay.com/sch/al_lowe/m.html?_nkw=&_armrs=1&_ipg=&_from= (https://www.ebay.com/sch/al_lowe/m.html?_nkw=&_armrs=1&_ipg=&_from=)
Here's an interview video by Metal Jesus Rocks.
https://www.youtube.com/watch?v=v7AgSapZAi8 (https://www.youtube.com/watch?v=v7AgSapZAi8)
-
Wow!
I can't believe he's actually selling this stuff...
I guess since he's publicly selling the source code now, I can reveal that some of the Sierra source code I managed to obtain was kindly shared with me by Al. However I think I saw some floppies in this video (e.g. Winnie the Poo) which he forgot to send me. I hope the happy buyer will archive and publish everything.
-
However I think I saw some floppies in this video (e.g. Winnie the Poo) which he forgot to send me.
I suppose this is because they are Apple II floppies which he can't read directly.
-
I guess you're right!
-
I can't believe he's actually selling this stuff...
It does seem strange, especially given this:
Realize that, while you’ll have my data as of the day of Larry 1’s creation, you will not own the intellectual property rights to the game, the code, the art, or anything else. Nor do I. The I. P. rights were sold over and over again, until they are now owned by a German game company.
It is crazy how much the bidding is up to already.
-
It's not that strange. Back when SCI Studio was still relevant, I contacted Mr. Lowe via email about permission to develop a Larry 4. Shared a concept and everything, and he gave me basically the same spiel -- I had his blessing to make Larry 4 - The Missing Floppies, but I was to absolutely not name it Leisure Suit Larry 4 - The Missing Floppies. He could only permit me to use the Larry Laffer character, not the LSL name. Which was about what Kon-Tiki and I'd expected.
-
So you called it The Dating Pool instead? How's it coming along?
-
The Dating Pool is not Larry 4, lol. Though there is some Larry influence in there.
I still have an old AGS project that was supposed to become Larry 4 after we gave up on the new SCI Studio ever coming out. Who knows, it might become the second SCI11+ game... probably not, though. I'd like to make it at least pass for SCI1 ;D
-
It's not that strange. Back when SCI Studio was still relevant, I contacted Mr. Lowe via email about permission to develop a Larry 4. Shared a concept and everything, and he gave me basically the same spiel -- I had his blessing to make Larry 4 - The Missing Floppies, but I was to absolutely not name it Leisure Suit Larry 4 - The Missing Floppies. He could only permit me to use the Larry Laffer character, not the LSL name. Which was about what Kon-Tiki and I'd expected.
Yeah, I guess I'm not so surprised that Al is doing this, since he has always supported the fans. I'm surprised that he is allowed to do this though. Obviously we've had access to the AGI "source" for Larry 1 since the first fan made AGI tools came out, so its not like its selling a secret part of the intellectual property, but I'd be surprised if the current owners of the IP weren't frowning a bit at these auctions. Still, wish I could afford a bid on them. I wonder who is bidding so high and if they have an interest in the technical side.
-
Plot twist: the top bidder is the current owner of the IP.
-
Obviously we've had access to the AGI "source" for Larry 1 since the first fan made AGI tools came out
Except I would love to see the real source, especially the comments, etc.
-
I wonder if the source to the SCI interpreter itself is included somehow somewhere with what he has. Doubtful, I guess...
-
I wonder if the source to the SCI interpreter itself is included somehow somewhere with what he has. Doubtful, I guess...
I figure someone on the systems team would be more likely to have those.
☐ SCI0
☐ SCI1
☑ SCI11
☑ Some version of SCI3?
-
Except I would love to see the real source, especially the comments, etc.
The disk slack space would be interesting as well. I hope that whoever wins it thinks to look at that. Still 8 days to run and its already over $8000. Why are they pushing it up so quickly?
-
I wonder if the source to the SCI interpreter itself is included somehow somewhere with what he has. Doubtful, I guess...
I figure someone on the systems team would be more likely to have those.
Kawa is right.
There's no interpreter source in Al's archive.
And indeed some system programmers kept source code to a few interpreter versions.
-
I would love to see the real source, especially the comments, etc.
If the buyer won't publish the stuff, I'm certain someone would leak it... ;)
-
Aaaaaand all the Larry stuff has vanished...
-
In the "bought by a hoarder" sense or in the "bitrotted away" sense?
-
The auctions were cancelled.
-
Well, the Larry ones were. His copy of Bop-A-Bet is still up. ;) Guess someone didn't like him selling authentic source code...
-
Saw this in the Youtube comments a short while ago:
A few people on the Sierra Gamers Facebook group reached out to Al and said it was because Activision sent a cease-and-desist. Activision doesn't own the IP for Larry but was compelled to act because some of the source code might also be used in King's Quest and Space Quest, which AV does own. Al stated that AV is wrong but doesn't want to take legal action because it will cost more than what the source code is going for.
https://www.facebook.com/groups/273746983994/
And this quote from the mentioned Facebook page:
I called Al yesterday to ask him.
He received a letter from an outside law firm hired by Activison that ordered him to take it down. He said in the letter Activison understood they don’t own the IP to LSL but that the source code probably contained shared code to Kings Quest and Space Quest. For that reason they sent him the letter.
Al and I agreed that he was right, but by the time you hire an attorney to prove you’re right, it would have cost more than what he would have got from the auctions.
If I had to take a guess, this is one of those scenarios where Activison is compelled to act. You can’t pick and choose when to enforce IP rights. If they chose not to go after Al and then someone else releases source code that they actually care about, attorneys can point to ALS scenario and say Activison is being partial and selective in their enforcement of their IP rights, which you can’t do under US law.
Probably a good thing that Al didn't yet start the KQ3 and PQ1 auctions, which apparently he was intending to do.
-
I would love to see the KQ3 source.
-
So, Activision killed the auctions. In all fairness, while they don't own Larry, they do own much of the other Sierra franchises, and they share engines.
I imagine the legal issue is referring to the system scripts that the AGI and SCI games all share. There's just one problem, though: many of those scripts are also in freely available demos. I took advantage of that fact when creating the SCI01 template game, using the QFG2 demo as the foundation and the interpreter from the EGA 1990 Christmas Card.
If I had to take a guess, this is one of those scenarios where Activison is compelled to act. You can’t pick and choose when to enforce IP rights. If they chose not to go after Al and then someone else releases source code that they actually care about, attorneys can point to ALS scenario and say Activison is being partial and selective in their enforcement of their IP rights, which you can’t do under US law.
That would be true to an extent with trademarks, but it's completely wrong copyright-wise. A copyright owner can, in fact, pick and choose when to enforce their rights. The worst thing that would happen by ignoring copyright violations is less damages awarded to the copyright owner in a lawsuit.
I'm no lawyer, by the way; I just read the TV Tropes article (https://tvtropes.org/pmwiki/pmwiki.php/UsefulNotes/Copyright) regarding copyright law (it explains that defending a copyright is not required, simply allowed), as well as this (https://www.templetons.com/brad/copymyths.html) article regarding copyright myths (the relevant one is number 5).
-
I imagine the legal issue is referring to the system scripts that the AGI and SCI games all share. There's just one problem, though: many of those scripts are also in freely available demos.
I suspect with regards to these their objection was about the source code being released; the script binaries (which the AGI community has been able to decompile) are publicly available separately.
Having said that, i think this is really unfortunate news, and means we may never get to see the original sources to Larry or Sierra's other titles. The only circumstances under which I could see them becoming public is if Activision could somehow be convinced to donate the sources to the Internet Archive for the purposes of preserving an important piece of gaming history - but I think any such efforts are unlikely to be successful.
-
Having said that, i think this is really unfortunate news, and means we may never get to see the original sources to Larry or Sierra's other titles. The only circumstances under which I could see them becoming public is if Activision could somehow be convinced to donate the sources to the Internet Archive for the purposes of preserving an important piece of gaming history - but I think any such efforts are unlikely to be successful.
Hi Peter ! :)
Really great to see you join the forum. Hope we see a few more posts from you. It's been a long time. Any thoughts on doing anything in the AGI community again?
I've been dabbling with a C# AGI interpreter recently, in fact Collector will be happy to know I've got tired of working on my Vectrex emulator and decided to switch back to the C# AGI interpreter. Currently working on playing sounds.
-
Having said that, i think this is really unfortunate news, and means we may never get to see the original sources to Larry or Sierra's other titles.
Hi Peter,
Don't despair. Here's the source for LSL1's Lefty's bar (RM15):
RM15.CG
[logics for room 15 -- rmInsideBar
[ "Leisure Suit Larry in the Land of the Lounge Lizards"
[ by Al Lowe
%include "rm15.msg"
%include "gamedefs.h"
#define L_PEEPHOLE 0
#define L_CEILING_FAN 1
#define L_JUKEBOX 2
#define L_MEN_ON_STOOL 0
#define L_GIRL_ON_STOOL 1
#define L_EGO_ON_STOOL 2
%define BAR_Y 136
%define WAITING_FOR_PASSWORD 3
%define legCycling lf0
%define bartenderWandering lf1
%define boreCycling lf2
%define nearJukeBox lf3
%define nearGirl lf4
%define nearBore lf5
%define nearEmptyStool lf6
%define nearMen lf7
%define nearDoor lf8
%define doorScriptDone lf9
%define startJukeBox lf10
%define orderedAWhiskey lf11
%define orderedABeer lf12
%define orderedAWine lf13
%define staggering lf14
%define tookADrink lf15
%define beenToldPrice lf16
%define heardJoke1 lf21
%define heardJoke2 lf22
%define heardJoke3 lf23
%define heardJoke4 lf24
%define heardJoke5 lf25
%define heardJoke6 lf26
%define heardJoke7 lf27
%define heardJoke8 lf28
%define heardJoke9 lf29
%define jukeBoxTimer lv0
%define bartenderTimer lv1
%define legCycles lv2
%define boreTalkCycles lv3
%define jokeSeconds lv4
%define doorTimer lv5
%define doorScript lv6
%define drinkCount lv7
%define staggerCycles lv8
%define drunkSeconds lv9
%define joke lv10
%define tipCount lv11
%object aDoor 1
%object aPeepHole 2
%object aFan 3
%object aJukeBox 4
%object aGirl 5
%object aBore 6
%object aBartender 7
if (initLog)
{
SetHorizon( 99);
LoadPic( currentRoom);
DrawPic( currentRoom);
DiscardPic( currentRoom);
LoadSound( mTitle);
LoadView( vPimpDoor);
LoadView( vBarInterior);
LoadView( vBarGreaser);
LoadView( vBarFlys);
LoadView( vBarDoor);
LoadView( vBartender);
LoadView( vPainting);
AddToPic( vPainting, 0, 0, 81, 69, 4, 4);
[view, loop, cel, x, y, obj priority, box priority
DiscardView( vPainting);
AddToPic( vBarFlys, 0, 0, 112, 128, 11, 0);
AddToPic( vBarFlys, 0, 1, 101, 128, 11, 0);
AnimateObj( aDoor);
IgnoreBlocks( aDoor);
IgnoreObjs( aDoor);
Position( aDoor, 142, 150);
SetView( aDoor, vPimpDoor);
SetCel( aDoor, 0);
SetPriority( aDoor, 11);
Draw( aDoor);
work = DOOR_CYCLE_TIME;
CycleTime( aDoor, work);
StopUpdate( aDoor);
AnimateObj( aPeepHole);
SetView( aPeepHole, vBarInterior);
SetLoop( aPeepHole, L_PEEPHOLE);
FixLoop( aPeepHole);
SetCel( aPeepHole, 0);
SetPriority( aPeepHole, 12);
Position( aPeepHole, 143, 110);
AnimateObj( aFan);
IgnoreHorizon( aFan);
Position( aFan, 66, 66);
SetView( aFan, vBarInterior);
SetLoop( aFan, L_CEILING_FAN);
FixLoop( aFan);
SetCel( aFan, 0);
Draw( aFan);
CycleTime( aFan, two);
AnimateObj( aJukeBox);
IgnoreBlocks( aJukeBox);
IgnoreObjs( aJukeBox);
SetView( aJukeBox, vBarInterior);
SetLoop( aJukeBox, L_JUKEBOX);
FixLoop( aJukeBox);
SetCel( aJukeBox, 1);
Position( aJukeBox, 16, 128);
SetPriority( aJukeBox, 11);
Draw( aJukeBox);
StopUpdate( aJukeBox);
AnimateObj( aGirl);
IgnoreBlocks( aGirl);
IgnoreObjs( aGirl);
SetView( aGirl, vBarFlys);
SetLoop( aGirl, L_GIRL_ON_STOOL);
SetCel( aGirl, 0);
SetPriority( aGirl, 11);
Position( aGirl, 65, 128);
Draw( aGirl);
CycleTime( aGirl, two);
AnimateObj( aBore);
IgnoreBlocks( aBore);
SetView( aBore, vBarGreaser);
SetLoop( aBore, FACING_LEFT);
SetPriority( aBore, 11);
Position( aBore, 77, 128);
Draw( aBore);
AnimateObj( aBartender);
SetView( aBartender, vBartender);
SetLoop( aBartender, 0);
SetCel( aBartender, 0);
Position( aBartender, 106, 101);
Draw( aBartender);
StopUpdate( aBartender);
if (previousRoom == rmBackroom)
{
egoX = 141;
egoY = 148;
}
else
{
if (previousRoom == rmHallway)
{
egoX = 39;
egoY = 108;
}
else
{
egoX = 76;
egoY = 167;
}
}
PositionV( ego, egoX, egoY);
Draw( ego);
Random( 15, 32, bartenderTimer);
Random( 4, 32, legCycles);
Random( 15, 32, boreTalkCycles);
ShowPic( );
Return( );
} [ end initLOG
if (Posn( ego, 45, 120, 133, 159)) [ near bar
{
SetPriority( ego, 12);
}
else
{
ReleasePriority( ego);
}
Reset( nearJukeBox);
if (Posn( ego, 0, 117, 33, 131))
{
Set( nearJukeBox);
}
Reset( nearGirl);
if (Posn( ego, 55, 0, 78, BAR_Y))
{
Set( nearGirl);
Set( nearPerson);
}
Reset( nearBore);
if (Posn( ego, 71, 0, 87, BAR_Y))
{
Set( nearBore);
Set( nearPerson);
}
Reset( nearEmptyStool);
if (Posn( ego, 85, 0, 99, BAR_Y))
{
Set( nearEmptyStool);
}
Reset( nearMen);
if (Posn( ego, 94, 0, 124, BAR_Y))
{
Set( nearMen);
Set( nearPerson);
}
Reset( nearDoor);
if (Posn( ego, 132, 137, 149, 154))
{
Set( nearDoor);
}
[*****
:handleInput
[*****
if (!haveInput) {goto noInput;}
[ Handle the pimp door sequence.
if (doorScript != WAITING_FOR_PASSWORD)
{
if (Said( ken$sent$me))
{
Print( 6);
}
}
else
{
Set( doorScriptDone);
if (Said( ken$sent$me))
{
doorScript = 100;
doorTimer = 0;
}
Set( haveMatch);
unknownWord = 0;
}
if ((Said( ask, anyword, password) ||
Said( ask, password)))
{
if (!nearPerson)
{
Set( notCloseEnough);
}
else
{
Print( 68);
}
}
if ((Said( unlock, door) ||
Said( open, door)))
{
if (!nearDoor)
{
Set( notCloseEnough);
}
else
{
Print( 47);
}
}
if ((Said( look, peephole, rol) ||
Said( look$in, peephole, rol) ||
Said( look, door) ||
Said( look$in, door) ||
Said( look, window, rol) ||
Said( look$in, window, rol)))
{
Print( 65);
}
if ((Said( break, down, door) ||
Said( break, door, rol) ||
Said( hit, door)))
{
if (!nearDoor)
{
Set( notCloseEnough);
}
else
{
Print( 55);
}
}
if (Said( knock, rol))
{
if (!nearDoor)
{
Set( notCloseEnough);
}
else
{
if (doorScript)
{
Print( 46);
}
else
{
Set( programControl);
StopMotion( ego);
Print( 5);
doorTimer = 3;
}
}
}
if ((Said( unlock, door, rol) ||
Said( use, key, rol)))
{
if (!nearDoor)
{
Set( notCloseEnough);
}
else
{
Print( 63);
}
}
[ General purpose looks.
if ((Said( look) ||
Said( look, room) ||
Said( look, bar)))
{
Print( 1);
}
if ((Said( tip, bartender) ||
Said( give, bartender, money) ||
Said( give, money, bartender) ||
Said( give, tip, bartender)))
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 33);
}
else
{
if (!dollars > 4)
{
Print( 76);
}
else
{
++tipCount;
dollars -= 5;
if (tipCount == 1) {Print( 77);}
if (tipCount == 2) {Print( 78);}
if (tipCount == 3) {Print( 79);}
if (tipCount == 4) {Print( 80);}
if (tipCount > 4) {Print( 81);}
}
}
}
if (Said( look, bartender))
{
Print( 82);
Print( 83);
}
if (Said( buy, bartender, drink))
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 33);
}
else
{
Print( 69);
}
}
if (Said( buy, round))
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 33);
}
else
{
if (!beenToldPrice)
{
Set( beenToldPrice);
Print( 70);
}
else
{
dollars = 0;
Print( 71);
}
}
}
if ((Said( give, bartender, money) ||
Said( give, money, bartender) ||
Said( pay, lefty) ||
Said( bribe, lefty)))
{
Print( 72);
}
if (Said( look, moose))
{
Print( 45);
}
if (Said( look, girl))
{
Print( 48);
}
if ((Said( look, man) ||
Said( look, people)))
{
Print( 53);
}
if (Said( look, fan))
{
Print( 49);
Print( 50);
}
if (Said( look, painting))
{
Print( 51);
}
if ((Said( touch, girl) ||
Said( touch, girl, leg) ||
Said( touch, leg) ||
Said( look, leg) ||
Said( feel, leg) ||
Said( feel, girl, leg) ||
Said( feel, girl)))
{
if (!nearGirl)
{
Set( notCloseEnough);
}
else
{
Print( 67);
}
}
if ((Said( pick$up, girl) ||
Said( ask, girl, dance) ||
Said( dance, with, girl) ||
Said( buy, girl, drink) ||
Said( kiss, girl) ||
Said( talk, girl)))
{
if (!nearGirl)
{
Set( notCloseEnough);
}
else
{
Print( 60);
Print( 56);
Print( 57);
}
}
if ((Said( listen, man) ||
Said( talk, man)))
{
if ((nearBore || currentStatus == ON_BAR_STOOL))
{
Print( 59);
}
else
{
if (nearMen)
{
Print( 61);
}
else
{
Set( notCloseEnough);
}
}
}
if ((Said( look, jukebox) ||
Said( look$in, jukebox)))
{
if (!nearJukeBox)
{
Set( notCloseEnough);
}
else
{
Print( 64);
}
}
if ((Said( play, jukebox) ||
Said( use, jukebox) ||
Said( play, music) ||
Said( put, anyword, dollar, jukebox) ||
Said( put, dollar, jukebox) ||
Said( put, money, jukebox)))
{
if (!nearJukeBox)
{
Set( notCloseEnough);
}
else
{
Print( 4);
dollars -= 1;
Set( startJukeBox);
}
}
if ((Said( use, hammer, door) ||
Said( open, door, use, hammer) ||
Said( hit, door, with, hammer) ||
Said( use, hammer, open, door) ||
Said( use, hammer, door) ||
Said( use, hammer, on, door) ||
Said( hammer, on, door)))
{
if (!nearDoor)
{
Set( notCloseEnough);
}
else
{
if (!Has( iHammer))
{
Set( dontHaveIt);
}
else
{
Print( 73);
}
}
}
[ Handle the purchase of libations.
if ((Said( order, drink) ||
Said( buy, drink, wino) ||
Said( buy, wino, drink) ||
Said( buy, drink) ||
Said( drink) ||
Said( talk, bartender)))
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 20);
}
else
{
Print( 21);
}
}
if ((Said( wine) ||
Said( give, me, wine) ||
Said( get, wine) ||
Said( order, wine)))
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 33);
}
else
{
if (script && script < 5)
{
Print( 40);
}
else
{
Print( 36);
Print( 37);
Set( orderedAWine);
script = 0;
Set( scriptDone);
}
}
}
if ((Said( beer) ||
Said( give, me, beer) ||
Said( get, beer) ||
Said( order, beer)))
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 33);
}
else
{
if (script && script < 5)
{
Print( 40);
}
else
{
Print( 23);
Set( orderedABeer);
script = 0;
Set( scriptDone);
}
}
}
if ((Said( booze) || [ Generic non-handled liquors.
Said( give, me, booze) ||
Said( get, booze) ||
Said( champagne) ||
Said( give, me, champagne) ||
Said( get, champagne) ||
Said( order, champagne) ||
Said( order, booze)))
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 33);
}
else
{
if (script && script < 5)
{
Print( 40);
}
else
{
Print( 54);
}
}
}
if ((Said( light, beer) ||
Said( give, me, light, beer) ||
Said( get, light, beer) ||
Said( order, light, beer)))
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 33);
}
else
{
if (script && script < 5)
{
Print( 40);
}
else
{
Print( 52);
}
}
}
if ((Said( whiskey) ||
Said( give, me, whiskey) ||
Said( get, whiskey) ||
Said( order, whiskey)))
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 33);
}
else
{
if (script && script < 5)
{
Print( 40);
}
else
{
Print( 22);
Set( orderedAWhiskey);
script = 0;
Set( scriptDone);
}
}
}
if (Said( drink, whiskey))
{
if (!Has( iWhiskey))
{
Set( dontHaveIt);
}
else
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 34);
}
else
{
Set( tookADrink);
Drop( iWhiskey);
Print( 39);
}
}
}
[ Handle mounting, and dismounting, of stool.
if ((Said( sit) ||
Said( sit, down)||
Said( sit, bar)||
Said( mount, stool)||
Said( mount, bar, stool)||
Said( get, on, stool) ||
Said( sit, on, stool) ||
Said( sit, on, bar, stool) ||
Said( sit, down, on, stool) ||
Said( sit, down, on, bar, stool) ||
Said( sit, bar, stool) ||
Said( sit, stool)))
{
if (currentStatus == ON_BAR_STOOL)
{
Print( 3);
}
else
{
if (!nearEmptyStool)
{
Set( notCloseEnough);
}
else
{
currentStatus = ON_BAR_STOOL;
IgnoreBlocks( ego);
SetView( ego, vBarFlys);
SetLoop( ego, L_EGO_ON_STOOL);
RepositionTo( ego, 90, 128);
StopMotion( ego);
Set( programControl);
StopCycling( aBore);
jokeSeconds = 15; [ Seconds(+7) before first joke.
boreTalkCycles = 0; [ Turn off his random talking.
}
}
}
if ((Said( leave, stool) ||
Said( leave, bar, stool) ||
Said( get, off, stool) ||
Said( get, off, bar, stool) ||
Said( get, up) ||
Said( get, off) ||
Said( get, down) ||
Said( stand, up) ||
Said( stand)))
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 2);
}
else
{
if (script && script < 5)
{
Print( 40);
}
else
{
SetView( ego, vEgo);
StartMotion( ego);
Reset( programControl);
ObserveBlocks( ego);
RepositionTo( ego, 90, 131);
SetLoop( aBore, FACING_LEFT);
StopCycling( aBore);
Random( 24, 32, boreTalkCycles); [ Cycles before talking to girl.
jokeSeconds = 0; [ No more jokes.
if (!drunkSeconds)
{
currentStatus = NORMAL;
}
else
{
currentStatus = DRUNK;
Set( handsOff);
PreventInput();
Print( 41);
}
}
}
}
if ((Said( kiss, off, rol) ||
Said( fuck$you, rol) ||
Said( damn, rol) ||
Said( go, hump, rol) ||
Said( shut, up, rol) ||
Said( get, lost, rol)))
{
if (currentStatus != ON_BAR_STOOL)
{
Print( 44);
}
else
{
CurrentLoop( aBore, work);
if (work != FACING_RIGHT)
{
Print( 62);
}
else
{
Print( 43);
[ Make him sulk awhile before he starts talking to the girl.
SetLoop( aBore, FACING_LEFT);
StopCycling( aBore);
Reset( boreCycling);
Random( 123, 234, boreTalkCycles);
Random( 44, 88, jokeSeconds); [ seconds till he talks to ego.
}
}
}
[*****
:noInput
[*****
if (aSecondPassed)
{
--jukeBoxTimer;
if (jukeBoxTimer == 1 && !soundOn)
{
Set( musicDone);
}
--bartenderTimer;
if (bartenderTimer == 1)
{
Toggle( bartenderWandering);
if (bartenderWandering)
{
Random( 4, 12, bartenderTimer);
StartUpdate( aBartender);
Wander( aBartender);
}
else
{
Random( 12, 33, bartenderTimer);
SetLoop( aBartender, FACING_FRONT);
ForceUpdate( aBartender);
StopUpdate( aBartender);
}
}
--doorTimer;
if (doorTimer == 1)
{
Set( doorScriptDone);
}
if (currentStatus == DRUNK)
{
--drunkSeconds;
if (drunkSeconds == 41)
{
Print( 66);
}
if (drunkSeconds == 1)
{
--drunkSeconds;
staggerCycles = 0;
AcceptInput();
ReleaseLoop( ego);
PlayerControl();
Reset( programControl);
currentStatus = NORMAL;
Reset( handsOff);
Print( 42);
}
}
--jokeSeconds;
if (jokeSeconds == 7)
{
SetLoop( aBore, FACING_RIGHT);
StartCycling( aBore); [ He's starting a new joke
}
if (jokeSeconds == 1)
{
if (typing)
{
jokeSeconds = 4;
}
else
{
Random( 20, 45, jokeSeconds); [ seconds before he starts again
StopCycling( aBore); [ He's starting a new joke
if ((!heardJoke1 ||
!heardJoke2 ||
!heardJoke3 ||
!heardJoke4 ||
!heardJoke5 ||
!heardJoke6 ||
!heardJoke7 ||
!heardJoke8 ||
!heardJoke9))
{
:pickAJoke;
Random( 11, 19, joke); [ Pick a punch line.
work = joke;
work += 210; [ Because flags are 221-229.
if (IssetV( work)) [ Be sure it's a new one.
{
goto pickAJoke;
}
SetV( work);
Print( 10);
PrintV( joke);
Print( 58);
}
}
}
}
--boreTalkCycles;
if (boreTalkCycles == 1)
{
Random( 23, 45, boreTalkCycles);
Toggle( boreCycling);
if (boreCycling)
{
StartCycling( aBore);
}
else
{
StopCycling( aBore);
}
}
if (scriptDone)
{
Reset( scriptDone);
++script;
if (script == 1)
{
bartenderTimer = 0;
StartUpdate( aBartender);
MoveObj( aBartender, 106, 102, 1, scriptDone);
}
if (script == 2)
{
SetLoop( aBartender, FACING_FRONT);
StopUpdate( aBartender);
ForceUpdate( aBartender);
scriptTimer = 4;
}
if (script == 3)
{
StartUpdate( aBartender);
MoveObj( aBartender, 90, 102, 1, scriptDone);
}
if (script == 4)
{
SetLoop( aBartender, FACING_FRONT);
StopUpdate( aBartender);
ForceUpdate( aBartender);
scriptTimer = 3;
}
if (script == 5)
{
Print( 24);
if (!dollars > 2)
{
Print( 26);
Print( 27);
script = 6;
}
else
{
StartUpdate( aBartender);
MoveObj( aBartender, 119, 99, 1, scriptDone);
Print( 25);
dollars -= 3;
if (orderedAWhiskey)
{
Reset( orderedAWhiskey);
if (Has( iWhiskey))
{
Set( tookADrink);
Print( 35);
}
else
{
if (!boughtWhiskey)
{
Set( boughtWhiskey);
currentScore += 1;
}
Get( iWhiskey);
Print( 38);
}
}
if (orderedABeer)
{
Reset( orderedABeer);
Set( tookADrink);
Print( 28);
}
if (orderedAWine)
{
Reset( orderedAWine);
Set( tookADrink);
Print( 29);
Print( 30);
}
}
}
if (script == 6)
{
script = 0;
SetLoop( aBartender, FACING_BACK);
StopUpdate( aBartender);
ForceUpdate( aBartender);
Reset( bartenderWandering);
bartenderTimer = 5;
}
}
--legCycles;
if (legCycles == 1)
{
Random( 10, 22, legCycles);
Toggle( legCycling);
if (legCycling)
{
StartCycling( aGirl);
}
else
{
StopCycling( aGirl);
}
}
if (doorScriptDone)
{
Reset( doorScriptDone);
++doorScript;
if (doorScript == 1)
{
Draw( aPeepHole);
EndOfLoop( aPeepHole, doorScriptDone);
}
if (doorScript == 2)
{
StopUpdate( aPeepHole);
doorTimer = 3;
}
if (doorScript == WAITING_FOR_PASSWORD)
{
Print( 7);
doorTimer = 12;
}
if (doorScript == 4)
{
Print( 8);
StartUpdate( aPeepHole);
BeginningOfLoop( aPeepHole, doorScriptDone);
}
if (doorScript == 5)
{
Erase( aPeepHole);
StartMotion( ego);
Reset( programControl);
doorScript = 0;
doorTimer = 0;
}
if (doorScript == 101) [ He knew the password.
{
Print( 9);
StopMotion( ego);
Set( programControl);
StartUpdate( aPeepHole);
BeginningOfLoop( aPeepHole, doorScriptDone);
}
if (doorScript == 102)
{
Erase( aPeepHole);
StartUpdate( aDoor);
EndOfLoop( aDoor, doorScriptDone);
}
if (doorScript == 103)
{
newRoom = rmBackroom;
}
}
if (musicDone)
{
Reset( musicDone);
SetCel( aJukeBox, 1);
StopUpdate( aJukeBox);
ForceUpdate( aJukeBox);
}
if (startJukeBox)
{
Reset( startJukeBox);
StartUpdate( aJukeBox);
Sound( mTitle, musicDone);
if (!soundOn)
{
Reset( musicDone);
Random( 8, 12, jukeBoxTimer);
StartUpdate( aJukeBox);
}
}
[ Scott Murphy's drinking problem
if (tookADrink)
{
Reset( tookADrink);
ShakeScreen( 1);
if (!drunkSeconds)
{
drunkSeconds = 5; [ increases geometricly with each drink.
staggerCycles = 10;
Print( 31);
}
else
{
Print( 32);
if (drunkSeconds < 120)
{
drunkSeconds += drunkSeconds;
}
}
}
if (currentStatus == DRUNK)
{
if (egoDir != EGO_STOPPED)
{
--staggerCycles;
if (staggerCycles == 1)
{
Toggle( staggering);
if (!staggering)
{
Reset( programControl);
ReleaseLoop( ego);
staggerCycles = 7;
}
else
{
Set( programControl);
FixLoop(ego);
:loop1
Random( 1, 8, work);
if (work == egoDir)
{
goto loop1;
}
egoDir = work;
staggerCycles = 5;
}
}
}
}
[*****
:exit [ test for leaving the room
[*****
if (edgeEgoHit == TOP) {newRoom = rmHallway;}
if (edgeEgoHit == BOTTOM) {newRoom = rmOutsideBar;}
RM15.MSG
[messages for room 15 -- rmInsideBar
[ "Leisure Suit Larry in the Land of the Lounge Lizards"
[ by Al Lowe
%message 1
"This is the sleaziest bar you've ever been in.
And you've been in quite a few."
%message 2
"You are standing."
%message 3
"You are sitting."
%message 4
"You insert a dollar into the juke box, and select a suitably sleazy song."
%message 5
"You rap loudly on the naugahyde door.
You wonder how many naugas had to give their
all just to decorate this sleazehole."
%message 6
"So what?"
%message 7
"\"Yeah. Whatsda passwoid?\""
%message 8
"\"Scram, dog breath!\""
%message 9
"\"Come on in!\""
%message 10
"\"...blah, blah, blah, blah, blah...\""
%message 11
"\"...a lotta guys just leave her hanging in a tree somewhere!\""
%message 12
"\"...'cause Thursday's your night in the barrel!\""
%message 13
"\"...just think of the money he saved!\""
%message 14
"\"...and there stood the pig and the cow!\""
%message 15
"\"...dammit Liza, doncha know ya own reflection?\""
%message 16
"\"...we are coming back this way, aren't we?\""
%message 17
"\"...You idiot! I said POSSE!!\""
%message 18
"\"...nobody can eat THAT much ice cream!\""
%message 19
"\"...25 bucks, same as in town!\""
%message 20
"You'd better sit down first."
%message 21
"You greet the bartender.\n\n
\"What'll it be,\" Lefty responds, \"whiskey, wine or beer?\""
%message 22
"\"I'll have a glass of your fine, well whiskey!\" you tell Lefty."
%message 23
"\"Gimme a mug o' beer!\" you order Lefty."
%message 24
"\"That'll be $3.00, please.\""
%message 25
"You flip three bucks onto the counter."
%message 26
"\"I'm presently a little short,\" you stammer."
%message 27
"\"Yeah, and not just in the financial department, I bet!\" he replies,
grabbing back your order."
%message 28
"You down the beer in your pseudo-macho style,
and slam the mug back on the bar."
%message 29
"You delicately sip the wine until it's all gone.\n\n
You tell Lefty,
\"I find this impudent and sassy, with the slightest hint of impertinence.\""
%message 30
"He gazes at you longingly and moistens his lips!"
%message 31
"Suddenly you feel a little woozy."
%message 32
"This one tastes even better than the last.
One more sounds like a good idea."
%message 33
"Try sitting at the bar; that usually gets Lefty's attention."
%message 34
"It's not good etiquette to drink standing up."
%message 35
"Since you can only balance one open glass of whiskey at a time,
you toss this one down immediately."
%message 36
"\"May I please have a glass of your delicate white zinfandel, sir?\"
you ask Lefty."
%message 37
"Hey, was that your voice?"
%message 38
"You don't drink the whiskey, but instead,
decide to carry it with you wherever you go,
precariously balanced in an open shot glass."
%message 39
"The whiskey burns its way down your throat.
You vow to never again buy a \"well\" brand."
%message 40
"Hold on; you haven't got your last order yet!"
%message 41
"You feel a little light-headed."
%message 42
"Shaking your head, you clear away the cobwebs and are able to once again
walk in your standard, studly style."
%message 43
"\"Cram it, clown!\" you tell the bore on the stool next to you!"
%message 44
"\"Same to ya!\" shouts Lefty."
%message 45
"It's an antique, left over from \"King's Quest III.\""
%message 46
"Patience, Larry; patience!"
%message 47
"The door is locked. And, there is no key."
%message 48
"She may not be a great looker, but think of the muscles in that leg."
%message 49
"It's just going around in circles..."
%message 50
"...like your life."
%message 51
"You don't know much about art, but you do know what you like!"
%message 52
"You mean to say you're playing a 3-D adventure game,
and all you want is LIGHT beer??"
%message 53
"They're just sitting at the bar, drinking their livers into oblivion."
%message 54
"\"Sorry, we don't sell them sissy drinks here,\" says Lefty.
\"We got whiskey, wine and beer. What do you want?\""
%message 55
"My, aren't we the little savage!
Didn't your mother teach you anything?"
%message 56
"\"Who cares,\" she replies sarcastically.
\"Stop bugging me, or I'll have my boy friend
take care of you when he gets back from the rest room!\""
%message 57
"Looks like you're operating at your standard level of charm, Larry."
%message 58
"\"Har, har!!\""
%message 59
"He has nothing to say, but says it continuously."
%message 60
"\"Hi there, lovely legs!\" you say sweetly.
\"My name's Larry; Larry Laffer.\""
%message 61
"They have no comment."
%message 62
"He's not bothering you now; leave him alone, you big bully!"
%message 63
"You can't. There's no key in this game!"
%message 64
"Gee, Dad. It's a Wurlitzer!"
%message 65
"The peephole is locked from the inside."
%message 66
"Boy, are you drunk!"
%message 67
"SLAP!"
%message 68
"\"Ya got me!\""
%message 69
"\"No, thanks,\" Lefty replies. \"I don't drink.\""
%message 70
"\"Ok,\" says Lefty, \"but that'll cost ya $%v90.00!\""
%message 71
"The last of the big time spenders,
you go down in a blaze of glory, ordering drinks for everybody in the place."
%message 72
"\"I'll not help you,\" says Lefty, \"no matter how much you offer me!\""
%message 73
"The naugahyde bounces the hammer back, grazing your scalp but slightly."
%message 74
"You flip a fiver out on the bar.
Lefty grabs it, smiles, and says, \"Hey, thanks buddy! "
%message 75
"%m74"
%message 76
"You don't have enough money!"
%message 77
"\"Double down on eleven.\""
%message 78
"\"If you're short of money, you could always try gambling at the casino.\""
%message 79
"\"If you're bored hanging around my place, try hailing a cab outside.\""
%message 80
"\"Have you talked to Sierra On-Line lately?\""
%message 81
"\"Guys tell me I need to clean my rest room walls.\""
%message 82
"He appears to be perverted, twisted and sick!"
%message 83
"You instantly take a liking to him."
-
Just walk on by and drop a load of code right there like it ain't a thing ::)
-
Just walk on by and drop a load of code right there like it ain't a thing ::)
Christmas spirit, right? ;D
-
So a comment was set by a bracket?
-
Indeed.
-
If memory serves me right, the AGI code shown in the Donald B. Trivette book might have shown comments like that.
-
Good memory.
(http://blazingstix.com/pictures/agi-comments.jpg)
-
Apparently a scan of the book can be found in the Internet Archive:
https://www.archive.org/35/items/the-official-book-of-kings-quest/TheOfficialBookOfKingsQuest_text.pdf#page=31 (https://www.archive.org/35/items/the-official-book-of-kings-quest/TheOfficialBookOfKingsQuest_text.pdf#page=31)
-
Having said that, i think this is really unfortunate news, and means we may never get to see the original sources to Larry or Sierra's other titles.
Hi Peter,
Don't despair. Here's the source for LSL1's Lefty's bar (RM15):
RM15.CG
snip
RM15.MSG
snip
Where did you get this? It is a really fascinating look at how Sierra coded their games. Some things that I noticed right away:
- commands are not in the 'dot' format; looks like they used CamelCase. Which is interesting because the debug scripts all used lower case, with a dot separator.
- looks like they set aside flags and variables from 200 and above as 'local' flags and variables; for example, 'nearJukeBox', defined as 'lf3', decompiles as f203
- reserved flags and variables have values different than what is currently used in fan based games (for example currentRoom vs room_num, haveInput vs input_received)
- in 'said' commands, they didn't use quotes around words; and they used dollar sign ($) for spaces
I would really love to have more of this source code to help in decompiling the interpreter and gaining a fuller understanding of how everything works.
-
Apparently a scan of the book can be found in the Internet Archive:
https://www.archive.org/35/items/the-official-book-of-kings-quest/TheOfficialBookOfKingsQuest_text.pdf#page=31 (https://www.archive.org/35/items/the-official-book-of-kings-quest/TheOfficialBookOfKingsQuest_text.pdf#page=31)
Pretty easy to pick one up off of ebay too.
-
Where did you get this? It is a really fascinating look at how Sierra coded their games.
From generous people who were willing to privately share it with me.
I would really love to have more of this source code to help in decompiling the interpreter and gaining a fuller understanding of how everything works.
If you're looking for a specific snippet - I can probably post it here.
-
Some things that I noticed right away:
- commands are not in the 'dot' format; looks like they used CamelCase. Which is interesting because the debug scripts all used lower case, with a dot separator.
- looks like they set aside flags and variables from 200 and above as 'local' flags and variables; for example, 'nearJukeBox', defined as 'lf3', decompiles as f203
- reserved flags and variables have values different than what is currently used in fan based games (for example currentRoom vs room_num, haveInput vs input_received)
- in 'said' commands, they didn't use quotes around words; and they used dollar sign ($) for space
Perhaps if Omer has scripts from other AGI games, he could post one or two more for comparison with LSL.
-
Really great to see you join the forum. Hope we see a few more posts from you. It's been a long time. Any thoughts on doing anything in the AGI community again?
I feel somewhat tempted to do a rewrite of AGI Studio in TypeScript that would allow it to run on all platforms via Electron, and also via a web browser. Currently my full time gig is working on interpreters/compilers + web-based IDEs so it seems like a good time to revisit AGI tooling again. Largely it's going to be a matter of whether I could find enough spare time to do it, but also what level of interest there might be in such a project.
Anyone think this is a good idea? I'd love to see more fan games being made and existence of more modern tools esp. with good support for Mac/Linux as well as Windows might help that.
If I were to go ahead with this I'd use https://github.com/Microsoft/monaco-editor which provides excellent facilities for language tooling like error highlighting, autocomplete etc.
-
Hi Peter,
Don't despair. Here's the source for LSL1's Lefty's bar (RM15):
!!!!!!!!
Wow. That... is awesome.
I never thought I'd get to see any of the original code. My main interest is in the syntax and structure; the language AGI Studio uses is an educated guess partially based on some code samples that came from a book somewhere (it might have actually been the one Charles posted about). I always wondered what it _really_ looked like, e.g. how variable names were handled, whether there were local declarations used for specific rooms or everything was global, whether messages were embedded or in a separate file etc.
If I were to go ahead with a new version of AGI Studio, I'd love to have it support the original syntax, for authenticity. I understand there's legal restrictions on the original sources for the games, but I'm sure we could put together a brand new template and/or examples which conformed to the original syntax without problems as that would constitute our own work.
-
I never thought I'd get to see any of the original code. My main interest is in the syntax and structure; the language AGI Studio uses is an educated guess partially based on some code samples that came from a book somewhere (it might have actually been the one Charles posted about).
Yes, it was definitely the same book. I bought a copy of this book back in the 90s, from a local store in NZ, and that is what I used when I created the SHOWLOG application, which I think is what you used as the basis of the code syntax in AGI Studio. So indirectly the AGI Studio syntax is based on the example code in the Donald B. Trivette book. I would expect it to be fairly authentic, given it was in that book, which is why I'm surprised a bit that the LSL1 source code is different.
I always wondered what it _really_ looked like, e.g. how variable names were handled, whether there were local declarations used for specific rooms or everything was global, whether messages were embedded or in a separate file etc.
I'm hoping Omer is going to provide some samples from other games for comparison (the more games, the better, even if it is only one script from each ;) ). It could be that they had multiple different syntaxes, which if true would make it difficult to make a tool like AGI Studio or WinAGI more authentic.
If I were to go ahead with a new version of AGI Studio, I'd love to have it support the original syntax, for authenticity. I understand there's legal restrictions on the original sources for the games, but I'm sure we could put together a brand new template and/or examples which conformed to the original syntax without problems as that would constitute our own work.
Don't know if you know, but there is something like 75% of the original AGI interpreter source code available as well. There is a topic on these forums with an attachment that has the code. Apparently it was found in the floppy disk slack space from one of the games. It has been invaluable in my work on the C# AGI Interpreter.
-
I'm hoping Omer is going to provide some samples from other games for comparison (the more games, the better, even if it is only one script from each ;) ). It could be that they had multiple different syntaxes, which if true would make it difficult to make a tool like AGI Studio or WinAGI more authentic.
Here are some samples from a few AGI games: https://drive.google.com/open?id=1HSI3RiZPYszjLPbZM9k-Zyuo4uHqd1id (https://drive.google.com/open?id=1HSI3RiZPYszjLPbZM9k-Zyuo4uHqd1id)
The syntax is game specific and defined in their source.
-
I feel somewhat tempted to do a rewrite of AGI Studio in TypeScript that would allow it to run on all platforms via Electron, and also via a web browser. Currently my full time gig is working on interpreters/compilers + web-based IDEs so it seems like a good time to revisit AGI tooling again. Largely it's going to be a matter of whether I could find enough spare time to do it, but also what level of interest there might be in such a project.
Anyone think this is a good idea? I'd love to see more fan games being made and existence of more modern tools esp. with good support for Mac/Linux as well as Windows might help that.
If I were to go ahead with this I'd use https://github.com/Microsoft/monaco-editor which provides excellent facilities for language tooling like error highlighting, autocomplete etc.
I would certainly be interested in such a project. I was considering something similar. My thoughts were about creating something like the Scratch online programming "IDE" that is used a lot in school these days. I've played around with Scratch a bit (my daughters have both used it in school, and my younger daughter likes building Adventure-like games in Scratch on her ipad). It struct me that such an online environment would be great for an AGI IDE. If we could define a similar palette of blocks that could be dragged and dropped to build scripts, similar to how Scratch does it, then I think that might go down well, not only with AGI fans, but also in schools. And that is where I think it gets interesting. If the AGI/SCI community were to build something similar to Scratch but for building AGI games, then it could very well become adopted by some schools and our exposure could be greatly increased.
So if your plans were to create something online like that, then I think it would be fantastic. I've seen "block" like programming demos (Google's Blockly) where you can switch between the code and the blocks, where changes in one reflect in the other. That might be quite interesting as well.
-
Here are some samples from a few AGI games: https://drive.google.com/open?id=1HSI3RiZPYszjLPbZM9k-Zyuo4uHqd1id (https://drive.google.com/open?id=1HSI3RiZPYszjLPbZM9k-Zyuo4uHqd1id)
The syntax is game specific and defined in their source.
Thanks Omer. Yeah, looks like coders defined what they liked, although LSL appears to be the odd one out.
I've just remembered that you also provided a PDF with the original AGI programming documentation used by Sierra, and that it is attached to a post somewhere here in the forums. That document would also answer the question about syntax. Peter would no doubt be interested in that as well. Let me see if I can find the post...
Found it: http://sciprogramming.com/community/index.php?topic=1617.0
-
Here are some samples from a few AGI games: https://drive.google.com/open?id=1HSI3RiZPYszjLPbZM9k-Zyuo4uHqd1id (https://drive.google.com/open?id=1HSI3RiZPYszjLPbZM9k-Zyuo4uHqd1id)
The syntax is game specific and defined in their source.
Thank you for this! I'll probably spend weeks going over these samples in detail! I'm pleased that at first glance, all of the things I learned about variables, flags, commands, etc. by decompiling the interpreters appears to be accurate based on what I see here. And I also noticed that they used defines to refer to their resources (rooms, logics, views, sound, pics) which is emulated in WinAGI by the ResourceID property.
-
I would hate to see Visual AGI get swept under the rug with all of these other projects.
-
I would hate to see Visual AGI get swept under the rug with all of these other projects.
I do have it on my todo list to convert that AGI sound editor code that you sent me so that it can be incorporated into Visual AGI. Hopefully at some point we'll see that. And obviously in the not too distant future I'll ask you to merge my C# AGI Interpreter back into Visual AGI and then we can add a "Run Game" button.
On the subject of other projects, I think it is really great that there are other AGI projects starting up. We should encourage these as much as possible, and I for one would like to support Peter in what he has suggested. A browser based AGI IDE would be fantastic.
-
Just came across a video about the copyright issues surrounding the auction by the Space Quest historian:
https://www.youtube.com/watch?v=x8K7AWd-YAs