“Assassin” by Mocha Man & Eager Elmer

davidw
With my thirst for appallingly crap games satisfied – thanks muchly to “Sword Masters: Get Out Of The House”, “The Tavern” and “Doomed!” who definitely satisfied by thirst for a long, long time to come – I decided to turn my attentions to better games. Good games? Well… better than the previous three I mentioned anyway. Here I went to the top games on the Quest archive and saw this little gem peering out at me amidst all the other little gems. It cried at me to download it and write a review telling everyone it really wasn’t all that good. I was only too happy to oblige.

I was impressed with the attention to detail in the accompanying READ ME which begins with “welp” and then informs me that it’s not called a standard READ ME file because there are “fillions” of them around already. Fillions, eh? That’s a lot. After amusing myself with these bizarre typos, I decided I’d put it off long enough and went to the game itself.

I ran into problems quite soon. On my first command in fact. I was prompted to type HELP, did so, and found myself looking at a little pop-up window (nasty idea!) which was full of black text. On a black background. Hmm… In one way, this is an effective, if slightly unconventional, way of ensuring as many people as possible quit your game as soon as possible and thus don’t become even more disappointed with the game’s many other problems. On the other hand, it doesn’t pose much of a problem to those of us with a cut & paste command and an empty Word document. Now I'm not sure if this was the author’s fault, Quest’s fault or simply me changing the default colours of Quest and blindly assuming that it wouldn’t be daft enough to try displaying black text on a black background. Even more impressive is the way one of my next commands – X ROAD MAP – produces another pop-up window, this time a white one with… nothing inside. Even cut & paste didn’t help me here.

Visually-challenged player characters seem to be a favourite in Quest games from what I have seen and here is no exception. In the hospital, I am advised to take a brochure from the front desk, however the game then advises me that I CAN’T SEE THAT ANYWHERE. I'm told the same thing when trying to examine the front desk. However – and here the authors have begun to get into their stride – there *is* a description for the coat rack. Nice. On the down side, the jackets hanging on the coat rack are invisible but I guess one description for an entire location is a step up from the standard I've come to expect.

The game goes out of its way to bug me. Location descriptions will be different depending on whether you just entered a location – in which case you see a nice long description – or whether you're in the location and just typing LOOK – in which case you see a very short description. Often you need to exit the location and then re-enter it to see the full description as apparently the game interprets the LOOK command as “don’t show me everything I can LOOK at, just the basics”. Still, on the positive side of things, the authors have decided not to include descriptions of anything you can see in the longer descriptions so it’s not like you're really missing anything.

In an attempt to elevate this game to the lofty “not that” instead of “a steaming pile of” on the Crap-O-Meter, the authors have taken great care to customise some of the room descriptions. Now Quest has an annoying habit of churning out default room descriptions that sound like a robot wrote them: all very mechanical, to the point and with every last ounce of warmth or depth thoroughly murdered. This problem is then often made worse by the author of pretty much every Quest game I've ever played deciding to repeat this description in the actual body of the text. So you'll often be told the same thing twice which doesn’t do wonders for the game’s chances of ending up with anything more than a 1 out of 10 on the “is it any good?” scale. Here at least some effort has been expended to try and flesh out the descriptions to give the impression that they were written by real living human beings and not some faceless android. It succeeds… sometimes. Not all the time but at least it’s a start.

Of course, at other times, in an effort to convince people that bad games are cool, the authors have decided to plonk wonderful location descriptions like the following ones down:

W. ELM STREET PARKING.
YOU CAN GO NORTH.

And

PRINT STREET PARKING.
YOU CAN GO NORTH OR SOUTH.

Oh yes, filler locations. The bane of all that is good and proper in a text adventure. Whereas most people these days try and construct their games so that every location has a purpose, some still seem to enjoy the idea of filler locations. The purpose of these is simple: they have no purpose. They're just there. Why, the author wonders, should I have one location of use next to another location of use? Why, the author then wonders, shouldn’t I have 17 empty and pointless locations between them? Why, the author concludes, don’t I fill those locations with… nothing at all? And so he does. And that’s why we have filler locations. On the plus side, they give the game the distinct impression of being a lot bigger than it really is without the author having to go to the effort of writing any more actual game. On the down side, they nudge it firmly out of the “not that” category and into the “a steaming pile of” category.

Then again, a lot of the locations in the game seem to be merely filler locations as there isn't actually anything to do in them. Take, for example, the second location I visited: the Laundromat, which is described as:

HERE IS THE LAUNDROMAT.
YOU CAN GO SOUTH.

The lengthier description you see when you first enter the location mentions several other things of interest, but, as with most of the things of interest in the game, the authors seem to have decided that they're not interesting enough to warrant a description. So no examining the Laundromat itself, no examining the washers, no examining the front counter or the mint on the counter. No taking the mint. No using the washers. In fact, try as I might, I couldn’t find a single thing to do here. Hmm…

As the game progressed, I found myself recruited by the local mafia. The recruitment process was an amazingly complex and long drawn out one, no doubt designed to root out potential undercover cops and ensure the mafia heads remain safe, and involved me entering a tavern, being asked by a chap called Vinnie if I wanted to dehumanise people, and then – lo and behold! – I was a fully-fledged member of the mafia. Yes, it was certainly complicated this induction-into-the-mafia lark. Impressed with myself at the ease at which I had infiltrated this highly secretive gang of professional criminals, I went out on my first mission: I had to kill Red Jacket. That’s actually an item of clothing worn by the victim and not the victim himself, by the way, though as the game won’t let you refer to the victim by anything other than Red Jacket, I found myself thinking of him in this way. Mr. Red Jacket, I thought to myself, your days are numbered and then I proceeded to blast away at him with my pistol.

