1/*
    2%  NomicMUD: A MUD server written in Prolog
    3%
    4%  Some parts used Inform7, Guncho, PrologMUD and Marty's Prolog Adventure Prototype
    5% 
    6%  July 10,1996 - John Eikenberry 
    7%  Copyright (C) 2004 Marty White under the GNU GPL
    8% 
    9%  Dec 13, 2035 - Douglas Miles
   10%
   11%
   12%  Logicmoo Project changes:
   13%
   14% Main file.
   15%
   16*/
   17
   18:- if(exists_source(library(nldata/clex_iface))).   19% being in user is just to help debugging from console
   20:- user:ensure_loaded(library(nldata/clex_iface)).   21:- endif.   22% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   23%  CODE FILE SECTION
   24% :- ensure_loaded('adv_eng2cmd').
   25% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   26
   27
   28cmdalias(d, down).
   29cmdalias(e, east).
   30cmdalias(i, inventory).
   31cmdalias(l, look).
   32cmdalias(n, north).
   33cmdalias(s, south).
   34cmdalias(u, up).
   35cmdalias(w, west).
   36cmdalias(x, examine).
   37cmdalias(z, wait).
   38
   39preposition(spatial, P) :-
   40  member(P, [at, down, in, inside, into, of, off, on, onto, out, over, to, under, up, with]).
   41
   42preposition(_Other, P) :-
   43  member(P, [of, beside]).
   44
   45compass_direction(D) :-
   46  member(D, [north, south, east, west]).
   47
   48reflexive(W) :- member(W, [self, me, myself , i]). % 'i' inteferes with inventory
   49
   50strip_noise_words([to|Tokens], NewTokens) :- strip_noise_words(Tokens, NewTokens).
   51strip_noise_words(Tokens, NewTokens) :-
   52  findall(Token,
   53          ( member(Token, Tokens),
   54            \+ member(Token, ['please', 'the', 'a', 'an', 'some', 'thee'])),
   55          NewTokens).
   56
   57convert_reflexive(Agent, Words, NewWords) :-
   58  % Substitute Agent for 'self'.
   59  findall(Token,
   60          ( member(Word, Words),
   61            ( reflexive(Word), Token = Agent;
   62              Token = Word )),
   63          NewWords).
   64
   65
   66% -- parse(WordList, ActionOrQuery, Memory)
   67parse(Tokens, Action, Memory) :-
   68  (Tokens = [_] -> Tokens2 = Tokens ; strip_noise_words(Tokens, Tokens2)),
   69  parse2logical(Tokens2, Action, Memory).
   70
   71:- discontiguous(parse2logical/3).   72
   73object_or_self([], Agent, Mem):- thought(inst(Agent), Mem), !.
   74object_or_self(List,Agent,Mem):- append(LList,[R],List),member(R,[(?),(.)]),!,object_or_self(LList,Agent,Mem).
   75object_or_self([am, i], Agent, Mem):- thought(inst(Agent), Mem), !.
   76object_or_self([is| List], Agent, Mem):-!,object_or_self(List,Agent,Mem).
   77object_or_self([Agent], Agent, _Mem).
   78
   79parse2logical([who|Tail], whois(_Whoial, Agent), Mem) :- object_or_self(Tail, Agent, Mem).
   80parse2logical([whom|Tail], whois(_Whoial, Agent), Mem) :- object_or_self(Tail, Agent, Mem).
   81parse2logical([what|Tail], whatis(_What_Spatial, Agent), Mem) :- object_or_self(Tail, Agent, Mem).
   82parse2logical([where|Tail], whereis(spatial, Agent), Mem) :- object_or_self(Tail, Agent, Mem).
   83parse2logical([model|Tail], model(_All_Spatial, Agent), Mem) :- object_or_self(Tail, Agent, Mem).
   84parse2logical([memory|Tail], memory(Agent), Mem) :- object_or_self(Tail, Agent, Mem).
   85
   86parse2logical([ask, Object | Msg], emote(Spatial, say, Object, Msg), _M):- current_spatial(Spatial).
   87parse2logical([request, Object | Msg], emote(Spatial, say, Object, Msg), _M):- current_spatial(Spatial).
   88parse2logical([tell, Object | Msg], emote(Spatial, say, Object, Msg), _M):- current_spatial(Spatial).
   89parse2logical([talk, Object | Msg], emote(Spatial, say, Object, Msg), _M):- current_spatial(Spatial).
   90parse2logical([say|Msg], emote(Spatial, say, *, Msg), _M):- current_spatial(Spatial).
   91parse2logical([emote|Msg], emote(Spatial, act, *, Msg), _M):- current_spatial(Spatial).
   92parse2logical([Object, ',' | Msg], emote(Spatial, say, Object, Msg), Mem) :- current_spatial(Spatial),
   93  thought_model(Spatial,ModelData, Mem),
   94  in_model(h(Spatial, _, Object, _, _), ModelData).
   95parse2logical(Words, Action, Mem) :- Words \== [i], % Dont interfere with inventory
   96  % If not talking to someone else, substitute Agent for 'self'.
   97  append(Before, [Self|After], Words),
   98  reflexive(Self),
   99  thought(inst(Agent), Mem),
  100  append(Before, [Agent|After], NewWords),
  101  parse2logical(NewWords, Action, Mem).
  102
  103
  104parse2logical([dig, Hole], dig(Spatial, Hole, Where, Tool), Mem) :-
  105  thought_model(Spatial,ModelData, Mem),
  106  thought(inst(Agent), Mem),
  107  in_model(h(Spatial, _, Agent, Where, _), ModelData),
  108  Tool=shovel.
  109parse2logical([get, Prep], goto(Spatial, (*), Prep), _Mem) :-
  110  preposition(Spatial, Prep).
  111parse2logical([get, Prep, Object], goto(Spatial, Prep, Object), _Mem) :-
  112  preposition(Spatial, Prep).
  113
  114parse2logical([get, Object], take(Spatial, Object), _Mem) :- equals_efffectly(model, Spatial, take).
  115
  116parse2logical([give, Object, to, Recipient], give(Spatial, Object, Recipient), _Mem):- equals_efffectly(model, Spatial, give).
  117
  118parse2logical([go, escape], goto(Spatial, (*), escape), _Mem):- equals_efffectly(model, Spatial, escape).
  119parse2logical([go, Dir], goto(Spatial, (*), Dir), _Mem) :-
  120  compass_direction(Dir), equals_efffectly(model, Spatial, spatial).
  121parse2logical([go, Prep], goto(Spatial, (*), Prep), _Mem) :-
  122  preposition(Spatial, Prep).
  123parse2logical([go, ExitName], goto(Spatial, (*), ExitName), Mem) :-
  124  thought_model(Spatial,ModelData, Mem),
  125  in_model(h(Spatial, exit(ExitName), _, _, _), ModelData).
  126parse2logical([go, Dest], goto(Spatial, (*), Dest), Mem) :-
  127  thought_model(Spatial,ModelData, Mem),
  128  in_model(h(Spatial, _, _, Dest, _), ModelData).
  129  % getprop(Dest, has_rel(Spatial, How), ModelData).
  130
  131parse2logical([light, Thing], Result, Mem):- !, parse2logical([switch, on, Thing], Result, Mem).
  132parse2logical([turn, Thing, OnOff], Result, Mem) :- preposition(_, OnOff), !, parse2logical([switch, OnOff, Thing], Result, Mem).
  133parse2logical([turn, OnOff, Thing], Result, Mem) :- preposition(_, OnOff), !, parse2logical([switch, OnOff, Thing], Result, Mem).
  134parse2logical([switch, Thing, OnOff], Result, Mem) :- preposition(_, OnOff), !, parse2logical([switch, OnOff, Thing], Result, Mem).
  135parse2logical([switch, OnOff, Thing], switch(Spatial, OnOff, Thing), _Mem) :-
  136  preposition(_, OnOff), current_spatial(Spatial).
  137
  138
  139% parse2logical([look], look(Spatail), Mem) :- object_or_self(Tail, Agent, Mem).
  140
  141
  142parse2logical([CmdAlias|Tail], Action, Mem) :-
  143  cmdalias(CmdAlias, Verb),
  144  parse2logical([Verb|Tail], Action, Mem).
  145
  146parse2logical([Prep], goto(Spatial, (*), Prep), _Mem) :- preposition(Spatial, Prep).
  147parse2logical([Dir], Logic, Mem):- (compass_direction(Dir);Dir==escape), !, parse2logical([go, Dir], Logic, Mem).
  148
  149parse2logical([ExitName], goto(Spatial, (*), ExitName), Mem) :-
  150  thought_model(Spatial,ModelData, Mem),
  151  in_model(h(Spatial, exit(ExitName), _, _, _), ModelData).
  152
  153parse2logical([Verb|Args], Action, _M) :- Args\==[], Args\==['.'], action_model(Verb, Spatial),
  154  %member(Verb, [agent, create, delprop, destroy, echo, quit, memory, model, path, properties, setprop, state, trace, notrace, whereami, whereis, whoami]),
  155  Action =.. [Verb, Spatial|Args].
  156
  157parse2logical([Verb|Args], Action, _M) :-
  158  %member(Verb, [agent, create, delprop, destroy, echo, quit, memory, model, path, properties, setprop, state, trace, notrace, whereami, whereis, whoami]),
  159  Action =.. [Verb|Args]