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
   26
   27:- defn_state_getter(get_perceptq_objects(-list(inst))).   28get_perceptq_objects(Objects, S0):-
   29 setof(O,member(perceptq(O,_),S0),Objects).
   30
   31get_sensing_objects(Sense, Agents, S0):-
   32 get_objects((has_sense(Sense);inherited(memorize)), Agents, S0).
   33
   34:- defn_state_getter(get_live_agents(-list(agent))).   35get_live_agents(LiveAgents, S0):-
   36 get_some_agents( \+ powered=f, LiveAgents, S0).
   37
   38:- defn_state_getter(get_some_agents(conds,-list(agent))).   39get_some_agents(Precond, LiveAgents, S0):-
   40 must_det((
   41  get_objects(  
   42  (inherited(character),Precond), LiveAgents, S0),
   43  LiveAgents \== [])).                
   44
   45
   46
   47sense_here(_Sense, _In, _Here, _S0):-!.
   48sense_here(Sense, _In, Here, S0):- 
   49 getprop(Here, TooDark, S0),
   50 (sensory_problem_solution(Sense, TooDark, EmittingLight) -> 
   51   related_with_prop(Sense, _Obj, Here, EmittingLight, S0) ; true).
   52
   53can_sense_here(Agent, Sense, S0) :-
   54 from_loc(Agent, Here, S0),
   55 sense_here(Sense, in, Here, S0), !.
   56can_sense_here(_Agent, _Sense, _State) .
   57
   58is_star(Star):- Star == '*'.
   59is_star('*'(Star)):- nonvar(Star).
   60
   61can_sense(Agent, Sense, Thing, S0, S9):- can_sense(Agent, Sense, Thing, S0),S9=S0.
   62:- defn_state_getter(can_sense(agent,sense,thing)).   63can_sense(_Agent, _See, Star, _State) :- is_star(Star), !.
   64can_sense(Agent, Sense, Thing, S0) :- Agent == Thing, !, can_sense_here(Agent, Sense, S0).
   65can_sense(_Agent, Sense, Here, S0) :- 
   66  getprop(Here, has_rel(exit(_),t), S0), 
   67  sense_here(Sense, in, Here, S0),!.
   68
   69can_sense(Agent, Sense, Thing, S0) :-
   70  can_sense_here(Agent, Sense, S0),
   71  from_loc(Agent, Here, S0),
   72  (Thing=Here;  open_traverse(Thing, Here, S0)), !.
   73/*can_sense(Agent, Sense, Thing, S0) :-
   74 % get_open_traverse(_Open, Sense, _Traverse, Sense),
   75 can_sense_here(Agent, Sense, S0),
   76 h(Sense, Agent, Here, S0),
   77 (Thing=Here; h(Sense, Thing, Here, S0)).
   78*/
   79can_sense(Agent, Sense, Thing, _State):- 
   80 bugout1(pretending_can_sense(Agent, Sense, Thing, Agent)),!.
   81
   82
   83
   84send_precept(Agent, Event, S0, S2) :- 
   85  declared(perceptq(Agent, _Q), S0), !, 
   86  queue_agent_percept(Agent, Event, S0, S2).
   87send_precept(Agent, Event, S0, S2) :- 
   88  do_precept_list(Agent, Event, S0, S2).
   89
   90do_precept_list(Agent, Events, S0, S2) :- 
   91  undeclare(memories(Agent, Mem0), S0, S1),
   92  thought(timestamp(Stamp,_OldNow), Mem0),
   93  with_agent_console(Agent,process_percept_list(Agent, Events, Stamp, Mem0, Mem3)),
   94  declare(memories(Agent, Mem3), S1, S2).
   95
   96% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   97% CODE FILE SECTION
   98:- nop(ensure_loaded('adv_events')).   99% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  100
  101:- defn_state_setter(queue_agent_percept(agent,listok(event))).  102% Manipulate one agents percepts
  103queue_agent_percept(Agent, Event, S0, S2) :- 
  104 \+ is_list(Event),!, 
  105 queue_agent_percept(Agent, [Event], S0, S2).
  106% Agent process event list now
  107queue_agent_percept(Agent, Events, S0, S2) :- 
  108 getprop(Agent, inherited(no_perceptq), S0), !,
  109 do_precept_list(Agent, Events, S0, S2).
  110queue_agent_percept(Agent, Events, S0, S2) :-
  111 must_det((select(perceptq(Agent, Queue), S0, S1),
  112 append(Queue, Events, NewQueue),
  113 append([perceptq(Agent, NewQueue)], S1, S2))).
  114
  115
  116:- defn_state_setter(queue_event(listok(event))).  117queue_event(Event, S0, S2) :-
  118 each_sensing_thing(_All, queue_agent_percept(Event), S0, S2).
  119
  120
  121locally__agent_percept__(Agent, Event, Places, S0, S1) :-
  122 member(Where, Places),can_sense(Agent,_,Where,S0),!,
  123 queue_agent_percept(Agent, Event, S0, S1),!.
  124locally__agent_percept__(_Agent, _Event, _Places, S0, S0).
  125
  126
  127% Room-level simulation percepts
  128:- defn_state_setter(queue_local_event(listof(event),listof(place))).  129queue_local_event(Event, Places) --> {\+ is_list(Places)}, !, queue_local_event(Event, [Places]).
  130queue_local_event(Event, Places) --> 
  131 each_sensing_thing(_All, locally__agent_percept__(Event, Places)).
  132
  133
  134
  135
  136is_sense(X):- sensory_verb(X, _).
  137
  138sensory_verb(see, look).
  139sensory_verb(hear, listen).
  140sensory_verb(taste, taste).
  141sensory_verb(smell, smell).
  142sensory_verb(touch, feel).
  143
  144
  145action_sensory(Action, Sense):-
  146 compound(Action),
  147 Action=..[_Verb, Sensory|_],
  148 is_sense(Sensory), !,
  149 Sense=Sensory.
  150action_sensory(Action, Sense):-
  151 compound(Action),
  152 Action=..[Verb|_],
  153 verb_sensory(Verb, Sense).
  154action_sensory(Action, Sense):- 
  155 verb_sensory(Action, Sense) *-> true; Sense=see.
  156
  157
  158% listen->hear
  159verb_sensory(goto, Sense):- is_sense(Sense).
  160verb_sensory(examine, Sense):- is_sense(Sense).
  161verb_sensory(wait, Sense):- is_sense(Sense).
  162verb_sensory(print_, Sense):- is_sense(Sense).
  163verb_sensory(Verb, Sense):- sensory_verb(Sense, Verb).
  164verb_sensory(look, see).
  165verb_sensory(say, hear).
  166verb_sensory(eat, taste).
  167verb_sensory(feel, touch).
  168verb_sensory(goto, see).
  169verb_sensory(Verb, Sense):- nonvar(Verb), is_sense(Verb), Sense=Verb.
  170verb_sensory(Verb, Sense):- subsetof(Verb, Verb2), Verb\=Verb2,
  171 verb_sensory(Verb2, Sense), \+ is_sense(Verb).
  172verb_sensory(Verb, Sense):- verb_alias(Verb, Verb2), Verb\=Verb2,
  173 verb_sensory(Verb2, Sense), \+ is_sense(Verb).
  174
  175
  176
  177% sensory_model(Visual, TooDark, EmittingLight))
  178sensory_problem_solution(Sense, Dark = t, emitting(Sense, Light)):-
  179 problem_solution(Dark, Sense, Light).
  180
  181problem_solution(dark, see, light).
  182problem_solution(stinky, smell, purity).
  183problem_solution(noisy, hear, quiet).
  184
  185
  186:- defn_state_setter(percept_todo(list(action))).  187percept_todo(Actions, Mem0, Mem2):- add_todo_all(Actions, Mem0, Mem2),!.
  188%percept_todo(Actions, Mem0, Mem2):- apply_mapl_state(add_goal(), Actions, Mem0, Mem2).
  189
  190% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  191% CODE FILE SECTION
  192:- nop(ensure_loaded('adv_agent_percepts')).  193% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  194
  195
  196% Autonomous logical percept processing.
  197%process_percept_auto(Agent, with_msg(Percept, _Msg), Timestamp, M0, M2) :- !, 
  198% process_percept_auto(Agent, Percept, Timestamp, M0, M2).
  199
  200:- defn_state_setter(process_percept_auto//3).  201process_percept_auto(_Agent, msg(_), _Stamp, M0, M0) :- !.
  202process_percept_auto(_Agent, [], _Stamp, M0, M0) :- !.
  203process_percept_auto(Agent, [Percept|Tail], Stamp, M0, M9) :-
  204 process_percept_auto(Agent, Percept, Stamp, M0, M1),
  205 process_percept_auto(Agent, Tail, Stamp, M1, M9).
  206
  207process_percept_auto(Agent, Percept, _Stamp, M0, M0) :- was_own_self(Agent, Percept),!.
  208
  209% Auto examine room items
  210process_percept_auto(Agent, percept(Agent, Sense, Depth, child_list(_Here, _Prep, Objects)), _Stamp, Mem0, Mem2) :- 
  211 agent_thought_model(Agent, _ModelData, Mem0), Depth > 1,
  212 % getprop(Agent, model_depth = ModelDepth, advstate),  
  213 DepthLess is Depth - 1,
  214 findall( sub__examine(Agent, Sense, child, Obj, DepthLess),
  215   ( member(Obj, Objects),    
  216      Obj \== Agent), % ( \+ member(props(Obj, _), ModelData); true),
  217   Actions),
  218 percept_todo(Actions, Mem0, Mem2).
  219
  220process_percept_auto(_Agent, _Percept, _Timestamp, M0, M0):-  \+ declared(inherited(autonomous), M0),!.
  221
  222% Auto Answer
  223process_percept_auto(Agent, emoted(Speaker,  EmoteType, Agent, Words), _Stamp, Mem0, Mem1) :-
  224 trace, consider_text(Speaker,EmoteType, Agent, Words, Mem0, Mem1).
  225process_percept_auto(Agent, emoted(Speaker,  EmoteType, Star, WordsIn), _Stamp, Mem0, Mem1) :- is_star(Star),
  226 addressing_whom(WordsIn, Whom, Words),
  227 Whom == Agent,
  228 consider_text(Speaker,EmoteType, Agent, Words, Mem0, Mem1).
  229
  230% Auto take
  231process_percept_auto(Agent, percept_props(Agent, Sense, Object, Depth, PropList), _Stamp, Mem0, Mem2) :- 
  232  Depth > 1, 
  233 (member(inherited(shiny), PropList)),
  234 Object \== Agent,
  235 bugout3('~w: ~p~n', [Agent, percept_props(Agent, Sense, Object, Depth, PropList)], autonomous),
  236 agent_thought_model(Agent,ModelData, Mem0),
  237 \+ h(descended, Object, Agent, ModelData), % Not holding it? 
  238 add_todo_all([take(Agent, Object), print_(Agent, 'My shiny precious!')], Mem0, Mem2).
  239
  240
  241process_percept_auto(_Agent, _Percept, _Stamp, M0, M0).
  242
  243addressing_whom(List, Agent, Words):- Words = [_|_], append(Words,[Agent],List).
  244addressing_whom(List, Agent, Words):- Words = [_|_], append(_,[Agent|Words],List).
  245
  246
  247%was_own_self(Agent, say(Agent, _)).
  248was_own_self(Agent, emote(Agent, _, _Targ, _)).
  249was_own_self(Agent, emoted(Agent, _, _Targ, _)).
  250% was_own_self(Agent, Action):- action_doer(Action, Was), Was == Agent.
  251
  252:- defn_state_setter(process_percept_player//3).  253% Ignore own speech.
  254process_percept_player(Agent, _Percept, _Stamp, Mem0, Mem0) :- \+ is_player(Agent),!.
  255process_percept_player(_, [], _Stamp, Mem0, Mem0) :- !.
  256process_percept_player(Agent, [Percept|Tail], Stamp, Mem0, Mem4) :- !,
  257 process_percept_player(Agent, Percept, Stamp, Mem0, Mem1),
  258 process_percept_player(Agent, Tail, Stamp, Mem1, Mem4).
  259process_percept_player(Agent,Percept, _Stamp, Mem0, Mem0) :- was_own_self(Agent, Percept),!.
  260process_percept_player(_Agent, precept(_,Know,_,_Percept), _Stamp, Mem0, Mem0) :- Know == know, !.
  261process_percept_player(Agent1, precept(Agent2,_,_,_), _Stamp, Mem0, Mem0) :- Agent1 \== Agent2, !.
  262%process_percept_player(Agent1, precept(Agent2,_,_,_), _Stamp, Mem0, Mem0) :- Agent1 \== Agent2, !.
  263%process_percept_player(Agent,Percept, _Stamp, Mem0, Mem0) :- sub_term(Sub,Percept),compound(Sub),Sub=depth(_KnowsD, DepthN),getprop(Agent, look_depth = LookDepth, advstate), DepthN > LookDepth, !.
  264process_percept_player(Agent, Percept, _Stamp, Mem0, Mem0) :-
  265 percept2txt(Agent, Percept, Text),!, player_format('~N~w~n', [Text]),!.
  266
  267process_percept_player(Agent, Percept, _Stamp, M0, M0) :-
  268 player_format(Agent, '~N~q~n', [Agent:Percept]).
  269
  270is_player(Agent):- \+ is_non_player(Agent).
  271is_non_player(Agent):- Agent == floyd.
  272
  273
  274:- defn_state_setter(process_percept_main//3).  275% process_percept_main(Agent, PerceptsList, Stamp, OldModel, NewModel)
  276process_percept_main(_Agent, [], _Stamp, Mem0, Mem0) :- !.
  277process_percept_main(Agent, Percept, Stamp, Mem0, Mem2) :-
  278 quietly(process_percept_player(Agent, Percept, Stamp, Mem0, Mem1)),
  279 process_percept_auto(Agent, Percept, Stamp, Mem1, Mem2).
  280process_percept_main(Agent, Percept, Stamp, Mem0, Mem0):- 
  281 bugout3('~q FAILED!~n', [bprocess_percept(Agent, Percept, Stamp)], perceptq), !.
  282
  283
  284:- defn_state_setter(process_percept_list(agent, list(event), tstamp)).  285process_percept_list(Agent, Percept, Stamp, Mem0, Mem3) :- 
  286 \+ is_list(Percept),!, process_percept_list(Agent, [Percept], Stamp, Mem0, Mem3).
  287% caller memorizes PerceptList
  288process_percept_list(_Agent, _, _Stamp, Mem, Mem) :-
  289 declared(inherited(memorize_perceptq), Mem),
  290 !.
  291process_percept_list(Agent, Percept, Stamp, Mem0, Mem3) :-
  292 must_det((
  293 append(Percept, Mem0, PerceptMem),
  294 each_update_model(Agent, Percept, Stamp, PerceptMem, Mem0, Mem2),
  295 process_percept_main(Agent, Percept, Stamp, Mem2, Mem3))),!.
  296process_percept_list(_Agent, Percept, _Stamp, Mem0, Mem0) :-
  297 bugout3('process_percept_list(~w) FAILED!~n', [Percept], todo), !