home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
games
/
volume12
/
mdg
/
part03
/
input.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-03-04
|
15KB
|
914 lines
/*
MDG Multiuser Dungeon Game -- input.c reader-task
MDG is Copyright 1990 John C. Gonnerman
This program is subject to the general MDG
copyright statement (see enclosed file, Copyright).
*/
static char *sccsvers = "@(#) input.c\t(1.5)\tcreated 1/3/91";
#include <curses.h>
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include "setup.h"
#include "struct.h"
#include "messages.h"
#include "effect.h"
#define GOD1PROMPT \
"God Power: r)eveal, m)ap, s)tats, t)itle, l)ink, or i)tem? "
char *gates = "={}:;-|";
char *progname;
struct player_seg *pseg;
struct map_seg *mseg;
extern int errno;
extern char *sys_errlist[];
extern char *spell_names[];
int pid, dqid, gseg_id, playernum, player_indx;
char handle[20];
char old_buf[35] = "";
struct game_msg *gseg;
input_process()
{
int ch;
void input_exit();
strcpy(gseg->buf, WELCOME);
tell_viewer();
signal(SIGHUP, input_exit);
while((ch = getchar()) != EOF)
send_message(ch);
}
void input_exit(sig)
int sig;
{
shmdt(gseg);
exit(0);
}
send_t_message(ch)
int ch;
{
struct dmessage msg_buf;
int in_ch, item_indx;
msg_buf.msg_type = 1L;
msg_buf.playernum = playernum;
switch(ch) {
case '\f' :
redraw_scr();
break;
case 'n' : /* next */
gseg->trader_offset += 10;
tell_viewer();
break;
case 'p' : /* previous */
if(gseg->trader_offset > 0)
gseg->trader_offset -= 10;
tell_viewer();
break;
case 'b' : /* buy */
msg_buf.cmd = 'B';
strcpy(gseg->buf, "buy what? (0-9) ");
tell_viewer();
in_ch = getchar() - '0';
gseg->buf[0] = '\0';
tell_viewer();
if(in_ch < 0 || in_ch > 9)
break;
if((msg_buf.arg = trader_item(in_ch)) == -1)
break;
tell_daemon(&msg_buf);
break;
case 'v' : /* value */
strcpy(gseg->buf, "value what? (1-7) ");
tell_viewer();
in_ch = getchar() - '0';
if((item_indx = find_item(player_indx, in_ch)) >= 0) {
sprintf(gseg->buf, "%s is worth %d\n",
pseg->itm[item_indx].name,
pseg->itm[item_indx].value);
tell_viewer();
}
break;
case 's' : /* sell */
strcpy(gseg->buf, "sell what? (1-7) ");
tell_viewer();
in_ch = getchar() - '0';
if((item_indx = find_item(player_indx, in_ch)) >= 0) {
msg_buf.cmd = 'S';
msg_buf.arg = item_indx;
tell_daemon(&msg_buf);
}
gseg->buf[0] = '\0';
tell_viewer();
break;
case 'l' : /* leave */
msg_buf.cmd = 'L';
tell_daemon(&msg_buf);
break;
}
}
send_message(ch)
int ch;
{
struct dmessage msg_buf;
int in_ch, item_indx;
if(gseg->trader_offset >= 0) {
send_t_message(ch);
return;
}
msg_buf.msg_type = 1L;
msg_buf.playernum = playernum;
if(isupper(ch)) {
msg_buf.cmd = 'c';
msg_buf.subcmd = ch - 'A';
if((msg_buf.arg = get_spell_arg(tolower(ch))) == -1) {
strcpy(gseg->buf, "* aborted *");
tell_viewer();
return;
}
get_spell_text(tolower(ch), msg_buf.text);
tell_daemon(&msg_buf);
} else switch(ch) {
case '\n' :
case '\r' :
gseg->buf[0] = '\0';
tell_viewer();
break;
case '\f' :
redraw_scr();
break;
case '*' :
case '?' :
help();
break;
case ';' :
telltime();
break;
case 't' : /* take */
case '0' :
msg_buf.cmd = 't';
tell_daemon(&msg_buf);
break;
case 'k' :
case '8' :
msg_buf.cmd = 'm';
msg_buf.subcmd = L_NORTH;
tell_daemon(&msg_buf);
break;
case 'j' :
case '2' :
msg_buf.cmd = 'm';
msg_buf.subcmd = L_SOUTH;
tell_daemon(&msg_buf);
break;
case 'l' :
case '6' :
msg_buf.cmd = 'm';
msg_buf.subcmd = L_EAST;
tell_daemon(&msg_buf);
break;
case 'h' :
case '4' :
msg_buf.cmd = 'm';
msg_buf.subcmd = L_WEST;
tell_daemon(&msg_buf);
break;
case 'y' :
case '7' :
msg_buf.cmd = 'm';
msg_buf.subcmd = L_NWEST;
tell_daemon(&msg_buf);
break;
case 'u' :
case '9' :
msg_buf.cmd = 'm';
msg_buf.subcmd = L_NEAST;
tell_daemon(&msg_buf);
break;
case 'b' :
case '1' :
msg_buf.cmd = 'm';
msg_buf.subcmd = L_SWEST;
tell_daemon(&msg_buf);
break;
case 'n' :
case '3' :
msg_buf.cmd = 'm';
msg_buf.subcmd = L_SEAST;
tell_daemon(&msg_buf);
break;
case 'e' : /* enter */
case '5' :
msg_buf.cmd = 'e';
tell_daemon(&msg_buf);
break;
case 'd' : /* drop */
case '/' : /* drop */
strcpy(gseg->buf, "drop what? (0-7) ");
tell_viewer();
in_ch = getchar() - '0';
if(in_ch == 0) {
strcpy(gseg->buf, "drop gold where? (hjkl) ");
tell_viewer();
if((msg_buf.subcmd = get_dir()) != -1
&& (msg_buf.arg = get_amount()) > 0) {
msg_buf.cmd = 'D';
tell_daemon(&msg_buf);
}
} else if(in_ch > 0 && in_ch <= PMAX_ITEMS)
if((item_indx = find_item(player_indx, in_ch)) >= 0) {
sprintf(gseg->buf,
"drop %d where? (hjkl) ", in_ch);
tell_viewer();
if((msg_buf.subcmd = get_dir()) != -1) {
msg_buf.cmd = 'd';
msg_buf.arg = item_indx;
tell_daemon(&msg_buf);
}
}
gseg->buf[0] = '\0';
tell_viewer();
break;
case ')' : /* cast */
case 'c' : /* cast */
strcpy(gseg->buf, "cast which spell? (a-z) ");
tell_viewer();
in_ch = tolower(getchar());
if(in_ch >= 'a' && in_ch <= 'z') {
msg_buf.cmd = 'c';
msg_buf.subcmd = in_ch - 'a';
if((msg_buf.arg = get_spell_arg(in_ch)) == -1) {
strcpy(gseg->buf, "* aborted *");
tell_viewer();
return;
}
get_spell_text(in_ch, msg_buf.text);
tell_daemon(&msg_buf);
}
gseg->buf[0] = '\0';
tell_viewer();
break;
case 'g' : /* god power */
if(pseg->p[player_indx].createpts < 1)
break;
strcpy(gseg->buf, GOD1PROMPT);
tell_viewer();
in_ch = tolower(getchar());
get_god_cmd(in_ch);
gseg->buf[0] = '\0';
tell_viewer();
break;
case 'v' : /* verbose */
msg_buf.cmd = 'v';
tell_daemon(&msg_buf);
break;
case '(' : /* activate */
case 'a' : /* activate */
strcpy(gseg->buf, "activate what? (1-7) ");
tell_viewer();
in_ch = getchar() - '0';
activate_it(in_ch);
gseg->buf[0] = '\0';
tell_viewer();
break;
case '!' : /* activate 1 */
activate_it(1);
break;
case '@' : /* activate 2 */
activate_it(2);
break;
case '#' : /* activate 3 */
activate_it(3);
break;
case '$' : /* activate 4 */
activate_it(4);
break;
case '%' : /* activate 5 */
activate_it(5);
break;
case '^' : /* activate 6 */
activate_it(6);
break;
case '&' : /* activate 7 */
activate_it(7);
break;
case 'w' : /* write */
strcpy(gseg->buf, "write what? (1-7) ");
tell_viewer();
in_ch = getchar() - '1';
write_it(in_ch);
gseg->buf[0] = '\0';
tell_viewer();
break;
case '.' : /* say */
case 's' : /* say */
say_it();
break;
case '+' : /* partner */
case 'p' : /* partner */
partner();
break;
}
}
activate_it(in_ch)
int in_ch;
{
struct dmessage msg_buf;
int item_indx;
if(in_ch > 0 && in_ch <= PMAX_ITEMS) {
item_indx = find_item(player_indx, in_ch);
if(item_indx >= 0) {
msg_buf.msg_type = 1L;
msg_buf.playernum = playernum;
msg_buf.cmd = 'u';
msg_buf.subcmd = item_indx;
msg_buf.arg = get_use_dir(item_indx);
tell_daemon(&msg_buf);
}
}
}
partner()
{
struct dmessage msg_buf;
int pard;
strcpy(gseg->buf, "partner with who? ");
tell_viewer();
pard = toupper(getchar()) - '1';
gseg->buf[0] = '\0';
tell_viewer();
msg_buf.msg_type = 1L;
msg_buf.playernum = playernum;
msg_buf.cmd = 'p';
msg_buf.subcmd = pard;
tell_daemon(&msg_buf);
}
write_it(ch)
int ch;
{
struct dmessage msg_buf;
int i_indx;
if(ch < 0 || ch > 6)
return;
i_indx = pseg->p[player_indx].items[ch];
if(i_indx < 0 || pseg->itm[i_indx].type != NOTE)
return;
msg_buf.msg_type = 1L;
msg_buf.playernum = playernum;
msg_buf.cmd = 'w';
msg_buf.arg = i_indx;
get_message(msg_buf.text);
if(msg_buf.text[0] != '\0')
tell_daemon(&msg_buf);
}
say_it()
{
struct dmessage msg_buf;
msg_buf.msg_type = 1L;
msg_buf.playernum = playernum;
msg_buf.cmd = 's';
get_message(msg_buf.text);
if(msg_buf.text[0] != '\0')
tell_daemon(&msg_buf);
}
get_message(text)
char *text;
{
char inbuf[35];
int pos, ch;
pos = 0;
ch = '\0';
inbuf[0] = '\0';
text[0] = '\0';
while(ch != '\n' && ch != '\r') {
strcpy(gseg->buf, "Message (^R = Recall, ESC = Cancel) : ");
strcat(gseg->buf, inbuf);
strcat(gseg->buf, "_");
tell_viewer();
ch = getchar();
switch(ch) {
case '\033' :
inbuf[pos] = '\0';
gseg->buf[0] = '\0';
tell_viewer();
return;
case '\b' :
if(pos)
pos--;
inbuf[pos] = '\0';
break;
case '\n' :
case '\r' :
case '\f' :
case '\t' :
break;
case '\022' :
strcpy(inbuf, old_buf);
pos = strlen(inbuf);
break;
default :
if(isprint(ch) && pos < 30) {
inbuf[pos++] = ch;
inbuf[pos] = '\0';
}
break;
}
}
gseg->buf[0] = '\0';
tell_viewer();
strcpy(text, inbuf);
strcpy(old_buf, inbuf);
}
int get_amount()
{
char inbuf[9];
int pos, ch;
pos = 0;
ch = '\0';
inbuf[0] = '\0';
while(ch != '\n' && ch != '\r') {
sprintf(gseg->buf, "How much? (ESC to cancel): %s_", inbuf);
tell_viewer();
ch = getchar();
switch(ch) {
case '\033' :
gseg->buf[0] = '\0';
tell_viewer();
return;
case '\b' :
if(pos)
pos--;
inbuf[pos] = '\0';
break;
case '\n' :
case '\r' :
case '\f' :
case '\t' :
break;
default :
if(isdigit(ch) && pos < 7) {
inbuf[pos++] = ch;
inbuf[pos] = '\0';
}
break;
}
}
return atoi(inbuf);
}
int get_dir()
{
switch(tolower(getchar())) {
case 'h' :
case '4' :
return L_WEST;
case 'j' :
case '2' :
return L_SOUTH;
case 'k' :
case '8' :
return L_NORTH;
case 'l' :
case '6' :
return L_EAST;
case 'y' :
case '7' :
return L_NWEST;
case 'b' :
case '1' :
return L_SWEST;
case 'n' :
case '3' :
return L_SEAST;
case 'u' :
case '9' :
return L_NEAST;
}
return -1;
}
get_use_dir(indx)
int indx;
{
if(pseg->itm[indx].type == WEAPON
|| pseg->itm[indx].type == SHIELD
|| pseg->itm[indx].type == ARMOR
|| pseg->itm[indx].type == NOTE)
return 0;
if(pseg->itm[indx].type == MISSILE) {
sprintf(gseg->buf, "fire %s which way? (hjkl) ",
pseg->itm[indx].name);
tell_viewer();
return get_dir();
}
switch(pseg->itm[indx].effect) {
case TELEPORT :
case HEALING :
return 0;
case FIREBALLS : /* fireball */
case LIGHTNING : /* lightning */
case COLD : /* cold */
sprintf(gseg->buf, "activate %s which way? (hjkl) ",
pseg->itm[indx].name);
tell_viewer();
return get_dir();
default :
return 0;
}
}
get_spell_text(spell, text)
int spell;
char *text;
{
switch(spell) {
case 'w' :
get_message(text);
break;
}
}
int get_spell_arg(spell)
int spell;
{
int in_ch, item_indx;
switch(spell) {
case 'c' : /* cold */
case 'f' : /* fireball */
case 'l' : /* lightning */
case 'm' : /* missile */
case 'r' : /* death ray */
sprintf(gseg->buf, "cast %s which way? (hjkl) ",
spell_names[spell - 'a']);
tell_viewer();
return get_dir();
case 'n' : /* nightmare */
case 's' : /* seek */
case 'y' : /* yank */
sprintf(gseg->buf, "%s who? ",
spell_names[spell - 'a']);
tell_viewer();
in_ch = getchar();
return (isdigit(in_ch) ? in_ch - '1' : -1);
case 'o' : /* obscure */
strcpy(gseg->buf, "obscure what item? (0-7) ");
tell_viewer();
in_ch = getchar() - '0';
if(in_ch == 0)
return -1;
if(in_ch > 0 && in_ch <= PMAX_ITEMS)
item_indx = find_item(player_indx, in_ch);
return item_indx;
case 'v' : /* verify */
strcpy(gseg->buf, "verify what item? (0-7) ");
tell_viewer();
in_ch = getchar() - '0';
if(in_ch == 0)
return -1;
if(in_ch > 0 && in_ch <= PMAX_ITEMS)
item_indx = find_item(player_indx, in_ch);
return item_indx;
case 'w' : /* whisper */
strcpy(gseg->buf, "whisper to who? ");
tell_viewer();
in_ch = getchar();
return (isdigit(in_ch) ? in_ch - '1' : -1);
default :
return 0;
}
}
redraw_scr()
{
gseg->clear_ok = 1;
tell_viewer();
}
tell_daemon(mptr)
struct dmessage *mptr;
{
msgsnd(dqid, mptr, DMSGSIZ, IPC_NOWAIT);
}
tell_viewer()
{
struct sembuf ops[1];
ops[0].sem_num = player_indx;
ops[0].sem_op = 1;
ops[0].sem_flg = 0;
semop(pseg->sid, ops, 1);
}
int find_item(p_indx, p_item_indx)
int p_indx, p_item_indx;
{
int i, cnt;
cnt = 0;
if(p_item_indx < 1 || p_item_indx > PMAX_ITEMS)
return -1;
return pseg->p[p_indx].items[p_item_indx - 1];
}
get_god_cmd(ch)
int ch;
{
struct dmessage msg_buf;
char in_ch;
int item_indx;
msg_buf.msg_type = 1L;
msg_buf.playernum = playernum;
msg_buf.cmd = 'g';
msg_buf.subcmd = ch;
switch(ch) {
case 'l' :
strcpy(gseg->buf, "God Power: r)emember or c)reate? ");
tell_viewer();
msg_buf.arg = tolower(getchar());
if(msg_buf.arg == 'c') {
strcpy(gseg->buf, "God Power: select link 1-7? ");
tell_viewer();
msg_buf.ext_arg = getchar() - '1';
if(msg_buf.ext_arg > 6 || msg_buf.ext_arg < 0)
msg_buf.ext_arg = 0;
}
tell_daemon(&msg_buf);
break;
case 'm' :
strcpy(gseg->buf, "God Power: which way? (hjkl) ");
tell_viewer();
msg_buf.arg = get_dir();
strcpy(gseg->buf, "God Power: change to what code? ");
tell_viewer();
if((msg_buf.ext_arg = getchar()) == '=')
msg_buf.ext_arg = get_gate();
tell_daemon(&msg_buf);
break;
case 's' :
strcpy(gseg->buf,
"God Power: l)evel, j)ump inhibit, i)llumination? ");
tell_viewer();
msg_buf.arg = tolower(getchar());
strcpy(gseg->buf, "God Power: + (more) or - (less)? ");
msg_buf.ext_arg = getchar();
tell_daemon(&msg_buf);
break;
case 't' :
msg_buf.arg = pseg->p[player_indx].loc.sector;
get_message(msg_buf.text);
tell_daemon(&msg_buf);
break;
case 'r' :
tell_daemon(&msg_buf);
break;
case 'i' :
strcpy(gseg->buf, "God Power: which item? ");
tell_viewer();
in_ch = getchar() - '0';
if((item_indx = find_item(player_indx, in_ch)) < 0)
break;
msg_buf.arg = item_indx;
strcpy(gseg->buf,
"God Power: n)ame, r)eveal, a)lter, or c)urse item? ");
tell_viewer();
in_ch = tolower(getchar());
if(in_ch == 'a') {
msg_buf.subcmd = in_ch;
msg_buf.ext_arg = get_item_stat(item_indx);
tell_daemon(&msg_buf);
} else if(in_ch == 'n') {
msg_buf.subcmd = in_ch;
get_message(msg_buf.text);
tell_daemon(&msg_buf);
} else if(in_ch == 'r') {
tell_daemon(&msg_buf);
} else if(in_ch == 'c') {
msg_buf.subcmd = 'a';
msg_buf.ext_arg = 'c';
tell_daemon(&msg_buf);
}
break;
}
}
int get_item_stat(i_indx)
int i_indx;
{
strcpy(gseg->buf, "God Power: alter v)alue or r)ange? ");
tell_viewer();
return tolower(getchar());
}
int get_gate()
{
strcpy(gseg->buf, "God Power: select gate number 1-7 > ");
tell_viewer();
switch(getchar()) {
case '2' :
return '{';
case '3' :
return '}';
case '4' :
return ':';
case '5' :
return ';';
case '6' :
return '-';
case '7' :
return '|';
default :
return '=';
}
}
/* end of file. */