#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 = Library;

#Ifndef USEINFORM;
! 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_NO_DARKNESS;
!Constant OPTIONAL_FULL_SCORE;
!Constant OPTIONAL_FULL_DIRECTIONS;
Constant OPTIONAL_GUESS_MISSING_NOUN;
!Constant OPTIONAL_MANUAL_SCOPE;
!Constant RUNTIME_ERRORS = 0;
#EndIf;

#Ifdef USEINFORM;
Include "Parser";
Include "VerbLib";

#IfNot;
Include "globals.h";
#EndIf;

[ ChooseObjects obj code;
    if(obj == 0) return 1;
!print (the) obj," ",code, " ", action, " ", action_to_be, "^";
    if(code < 2) {
        ! considering including obj in "all", with
        ! code == true if wanting to add the obj
        if (obj has scenery) {
            ! force include (would normally be excluded)
            return 1;
        }
        rfalse; ! go with std parser decision
    }
    ! deciding between seemingly equally good matches
    if(action_to_be == ##Eat && obj has edible) return 3;
    if(obj hasnt scenery) return 2;
    return 1;
];

#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";

#Ifdef USEINFORM;
Include "Grammar";
#Endif;
Object Library "The Library"
	with
	    description "You are in a library.",
	has light;

Object -> John "John"
	with name 'john',
	description "He is beautiful and he knows it.",
	has animate proper;

Object -> BlackRod "black rod"
	with name 'black' 'rod',
	;

Object -> BlackCake "black cake"
	with name 'black' 'cake',
	before [;
	Eat: "You decide to leave it for later.";
	],
	has edible;

Object -> Shrubbery "shrubbery"
	with name 'shrubbery',
	has scenery;

[ Initialise;
#IfDef USEINFORM;
    location=INITIAL_LOCATION_VALUE;
#EndIf;
    ChooseObjects(0,0);
];
