Fully parse if clauses in menu
Exit,
}
+enum MenuConditionType {
+ Flag,
+ Object,
+}
+
interface MenuOptionCommon {
kind: MenuOptionType
label: string
+ condition?: {
+ negate: boolean,
+ type: MenuConditionType,
+ name: string,
+ }
}
interface MenuItem extends MenuOptionCommon {
constructor(options: any[]) {
this.options = options.map(o => {
+ const condition = o[0] && {
+ negate: o[0][2] != null,
+ type: o[0][3][0].value == '$' ? MenuConditionType.Flag : MenuConditionType.Object,
+ name: o[0][3][1].value,
+ };
switch(o[1].value) {
case 'item':
return <MenuItem>{
kind: MenuOptionType.Item,
label: o[3],
instructions: o[5],
+ condition,
};
case 'buy':
return <MenuBuy>{
label: o[3][1].value, // TODO: fetch object name from object database
object: o[3][1].value,
value: o[5].value,
+ condition,
};
case 'exit':
return <MenuExit>{
kind: MenuOptionType.Exit,
label: o[3],
+ condition,
};
default:
throw new Error('Unknown menu item type: ' + o[1].value);
menuitem -> if:? "exit" __ string __
if -> "if" __ %bang:? flag_identifier __
-if -> "if" __ %bang:? obj_identifier %word __
+if -> "if" __ %bang:? obj_identifier __
flag_identifier -> %flag_mark %word
obj_identifier -> %obj_mark %word