Or tried to anyway. Only just when the game seemed to have managed to lever itself out of the “a steaming pile of” category and into the “not that” category, it went and hit me left, right and centre with an unholy torrent of guess the verb problems:

> SHOOT MAN
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.

> SHOOT MAN WITH PISTOL
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.

> SHOOT RED JACKET WITH PISTOL
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.

> SHOOT RED JACKET
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.

> USE PISTOL
YOU CAN'T USE THAT HERE.

> USE PISTOL ON RED JACKET
YOU PULL THE GUN SILENTLY OUT OF YOUR JACKET AND FIRE. THE SHOT HITS THE MAN IN THE NECK AND HE FALLS TO HIS KNEES AND THEN FALLS OVER.

By the time I finally hit upon the correct command to pull this off, I was more than ready to shoot myself in despair… only I couldn’t figure out the command so shooting poor Mr. Red Jacket was the only choice left to me. Impressively, Mr. Red Jacket did a rather remarkable disappearing act after I shot him and I was unable to find his corpse. Had he perhaps not been quite dead even though I’d shot him in the neck? Had he stumbled away and hidden somewhere out of sight and the game just decided not to tell me? Had he simply vanished into thin air at the moment of the bullet’s impact? I had visions of the pistol I was firing being so inhumanly powerful that it could obliterate a red jacketed man with a single shot. This, I felt, would be a seriously cool weapon to have.

Whatever the truth of the situation, Mr. Red Jacket was clearly not a red jacket-wearing man that anybody really missed as I approached him in broad daylight in the middle of the street and shot him dead with my pistol and no one seemed to be particularly concerned. Or even noticed it had happened. I even stood around afterwards wondering if the cops were going to show up and arrest me for this heinous crime, but clearly they weren’t bothered either. Then again, with no corpse around (handy things these disappearing corpses!) there was little they could get me on save having a smoking gun in public.

On my way back to the mafia headquarters, still with a smoking gun in my hand, I am questioned by a police officer who isn't, to be kind, the brightest spark. She questions me about the shooting on Elm Street (apparently they found the invisible corpse after all, clever cops) and, even though I'm standing there with a loaded gun in my hand, she lets me go when I say I didn’t hear anything. My god. I know standards in the modern police force are said to be slipping, but *this*…

As you might have gathered from the fact that I played this far into the game without either a) slitting my wrists or b) firing the game into the recycle bin at slightly less than the speed of light, I didn’t hate Assassin quite as much as the previous three Quest games I’d played. Actually no, that’s not strictly speaking true. To say it’s a good game would be wildly misleading. In truth it’s pretty darn awful, but there's just something so bad about it that it’s almost good. It’s like a horrible car crash of a game that you know is going to be something you don’t want to see, but it’s purely *because* it’s so horrible that you keep on looking at it. I have to admit, I had a good chuckle at the idea of someone being recruited into the mafia by simply wandering into a tavern and answering a simple question. Even more chucklesome was the police officer questioning me about a shooting and not even seeming suspicion of the smoking gun in my hand. But even that was topped by my next assignment which involved me heading to the park and reading a note that had a mafia sign on it… in plain view of anyone who happened to wander past! The note even advises me – this being the note that’s been left out in plain sight – to acquire for myself a bomb and blow up a possible police base. While I'm at it, I might as well head along to the police station and turn myself in. It'll be quicker for me that way.

Unfortunately, by this stage I had begun to have the sneaking suspicion that the game wasn’t really very good. This was built up by a number of factors, but the main one seemed to be simply the feeling I had had right from the start that it was, well, a bit crap. I was tempted to carry on playing till I finished the game, but even though this was a step up from the masterpiece of interactive fiction that was “The Tavern”, it’s still not the kind of game I really wanted to be playing for any great length of time. It’s nearly got the makings of a half decent game here, and comes close to being amusing at times – though never intentionally – but there's a definite feeling that it’s only been half finished. Why the empty locations? Why the multitude of items that can’t be examined? Why are the mafia and the cops in the single figure IQ bracket?

On the Quest archive, the game boasts many scores of 4 and 5 (out of 5) and reviews which claim great things about it. Unfortunately, there must be two different versions of the game and I, cursed with bad luck as I am, picked the stinker to play. Anyone out there who has played the masterpiece which warrants 4 and 5 (out of 5), could you please send me a copy of the game as the one I downloaded would be extremely lucky to get a 2 out of 5.

So, in conclusion, I can think this one is safely out of the “a steaming pile of” category and into the “not that” category on the Crap-O-Meter, but it’s still kind of hard to recommend anyone play it unless they're actively seeking out bad games for one reason or another.

2 out of 10

Thanatos
...

No Comment :shock:

Michael The Gamer
davidw, I will not even read your complain about Assassin
1) It one of the best games in the Achieve
2) Its too long

But I just went though and read breafly

Best things about the game
Its has full descriptions
It has no mistakes
No typos
Very funny supplied readme
And I dont see anything wrong
Added a hint feature

Worse things about the game
You complaining about nothing in this game

And also face the facts that everyone at textadventures.co.uk likes the game
and Only you dont like it
Heres proof: Go to http://www.textadventures.co.uk/review.php?game=89

Anyone agree with me?

