/* SCCS Id: @(#)nhlan.c 3.3 99/11/21 */ /* Copyright (c) Michael Allison, 1997 */ /* NetHack may be freely redistributed. See license for details. */ /* * Currently shared by the following ports: * WIN32 * * The code in here is used to take advantage of added features * that might be available in a Local Area Network environment. * * Network Username of player * Mail * Futures * Shared bones * To implement this: code, data files, and configuration * files need to be separated from writeable files such * as level files, bones files, and save files. * */ #include "hack.h" #include #ifdef LAN_FEATURES #ifdef LAN_MAIL /* Port specific code needs to implement these routines for LAN_MAIL */ extern char *FDECL(get_username, (int *)); extern boolean NDECL(mail_check); extern boolean FDECL(mail_fetch, (struct lan_mail_struct *)); extern void FDECL(mail_init, (char *)); extern void NDECL(mail_finish); struct lan_mail_struct mailmessage; #endif /* LAN_MAIL */ void init_lan_features() { lan_username(); #ifdef LAN_MAIL lan_mail_init(); #endif #ifdef LAN_SHARED_BONES #endif } /* * The get_lan_username() call is a required call, since some of * the other LAN features depend on a unique username being available. * */ char lusername[MAX_LAN_USERNAME]; int lusername_size = MAX_LAN_USERNAME; char *lan_username() { char *lu; lu = get_username(&lusername_size); if (lu) { Strcpy(lusername, lu); return lusername; } else return (char *)0; } # ifdef LAN_MAIL #if 0 static void mail_by_pline(msg) struct lan_mail_struct *msg; { long size; for (size = 0; size < qt_msg->size; size += (long)strlen(in_line)) { (void) dlb_fgets(in_line, 80, msg_file); convert_line(); pline(out_line); } } #endif /* 0 */ static void mail_by_window(msg) struct lan_mail_struct *msg; { char buf[BUFSZ]; winid datawin = create_nhwindow(NHW_TEXT); char *get, *put; int ccount = 0; get = msg->body; put = buf; while (*get) { if (ccount > 79) { *put = '\0'; putstr(datawin, 0, buf); put = buf; ccount = 0; } if (*get == '\r') { get++; } else if (*get == '\n') { *put = '\0'; putstr(datawin, 0, buf); put = buf; get++; ccount = 0; } else if (!isprint(*get)) { get++; } else { *put++ = *get++; ccount++; } } *put = '\0'; putstr(datawin, 0, buf); putstr(datawin, 0, ""); display_nhwindow(datawin, TRUE); destroy_nhwindow(datawin); } /* this returns TRUE if there is mail ready to be read */ boolean lan_mail_check() { if (flags.biff) { if (mail_check()) return TRUE; } return FALSE; } void lan_mail_read(otmp) struct obj *otmp; { if (flags.biff) { (void) mail_fetch(&mailmessage); /* after a successful fetch iflags.lan_mail_fetched * should be TRUE. If it isn't then we don't * trust the contents of mailmessage. This * ensures that things work correctly across * save/restores where mailmessage isn't * saved (nor should it be since it may be * way out of context by then). */ if (iflags.lan_mail_fetched) { if (mailmessage.body_in_ram) { mail_by_window(&mailmessage); return; } } } pline_The("text has faded and is no longer readable."); } void lan_mail_init() { if (!flags.biff) return; (void) mail_init(lusername); } void lan_mail_finish() { if (iflags.lan_mail) (void) mail_finish(); } /* If ever called, the underlying mail system ran into trouble * and wants us to cease bothering it immediately. * Don't call mail_finish() because the underlying mail system * may already be unavailable. Just clean up the NetHack side * of things to prevent a crash. */ void lan_mail_terminate() { /* Step 1. Clear iflags.lan_mail to indicate "not inited" */ iflags.lan_mail = FALSE; /* Step 2. Clear iflags.lan_mail_fetched */ iflags.lan_mail_fetched = FALSE; /* Once having gotten to this point, the only way to resume NetHack mail features again is to Save/Quit game, or for the user to clear iflags.biff and then set it once again, which triggers mail initialization */ } # endif /*LAN_MAIL*/ #endif /*LAN_FEATURES*/ /*nhlan.c*/