1/*
    2:-swi_module(toploop_npc, [
    3          move_or_sit_memory_idea/3,
    4          npc_tick/0,
    5          join_npcs_long_running/0,npc_tick_tock/0,npc_tick_tock_time/1,
    6          command_actTick/1,
    7          npc_controller/2,   
    8          %warnOnError/1,
    9          get_world_agent_plan/3,
   10          tick_controller/2]).
   11*/
   12
   13/* * module> 
   14% Uses timers to make sure all Agents get a chance to do their things
   15%
   16% Logicmoo Project PrologMUD: A MUD server written in Prolog
   17% Maintainer: Douglas Miles
   18% Dec 13, 2035
   19%
   20*/
   21
   22:- meta_predicate warnOnError(0).   23:- meta_predicate agent_call_safely(?,?,?).   24
   25
   26% :- include(prologmud(mud_header)).
   27% :- file_begin(mudcode).
   28:- dynamic(npc_tick_tock_time/1).   29npc_tick_tock_time(60).
   30
   31npc_tick_tock:-
   32   npc_tick_tock_time(Time),sleep(Time),
   33   npc_tick.
   34
   35npc_tick:-
   36   join_npcs_long_running, 
   37   findall(What-Who,npc_controller(What,Who),List),!,
   38   my_random_member(What-Who,List),!,
   39   ignore(in_thread_and_join(on_x_debug(tick_controller(What,Who)))).
   40
   41join_npcs_long_running.
   42
   43% skip manually controled agents
   44npc_controller(simple_world_agent_plan,Who):- no_repeats(tAgent(Who)), \+ has_tty(Who).
   45
   46tick_controller(simple_world_agent_plan,Who):- command_actTick(Who).
   47
   48%:-ggtrace.
   49
   50move_or_sit_memory_idea(Agent,actMove(Dir),[Outlet]) :- 
   51	mudMemory(Agent,aDirectionsFn([Dir|_])),
   52	number_to_dir(Num,Dir,vHere),
   53	mudNearReach(Agent,List),
   54	nth1(Num,List,What),
   55	(What == [];
   56	What == [Outlet]).
   57move_or_sit_memory_idea(Agent,actSit,_) :-
   58        req1(mudMemory(Agent,aDirectionsFn(Old))),
   59	del(mudMemory(Agent,aDirectionsFn(Old))),
   60	random_permutation(Old,New),
   61	ain(mudMemory(Agent,aDirectionsFn(New))).
   62
   63
   64command_actTick(Who):- (side_effect_prone),
   65   ignore(current_agent(Who)),
   66   must(nonvar(Who)),
   67   with_agent(Who,
   68     must_det_l((
   69      show_failure(current_agent(Who)),
   70      command_actIdea(Who,IdeaS),
   71      my_random_member(Idea,IdeaS),!,
   72      do_agent_call_plan_command(Who,Idea)))).
   73
   74
   75 
   76get_world_agent_plan(W,Who,Idea):-no_repeats(with_agent(Who,call_no_cuts(world_agent_plan(W,Who,Idea)))).
   77
   78do_agent_call_plan_command(A,C):- t_l:agent_current_action(A,CC),dmsg(too_busy(CC,agent_call_plan_command(A,C))),!.
   79do_agent_call_plan_command(A,C):-   
   80   with_agent(A,locally_tl(agent_current_action(A,C), do_agent_action(A,C))).
   81
   82
   83command_actIdea(Who,IdeaSO):- (var(Who)->current_agent(Who);true),
   84  side_effect_prone,
   85  findall(Idea,
   86        (get_world_agent_plan(current,Who,Idea),
   87             dmsg(get_world_agent_plan(current,Who,Idea))),IdeaS),
   88  (IdeaS=[_,_|_]->delete_eq(IdeaS,actLook,IdeaSO);IdeaSO=IdeaS),
   89  (IdeaSO==[]->dmsg(noidea(actIdea(Who)));true).
   90
   91baseKB:action_info(actNpcTimer(ftInt),"sets how often to let NPCs run").
   92
   93baseKB:action_info(actTock,"Makes All NPCs do something brilliant").
   94baseKB:action_info(actTick(tAgent),"Makes some agent do something brilliant").
   95baseKB:action_info(actTick,"Makes *your* agent do something brilliant").
   96
   97baseKB:action_info(actIdea(isOptional(tAgent,isSelfAgent)),"Makes some agent (or self) think of something brilliant").
   98baseKB:action_info(actProlog(ftCallable),"Call a ftCallable").
   99
  100baseKB:agent_text_command(Agent,["prolog",X],Agent,actProlog(X)):-ignore(X=ftCallable).
  101baseKB:agent_text_command(Agent,["prolog"],Agent,actProlog(prolog_repl)).
  102% baseKB:agent_text_command(Agent,["tlocals"],Agent,actProlog(tlocals)).
  103
  104:-export(warnOnError/1).  105:-module_transparent(warnOnError/1).  106warnOnError(X):-catch(X,E,dmsg(error(E:X))).
  107
  108baseKB:agent_call_command(_Agent,actProlog(prolog_repl)) :- (side_effect_prone),true, prolog_repl,!.
  109baseKB:agent_call_command(Agent,actProlog(C)) :- (side_effect_prone),true,nonvar(C),agent_call_safely(Agent,C).
  110
  111:-export(agent_call_safely/2).  112agent_call_safely(_Agnt,C):- any_to_callable(C,X,Vars), !, gensym(result_count_,RC),flag(RC,_,0),!,agent_call_safely(RC,X,Vars),flag(RC,CC,CC),fmt(result_count(CC)).
  113agent_call_safely(RC,X,[]) :- !, call_u(quietly((warnOnError(doall(((X,flag(RC,CC,CC+1),fmt(cmdresult(X,true))))))))).
  114agent_call_safely(RC,X,Vars) :-  call_u(quietly((warnOnError(doall(((X,flag(RC,CC,CC+1),fmt(cmdresult(X,Vars))))))))).
  115
  116atom_to_term_safe(A,T,O):-catch(atom_to_term(A,T,O),_,fail)->T\==end_of_file.
  117
  118any_to_callable(C,X,Vs):- atom(C),!,atom_to_term_safe(C,XX,Vs1),!,any_to_callable0(XX,X,Vs2),term_variables((Vs1,Vs2),Vs),!.
  119any_to_callable(T,X,Vs):- catch(text_to_string(T,S),_,fail),string_to_atom(S,C),atom_to_term_safe(C,XX,Vs1),!,any_to_callable0(XX,X,Vs2),term_variables((Vs1,Vs2),Vs),!.
  120any_to_callable(C,X,Vs):- any_to_callable0(C,X,Vs).
  121any_to_callable0(C,X,Vs):- expand_goal(C,X),term_variables((C,X),Vs),!.
  122% any_to_callable(C,X,Vs):-force_expand(expand_goal(C,X)),term_variables((C,X),Vs),!.
  123
  124baseKB:agent_call_command(_Agent,actNpcTimer(Time)):-retractall(npc_tick_tock_time(_)),asserta(npc_tick_tock_time(Time)).
  125baseKB:agent_call_command(Who,actTick) :-  on_x_debug(command_actTick(Who)).
  126baseKB:agent_call_command(_Agent,actIdea(Who)) :-  must(command_actIdea(Who,Idea)),fmt(result_actIdea(Who,Idea)).
  127baseKB:agent_call_command(_Agent,actTock) :- (side_effect_prone), npc_tick.
  128baseKB:agent_call_command(_Agent,actTick(Other)) :-(side_effect_prone), baseKB:agent_call_command(Other,actTick).
  129
  130:- include(prologmud(mud_footer)).