Elexxorine
Daivid, is there any game you like? just out of curisoity...

davidw
I liked Dr Froth’s IFComp entry and a couple of Steve the Gaming Guy’s games haven't been bad. But most Quest games? No. The only people who seem to like most Quest games are the Quest users. Funny that.

davidw
I don’t know why I've even bothering to respond to you, Michael, because what you know about good games could be written on the back of the world’s smallest postage stamp. In big letters. But anyway…

Best things about the game
Its has full descriptions



Full descriptions? Where exactly? This is the Laundromat:

HERE IS THE LAUNDROMAT.
YOU CAN GO SOUTH.

Yes, very full.

It has no mistakes



Aside from the empty locations with nothing to do, the multitude of items that can’t be examined and the hundred and one other problems you mean? Oh, and a police officer who doesn’t even notice I'm carrying a loaded gun shortly after a man has been shot dead in broad daylight?

No typos



Even the README has typos. Then again, your own posts are littered with the worst spelling and grammar I've seen outside of a Sword Master game so it’s unlikely you'd know a typo if you fell over one.

You complaining about nothing in this game



You're taking issue with me not complaining about nothing in the game in a review in which I complain about lots and lots of things? Er… whatever…

And also face the facts that everyone at textadventures.co.uk likes the game
and Only you dont like it
Heres proof: Go to http://www.textadventures.co.uk/review.php?game=89

Anyone agree with me?



Some people have said nice things about every unplayable piece of trash on the archive. Either I'm really supposed to believe that drivel like that is actually a quality game in disguise or people will say nice things about Quest games purely because they use Quest and don’t want to seem too negative about it. Serious question: outside of the immediate Quest community, how many glowing reviews of Quest games have you ever seen? I've seen positive ones of Dr Froth’s IFComp entry and one of a game by CJ592. That’s it.

But don’t take my word for it that most of the games are bad. Post a message on RAIF asking some of the people there to play the cream of the Quest crop and tell you what they think. I'm sure their opinion of games like “Assassin” will make the review I wrote above seem almost complimentary by comparison.

paul_one
David,

by the looks of things, various 'scripts' should be kicked off when you enter a room - which are a /kind/ of description - although a fairly poor one (from what I quickly read from the file).

They are still very empty and need filling out enormously.
And the custom commands that I saw lead me to think that it would be VERY hard to get the right one.

Michael The Gamer
davidw just to think about it
Authors dont want to put a lot of commands that look the same
like

> SHOOT MAN
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.

> SHOOT MAN WITH PISTOL
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.

> SHOOT RED JACKET WITH PISTOL
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.

> SHOOT RED JACKET
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.

> USE PISTOL
YOU CAN'T USE THAT HERE.

> USE PISTOL ON RED JACKET
YOU PULL THE GUN SILENTLY OUT OF YOUR JACKET AND FIRE. THE SHOT HITS THE MAN IN THE NECK AND HE FALLS TO HIS KNEES AND THEN FALLS OVER.



but it should include how to play a game
In Assassin (when you typed help)

To kill: Make sure you have a weapon, and then USE it on the victim. For example, say I wanted to kill someone named "unfortunate victim" and I had a pistol. I would type "use pistol on unfortunate victim" (luckily, no object names are that long).



Saying about that I guess you never typed help

davidw
You really don't like reading things before commenting on them, do you, Michael? As stated in my review, the very first command in the game I typed was HELP. And any author who has a clue what he is doing should try to cover every response the player will type, especially the obvious ones. It’s what separates the good authors from the bad ones.

Michael The Gamer
davidw wrote:You really don't like reading things before commenting on them, do you, Michael? As stated in my review, the very first command in the game I typed was HELP. And any author who has a clue what he is doing should try to cover every response the player will type, especially the obvious ones. It’s what separates the good authors from the bad ones.


I dont see any author doing that

davidw
And there you have it, people. Case closed.

Michael, you wonder why I think you're an idiot? It’s because of comments like the one above. You're forever giving your opinion on subjects that it’s obvious you know nothing about and crying to the moderators when people tell you you're wrong. Guess the verb is one of the worst things in IF and every author currently trying to write a game does their damnedest to cut down on it as much as possible. The ones that don’t are the ones who produce buggy, useless games that no one wants to play.

Freak
Quest games are frequently written under the assumption that the side panel will be enabled, and are meant to be played through the side panel. (So USE X ON Y instead of custom verbs.) That's a good chunk of why you're rating everything so much lower.

But even with that in mind, I can't give this a high score. It's too sparsely implemented (73 objects in 104 rooms), and it's too silly to take seriously, without being funny.

steve the gaming guy
I see what you're saying, Freak. I agree to a point but if an author wants to make a game that mainly uses the sidebar, he should point that out in the intro of the game. The second Mansion game is a great example of this. It was a well put together game and it introduces it as a game that focuses on the use of the sidebar.
Now, when I design my own games (and I presume most 'authors'), I type in the commands that need to be used to make the desired effect work. The adjectives are not a headache to put in. QDK is designed that way. Although it may not be mandatory to allow the player to say 'unlock door', it's just a nice touch and a better chance at a high score to not force them to use only one command 'use key on door'. What's even better is, let's say you don't have a key and you create something with custom commands as follows:

> e 
The door is locked and you cannot travel further in that direction.

> open door
The door is locked and cannot be opened yet.

> unlock door
The door is locked and you do not have a key.


This would be much better than the player seeing this:

> e
You can't go that way.

