foundation2_fluffos_v1/
foundation2_fluffos_v1/bin/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/ChangeLog.old/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/Win32/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/compat/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/compat/simuls/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/include/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/clone/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/command/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/data/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/etc/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/include/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/inherit/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/inherit/master/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/log/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/compiler/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/efuns/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/operators/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/u/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/tmp/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/windows/
foundation2_fluffos_v1/lib/cfg/
foundation2_fluffos_v1/lib/cmds/adm/
foundation2_fluffos_v1/lib/daemon/save/
foundation2_fluffos_v1/lib/daemon/services/
foundation2_fluffos_v1/lib/daemon/soul/
foundation2_fluffos_v1/lib/doc/build/
foundation2_fluffos_v1/lib/doc/classes/
foundation2_fluffos_v1/lib/doc/driver/
foundation2_fluffos_v1/lib/doc/driver/applies/
foundation2_fluffos_v1/lib/doc/driver/applies/interactive/
foundation2_fluffos_v1/lib/doc/driver/concepts/
foundation2_fluffos_v1/lib/doc/driver/driver/
foundation2_fluffos_v1/lib/doc/driver/efuns/arrays/
foundation2_fluffos_v1/lib/doc/driver/efuns/buffers/
foundation2_fluffos_v1/lib/doc/driver/efuns/calls/
foundation2_fluffos_v1/lib/doc/driver/efuns/compile/
foundation2_fluffos_v1/lib/doc/driver/efuns/filesystem/
foundation2_fluffos_v1/lib/doc/driver/efuns/floats/
foundation2_fluffos_v1/lib/doc/driver/efuns/functions/
foundation2_fluffos_v1/lib/doc/driver/efuns/general/
foundation2_fluffos_v1/lib/doc/driver/efuns/mappings/
foundation2_fluffos_v1/lib/doc/driver/efuns/numbers/
foundation2_fluffos_v1/lib/doc/driver/efuns/parsing/
foundation2_fluffos_v1/lib/doc/driver/lpc/constructs/
foundation2_fluffos_v1/lib/doc/driver/lpc/types/
foundation2_fluffos_v1/lib/doc/driver/platforms/
foundation2_fluffos_v1/lib/doc/efun/
foundation2_fluffos_v1/lib/doc/etc/
foundation2_fluffos_v1/lib/doc/faq/
foundation2_fluffos_v1/lib/doc/help/creator/
foundation2_fluffos_v1/lib/doc/help/player/
foundation2_fluffos_v1/lib/doc/lpc/basic/
foundation2_fluffos_v1/lib/doc/lpc/data_types/
foundation2_fluffos_v1/lib/doc/lpc/etc/
foundation2_fluffos_v1/lib/doc/lpc/intermediate/
foundation2_fluffos_v1/lib/doc/lpc/types/
foundation2_fluffos_v1/lib/doc/mudlib/
foundation2_fluffos_v1/lib/doc/mudlib/Features/
foundation2_fluffos_v1/lib/domains/Examples/armour/
foundation2_fluffos_v1/lib/domains/Examples/etc/
foundation2_fluffos_v1/lib/domains/Examples/npc/
foundation2_fluffos_v1/lib/domains/Examples/room/
foundation2_fluffos_v1/lib/domains/Examples/virtual/
foundation2_fluffos_v1/lib/domains/Examples/virtual/exaA/
foundation2_fluffos_v1/lib/domains/Examples/virtual/exaB/
foundation2_fluffos_v1/lib/domains/Examples/weapon/
foundation2_fluffos_v1/lib/domains/School/doc/
foundation2_fluffos_v1/lib/domains/School/room/
foundation2_fluffos_v1/lib/domains/School/room/Classes/
foundation2_fluffos_v1/lib/domains/School/room/Offices/
foundation2_fluffos_v1/lib/domains/Standard/
foundation2_fluffos_v1/lib/domains/Standard/pools/
foundation2_fluffos_v1/lib/domains/Standard/std/
foundation2_fluffos_v1/lib/domains/Standard/xtra/
foundation2_fluffos_v1/lib/include/
foundation2_fluffos_v1/lib/lib/obj/
foundation2_fluffos_v1/lib/news/
foundation2_fluffos_v1/lib/save/
foundation2_fluffos_v1/lib/secure/cfg/
foundation2_fluffos_v1/lib/secure/cmds/player/
foundation2_fluffos_v1/lib/secure/lib/
foundation2_fluffos_v1/old/
foundation2_fluffos_v1/win32/
/*    /lib/interface.c
 *    from the Foundation II LPC Library
 *    handles user interface issues
 *    created by Descartes of Borg 950428
 */

#include <lib.h>
#include <daemons.h>
#include "interface.h"

inherit LIB_CHAT;
inherit LIB_COMMAND;
inherit LIB_EDITOR;
inherit LIB_NMSH;

private string Terminal;
private mapping Blocked;
private int *Screen;
private static int LogHarass;
private static string Client;
private static mapping TermInfo;

