1/*
    2%  NomicMUD: A MUD server written in Prolog
    3%  Maintainer: Douglas Miles
    4%  Dec 13, 2035
    5%
    6%  Bits and pieces:
    7%
    8%    LogicMOO, Inform7, FROLOG, Guncho, PrologMUD and Marty's Prolog Adventure Prototype
    9% 
   10%  Copyright (C) 2004 Marty White under the GNU GPL 
   11%  Sept 20,1999 - Douglas Miles
   12%  July 10,1996 - John Eikenberry 
   13%
   14%  Logicmoo Project changes:
   15%
   16% Main file.
   17%
   18*/
   19
   20%:- nop(ensure_loaded('adv_chat80')).
   21%:- ensure_loaded(adv_main).
   22%:- endif.
   23
   24%:- user:listing(adventure).
   25
   26get_sensing_objects(Objects, S0):-
   27   setof(O,member(perceptq(O,_),S0),Objects).
   28
   29get_sensing_objects(Sense, Agents, S0):-
   30   get_objects((has_sense(Sense);inherit(memorize,t)), Agents, S0).
   31
   32get_live_agents(LiveAgents, S0):-
   33  get_some_agents( \+ state(_Spatial, powered, f), LiveAgents, S0).
   34
   35get_some_agents(Precond, LiveAgents, S0):-
   36  dmust((
   37     get_objects(     
   38      (inherit(character,t),Precond), LiveAgents, S0),
   39   LiveAgents = [_|_])).
   40
   41
   42
   43is_prop_public(_,P) :-
   44  \+ \+ 
   45  member(P, [
   46             name(_),
   47             desc(_),
   48             fragile(_),emitting(_Light), 
   49             %has_rel(_Spatial, _), 
   50             
   51             can_be(Spatial, eat, _), 
   52             can_be(Spatial, move, _), 
   53             can_be(Spatial, open, _), state(Spatial, open, _), 
   54             can_be(Spatial, lock, t), state(Spatial, locked, _),
   55             inherit(shiny,t)]).
   56is_prop_public(_,Prop):- is_prop_nonpublic(Prop),!,fail.
   57
   58is_prop_public(_,_):-!.
   59
   60
   61is_prop_nonpublic(has_sense(_)).
   62is_prop_nonpublic(_):- !, fail.
   63
   64has_sensory(Spatial, Sense, Agent, State) :-
   65  sensory_model_problem_solution(Sense, Spatial, TooDark, EmittingLight),
   66  get_open_traverse(_Open, Sense, _Traverse, Spatial, OpenTraverse),
   67  related(Spatial, OpenTraverse, Agent, Here, State),
   68  getprop(Here, TooDark, State) , 
   69  \+ related_with_prop(Spatial, OpenTraverse, _Obj, Here, EmittingLight, State), !, fail.
   70has_sensory(_Spatial, _Sense, _Agent, _State) .
   71
   72
   73can_sense(_Spatial, _See, Star, _Agent, _State) :- Star == '*', !.
   74can_sense(Spatial, Sense, Thing, Agent, State) :-
   75  get_open_traverse(_Open, Sense, _Traverse, Spatial, OpenTraverse),
   76  has_sensory(Spatial, Sense, Agent, State),
   77  related(Spatial, OpenTraverse, Agent, Here, State),
   78  (Thing=Here; related(Spatial, OpenTraverse, Thing, Here, State)).
   79can_sense(Spatial, Sense, Thing, Agent, _State):- dbug(pretending_can_sense(Spatial, Sense, Thing, Agent)),!.
   80
   81
   82% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   83%  CODE FILE SECTION
   84:- nop(ensure_loaded('adv_events')).   85% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   86
   87% Manipulate one agents percepts
   88queue_percept(Agent, Event, S0, S2) :-
   89  dmust((select(perceptq(Agent, Queue), S0, S1),
   90  append(Queue, [Event], NewQueue),
   91  append([perceptq(Agent, NewQueue)], S1, S2))).
   92
   93queue_event(Event, S0, S2) :-
   94  each_sensing_agent(_All, queue_percept(Event), S0, S2).
   95
   96
   97% Room-level simulation percepts
   98queue_local_percept(Agent, Spatial, Event, Places, S0, S1) :-
   99  ignore(current_spatial(Spatial)),
  100  member(Where, Places),
  101  get_open_traverse(look, Spatial, OpenTraverse),
  102  related(Spatial, OpenTraverse, Agent, Where, S0),
  103  queue_percept(Agent, Event, S0, S1),!.
  104queue_local_percept(_Agent, _Spatial, _Event, _Places, S0, S0).
  105
  106/*
  107queue_local_event(Spatial, Event, Places, S0, S2) :-
  108  current_player(Player),
  109  queue_local_percept(Spatial, Player, Event, Places, S0, S1),
  110  queue_local_percept(Spatial, floyd , Event, Places, S1, S2).
  111*/
  112
  113queue_local_event(Spatial, Event, Places, S0, S2) :-   
  114  each_sensing_agent(_All, queue_local_percept(Spatial, Event, Places), S0, S2).
  115
  116
  117
  118/*
  119
  120sensory_model(olfactory, spatial).
  121sensory_model(taste, spatial).
  122sensory_model(tactile, spatial).
  123
  124sensory_model(sixth, _).
  125*/
  126
  127
  128current_spatial(spatial).
  129
  130
  131is_sense(X):- sensory_model(X, _).
  132
  133sensory_model(see, spatial).
  134sensory_model(hear, spatial).
  135sensory_model(taste, spatial).
  136sensory_model(smell, spatial).
  137sensory_model(feel, spatial).
  138
  139action_model(_, spatial).
  140
  141sensory_verb(see, look).
  142sensory_verb(hear, listen).
  143sensory_verb(taste, taste).
  144sensory_verb(smell, smell).
  145sensory_verb(feel, touch).
  146
  147
  148action_sensory(Action, Sense):-
  149  compound(Action),
  150  Action=..[_Verb, Sensory|_],
  151  is_sense(Sensory), !,
  152  Sense=Sensory.
  153action_sensory(Action, Sense):-
  154  compound(Action),
  155  Action=..[Verb|_],
  156  verb_sensory(Verb, Sense).
  157action_sensory(Action, Sense):- verb_sensory(Action, Sense) *-> true; Sense=see.
  158
  159
  160  % sensory_model(Spatial1, Spatial2):- Spatial1 == Spatial2, !.
  161
  162% listen->hear
  163verb_sensory(goto, Sense):- is_sense(Sense).
  164verb_sensory(examine, Sense):- is_sense(Sense).
  165verb_sensory(wait, Sense):- is_sense(Sense).
  166verb_sensory(print_, Sense):- is_sense(Sense).
  167verb_sensory(Verb, Sense):- sensory_verb(Sense, Verb).
  168verb_sensory(look, see).
  169verb_sensory(say, hear).
  170verb_sensory(eat, taste).
  171verb_sensory(feel, touch).
  172verb_sensory(goto, see).
  173verb_sensory(Verb, Sense):- nonvar(Verb), is_sense(Verb), Sense=Verb.
  174verb_sensory(Verb, Sense):- subsetof(Verb, Verb2), Verb\=Verb2,
  175  verb_sensory(Verb2, Sense), \+ is_sense(Verb).
  176verb_sensory(Verb, Sense):- verb_alias(Verb, Verb2), Verb\=Verb2,
  177  verb_sensory(Verb2, Sense), \+ is_sense(Verb).
  178
  179
  180
  181% sensory_model(Visual, Spatial, TooDark, EmittingLight))
  182sensory_model_problem_solution(Sense, Spatial, state(Spatial, Dark, t), emitting(Light)):-
  183   problem_solution(Dark, Sense, Light), sensory_model(Sense, Spatial).
  184
  185problem_solution(dark, see, light).
  186problem_solution(stinky, smell, pure).
  187problem_solution(noisy, hear, quiet).
  188
  189
  190
  191% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  192%  CODE FILE SECTION
  193:- nop(ensure_loaded('adv_agent_percepts')).  194% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  195
  196
  197% Autonomous logical percept processing.
  198process_percept_auto(Agent, [Same|_], _Stamp, Mem0, Mem0) :- was_own_self(Agent, Same).
  199process_percept_auto(Agent, emoted(_Spatial, _Say, Speaker, Agent, Words), _Stamp, Mem0, Mem1) :-
  200  consider_text(Speaker, Agent, Words, Mem0, Mem1).
  201process_percept_auto(Agent, emoted(_Spatial, _Say, Speaker, (*), WordsIn), _Stamp, Mem0, Mem1) :-
  202  addressing_whom(WordsIn, Whom, Words),
  203  Whom == Agent,
  204  consider_text(Speaker, Agent, Words, Mem0, Mem1).
  205process_percept_auto(Agent, Percept, _Stamp, Mem0, Mem0) :-
  206  Percept =.. [Functor|_],
  207  member(Functor, [talk, say]),
  208  bugout('~w: Ignoring ~p~n', [Agent, Percept], autonomous).
  209process_percept_auto(Agent, sense_props(see, Object, PropList), _Stamp, Mem0, Mem2) :-
  210  bugout('~w: ~p~n', [Agent, sense_props(see, Object, PropList)], autonomous),
  211  (member(shiny, PropList),member(inherit(shiny,t), PropList)),
  212  member(model(Spatial, ModelData), Mem0),
  213  \+ related(Spatial, descended, Object, Agent, ModelData), % Not holding it?
  214  add_todo_all([take(Spatial, Object), print_('My shiny precious!')], Mem0, Mem2).
  215
  216process_percept_auto(_Agent,
  217    sense(Sense, [you_are(Spatial, _How, _Here), exits_are(_Exits), here_are(Objects)]),
  218    _Stamp, Mem0, Mem2) :-
  219  member(model(Spatial, ModelData), Mem0),
  220  findall(examine(Sense, Obj),
  221          ( member(Obj, Objects),
  222            \+ member(props(Obj, _, _), ModelData)),
  223          ExamineNewObjects),
  224  add_todo_all(ExamineNewObjects, Mem0, Mem2).
  225process_percept_auto(_Agent, _Percept, _Stamp, Mem0, Mem0).
  226
  227
  228%was_own_self(Agent, say(Agent, _)).
  229was_own_self(Agent, emote(_Spatial, _, Agent, _, _)):- fail.
  230
  231% Ignore own speech.
  232% process_percept_player(Agent, [Same|_], _Stamp, Mem0, Mem0) :- was_own_self(Agent, Same).
  233process_percept_player(Agent, Percept, _Stamp, Mem0, Mem0) :-
  234  percept2txt(Agent, Percept, Text),
  235  player_format('~N~w~n', [Text]),!,
  236  redraw_prompt(Agent).
  237process_percept_player(Agent, Percept, _Stamp, Mem0, Mem0) :-
  238  player_format('~N~q~n', [Agent:Percept]),
  239  dmust(redraw_prompt(Agent)),!.
  240
  241% once(( notrace((thought(inherit(console,t), Mem0);thought(inherit(player,t), Mem0);thought(inherit(telnet,t), Mem0))).
  242is_player(Agent):- \+ is_non_player(Agent).
  243is_non_player(Agent):- Agent == 'floyd~1'.
  244
  245
  246process_percept(Agent, Percept, Stamp, Mem0, Mem1) :-
  247  once(is_player(Agent)),
  248  once(notrace(process_percept_player(Agent, Percept, Stamp, Mem0, Mem1))),
  249  \+ thought(inherit(autonomous,t), Mem1),!.
  250  
  251process_percept(Agent, [LogicalPercept|_IgnoredList], Stamp, Mem0, Mem1) :-
  252  thought(inherit(autonomous,t), Mem0),
  253  nop((ignore(((IgnoredList\==[], dbug(ignored_process_percept_auto(Agent,IgnoredList))))))),
  254  process_percept_auto(Agent, LogicalPercept, Stamp, Mem0, Mem1).
  255
  256process_percept(Agent, Percept, Stamp, Mem0, Mem0):- 
  257  bugout('~q FAILED!~n', [process_percept(Agent, Percept, Stamp)], general), !.
  258
  259process_percept_main(Agent, Percept, Stamp, Mem0, Mem3) :-
  260 dmust((
  261  forget(model(Spatial, Model0), Mem0, Mem1),
  262  Percept = [LogicalPercept|IgnoredList],
  263  nop(ignore(((IgnoredList\==[], dbug(ignored_model_update(Agent,IgnoredList)))))),
  264  update_model(Spatial, Agent, LogicalPercept, Stamp, Mem1, Model0, Model1),
  265  memorize(model(Spatial, Model1), Mem1, Mem2),
  266  process_percept(Agent, Percept, Stamp, Mem2, Mem3))).
  267process_percept_main(_Agent, Percept, _Stamp, Mem0, Mem0) :-
  268  bugout('process_percept_main(~w) FAILED!~n', [Percept], general), !.
  269
  270
  271
  272process_percept_list(_Agent, [], _Stamp, Mem0, Mem0).
  273% caller memorizes PerceptList
  274process_percept_list(_Agent, _, _Stamp, Mem, Mem) :-
  275  thought(inherit(no_perceptq), Mem),
  276  !.
  277process_percept_list(Agent, [Percept|Tail], Stamp, Mem0, Mem4) :-
  278  %bugout('process_percept_list([~w|_])~n', [Percept], autonomous),
  279  %!,
  280  process_percept_main(Agent, Percept, Stamp, Mem0, Mem1),
  281  process_percept_list(Agent, Tail, Stamp, Mem1, Mem4).
  282process_percept_list(Agent, List, Stamp, Mem0, Mem0) :-
  283  bugout('process_percept_list FAILED!~n'(Agent, List, Stamp), general)