> open door
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.

> unlock door
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.


In this set of examples, the player doesn't have the key in inventory and cannot rely on clicking and dragging in the sidebar.

Michael The Gamer
steve the gaming guy wrote:I see what you're saying, Freak. I agree to a point but if an author wants to make a game that mainly uses the sidebar, he should point that out in the intro of the game. The second Mansion game is a great example of this. It was a well put together game and it introduces it as a game that focuses on the use of the sidebar.
Now, when I design my own games (and I presume most 'authors'), I type in the commands that need to be used to make the desired effect work. The adjectives are not a headache to put in. QDK is designed that way. Although it may not be mandatory to allow the player to say 'unlock door', it's just a nice touch and a better chance at a high score to not force them to use only one command 'use key on door'. What's even better is, let's say you don't have a key and you create something with custom commands as follows:

> e
The door is locked and you cannot travel further in that direction.

> open door
The door is locked and cannot be opened yet.

> unlock door
The door is locked and you do not have a key.



This would be much better than the player seeing this:

[quote]> e
You can't go that way.

> open door
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.

> unlock door
I DON'T UNDERSTAND YOUR COMMAND. TYPE HELP FOR A LIST OF VALID COMMANDS.



In this set of examples, the player doesn't have the key in inventory and cannot rely on clicking and dragging in the sidebar.[/quote]

Its better if you quote the custom commands instead of coding it like the one above

davidw since your a smarty pants im checking all (or one :lol: ) of your game(s) and see if you added any responce that I choose to type and see if I can win the game

davidw
Well, Michael, considering that you give unplayable games written by illiterates 5 out of 5, if you rate mine any lower I’ll only be left with the conclusion that you’ve given it a bad rating because you don’t like me. The same goes for any negative review you might post.

paul_one
Right,

while everyone is here, I'll just re-post my preview game (which as it has it, implements quite a few key features that are in this argument).
.. why isn't the ".qlb" attachment allowed!? *sigh*

Fine, I'll just code block them.
FILE=common.qlb
!library
!asl-version <400>
!Common library to give room descriptions, and default answers to many commands.
!Created by Tr0n²

!addto game

startscript {
panes off
set string <directions[0]; north>
set string <directions[1]; northeast>
set string <directions[2]; northwest>
set string <directions[3]; east>
set string <directions[4]; west>
set string <directions[5]; southeast>
set string <directions[6]; south>
set string <directions[7]; southwest>
set string <directions[8]; up>
set string <directions[9]; down>

set string <desc.rnd1[0]; in what seems to be,>
set string <desc.rnd1[1]; in>
set string <desc.rnd1[2]; in, what could be called,>
set string <desc.rnd1[3]; inside, what you can only call,>
set string <desc.rnd1[4]; inside>
set string <desc.rnd1[5]; , looking around>
set string <desc.rnd1[6]; in the middle of>

set string <desc.rnd2[0]; It looks like you can go;>
set string <desc.rnd2[1]; You see that you can go;>
set string <desc.rnd2[2]; The exits surrounding you are;>
set string <desc.rnd2[3]; You may go;>
set string <desc.rnd2[4]; You're torn for choice, you can go;>

set string <desc.rnd3[0]; to>
set string <desc.rnd3[1]; toward>
set string <desc.rnd3[2]; which is>
set string <desc.rnd3[3]; into>

}

