/* /lib/interface.c
* from the Dead Soulsr1 Object Library
* handles user interface issues
* created by Descartes of Borg 950428
* Version: @(#) interface.c 1.4@(#)
* Last Modified: 96/10/15
*/
#include <lib.h>
#include <daemons.h>
#include <message_class.h>
#include "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, 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) {
SetCommandFail(0);
if( Client ) {
int cl;
sscanf(str, "%d %s", cl, str);
}
if( (str = editor::process_input(str)) == "" ) return "";
else {
str = nmsh::process_input(str);
if( str != "" ) {
return chat_command(str);
}
else {
return "";
}
}
}
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) {
int cl = 0;
if( msg_class[0] == 'N' ) {
msg_class = msg_class[1..];
cl |= MSG_NOWRAP;
}
else if( msg_class == "prompt" && msg_class == "editor" ) cl |= MSG_NOWRAP;
switch(msg_class) {
case "smell": case "sound": case "touch":
cl |= MSG_ENV;
break;
case "snoop":
cl |= MSG_SYSTEM | MSG_NOCOLOUR;
case "broadcast":
cl |= MSG_SYSTEM;
break;
case "editor":
cl |= MSG_EDIT;
break;
case "tell": case "shout":
cl |= MSG_CONV;
break;
case "come": case "leave": case "telout": case "telin":
cl |= MSG_ENV;
break;
case "living_item": case "inanimate_item":
cl |= MSG_ROOMDESC;
break;
case "system": case "more":
cl |= MSG_SYSTEM;
break;
case "prompt":
cl = MSG_PROMPT;
break;
case "error":
cl |= MSG_ERROR;
break;
case "help":
cl |= MSG_HELP;
default:
cl |= MSG_ENV;
}
eventPrint(msg, cl);
}
static void receive_snoop(string str) { receive_message("snoop", "%"+str); }
int Setup() {
command::Setup();
nmsh::Setup();
TermInfo = (mapping)TERMINAL_D->query_term_info(Terminal);
}
varargs int eventPrint(string msg, mixed arg2, mixed arg3) {
int msg_class;
if( !msg ) return 0;
if( !arg2 && !arg3 ) msg_class = MSG_ENV;
else if( !arg2 ) {
if( !intp(arg3) ) msg_class = MSG_ENV;
else msg_class = arg3;
}
else if( !intp(arg2) ) msg_class = MSG_ENV;
else msg_class = arg2;
if( !(msg_class & MSG_NOBLOCK) && GetBlocked("all") ) return 0;
if( GetLogHarass() )
log_file("harass/" + GetKeyName(), strip_colours(msg) + "\n");
if( !TermInfo )
TermInfo = (mapping)TERMINAL_D->query_term_info(GetTerminal());
if( !(msg_class & MSG_NOCOLOUR) ) {
int indent;
if( msg_class & MSG_CONV ) indent = 4;
else indent = 0;
if( msg_class & MSG_NOWRAP )
msg = terminal_colour(msg + "%^RESET%^", TermInfo);
else
msg = terminal_colour(msg + "%^RESET%^\n", TermInfo,
GetScreen()[0], indent);
}
else if( !(msg_class & MSG_NOWRAP) ) msg = wrap(msg, GetScreen()[0]-1);
if( Client ) receive("<" + msg_class + " " + msg + " " + msg_class +">\n");
else receive(msg);
return 1;
}
varargs int SetBlocked(string type, int flag) {
if( !type ) return 0;
if( !flag ) flag = !Blocked[type];
if( Blocked[type] == 2 && !archp(this_player()) ) {
this_player()->eventPrint("Unable to unblock " + type + ".");
return -1;
}
Blocked[type] = flag;
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]); }
int SetClient(int x) {
return 0;
if( x ) SetTerminal("unknown");
return (Client = x);
}
int 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;
width--;
if( width * height > __LARGEST_PRINTABLE_STRING__ ) {
if( width > height ) width = __LARGEST_PRINTABLE_STRING__/height;
else if( height > width ) height = __LARGEST_PRINTABLE_STRING__/width;
else width = height = (__LARGEST_PRINTABLE_STRING__-1)/2;
}
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": case "dec-vt100":
terminal = "ansi";
break;
case "unknown": case "ansi": case "freedom": case "ansi-status":
case "xterm":
break;
case "console": case "ibm-3278-2":
terminal = "unknown";
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; }