static void create() {
    chat::create();
    command::create();
    editor::create();
    nmsh::create();
    Terminal = "unknown";
    Screen = ({ 80, 24 });
    Blocked = ([]);
}

static string process_input(string str) {
    if( (str = editor::process_input(str)) == "" ) return "";
    else return nmsh::process_input(str);
}

static void terminal_type(string str) {
    if( !stringp(str) ) return;
    else SetTerminal(lower_case(str));
}

static void window_size(int width, int height) { SetScreen(width, height); }

void receive_message(string msg_class, string msg) {
    string *words;
    int i, max;
    string str, pre, post;
    int x, do_wrap;

    if( GetLogHarass() )
      log_file("harass/" + GetKeyName(), strip_colours(msg) + "\n");
    if( Client ) {
        receive("<"+msg_class+">"+msg+"\n");
        return;
    }
    x = GetScreen()[0];
    if( msg_class[0] == 'N' ) msg_class = msg_class[1..];
    else if( msg_class != "prompt" && msg_class != "editor" ) 
      msg = wrap(msg,x );
    if( msg_class == "snoop" ) {
	receive(strip_colours(msg));
	return;
    }
    if( msg_class == "editor" || msg_class == "system" || 
       msg_class == "more" ) {
        receive(msg);
        return;
    }
    if( GetBlocked(msg_class) ) {
	switch(msg_class) {
            case "broadcast": case "more": case "help": case "smell":
	    case "sound": case "my_action": case "other_action":
            case "system": case "prompt": case "editor":
	        break;
   	    default: return;
	}
    }
    msg = msg + "%^RESET%^";
    switch(msg_class) {
        case "smell": msg = "%^ORANGE%^"+msg; break;
        case "sound": msg = "%^CYAN%^"+msg; break;
        case "tell": 
          if(sscanf(msg, "%s:%s", pre, post) == 2)
            msg = "%^BOLD%^RED%^"+pre+":%^RESET%^"+post;
        break;
        case "shout":
          if(sscanf(msg, "%s:%s", pre, post) == 2)
            msg = "%^BOLD%^BLUE%^"+pre+":%^RESET%^"+post;
          break;
        case "come": case "leave": case "telout": case "telin":
          msg = "%^BOLD%^GREEN%^"+msg; break;
        case "living_item": msg = "%^BOLD%^RED%^"+msg; break;
        case "inanimate_item": msg = "%^BOLD%^MAGENTA%^"+msg; break;
    }
    if( !TermInfo ) 
      TermInfo = (mapping)TERMINAL_D->query_term_info(GetTerminal());
    receive(terminal_colour(msg, TermInfo));
}

static void receive_snoop(string str) { receive_message("snoop", "%"+str); } 

static string cache_commands(string str) {
    if( nmsh::cache_commands(str) == "" ) return "";
    else return chat::cache_commands(str);
}

int Setup() {
    command::Setup();
    nmsh::Setup();
    TermInfo = (mapping)TERMINAL_D->query_term_info(Terminal);
}

int SetBlocked(string type) {
    Blocked[type] = !Blocked[type];
    message("system", "You are "+(Blocked[type] ? "now blocking" :
      "no longer blocking")+" "+type+".", this_object());
    return Blocked[type];
}

int GetBlocked(string type) { return (Blocked["all"] || Blocked[type]); }

string SetClient(string str) {
    if(base_name(previous_object()) != LIB_LOGIN) return Client;
    return (Client = str);
}

string GetClient() { return Client; }

int SetLogHarass(int x) {
    string txt;

    if( GetForced() || (this_player(1) != this_object()) ) return LogHarass;
    if( LogHarass == x ) return LogHarass;
    if( x ) {
        txt = "**************** Start of Log *****************\n"+
            "Time: " + ctime( time() ) + "\n";
        if( environment( this_object() ) ) txt += "Place: " +
            file_name( environment( this_object() ) ) + "\n";
    } else {
        txt = "**************** End of Log *****************\n"+
            "Time: " + ctime( time() ) + "\n";
    }
    log_file("harass/" + GetKeyName(), txt);
    return (LogHarass = x);
}

int GetLogHarass() { return LogHarass; }

int *SetScreen(int width, int height) { 
    if( !width || !height ) return Screen;
    return (Screen = ({ width, height })); 
}

int *GetScreen() { return Screen; }

string SetTerminal(string terminal) { 
    switch( terminal ) {
        case "iris-ansi-net": case "vt100": case "vt220": case "vt102":
        case "vt300": 
	    terminal = "ansi";
	    break;
	case "unknown": case "ansi": case "freedom": case "ansi-status":
	case "xterm": 
	    break;
	default:
	    log_file("terminals", "Unknown terminal type: " + terminal + "\n");
	    terminal = Terminal;
	    break;
    }
    if( terminal != Terminal ) 
      TermInfo = (mapping)TERMINAL_D->query_term_info(terminal);
    return Terminal = terminal;
}

string GetTerminal() { return Terminal; }

string GetKeyName() { return 0; }