description {
set numeric <desc.rnd1; $rand(0;6)$ >
msg <You are |cg#game:posture#|cb _
#desc.rnd1[desc.rnd1]# _
#(quest.currentroom):prefix# _
|cr#(quest.currentroom):alias#|cb >

if ( $left(#quest.command#;1)$ = l) or _
not property <#quest.currentroom#; been_here> then {
msg <#quest.lookdesc#>
property <#quest.currentroom#; been_here>
if not ( #quest.formatobjects# = ) then msg <You can see #quest.formatobjects# here. >
}

set numeric <desc.rnd1; $rand(0;4)$ >
msg <#desc.rnd2[desc.rnd1]#>
for <loop.1; 0; 9> {
if not ( $objectproperty(#quest.currentroom#; #directions[loop.1]#)$ = ! ) then {
set string <direction.name; $objectproperty(#quest.currentroom#; #directions[loop.1]#)$ >
set numeric <desc.rnd1; $rand(0;3)$ >
msg < |cl#directions[loop.1]#|cb #desc.rnd3[desc.rnd1]# #(direction.name):prefix# |cr#(direction.name):alias#|cb,>
}
}
}

afterturn set string <quest.lastcommand; #quest.command#>

error <badthing; You don't see anything like that here..>
error <badcommand; $badcommand$>
error <badgo; It doesn't seem like you can go there..>
error <defaultout; It doesn't seem like you can go there..>
error <badgive; You decide that you are a deserving owner, and give to yourself.. You are pleased with your new gift.>
error <badplace; It doesn't seem like you can go there..>
error <badpronoun; $badit$>
error <badput; You put it into your own hand..>
error <badtake; You think about it, but decide that you can do without such an item..>
error <baduse; You try to use it, but can't quite figure out |ihow|xi to..>
error <defaultuse; You try to use it, but can't quite figure out |ihow|xi to..>
error <cantdrop; You can't get rid of that!>
error <cantclose; You try your best, but it just won't close..>
error <cantopen; You try your best, but it just won't open..>
error <cantremove; You try your best, but you can't remove that..>
error <cantput; You think that there are better places to put things then |ithere|xi..>
error <defaultspeak; You suddenly feel something is wrong with you speaking to that..>
error <noitem; You can't do that if you don't have it first..>
error <itemunwanted; You decide it's better to hang onto it..>

' This is taken from stdverbs.lib, for standard compatibility..
' Edited a little because the actions were blurring together
command <#cmn.command#. #cmn.command2#; _
#cmn.command#, and then #cmn.command2#; _
#cmn.command#, then #cmn.command2#; _
#cmn.command#, #cmn.command2#; _
#cmn.command# and then #cmn.command2#; _
#cmn.command# then #cmn.command2#> {
msg <|n|cg|b$symbol(gt)$ #cmn.command#|cb|xb>
exec <#cmn.command#>
pause <500>
if ( $instr(#cmn.command2#;,)$ = 0 ) and _
( $instr(#cmn.command2#;_then_)$ = 0 ) then _
msg <|n|cg|b$symbol(gt)$ #cmn.command2#|xb|cb>
exec <#cmn.command2#>
}

command <look around> _
exec <look>
command <look into #@object#> _
exec <look in #@object#>
command <look at ground> _
if here <$getobjectname(ground)$> then _
exec <look at ground; normal> _
else _
msg <You look at your feet, suddenly feeling bashful..>
command <look at sky> _
if here <$getobjectname(sky)$> then _
exec <look at sky; normal> _
else _
msg <You look up, letting your mind wander for a few moments..>
command <look on #@object#;look at #@object#> _
exec <look at #@object#; normal>
command <look at #@object# with #@something#;_
look at #@object# in #@something#;_
look down #@object# with #@something#;_
look in #@object# with #@something#;_
look in #@object# using #@something#> {
msg <You angle the #@something# just right, look into it, and see..>
if property < #something#; reflective > then {
flag on <mirror_in_use>
exec <look at #@object#>
flag off <mirror_in_use>
}
else _
exec <look at #@something#>
}
command <look #look.direction#ward;_
look #look.direction#wards;_
look #look.direction#> {
for <look.loop; 0; 9> _
if ( #look.direction# = #directions[look.loop]# ) and _
not ( $objectproperty(#quest.currentroom#; #look.direction#)$ = ! ) then _
flag on <look_direction>
if flag <look_direction> then {
set string <look.direction.name; $objectproperty(#quest.currentroom#; #look.direction#)$ >
msg <You see the #(look.direction.name):alias# ..>
flag off <look_direction>
}
else _
select case <#look.direction#> {
case <down> _
exec <look at ground>
case <up> _
exec <look at sky>
case else _
exec <look #look.direction#; normal>
}
}

command <go #direction#;_
n;north;ne;northeast;e;east;se;southeast;_
s;south;sw;southwest;w;west;nw;northwest;_
u;up;d;down> _
select case <#game:posture#> {
case <standing; crouching; crawling; limping; crying> _
exec <#quest.originalcommand#; normal>
case else _
msg <You can't do that while you're #game:posture#..>
}
command <put #@object# and #@object2# and #object3# on #@last_object#; _
put #@object#, #@object2# and #object3# on #@last_object#; _
put #@object# and #@object2# on #@last_object#> _
exec <put #@object# on #@last_object#, put #@object2# on #@last_object#, put #@object3# on #@last_object#>
command <put #@object# on #@last_object#> _
exec <put #@object# on #@last_object#; normal>

command <sit down; sit up;sit> _
debug <SIT_$posture_change(sit down;sitting;You sit down on the ground and rest..)$>
command <stand up;stand> _
debug <STAND_$posture_change(stand;standing;You stand up, brushing your legs for no real reason.)$>
command <lay down;lay;sleep> _
if ( $posture_change(lay down;laying;|xn)$ = SUCC ) then {
msg <You lay down, spread your legs out, and |xn>
if ( $rand(1;10)$ = 5 ) then _
msg <|cr`OUCH!`|cb hit your head!> _
else _
msg <lay down with your hands behind your head.>
}
command <jump> _
select case <$posture_test(laying)$> {
case <SUCC; FAIL> _
debug <JUMP_$posture_change(jump;laying;You leap into the air, spread your arms and - fall flat on your face!|nYou are now lying on the ground.)$>
case <SAME> _
exec <stand up, jump>
}

command <cry;sob> _
debug <CRY_$posture_change(cry;crying;Your vision goes blurry and there's a sparkle in your stomach as you start to cry.)$>
command <don't cry;stop crying> _
debug <STOP_CRY$posture_change(stop crying;#game:old_posture#;You dry your eyes and give a poor sniffle as you stop crying.)$>
command <stomp; stamp> _
if ( $posture_change(stamp;standing;)$ = FAIL ) then _
msg <You stomp around like a small child, waving your arms.>

command <cut throat;cut throat #stuff#;_
slit throat;slit throat #stuff#;_
maime;maime #stuff#> _
msg <You don't need to be so graphical! Try attack, hit or kick.>
command <die> _
msg <You think about jumping from a tall building for a second or two - imagining the rush of air and the sense of freedom that would come - and then snap back to reality.>
command <yell;shout;cry out> _
msg <You yell at the top of your voice..>

command <stop> _
if ( #game:posture# = crying ) then _
exec <stop crying> _
else _
msg <Stop what?>
command <get up> _
select case <#game:posture#> {
case <sitting;laying> _
exec <stand up>
case <hanging> _
exec <go up>
case else _
msg <Get up where?>
}

command <help> _
msg <Have a walk around, try out some things.|n_
Send in some suggestions about commands which would be helpful, or nice.|n_
debug commands:|n _
|cgt.f1|cb Flag 1 - set mirror flag on.|n _
|cgt.f11|cb Flag 1 - set mirror flag off.|n _
|cgt.f2|cb Flag 2 - set darkness flag on.|n _
|cgt.f22|cb Flag 2 - set darkness flag off.|n _
|cgt.in|cb Indent test.|n _
|cgt.in2|cb Indent test 2.|n_
room descriptions don't (yet?) take darkness into account.|n|n_
Commands known about:|n _
break; smash; crush; stomp; stamp; climb; _
drink; sip; quaff; swig; eat; nibble; munch; _
scoff; consume; hit; jump; leap; kick; kill; _
murder; kiss; smooch; punch; pinch; sit; throw; _
turn; step>

command <wait> _
msg <You step back and watch time roll by..>
command <xyzzy> _
msg <"|cgAZEEZEE|cb..." You cry out..|n_
"..cseezzy.. exy-zee? .. exize?"|n_
You ponder how it should be pronounced and forget why you said it in the first place..>

command <#t.command# #@object# with #@something#;_
#t.command# #@object# using #@something#;_
#t.command# #@object# on with #@something#;_
#t.command# #@object# on #@something#;_
#t.command# #@object# at #@something#;_
#t.command# #@object# into #@something#;_
#t.command# #@object# in #@something#;_
#t.command# on #@object# with #@something#;_
#t.command# on #@object#;_
#t.command# onto #@object#;_
#t.command# over #@object#;_
#t.command# up #@object#;_
#t.command# off #@object# with #@something#;_
#t.command# off #@object#;_
#t.command# #@object# on;_
#t.command# #@object# off with #@something#;_
#t.command# #@object# off;_
#t.command# #@object#> _
select case <#t.command#> {
case <break; smash; crush; stomp; stamp; climb; _
drink; sip; quaff; swig; eat; nibble; munch; _
scoff; consume; hit; jump; leap; kick; kill; _
murder; kiss; smooch; punch; pinch; sit; throw; _
turn; step> {

if action < #object#; #t.command# > then _
doaction <#object#; #t.command#> _
elseif property < #object#; #t.command# > then _
msg <$objectproperty(#object#;#t.command#)$> _
else _
select case <#t.command#> {
case <break; smash; crush; stomp; stamp> _
msg <You figure that breaking the #(quest.lastobject):alias# isn't the right thing to do.>
case <climb> _
msg <You can't climb the #(quest.lastobject):alias#>
case <drink; sip; quaff; swig> _
msg <You can't drink that.>
case <eat; nibble; munch; scoff; consume> _
msg <You don't want to eat that.>
case <hit; attack; hurt> {
msg <You decide hitting |xn>
if ( #(quest.lastobject):gender# = ! ) then _
msg <it |xn> _
else _
msg <#(quest.lastobject):gender# |xn>
msg <would be a bad choice.>
}
case <jump; leap> _
msg <You can't jump that!>
case <kick> _
msg <You don't have the courage to kick the #(quest.lastobject):alias#..>
case <kill; murder> _
if ( #(object):gender# = him ) or ( #(object):gender# = her ) then _
msg <You decide that killing #(object):gender# is the wrong thing to do..> _
else _
msg <Can you actually kill #(object):prefix# #(object):alias#!?>
case <kiss; smooch> _
msg <You stare, your eyes misted over as you play the kiss over in your mind..>
case <punch> _
msg <You imagine your fist flying through the air, and then reality snaps back into place..>
case <pinch> _
msg <You sqeeze your fingers together, but decide you look silly and immediately stop.>
case <sit> {
msg <You'd rather not sit on |xn>
if ( #(quest.lastobject):gender# = ! ) then _
msg <it.> _
else _
msg <#(quest.lastobject):gender#.>
}
case <step> _
msg <Your feet are more comfortable where they are.>
case <throw> _
msg <You position yourself carefully, but then decide you'd rather not..>
case <turn> {
msg <You try to find a way to turn the #(quest.lastobject):alias#|xn>
if ( $instr(#quest.command#;_on)$ > 0 ) then _
msg < on|xn> _
elseif ( $instr(#quest.command#;_off)$ > 0 ) then _
msg < off|xn>
msg <, but can't quite figure out how you could.>
}
}
}
case else _
exec <#quest.command#; normal>
}

command <#t.command# ;#t.command#> select case <#t.command#> {
case <break; smash; crush; stomp; stamp; climb; _
drink; sip; quaff; swig; eat; nibble; munch; _
scoff; consume; hit; jump; leap; kick; kill; _
murder; kiss; smooch; punch; pinch; sit; throw; _
turn; step> _
msg <#t.command# what?>
case else _
exec <#quest.command#; normal>
}



!end

define synonyms
yourself; myself; me; you = self
n = north
n, = north,
s = south
s, = south,
e = east
e, = east,
w = west
w, = west,
ne = northeast
ne, = notheast,
nw = northwest
nw, = northwest,
se = southeast
se, = southeast,
sw = southwest
sw, = southwest,
l = look
l, = look,
i; inv = inventory
i,; inv, = inventory,
end define

define type <surface>
container
surface
add
remove

action <list> {
msg <On the #@object# you see |xn>
set string <t.cont.list; >
set numeric <t.cont.count; 0>
for each object in <#quest.currentroom#> {
if ( #(quest.thing):parent# = #object# ) and _
not property <#quest.thing#; invisible> then {
set string <t.cont.list; #t.cont.list# #(quest.thing):prefix# |b#(quest.thing):alias#|xb,>
set string <t.cont.last; #(quest.thing):prefix# |b#(quest.thing):alias#|xb>
inc <t.cont.count>
}
}
if ( %t.cont.count% > 1 ) then {
set numeric <t.cont.pos; $instr(#t.cont.list#;, #t.cont.last#)$ - 1>
set string <t.cont.list; $left(#t.cont.list#;%t.cont.pos%)$ and #t.cont.last#.>
}
else {
set numeric <t.cont.pos; $lengthof(#t.cont.list#)$ - 1>
set string <t.cont.list; $left(#t.cont.list#;%t.cont.pos%)$.>
}
msg <#t.cont.list#>
}
end define

define type <object>
gender=it
prefix=a
take

end define

define type <bottle>
type <object>

action <hit> doaction <$thisobject$; break>
action <smash> doaction <$thisobject$; break>
action <break> {
set string <thisobject; $thisobject$>
if property < #thisobject#; broken > or ( #something# = #object# ) then _
msg <You can't break it twice!> _
elseif property < #something#; soft > then _
msg <That wouldn't break the #@thisobject#!> _
else {
if ( #something# = #thisobject# ) then _
msg <The #@thisobject# also smashes..> _
elseif ( #something# = ) then _
msg <You smash the #@thisobject# on the ground and break the bottom off.. It is now sharp where it is broken.> _
else {
msg <You smash the #@object# using the #@something#, and see the it break.>
debug <#something#>
}
property <$thisobject$; alias=Broken #(thisobject):alias#; look=It used to be:|n |i#(thisobject):look#|xi|nIt is now broken, and has sharp edges.;broken>
if property < #something#; fragile > and _
not ( $thisobject$ = #something# ) and _
not property < #something#; broken > then _
doaction < #something#; break >
}
set string <something; >
}

properties <fragile>

end define

define room <inventory>

define object <self>
look {
select case <$look_desc$> {
case <0> _
msg <You look down at your body, and see that you haven't changed too much since you last looked. You look well built and you feel comfortable in the jeans and t-shirt you're wearing.>
case <1> _
msg <You pull some funny faces and wink in the mirror, pulling a quick smirk from your bag of facial expressions. After some serious thought, you adjust a few strands of hair, and smile..|nYou feel quite comfortable with your looks.>
case <2> _
msg <You stare in the darkness down at yourself.>
case <3> _
msg <You stare in the darkness at #@something#.. You can't even see it, let alone yourself!>
}
}
properties <invisible>
end define

end define

define function <look_desc>
set numeric <t.look.return; 0>
if flag <mirror_in_use> then inc <t.look.return>
if flag <darkness> then inc <t.look.return; 2>

return <%t.look.return%>
end define

define function <badcommand>
if not ( $instr(#quest.lastcommand#;_it)$ = 0 ) and _
flag <t.badit> then _
exec <#t.badit.first# #quest.command#> _
else _
msg <You try, but realise you don't know how!>
flag off <t.badit>

end define

define function <badit>
set numeric <t.badit.pos; $instr(#quest.originalcommand#;_it)$ >
set string <t.badit.first; $left(#quest.originalcommand#;%t.badit.pos%)$ >
flag on <t.badit>

return <#t.badit.first# what?>
end define

define function <posture_change>
' $posture_change(description_for_action; posture_to_change_to; message_to_print_to_screen)$
' Return = SUCC | SAME | FAIL

set string <t.pos.action; $parameter(1)$>
set string <t.pos.posture; $parameter(2)$>
set string <t.pos.message; $parameter(3)$>
set string <t.pos.return; $posture_test(#t.pos.posture#)$>

select case <#t.pos.return#> {
case <FAIL> _
msg <You can't #t.pos.action# while you're #game:posture#.>
case <SAME> _
msg <You are already #game:posture#.>
case <SUCC> {
msg <#t.pos.message#>
property <game; old_posture=#game:posture#; posture=#t.pos.posture#>
}
}

return <#t.pos.return#>

' select case <#game:posture#> {
' case <stuck;trapped;caught> _
' msg <You can't #t.pos.action# while you're #game:posture#.>
' case <#t.pos.posture#> _
' msg <You are already #game:posture#>
' case <crying> _
' if ( #t.pos.posture# = #game:old_posture# ) then _
' set string <t.pos.return; SUCC> _
' else _
' msg <You're crying too hard to do that..>
' case else _
' set string <t.pos.return; SUCC>
' }

' if ( #t.pos.return# = SUCC ) then {
' msg <#t.pos.message#>
' property <game; old_posture=#game:posture#; posture=#t.pos.posture#>
' }

return <#t.pos.return#>

end define

define function <posture_test>
' $posture_test(posture_to_change_to)$
' Return = SUCC | SAME | FAIL

set string <t.postst.return; FAIL>
set string <t.postst.same; $parameter(1)$>
select case <#game:posture#> {
case <stuck;trapped;caught> _
msg <|xn>
case <#t.postst.same#> _
set string <t.postst.return; SAME>
case <crying> _
if ( $parameter(1)$ = #game:old_posture# ) then _
set string <t.postst.return; SUCC>
case else _
set string <t.postst.return; SUCC>
}
return <#t.postst.return#>

end define


FILE=preview.asl
' Preview to see how the system can deal with
' stuff nicely.
' Including nice default error messages, good responses, descriptions, and general level of interactivity.
' containers, surfaces, items, exits and rooms too.
' Created by Tr0n²

!include <common.qlb>

define game <Preview>
asl-version <400>
gametype singleplayer
start <start>
game version <0.15>
game author <Tr0n²>
game info <A simple IF game, previewing the interactive level.>

properties <posture=standing>

startscript {
set string <one; yes>
set string <two; yes>
set string <three; no>
}
command <t.f1> flag on <mirror_in_use>
command <t.f11> flag off <mirror_in_use>
command <t.f2> flag on <darkness>
command <t.f22> flag off <darkness>
command <t.in> debug <$indent(lets see here!|nthis should|ncome out|nas lines; 3)$>
command <t.in2> debug <$indent(this should.|ncome out even.|further out!; 20)$ >
command <t.last> msg <#quest.lastcommand#>

end define

define room <start>
alias <Wooded Glade>
prefix <a>
look <You are all alone, tree's surround you, the grass is soft under your shoes and the morning light is dripping into the hole above you.>

comand <yell;shout;cry out> {
exec <yell; normal>
msg <The surrounding bushes seem to shuffle and look at you suspiciously.>
}

define object <treestump>
alias <Treestump>
alt <stump;treest>
prefix <a>
look <The Oak Treestump looks like it is old, and many carvings are on the top.>
type <surface>

list empty exec <look at carvings>
properties <kick=You kick the Treestump in frustration, and then limp around for a few seconds.>

end define

define object <carvings>
alt <wooden carvings;enscriptions;markings>
prefix <the>
alias <Carvings>
look <Some of the carvings are so old you can't make out if they were faces or rude pictures - possibly both.. Others are more recent.|nYou see |b"I will love you always.."|xb >
parent <treestump>
properties <invisible>

end define

define object <trees>
alt <tree;woods;branches;leaves;glade>
prefix <the>
alias <trees>
look <You look at the trees surrounding you, they all appear to be more or less the same.|nThere are breaks in the circle to the north, east and south.>
action <climb> msg <wee>
properties <invisible>

end define

define object <gbottle>
alt <bottle;green b;g bottle;btl>
alias <Green Bottle>
look <An empty green bottle.>
type <bottle>

properties <gender=him>

end define

define object <rbottle>
alt <bottle;red b;rbottle;btl>
alias <Red Bottle>
look <An empty red bottle.>
type <bottle>

end define

define object <boot>
alt <boot;shoe;heel>
alias <Leather Boot>
look <A leather boot, slightly scuffed and worn - but smells of dandylions!>
type <object>

end define

define object <feather>
properties <soft>
end define

north <room3>
east <room4>
south <room2>

end define

define room <room2>
alias <Small Beaten Path>
prefix <a>
look <This small beaten path seems to wind Southwards through the trees..>

define object <beatenpath>
alias <Path>
alt <beaten path;small path;small beaten path;ground;floor;dirt;_
bracken;twigs;sticks>
prefix <the>
look <You look at the small beaten pathway between the trees. Twigs lay like green or brown worms over the lighter dirt path.>

properties <invisible>
end define

north <start>
end define

define room <room3>
alias <Dusty Road>
prefix <a>
look <The dusty road appears to drift off Northwards, deviding the fields that lay ahead into two as if some god had half heartedly started to saw through the land and just given up after marking it.>

define object <dustyroad>
alias <Road>
alt <dusty road;road;ground;floor;dirt>
prefix <the>
look <The road is quite wide, and shows some grass in patches, like mini-islands in a sea of sand. Greenery grows either side, giving the fields beyond them boundaries, presumably to stop the road from consuming the rest.>

properties <invisible>
end define

south <start>
end define

define room <room4>
alias <Cobbled Road>
prefix <a>
look <The cobbles here are small and black bubbles on the floor. It heads off Eastwards towards a small town.>

define object <cobbles>
alt <cobbles;cobble;ground;road;floor>
alias <Cobbles>
prefix <the>
look <The cobbles under your feet look at if they were a black substance poured over a collection of large marbles.. They have the effect that any coach with circular wheels travelling along it either quickly evolves webbed wheels - or develops

properties <invisible>
end define

west <start>
end define


Unfortunately I can't find why doing a "look at bottle" crashes Quest (or a 'look at anything' to that matter).
Probably the old 'exec <sdf; normal>' bug again.

But the above preview does good things..
try (without doing anything else):
> KICK IT

> STUMP

You'll be pleasantly surprised (this applies any time the object 'it' is referring to an object that is wrong - wrong being whatever Quest deems as wrong).

[EDIT]
Oops, my bad.
Old version of Quest had the exec <> error.
Just upgraded and it works now.

Elexxorine
I couldn't see your indent function. Where is it? I'm interested how you did it, as you know I made myself one too.

paul_one
I removed it for a few reasons - as I've told you.

Linky to version of library with indent function:
viewtopic.php?f=5&t=1682

And I'm thinking about picking this up again a little, making a cute little game or two from it.

Elexxorine
My indent code is different and lines stuff up. I use it to print the skills, etc in my new battle code I'm making, to print two per line, it lines with the values so with the skill name before so they all start at the same place and then does that again on the line two make two. It looks like they are in columns like a table, or similar. Spend ages making it work properly. The code is nasty though if any would really like to see it? Tr0n/Paul_one hates it.

This topic is now closed. Topics are closed after 60 days of inactivity.

Support

Forums