! Testing what is/SopeWithin and custom meta
!
#Iftrue (#version_number == 8);
Constant USEINFORM;
#Endif;

Constant Story      "Parser test";
Constant Headline   "^A parser test suite for PunyInform.^";
Serial "200827";
Constant INITIAL_LOCATION_VALUE = LitRoom;

! Uncomment to show time instead of score/turns
!Statusline time;

!Constant DEBUG;
!Constant DEBUG_PARSEANDPERFORM;
!Constant DEBUG_PARSEPATTERN;
!Constant DEBUG_PARSETOKEN;
!Constant DEBUG_CHECKNOUN;
!Constant DEBUG_GETNEXTNOUN;
!Constant DEBUG_SCOPE;

! Uncomment to add optional features to PunyLib
!Constant DEBUG;
!Constant CUSTOM_ABBREVIATIONS;
!Constant OPTIONAL_ALLOW_WRITTEN_NUMBERS;
Constant OPTIONAL_EXTENDED_METAVERBS;
!Constant OPTIONAL_EXTENDED_VERBSET;
!Constant OPTIONAL_FULL_SCORE;
!Constant OPTIONAL_FULL_DIRECTIONS;
!Constant OPTIONAL_GUESS_MISSING_NOUN;
!Constant OPTIONAL_MANUAL_SCOPE;
!Constant RUNTIME_ERRORS = 0;

#Ifdef USEINFORM;
Include "Parser";
Include "VerbLib";
#IfNot;
Include "globals.h";
#EndIf;

#Ifndef USEINFORM;
Include "puny.h";
#EndIf;

! Uncomment to add PunyLib extensions
!Include "ext_menu.h";
!Include "ext_flags.h";
!Include "ext_quote_box.h";
!Include "ext_cheap_scenery.h";


! -- testing third noun
! See: https://www.inform-fiction.org/manual/html/sa6.html#ans91

Global third;
#Ifdef USEINFORM;
[ ThirdNoun x;
  x = ParseToken(ELEMENTARY_TT, NOUN_TOKEN);
  if (x == GPR_FAIL or GPR_REPARSE) return x;
  third = x; return GPR_PREPOSITION;
];
#IfNot;
[ ThirdNoun x;
  x = ParseToken(TT_OBJECT, NOUN_OBJECT);
  if (x == GPR_FAIL or GPR_REPARSE) return x;
  third = x; return GPR_PREPOSITION;
];
#EndIf;

[ InstallSub;
    print "installing with ", (the) third, "^";
];

Verb 'install' 
  * noun 'on'  noun 'with' ThirdNoun -> Install;

#Ifdef USEINFORM;
Include "Grammar";
#Endif;

! http://www.firthworks.com/roger/informfaq/vv.html
! (meta discussion at the end)
!
! but since restart is already orginally defined as meta
! we have to reinvert the logic here, and add a notMeta
! (to disable meta) instead.
![ isMeta; 
!    meta = true;
!    return GPR_PREPOSITION;
!];

[ notMeta; 
    meta = false;
    return GPR_PREPOSITION;
];

Extend 'restart' replace
    * -> Restart
    * notMeta noun   -> SwitchOn;


Object LitRoom "Lit Room"
	with
		description [;
			print "You are in a brightly lit room.^";
		],
	has light;

Object -> Battery "battery"
    with
        name 'battery';

Object -> Mounting "mounting"
    with
        name 'mounting';

Object -> Toolbox "toolbox"
    with
        name 'toolbox';

[Initialise;
	print "^^The testsuite is open for business!^^";
	print "If you drop the ball in the dark room it will still be in scope.^";
#IfDef USEINFORM;
    location=INITIAL_LOCATION_VALUE;;
#EndIf;
];


