/* * This file handles non-fighting player actions. */ #include <sys/types.h> #include <stdio.h> #include <string.h> #include <unistd.h> /* include main header file */ #include "mud.h" void cmd_say(D_MOBILE *dMob, char *arg) { if (arg[0] == '\0') { text_to_mobile(dMob, "Say what?\n\r"); return; } communicate(dMob, arg, COMM_LOCAL); } void cmd_chat(D_MOBILE *dMob, char *arg) { if (arg[0] == '\0') { text_to_mobile(dMob, "chat what?\n\r"); return; } communicate(dMob, arg, COMM_CHAT); } void cmd_quit(D_MOBILE *dMob, char *arg) { char buf[MAX_BUFFER]; /* log the attempt */ sprintf(buf, "%s has left the game.", dMob->name); log_string(buf); save_player(dMob); dMob->socket->player = NULL; free_mobile(dMob); close_socket(dMob->socket, FALSE); } void cmd_shutdown(D_MOBILE *dMob, char *arg) { shut_down = TRUE; } void cmd_commands(D_MOBILE *dMob, char *arg) { BUFFER *buf = buffer_new(MAX_BUFFER); int i, col = 0; bprintf(buf, " - - - - ----==== The full command list ====---- - - - -\n\n\r"); for (i = 0; tabCmd[i].cmd_name[0] != '\0'; i++) { if (dMob->level < tabCmd[i].level) continue; bprintf(buf, " %-16.16s", tabCmd[i].cmd_name); if (!(++col % 4)) bprintf(buf, "\n\r"); } if (col % 4) bprintf(buf, "\n\r"); text_to_mobile(dMob, buf->data); buffer_free(buf); } void cmd_who(D_MOBILE *dMob, char *arg) { D_MOBILE *xMob; D_SOCKET *dsock; BUFFER *buf = buffer_new(MAX_BUFFER); int count = 0; bprintf(buf, " #w%s#n %s\n", MUD_NAME, ctime (¤t_time)); for (dsock = dsock_list; dsock; dsock = dsock->next) { if (dsock->state != STATE_PLAYING) continue; if ((xMob = dsock->player) == NULL) continue; bprintf(buf, "[%-13s] %s %-20s\n", return_who_level_name(xMob), xMob->name, xMob->title); ++count; } /* Bleh are 1 player bleh */ if (count == 1) bprintf(buf, "\nThere is only one player in %s.\n", MUD_NAME); else bprintf(buf, "\nThere are %d players in %s\n", count, MUD_NAME); text_to_mobile(dMob, buf->data); buffer_free(buf); } /* * return_who_level_name() * * Returns string of level */ char *return_who_level_name (D_M * ch) { switch(ch->level) { default: return " *** BUG *** "; case 1: return " #RG#rues#Rt#n "; case 2: return " #GP#glaye#Gr#n "; case 3: return " #PA#pdmi#Pn#n "; case 4: return " #WI#wm#Dplement#wo#Wr #n"; } return " *** BUG *** "; } void cmd_help(D_MOBILE *dMob, char *arg) { if (arg[0] == '\0') { HELP_DATA *pHelp; BUFFER *buf = buffer_new(MAX_BUFFER); int col = 0; bprintf(buf, " - - - - - ----====//// HELP FILES \\\\\\\\====---- - - - - -\n\n\r"); for (pHelp = help_list; pHelp; pHelp = pHelp->next) { bprintf(buf, " %-19.18s", pHelp->keyword); if (!(++col % 4)) bprintf(buf, "\n\r"); } if (col % 4) bprintf(buf, "\n\r"); bprintf(buf, "\n\r Syntax: help <topic>\n\r"); text_to_mobile(dMob, buf->data); buffer_free(buf); return; } if (!check_help(dMob, arg)) { text_to_mobile(dMob, "Sorry, no such helpfile.\n\r"); return; } } void cmd_compress(D_MOBILE *dMob, char *arg) { /* no socket, no compression */ if (!dMob->socket) return; /* enable compression */ if (!dMob->socket->out_compress) { text_to_mobile(dMob, "Trying compression.\n\r"); text_to_buffer(dMob->socket, (char *) compress_will2); text_to_buffer(dMob->socket, (char *) compress_will); } else /* disable compression */ { if (!compressEnd(dMob->socket, dMob->socket->compressing, FALSE)) { text_to_mobile(dMob, "Failed.\n\r"); return; } text_to_mobile(dMob, "Compression disabled.\n\r"); } } void cmd_save(D_MOBILE *dMob, char *arg) { save_player(dMob); text_to_mobile(dMob, "Saved.\n\r"); } void cmd_copyover(D_MOBILE *dMob, char *arg) { FILE *fp; D_SOCKET *dsock, *dsock_next; char buf[100]; if ((fp = fopen(COPYOVER_FILE, "w")) == NULL) { text_to_mobile(dMob, "*** COPYOVER *** Copyover file not writeable, aborted.\n\r"); return; } /* Make sure the world is saved */ save_time(); sprintf(buf, "\n\r <*> The world starts spinning <*>\n\r"); /* For each playing descriptor, save its state */ for (dsock = dsock_list; dsock ; dsock = dsock_next) { dsock_next = dsock->next; compressEnd(dsock, dsock->compressing, FALSE); if (dsock->state != STATE_PLAYING) { text_to_socket(dsock, "\n\rSorry, we are rebooting. Come back in a few minutes.\n\r"); close_socket(dsock, FALSE); } else { fprintf(fp, "%d %s %s\n", dsock->control, dsock->player->name, dsock->hostname); /* save the player */ save_player(dsock->player); text_to_socket(dsock, buf); } } fprintf (fp, "-1\n"); fclose (fp); /* close any pending sockets */ recycle_sockets(); /* exec - descriptors are inherited */ sprintf(buf, "%d", control); execl(EXE_FILE, "SocketMud", "copyover", buf, (char *) NULL, (char *) NULL); /* Failed - sucessful exec will not return */ text_to_mobile(dMob, "Copyover FAILED!\n\r"); } void cmd_linkdead(D_MOBILE *dMob, char *arg) { D_MOBILE *xMob; char buf[MAX_BUFFER]; bool found = FALSE; for (xMob = dmobile_list; xMob; xMob = xMob->next) { if (!xMob->socket) { sprintf(buf, "%s is linkdead.\n\r", xMob->name); text_to_mobile(dMob, buf); found = TRUE; } } if (!found) text_to_mobile(dMob, "No one is currently linkdead.\n\r"); } void cmd_location(D_MOBILE * ch, char * arg) { char buf[MAX_BUFFER]; sprintf(buf, "Location: X:%d Y:%d\n\r", ch->y, ch->x); stc(buf, ch); } void cmd_number_here (D_MOBILE * ch, char * arg) { char buf[MAX_BUFFER]; sprintf(buf, "Sector number here is %d\n\r", map[ch->y][ch->x]); stc(buf, ch); } void cmd_recall (D_MOBILE * ch, char * arg) { stc("You pray to the gods to take you home\n\r", ch); ch->y = 403; ch->x = 703; cmd_look(ch, ""); }