Include "Grammar"; ! -------------------------------------------------------------------------- [ FPXSub; "You typed the floating point number ", noun/100, ".", (noun%100)/10, noun%10, " (rounded off to 2 decimal places.)"; ]; [ DigitNumber n type x; x = NextWordStopped(); if (x==-1) return -1; wn--; if (type==0) { x = WordAddress(wn); if (x->n>='0' && x->n<='9') return (x->n) - '0'; return -1; } if (x=='nought' or 'oh') { wn++; return 0; } x = TryNumber(wn++); if (x==-1000 || x>=10) x=-1; return x; ]; [ FloatingPoint a x b w d1 d2 d3 type; a = TryNumber(wn++); if (a==-1000) return -1; w = NextWordStopped(wn); if (w==-1) return a*100; x = NextWordStopped(wn); if (x==-1) return -1; wn--; if (w=='point') type=1; else { if (WordAddress(wn-1)->0~='.' || WordLength(wn-1)~=1) return -1; } d1 = DigitNumber(0,type); if (d1==-1) return -1; d2 = DigitNumber(1,type); d3 = DigitNumber(2,type); b=d1*10; if (d2>=0) b=b+d2; else d3=0; if (type==1) { x=1; while (DigitNumber(x,type)>=0) x++; wn--; } else wn++; parsed_number = a*100 + b; if (d3>=5) parsed_number++; return 1; ]; Verb "fp" * FloatingPoint -> FPX; ! -------------------------------------------------------------------------- Constant MAX_PHONE_LENGTH 30; Array dialled_number string MAX_PHONE_LENGTH; [ PhoneNumber f a l ch pp i; pp=1; if (NextWordStopped()==-1) return 0; do { a=WordAddress(wn-1); l=WordLength(wn-1); for (i=0:ii; if (ch<'0' || ch>'9') { if (ch~='-') { f=1; if (i~=0) return -1; } } else { if (pp(pp++)=ch-'0'; } } } until (f==1 || NextWordStopped()==-1); if (pp==1) return -1; dialled_number->0 = pp-1; return 0; ]; [ DialPhoneSub i; print "You dialled <"; for (i=1:i<=dialled_number->0:i++) print dialled_number->i; ">"; ]; Verb "dial" * PhoneNumber -> DialPhone; ! -------------------------------------------------------------------------- Global assumed_key; [ DefaultLockSub; print "(with ", (the) assumed_key, ")^"; <>; ]; [ DefaultUnlockSub; print "(with ", (the) assumed_key, ")^"; <>; ]; [ DefaultKeyTest i count; if (noun hasnt lockable) rfalse; objectloop (i in player && i ofclass Key) { count++; assumed_key = i; } if (count==1) rtrue; rfalse; ]; Extend "lock" first * noun = DefaultKeyTest -> DefaultLock; Extend "unlock" first * noun = DefaultKeyTest -> DefaultUnlock; ! -------------------------------------------------------------------------- Constant TWELVE_HOURS 720; [ NumericTime hr mn word x; if (hr>=24) return -1; if (mn>=60) return -1; x=hr*60+mn; if (hr>=13) return x; x=x%TWELVE_HOURS; if (word=='pm') x=x+TWELVE_HOURS; if (word~='am' or 'pm' && hr==12) x=x+TWELVE_HOURS; return x; ]; [ MyTryNumber wordnum i j; i=wn; wn=wordnum; j=NextWordStopped(); wn=i; switch(j) { 'twenty-five': return 25; 'thirty': return 30; default: return TryNumber(wordnum); } ]; [ TimeOfDay i j k x flag loop ch hr mn; i=NextWord(); if (i=='midnight') { parsed_number=0; return 1; } if (i=='midday' or 'noon') { parsed_number=TWELVE_HOURS; return 1; } ! Next try the format 12:02 j=WordAddress(wn-1); k=WordLength(wn-1); flag=0; for (loop=0:looploop; if (ch==':' && flag==0 && loop~=0 && loop~=k-1) flag=1; else { if (ch<'0' || ch>'9') flag=-1; } } if (k<3 || k>5) flag=0; if (flag==1) { for (loop=0:j->loop~=':':loop++, hr=hr*10) hr=hr+j->loop-'0'; hr=hr/10; for (loop++:looploop-'0'; mn=mn/10; j=NextWordStopped(); parsed_number=NumericTime(hr, mn, j); if (parsed_number<0) return -1; if (j~='pm' or 'am') wn--; return 1; } ! Next the format "half past 12" j=-1; if (i=='half') j=30; if (i=='quarter') j=15; if (j<0) j=MyTryNumber(wn-1); if (j<0) return -1; if (j>=60) return -1; k=NextWordStopped(); if ((k=='o^clock' or 'am' or 'pm')||(k==-1)) { hr=j; if (hr>12) return -1; jump TimeFound; } if (k=='to' or 'past') { mn=j; hr=MyTryNumber(wn); if (hr<=0) { x=NextWordStopped(); if (x=='noon' or 'midday') hr=12; if (x=='midnight') hr=0; if (hr<0) return -1; } if (hr>=13) return -1; if (k=='to') { mn=60-mn; hr=hr-1; if (hr==-1) hr=23; } wn++; k=NextWordStopped(); jump TimeFound; } hr=j; mn=MyTryNumber(--wn); if (mn<0 || mn>=60) return -1; wn++; k=NextWordStopped(); .TimeFound; parsed_number = NumericTime(hr, mn, k); if (parsed_number<0) return -1; if (k~='pm' or 'am' or 'o^clock') wn--; return 1; ]; [ SetTheTimeSub; SetTime(noun,1); "The time is set to ", (PrintTime) noun, "."; ]; Verb "time" * TimeOfDay -> SetTheTime; ! -------------------------------------------------------------------------- Global third; [ ThreefoldSub; "You do something involving ", (the) noun, ", ", (the) second, " and ", (the) third, "."; ]; [ GhostObject x; x=NounDomain(player,location,0); if (x==REPARSE_CODE) return x; if (x==0 or 1) return -1; third = x; return 0; ]; Verb "threefold" * noun noun GhostObject -> Threefold; ! -------------------------------------------------------------------------- [ MegaExam obj; print (a) obj, ": "; ; ]; [ MegaLookSub; ; LoopOverScope(MegaExam); ]; Verb meta "megalook" * -> MegaLook; ! -------------------------------------------------------------------------- [ ClapSub; "You clap."; ]; Verb "clap" * -> Clap; ! -------------------------------------------------------------------------- Verb "magnify" * noun -> Magnify; ! -------------------------------------------------------------------------- Verb "alarm," * "on" -> SwitchOn * "off" -> SwitchOff * TimeOfDay -> SetTo * ConTopic -> Inv; Verb "tc," * noun -> Examine * ConTopic -> Inv; [ Crew i; switch(scope_stage) { 1: rfalse; 2: objectloop (i has crewmember) PlaceInScope(i); rtrue; } ]; Verb "stc," * "where" "is" scope=Crew -> Examine * "locate" scope=Crew -> Examine; Verb "rc," * held -> Give * ConTopic -> Inv; [ Planet; switch(NextWord()) { 'centauro', 'earth': return 1; default: return -1; } ]; Verb "zen," * "scan" number "orbital" -> Show * "set" "course" "for" Planet -> Go * "speed" "standard" "by" number -> SetTo * "raise" held -> Take * "clear" held "for" "firing" -> Drop; ! ----------------------------------------------------------------------------