Warning, /frameworks/syntax-highlighting/autotests/folding/highlight_tads3.t.fold is written in an unsupported language. File is not indexed.
0001 // TADS3 Example File 0002 // Source: https://www.tads.org/t3doc/doc/t3QuickStart.htm 0003 0004 #charset "us-ascii" 0005 #include <adv3.h> 0006 #include <en_us.h> 0007 0008 versionInfo: GameID 0009 IFID = '558c20af-6559-477a-9f98-b7b4274cd304' 0010 name = 'The Best Burglar' 0011 byline = 'by Eric Eve' 0012 htmlByline = 'by <a href="mailto:eric.eve@hmc.ox.ac.uk"> 0013 Eric Eve</a>' 0014 version = '3' 0015 authorEmail = 'Eric Eve <eric.eve@hmc.ox.ac.uk>' 0016 desc = 'You are the world\'s best burglar faced with the greatest challenge 0017 of your felonious career.' 0018 htmlDesc = 'You are the world\'s best burglar faced with the greatest 0019 challenge of your felonious career.' 0020 ; 0021 0022 gameMain: GameMainDef 0023 <beginfold id='1'>/*</beginfold id='1'> the initial player character is 'me' <endfold id='1'>*/</endfold id='1'> 0024 initialPlayerChar = me 0025 0026 showIntro() 0027 <beginfold id='2'>{</beginfold id='2'> 0028 "<b>The Best Burglar</b>\nWell, you've got this far. Now it's just a 0029 quick nip inside the house and out again carrying the Orb of Ultimate 0030 Satisfaction, an object that no burglar has ever managed to steal 0031 before. If you can pull it off you're sure to win the Burglar of the 0032 Year Award, putting you at the pinnacle of your profession.\b"; 0033 <endfold id='2'>}</endfold id='2'> 0034 0035 showGoodbye() 0036 <beginfold id='2'>{</beginfold id='2'> 0037 "Thanks for playing! "; 0038 <endfold id='2'>}</endfold id='2'> 0039 ; 0040 0041 startRoom: OutdoorRoom 'Driveway' 0042 "The large red-brick Tudor house stands immediately to the north of this end 0043 of the driveway, while the drive back to the road where you left your 0044 getaway vehicle runs off though a belt of trees to the southwest." 0045 0046 roomFirstDesc = "Here you are in the drive of Number 305 Erehwon Avenue, 0047 with the great house you've come to burgle standing just before you to 0048 the north. The drive back to the road where you left your getaway 0049 vehicle runs off though a belt of trees to the southwest." 0050 0051 north = frontDoor 0052 in asExit(north) 0053 southwest = drive 0054 ; 0055 0056 + me: Actor 0057 pcDesc = "You're Alexis Lightfinger, burglar extraordinaire, the most 0058 professional thief in the known universe; but you're on a job now, so 0059 you don't have time for the narcissistic indulgence of admiring your own 0060 appearance. You're far too professional not to have come fully prepared, 0061 so there's no practical need to look yourself over again. " 0062 ; 0063 0064 ++ Container 'large white swag bag*bags' 'swag bag' 0065 "It's a large white bag with <q>SWAG</q> printed on it in very large 0066 letters. Everyone knows that no real burglar would ever carry such a thing, 0067 so by carrying it you know no one will take you for a real burglar. Cunning, 0068 eh? " 0069 ; 0070 0071 + frontDoor: LockableWithKey, Door 'solid oak front door*doors' 'front door' 0072 "The lintel above the front door is carved with the date 1589, presumably 0073 the date the house was built. The door itself is made of solid oak. " 0074 keyList = [brassKey] 0075 0076 makeOpen(stat) 0077 <beginfold id='2'>{</beginfold id='2'> 0078 inherited(stat); 0079 if(stat) 0080 achievement.awardPointsOnce(); 0081 <endfold id='2'>}</endfold id='2'> 0082 0083 achievement: Achievement <beginfold id='2'>{</beginfold id='2'> +10 "opening the front door" <endfold id='2'>}</endfold id='2'> 0084 0085 ; 0086 0087 + flowerPot: ComplexContainer 'terracotta small flower flowerpot/pot*pots' 0088 'flower pot' 0089 "It's a perfectly ordinary small terracota pot, though it looks like no 0090 one's got round to putting a plant in it yet. " 0091 subContainer: ComplexComponent, Container <beginfold id='2'>{</beginfold id='2'> bulkCapacity = 3<endfold id='2'>}</endfold id='2'> 0092 subUnderside: ComplexComponent, Underside <beginfold id='2'>{</beginfold id='2'> <endfold id='2'>}</endfold id='2'> 0093 0094 initSpecialDesc = "A small flower pot rests on the ground not far from the 0095 front door. " 0096 0097 bulk = 3 0098 bulkCapacity = 3 0099 ; 0100 0101 ++ brassKey: Hidden, Key 'small brass key*keys' 'small brass key' 0102 "It's an ordinary enough small brass key. " 0103 subLocation = &subUnderside 0104 ; 0105 0106 + Enterable -> frontDoor 'large red red-brick tudor house/mansion/front 0107 *houses*buildings' 'house' 0108 "It's a large red-brick Tudor house with mullioned windows, climbing 0109 creepers and the date 1589 carved over the door. " 0110 ; 0111 0112 ++ Component '(door) carved lintel' 'lintel' 0113 "Its most noteworthy feature is the date 1589 carved into it. " 0114 ; 0115 0116 + Decoration 'mullioned windows' 'windows' 0117 "They're architecturally attractive, no doubt, but not especially helpful to 0118 burglars. " 0119 0120 notImportantMsg = 'It\'s a matter of professional pride with you never to 0121 mess with windows. ' 0122 isPlural = true 0123 ; 0124 0125 + Decoration 'green climbing ivy/creepers/creeper' 'creepers' 0126 "The front of the house is festooned with green creepers -- ivy, perhaps, 0127 but botany was never your strong point since in the main plants aren't 0128 worth burgling. " 0129 0130 notImportantMsg = 'The creepers can\'t help you burgle the house -- they\'re 0131 certainly not strong enough to climb and they\'re certainly not worth 0132 stealing -- so you may as well leave them alone. ' 0133 isPlural = true 0134 ; 0135 0136 + drive: PathPassage 'drive/path/avenue' 'drive' 0137 "The drive leading back to the road runs off through a belt of trees to the 0138 southwest. " 0139 0140 dobjFor(TravelVia) 0141 <beginfold id='2'>{</beginfold id='2'> 0142 action() 0143 <beginfold id='2'>{</beginfold id='2'> 0144 "You retrace your steps back to the road, where your trusty unmarked 0145 burglarmobile is still parked, ready for your quick getaway. "; 0146 0147 if(orb.isIn(me)) 0148 <beginfold id='2'>{</beginfold id='2'> 0149 "Congratulations! You have got away with the Orb of Ultimate 0150 Satisfaction, a feat never before performed. As you slip the orb 0151 onto the back seat of your car and climb into the driver's seat 0152 you tell yourself that you're now absolutely certain to win 0153 the Burglar of the Year Award!\b"; 0154 0155 achievement.awardPointsOnce(); 0156 0157 finishGameMsg(ftVictory, [finishOptionUndo, 0158 finishOptionFullScore]); 0159 <endfold id='2'>}</endfold id='2'> 0160 else 0161 <beginfold id='2'>{</beginfold id='2'> 0162 "It's a shame you didn't manage to steal the orb, though. 0163 Without it you'll never win the Burglar of the Year Award 0164 now.\b"; 0165 0166 finishGameMsg(ftFailure, [finishOptionUndo]); 0167 <endfold id='2'>}</endfold id='2'> 0168 <endfold id='2'>}</endfold id='2'> 0169 <endfold id='2'>}</endfold id='2'> 0170 0171 okayRubMsg = 'What -- all of it? That may take a while! ' 0172 achievement: Achievement <beginfold id='2'>{</beginfold id='2'> +10 "getting away with the orb" <endfold id='2'>}</endfold id='2'> 0173 ; 0174 0175 + Decoration 'belt/trees' 'trees' 0176 "The trees are in full leaf, which is good, because they hide what you're 0177 doing from the road. " 0178 0179 notImportantMsg = 'The trees are doing a good job of hiding you from the 0180 road, so you may as well leave them alone. It\'s not as if they\'re 0181 something you could steal, after all. ' 0182 ; 0183 0184 hallway: Room 'Hallway' 0185 "This hall is or grand proportions but pretty bare. The front door lies to 0186 the south and other exits lead east, north and west. " 0187 0188 south = hallDoor 0189 out asExit(south) 0190 west = study 0191 north: FakeConnector <beginfold id='2'>{</beginfold id='2'> "You're pretty sure that only leads to the kitchen, 0192 and you haven't come here to cook a meal. " <endfold id='2'>}</endfold id='2'> 0193 0194 east: DeadEndConnector <beginfold id='2'>{</beginfold id='2'> 'the living room' "You <<one of>>walk through the 0195 doorway and find yourself in<<or>>return to<<stopping>> the living room 0196 where you take <<one of>> a <<or>>another<<stopping>> quick look around, 0197 but <<one of>><<or>> once again<<stopping>> failing to find anything of 0198 interest you quickly return to the hall. "<endfold id='2'>}</endfold id='2'> 0199 ; 0200 0201 + hallDoor: Lockable, Door -> frontDoor 'front door*doors' 'front door' 0202 ; 0203 0204 + table:Surface 'small wooden mahogany side table/legs*tables' 'small table' 0205 "It's a small mahogany table standing on four thin legs. " 0206 initSpecialDesc = "A small table rests by the east wall. " 0207 bulk = 5 0208 0209 dobjFor(Take) 0210 <beginfold id='2'>{</beginfold id='2'> 0211 check() 0212 <beginfold id='2'>{</beginfold id='2'> 0213 if(contents.length > 0) 0214 failCheck('It\'s probably not a very good idea to try picking 0215 up the table while <<contents[1].nameIs>> still on it. '); 0216 <endfold id='2'>}</endfold id='2'> 0217 <endfold id='2'>}</endfold id='2'> 0218 ; 0219 0220 ++ vase: Container 'cheap china floral vase/pattern' 'vase' 0221 "It's only a cheap thing, made of china but painted in a tasteless floral 0222 pattern using far too many primary colours. " 0223 0224 bulk = 3 0225 bulkCapacity = 3 0226 ; 0227 0228 +++ silverKey: Hidden, Key 'small silver key*keys' 'small silver key' 0229 ; 0230 0231 study: Room 'Study' 0232 "This study is much as you would expect: somewhat spartan. A desk stands in 0233 the middle of the room with a chair placed just behind it. A <<if 0234 picture.moved>>safe is built into <<else>> rather bland painting hangs on 0235 <<end>> the west wall. The way out is to the east. " 0236 east = hallway 0237 out asExit(east) 0238 ; 0239 0240 + desk: Heavy, Platform 'plain wooden desk' 'desk' 0241 "It's a plain wooden desk with a single drawer. " 0242 dobjFor(Open) remapTo(Open, drawer) 0243 dobjFor(Close) remapTo(Close, drawer) 0244 dobjFor(LookIn) remapTo(LookIn, drawer) 0245 dobjFor(UnlockWith) remapTo(UnlockWith, drawer, IndirectObject) 0246 dobjFor(LockWith) remapTo(LockWith, drawer, IndirectObject) 0247 dobjFor(Lock) remapTo(Lock, drawer) 0248 dobjFor(Unlock) remapTo(Unlock, drawer) 0249 ; 0250 0251 ++ drawer: KeyedContainer, Component '(desk) drawer*drawers' 'drawer' 0252 "It's an ordinary desk drawer with a small silver lock. " 0253 keyList = [silverKey] 0254 ; 0255 0256 +++ notebook: Readable 'small bright red notebook/book/cover/pages' 0257 'small red notebook' 0258 "It's a small notebook with a bright red cover. " 0259 0260 readDesc = "You open the notebook and flick through its pages. The only 0261 thing you find of any interest is a page with <q>SAFE DATE</q> scrawled 0262 across it. After satisfying yourself that the notebook contains nothing 0263 else of any potential relevance you snap it shut again. <.reveal 0264 safe-date>" 0265 0266 dobjFor(Open) asDobjFor(Read) 0267 dobjFor(LookIn) asDobjFor(Read) 0268 0269 dobjFor(Read) 0270 <beginfold id='2'>{</beginfold id='2'> 0271 action() 0272 <beginfold id='2'>{</beginfold id='2'> 0273 inherited; 0274 achievement.awardPointsOnce(); 0275 <endfold id='2'>}</endfold id='2'> 0276 <endfold id='2'>}</endfold id='2'> 0277 0278 cannotCloseMsg = 'It\'s already closed. ' 0279 achievement: Achievement <beginfold id='2'>{</beginfold id='2'> +5 "reading the notebook" <endfold id='2'>}</endfold id='2'> 0280 ; 0281 0282 + CustomImmovable, Chair 'red office swivel chair' 'chair' 0283 "It's a typical office swivel chair, covered in red fabric. " 0284 0285 cannotTakeMsg = 'You see no reason to burden yourself with such a useless 0286 object; that would be quite unprofessional. ' 0287 0288 ; 0289 0290 + picture: RoomPartItem, Thing 'rather bland picture/painting/landscape' 0291 'picture' 0292 "It's a landscape, pleasantly executed enough, but of no great distinction 0293 and definitely not worth the bother of stealing. " 0294 0295 initNominalRoomPartLocation = defaultWestWall 0296 initSpecialDesc = "A rather bland painting hangs on the west wall. " 0297 isListed = (moved) 0298 0299 bulk = 8 0300 0301 dobjFor(LookBehind) 0302 <beginfold id='2'>{</beginfold id='2'> 0303 action() 0304 <beginfold id='2'>{</beginfold id='2'> 0305 if(moved) 0306 inherited; 0307 else 0308 <beginfold id='2'>{</beginfold id='2'> 0309 safe.discover(); 0310 "Behind the picture is a safe built into the wall. "; 0311 <endfold id='2'>}</endfold id='2'> 0312 <endfold id='2'>}</endfold id='2'> 0313 <endfold id='2'>}</endfold id='2'> 0314 0315 moveInto(newDest) 0316 <beginfold id='2'>{</beginfold id='2'> 0317 if(!safe.discovered) 0318 <beginfold id='2'>{</beginfold id='2'> 0319 "Removing the painting from the wall reveals a safe behind. "; 0320 safe.discover(); 0321 <endfold id='2'>}</endfold id='2'> 0322 inherited(newDest); 0323 <endfold id='2'>}</endfold id='2'> 0324 ; 0325 0326 + safe: RoomPartItem, Hidden, CustomFixture, ComplexContainer 0327 'sturdy steel safe' 'safe' 0328 "It's a sturdy steel safe with a single dial on its door. " 0329 0330 subContainer: ComplexComponent, IndirectLockable, OpenableContainer 0331 <beginfold id='2'>{</beginfold id='2'> 0332 bulkCapacity = 5 0333 makeOpen(stat) 0334 <beginfold id='2'>{</beginfold id='2'> 0335 inherited(stat); 0336 if(stat) 0337 achievement.awardPointsOnce(); 0338 <endfold id='2'>}</endfold id='2'> 0339 0340 achievement: Achievement <beginfold id='2'>{</beginfold id='2'> +10 "opening the safe" <endfold id='2'>}</endfold id='2'> 0341 <endfold id='2'>}</endfold id='2'> 0342 0343 specialDesc = "A safe is built into the west wall. " 0344 specialNominalRoomPartLocation = defaultWestWall 0345 cannotTakeMsg = 'It's firmly built into the wall; you can't budge it. ' 0346 0347 discover() 0348 <beginfold id='2'>{</beginfold id='2'> 0349 if(!discovered) 0350 <beginfold id='2'>{</beginfold id='2'> 0351 foreach(local cur in allContents) 0352 cur.discover(); 0353 0354 achievement.awardPointsOnce(); 0355 <endfold id='2'>}</endfold id='2'> 0356 inherited(); 0357 <endfold id='2'>}</endfold id='2'> 0358 0359 achievement: Achievement <beginfold id='2'>{</beginfold id='2'> +5 "finding the safe" <endfold id='2'>}</endfold id='2'> 0360 ; 0361 0362 ++ safeDoor: Hidden, ContainerDoor '(safe) door' 'safe door' 0363 "It has a circular dial attached to its centre. " 0364 ; 0365 0366 +++ safeDial: Hidden, Component, NumberedDial 'circular dial*dials' 'dial' 0367 "The dial can be turned to any number between <<minSetting>> and 0368 <<maxSetting>>. It's currently at <<curSetting>>. " 0369 0370 minSetting = 0 0371 maxSetting = 99 0372 curSetting = '35' 0373 0374 num1 = 0 0375 num2 = 0 0376 correctCombination = 1589 0377 0378 makeSetting(val) 0379 <beginfold id='2'>{</beginfold id='2'> 0380 inherited(val); 0381 num2 = num1; 0382 num1 = toInteger(val); 0383 if(100 * num2 + num1 == correctCombination) 0384 <beginfold id='2'>{</beginfold id='2'> 0385 "You hear a slight <i>click</i> come from the safe door. "; 0386 safe.makeLocked(nil); 0387 <endfold id='2'>}</endfold id='2'> 0388 else if(!safe.isOpen) 0389 safe.makeLocked(true); 0390 <endfold id='2'>}</endfold id='2'> 0391 ; 0392 0393 ++ orb: Thing 'ultimate battered dull metal orb/sphere/ball/satisfaction' 0394 'Orb of Ultimate Satisfaction' 0395 "It doesn't look much be honest, just a battered sphere made of some dull 0396 metal, but you've been told it's the most valuable and desirable object 0397 in the known universe! " 0398 0399 aName = (theName) 0400 0401 subLocation = &subContainer 0402 0403 okayRubMsg = 'As {you/he} rub{s} {the dobj/him} a shimmering djiin suddenly 0404 appears in the air before you!\b 0405 <q>Hello, you have reached the automated holographic answering service 0406 of Jeannie the Genie,</q> she announces. <q>I\'m sorry I\'m not 0407 available to respond to your rub in person right now, but my hours of 0408 activity have been heavily curtailed by the European Working Time 0409 Directive. Before making a wish, please make sure that you have 0410 conducted a full risk assessment in line with the latest Health and 0411 Safety Guidelines. Also, please note that before any wish can be granted 0412 you must sign a Form P45/PDQ/LOL indemnifying this wish-granting agency 0413 against any consequential loss or damage arising from the fulfilment of 0414 your desires. Thank you for rubbing. Have a nice day!</q>\b 0415 Her message complete, the holographic djiin fades away into 0416 non-existence. ' 0417 0418 moveInto(dest) 0419 <beginfold id='2'>{</beginfold id='2'> 0420 inherited(dest); 0421 if(dest.isOrIsIn(me)) 0422 achievement.awardPointsOnce(); 0423 <endfold id='2'>}</endfold id='2'> 0424 0425 achievement: Achievement <beginfold id='2'>{</beginfold id='2'> +10 "taking the orb" <endfold id='2'>}</endfold id='2'> 0426 ; 0427 0428 //------------------------------------------------------------------------------ 0429 0430 <beginfold id='1'>/*</beginfold id='1'> DEFINE A NEW VERB <endfold id='1'>*/</endfold id='1'> 0431 0432 DefineTAction(Rub) 0433 ; 0434 0435 VerbRule(Rub) 0436 'rub' dobjList 0437 : RubAction 0438 verbPhrase = 'rub/rubbing (what)' 0439 ; 0440 0441 <beginfold id='1'>/*</beginfold id='1'> When creating a new verb, you'll want to modify the Thing class so as to provide 0442 default handling for the command. The defaults specified here will be used except 0443 on objects for which you define explicit handling of the command. <endfold id='1'>*/</endfold id='1'> 0444 0445 modify Thing 0446 dobjFor(Rub) 0447 <beginfold id='2'>{</beginfold id='2'> 0448 preCond = [touchObj] 0449 action() <beginfold id='2'>{</beginfold id='2'> mainReport(okayRubMsg); <endfold id='2'>}</endfold id='2'> 0450 <endfold id='2'>}</endfold id='2'> 0451 0452 okayRubMsg = '{You/he} rub{s} {the dobj/him} but not much happens as a 0453 result. ' 0454 0455 shouldNotBreakMsg = 'Only amateurs go round breaking things unnecessarily. ' 0456 ; 0457 0458 //------------------------------------------------------------------------------ 0459 0460 <beginfold id='1'>/*</beginfold id='1'> HINTS <endfold id='1'>*/</endfold id='1'> 0461 0462 TopHintMenu; 0463 0464 + Goal -> (frontDoor.achievement) 0465 'How do I get into the house?' 0466 [ 0467 'Well, the windows don\'t seem a good way in. ', 0468 'So perhaps you\'d better try the front door. ', 0469 'Could someone have left a key around somewhere? ', 0470 'Is there anything lying around where someone could have hidden a key? ', 0471 'What about that flowerpot? ', 0472 'Try looking under the flowerpot. ' 0473 ] 0474 0475 goalState = OpenGoal 0476 ; 0477 0478 <beginfold id='1'>/*</beginfold id='1'> The closeWhenSeen property of the following Goal object is an example of how to 0479 make your hint menu respond dynamically to the player's current situation. <endfold id='1'>*/</endfold id='1'> 0480 0481 + Goal 'Where can I find the orb? ' 0482 [ 0483 'Something like that is bound to be kept safe. ', 0484 'So it\'s probably inside the house. ' 0485 ] 0486 0487 goalState = OpenGoal 0488 closeWhenSeen = hallway 0489 ; 0490 0491 + Goal 'Where can I find the orb?' 0492 [ 0493 'It\'s sure to be kept somewhere safe. ', 0494 'You\'d better hunt around. ', 0495 'Somewhere in the study seems the most likely place. ', 0496 deskHint, 0497 'But it should be safely locked in a safe ', 0498 'Where might someone hide a safe in this study? ', 0499 'What could be behind that picture on the wall? ', 0500 'Try looking behind the picture (or simply taking the picture). ' 0501 ] 0502 0503 openWhenSeen = hallway 0504 closeWhenSeen = orb 0505 ; 0506 0507 ++ deskHint: Hint 'Have you tried looking in the desk drawer? ' 0508 [deskGoal] 0509 ; 0510 0511 + deskGoal: Goal 'How do I get the desk drawer open?' 0512 [ 0513 'Have you examined the drawer? ', 0514 'What might you need to unlock it? ', 0515 'Where might you find such a thing? ', 0516 'What have you seen that a small key might be hidden in? ', 0517 'How carefully have you searched the hall? ', 0518 'What is (or was) on the hall table? ', 0519 'What might that vase be for? ', 0520 'Try looking in the vase. ' 0521 ] 0522 closeWhenSeen = notebook 0523 ; 0524 0525 + Goal 'How do I get the safe open?' 0526 [ 0527 'How carefully have you examined the safe? ', 0528 'Where might someone leave a clue to the combination? ', 0529 deskHint, 0530 'Make sure you read the notebook. ', 0531 'Once you\'ve found the combination you need to use the dial. ', 0532 'If the combination is a number larger than 99 you\'ll need to enter it 0533 in stages. ', 0534 'For example, if the combination were 1234 you\'d first need to turn the 0535 dial to 12 and then turn it to 34. ' 0536 ] 0537 0538 openWhenSeen = safe 0539 closeWhenAchieved = (safe.subContainer.achievement) 0540 ; 0541 0542 + Goal 'What does the clue in the notebook mean?' 0543 [ 0544 'Well, <q>SAFE</q> might refer to something you want to open. ', 0545 'Have you seen a date round here? ', 0546 'When was this house built? ', 0547 'Where might you find the year in which this house was built? ', 0548 'How carefully have you looked at the front of the house? ', 0549 'Did you examine the door? ' 0550 ] 0551 0552 openWhenRevealed = 'safe-date' 0553 closeWhenAchieved = (safe.subContainer.achievement) 0554 ; 0555 0556 0557 + Goal 'What do I do with the orb now I\'ve got it?' 0558 [ 0559 'Well, you could try rubbing it. ', 0560 'But the main thing to do now is to escape with it. ' 0561 ] 0562 openWhenSeen = orb 0563 ;