home *** CD-ROM | disk | FTP | other *** search
/ Amiga Special: Spiele Hits / Hits-CD.iso / aminet / spiele / ammud1_1.lha / AmigaMUD / Src / Basics / chat.m < prev    next >
Text File  |  1997-06-10  |  21KB  |  908 lines

  1. /*
  2.  * Amiga MUD
  3.  *
  4.  * Copyright (c) 1997 by Chris Gray
  5.  */
  6.  
  7. /*
  8.  * chat.m - add a simple chat mode.
  9.  */
  10.  
  11. private tp_chat CreateTable()$
  12. use tp_chat
  13.  
  14. define tp_chat ChatThing CreateThing(nil)$
  15. define tp_chat p_chNoiseAdverbs CreateStringProp()$
  16. define tp_chat p_chActionAdverbs CreateStringProp()$
  17. ChatThing@p_chNoiseAdverbs := ""$
  18. ChatThing@p_chActionAdverbs := ""$
  19.  
  20. define tp_chat p_pSaveAction CreateActionProp()$
  21. define tp_chat p_pSavePrompt CreateStringProp()$
  22. define tp_chat p_pChatting CreateBoolProp()$
  23. define tp_chat p_pChatAliases CreateThingListProp()$
  24.  
  25. define tp_chat p_chKey CreateStringProp()$
  26. define tp_chat p_chContents CreateStringProp()$
  27.  
  28. define tp_chat proc chatReset()void:
  29.     thing me;
  30.  
  31.     me := Me();
  32.     ignore SetPrompt(me@p_pSavePrompt);
  33.     me -- p_pSavePrompt;
  34.     ignore SetCharacterInputAction(me@p_pSaveAction);
  35.     me -- p_pSaveAction;
  36.     me -- p_pChatting;
  37.     DelElement(me@p_pEnterActions, chatReset);
  38.     DelElement(me@p_pExitActions, chatReset);
  39. corp;
  40.  
  41. define tp_chat proc chatHandler(string line)void:
  42.     thing me, alias;
  43.     list thing aliases;
  44.     int count;
  45.     string word, contents;
  46.     bool found;
  47.  
  48.     me := Me();
  49.     if line = "." or line = "$" then
  50.     chatReset();
  51.     elif SubString(line, 0, 1) = "!" then
  52.     call(me@p_pSaveAction, void)(SubString(line, 1, Length(line) - 1));
  53.     else
  54.     aliases := me@p_pChatAliases;
  55.     SetTail(line);
  56.     word := GetWord();
  57.     if word == "alias" then
  58.         word := GetWord();
  59.         if word = "" then
  60.         if aliases = nil then
  61.             Print("You have no chat aliases.\n");
  62.         else
  63.             count := Count(aliases);
  64.             Print("Chat aliases:\n");
  65.             while count ~= 0 do
  66.             count := count - 1;
  67.             alias := aliases[count];
  68.             Print("  ");
  69.             Print(alias@p_chKey);
  70.             Print(" => ");
  71.             Print(alias@p_chContents);
  72.             Print("\n");
  73.             od;
  74.         fi;
  75.         else
  76.         Print("Chat alias '");
  77.         Print(word);
  78.         Print("' ");
  79.         found := false;
  80.         if aliases ~= nil then
  81.             count := Count(aliases);
  82.             while count ~= 0 and not found do
  83.             count := count - 1;
  84.             alias := aliases[count];
  85.             if alias@p_chKey == word then
  86.                 found := true;
  87.             fi;
  88.             od;
  89.         fi;
  90.         contents := GetTail();
  91.         if contents = "" then
  92.             if found then
  93.             DelElement(aliases, alias);
  94.             Print("removed.\n");
  95.             else
  96.             Print("does not exist.\n");
  97.             fi;
  98.         else
  99.             if SubString(contents, 0, 1) = "\"" then
  100.             contents := SubString(contents, 1, Length(contents)-2);
  101.             fi;
  102.             if found then
  103.             alias@p_chContents := contents;
  104.             Print("updated.\n");
  105.             else
  106.             if aliases = nil then
  107.                 aliases := CreateThingList();
  108.                 me@p_pChatAliases := aliases;
  109.             fi;
  110.             alias := CreateThing(nil);
  111.             alias@p_chKey := word;
  112.             alias@p_chContents := contents;
  113.             AddTail(aliases, alias);
  114.             Print("added.\n");
  115.             fi;
  116.         fi;
  117.         fi;
  118.     else
  119.         alias := nil;
  120.         if aliases ~= nil then
  121.         count := Count(aliases);
  122.         while count ~= 0 and not found do
  123.             count := count - 1;
  124.             alias := aliases[count];
  125.             if alias@p_chKey == word then
  126.             found := true;
  127.             fi;
  128.         od;
  129.         fi;
  130.         if found then
  131.         DoSay(alias@p_chContents + " " + GetTail());
  132.         else
  133.         DoSay(line);
  134.         fi;
  135.     fi;
  136.     fi;
  137. corp;
  138.  
  139. define tp_chat proc v_chat()bool:
  140.     thing me;
  141.     action oldAction;
  142.     string tail;
  143.  
  144.     me := Me();
  145.     if me@p_pChatting then
  146.     Print("You are already in chat mode!\n");
  147.     false
  148.     else
  149.     tail := GetTail();
  150.     if tail = "" then
  151.         oldAction := SetCharacterInputAction(chatHandler);
  152.         if oldAction = nil then
  153.         OPrint(Capitalize(CharacterNameS(me)) + " is confused.\n");
  154.         false
  155.         else
  156.         me@p_pChatting := true;
  157.         me@p_pSaveAction := oldAction;
  158.         me@p_pSavePrompt := SetPrompt("chat> ");
  159.         AddHead(me@p_pEnterActions, chatReset);
  160.         AddHead(me@p_pExitActions, chatReset);
  161.         true
  162.         fi
  163.     else
  164.         chatHandler(tail);
  165.         true
  166.     fi
  167.     fi
  168. corp;
  169.  
  170. VerbTail(G, "c", v_chat)$
  171. Synonym(G, "c", "chat")$
  172.  
  173. define tp_chat proc v_whisper()bool:
  174.     string what, ch, agentName;
  175.     character who;
  176.     thing agent;
  177.  
  178.     what := GetWord();
  179.     if what == "to" then
  180.     what := GetWord();
  181.     fi;
  182.     if what = "" then
  183.     Print("Specify who you want to whisper to.\n");
  184.     false
  185.     else
  186.     ch := SubString(what, Length(what) - 1, 1);
  187.     if ch = "," or ch = ":" then
  188.         what := SubString(what, 0, Length(what) - 1);
  189.     fi;
  190.     who := Character(what);
  191.     if who = nil then
  192.         who := Character(Capitalize(what));
  193.     fi;
  194.     if who = nil then
  195.         agent := FindAgent(what);
  196.     else
  197.         agent := CharacterThing(who);
  198.     fi;
  199.     if agent = nil then
  200.         Print("You can't whisper to " + what + ".\n");
  201.         false
  202.     elif agent = Me() then
  203.         Print("You can't whisper to yourself!\n");
  204.         false
  205.     else
  206.         what := GetTail();
  207.         agentName := CharacterNameS(agent);
  208.         if what = "" then
  209.         Print("Specify what you want to whisper to " +
  210.             agentName + ".\n");
  211.         false
  212.         else
  213.         if Me()@p_pEchoPose then
  214.             Print("You whisper to " + agentName + ": " +
  215.             what + "\n");
  216.         fi;
  217.         note - Magic value of 10 is probability of being overheard;
  218.         if Whisper("", what, agent, 10) then
  219.             true
  220.         else
  221.             Print(agentName + " is not here!\n");
  222.             false
  223.         fi
  224.         fi
  225.     fi
  226.     fi
  227. corp;
  228.  
  229. VerbTail(G, "wh", v_whisper)$
  230. Synonym(G, "wh", "whisper")$
  231.  
  232. define tp_chat proc v_pose()bool:
  233.     thing me;
  234.     string activity;
  235.  
  236.     me := Me();
  237.     activity := GetTail();
  238.     if activity = "" then
  239.     Print("You must give the pose/emote you want to do.\n");
  240.     false
  241.     elif not CanSee(Here(), me) then
  242.     Print("It is dark - no-one could see you " + activity + "!\n");
  243.     false
  244.     elif me@p_pHidden then
  245.     Print("You are hidden - no-one could see you " + activity + "!\n");
  246.     false
  247.     else
  248.     if GlobalThing@p_FreePoses then
  249.         Pose("", activity);
  250.         if me@p_pEchoPose then
  251.         Print("You " + activity + ".\n");
  252.         fi;
  253.     else
  254.         Pose("", "=> " + activity);
  255.         if me@p_pEchoPose then
  256.         Print("You => " + activity + ".\n");
  257.         fi;
  258.     fi;
  259.     true
  260.     fi
  261. corp;
  262.  
  263. VerbTail(G, "pose", v_pose)$
  264. Synonym(G, "pose", "emote")$
  265. Synonym(G, "pose", ":")$
  266.  
  267. define tp_chat proc v_emit()bool:
  268.     thing me, here;
  269.     string message;
  270.  
  271.     me := Me();
  272.     message := GetTail();
  273.     if message = "" then
  274.     Print("You must give the emit you want to do.\n");
  275.     Print("  E.g.   .It is very quiet here.\n");
  276.     false
  277.     else
  278.     here := Here();
  279.     if GlobalThing@p_FreePoses then
  280.         ABPrint(here, nil, nil, message + "\n");
  281.     else
  282.         ABPrint(here, nil, nil,
  283.         "[" + CharacterNameG(me) + "] " + message + "\n");
  284.     fi;
  285.     true
  286.     fi
  287. corp;
  288.  
  289. VerbTail(G, "emit", v_emit)$
  290. Synonym(G, "emit", ".")$
  291.  
  292. define tp_chat proc actionAdverb(string s)void:
  293.     ChatThing@p_chActionAdverbs := ChatThing@p_chActionAdverbs + s;
  294. corp;
  295.  
  296. actionAdverb("aimlessly,aimless,aim.")$
  297. actionAdverb("awkwardly,awkward,awk.")$
  298. actionAdverb("briefly,brief.")$
  299. actionAdverb("briskly,brisk.")$
  300. actionAdverb("clumsily,clumsy,clu.")$
  301. actionAdverb("crazily,crazy,cra.")$
  302. actionAdverb("deeply,deep.")$
  303. actionAdverb("enthusiastically,enthusiastic,enthuse,ent.")$
  304. actionAdverb("exitedly,excited,exc,e.")$
  305. actionAdverb("fervently,fervent,fer.")$
  306. actionAdverb("firmly,firm.")$
  307. actionAdverb("frentically,frentic,fren,fre.")$
  308. actionAdverb("furiously,furious,fur.")$
  309. actionAdverb("gayly,gay.")$
  310. actionAdverb("gracefully,gracefull,gra.")$
  311. actionAdverb("happily,happy,h.")$
  312. actionAdverb("hesitantly,hesitant,hes.")$
  313. actionAdverb("hurriedly,hurry,hur.")$
  314. actionAdverb("impatiently,impatient,imp.")$
  315. actionAdverb("majestically,majestic,maj.")$
  316. actionAdverb("merrily,merry,mer.")$
  317. actionAdverb("mischievously,mischievous,mis.")$
  318. actionAdverb("mockingly,mocking,mock.")$
  319. actionAdverb("mysteriously,mysterious,mys.")$
  320. actionAdverb("nastily,nasty,nas.")$
  321. actionAdverb("naughtily,naughty,nau.")$
  322. actionAdverb("passionately,passionate,pas.")$
  323. actionAdverb("patiently,patient,pat.")$
  324. actionAdverb("playfully,playfull,pla.")$
  325. actionAdverb("pointedly,pointed,poi.")$
  326. actionAdverb("politely,polite,pol.")$
  327. actionAdverb("quickly,quick,qui,q,f.")$
  328. actionAdverb("rapidly,rapid,rap.")$
  329. actionAdverb("sadly,sad.")$
  330. actionAdverb("sharply,sharp,sha.")$
  331. actionAdverb("slowly,slow,slo,s.")$
  332. actionAdverb("smoothly,smooth,smo.")$
  333. actionAdverb("solemnly,solemn,sol.")$
  334. actionAdverb("suddenly,sudden,sud.")$
  335. actionAdverb("suggestively,suggest,sug.")$
  336. actionAdverb("swiftly,swift,swi.")$
  337. actionAdver