/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock * * * * Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little * * This mud is NOT to be copied in whole or in part, or to be run without * * the permission of Matthew Little. Nobody else has permission to * * authorise the use of this code. * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <ctype.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <assert.h> #include <unistd.h> #include <stdarg.h> #include <limits.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include "merc.h" #include "build.h" #include "version.h" #include "changes.h" #include "quotes.h" int MaxRetired; RETIRED_DATA *retired_table; NCLANS_DATA *nclans_table; char *classname args ( (int Value) ); void load_retired (void) { FILE *fp; int i; if (!(fp = fopen ("../db/retired.db", "r"))) { bug ("Could not open retried file for reading.", 0); return; } fscanf (fp, "%d\n", &MaxRetired); /* Use malloc so we can realloc later on */ retired_table = malloc (sizeof (RETIRED_DATA) * (MaxRetired + 1)); for (i = 0; i < MaxRetired; i++) { retired_table[i].name = fread_string (fp); retired_table[i].title = fread_string (fp); retired_table[i].class = fread_number (fp); retired_table[i].pks = fread_number (fp); retired_table[i].pds = fread_number (fp); retired_table[i].mks = fread_number (fp); retired_table[i].mds = fread_number (fp); retired_table[i].als = fread_number (fp); retired_table[i].aws = fread_number (fp); retired_table[i].played = fread_number (fp); retired_table[i].creation = fread_string (fp); retired_table[i].retired = fread_string (fp); retired_table[i].clan = fread_string (fp); retired_table[i].generation = fread_number (fp); retired_table[i].status = fread_number (fp); retired_table[i].displayed = fread_number (fp); } fclose (fp); return; /* just return */ } void save_retired (void) { FILE *fp; int i; if (!(fp = fopen ("../db/retired.db", "w"))) { perror ("../db/retired.db"); return; } fprintf (fp, "%d\n", MaxRetired); for (i = 0; i < MaxRetired; i++) { fprintf (fp, "%s~\n", retired_table[i].name); fprintf (fp, "%s~\n", retired_table[i].title); fprintf (fp, "%d\n", retired_table[i].class); fprintf (fp, "%d\n", retired_table[i].pks); fprintf (fp, "%d\n", retired_table[i].pds); fprintf (fp, "%d\n", retired_table[i].mks); fprintf (fp, "%d\n", retired_table[i].mds); fprintf (fp, "%d\n", retired_table[i].als); fprintf (fp, "%d\n", retired_table[i].aws); fprintf (fp, "%d\n", retired_table[i].played); fprintf (fp, "%s~\n", retired_table[i].creation); fprintf (fp, "%s~\n", retired_table[i].retired); fprintf (fp, "%s~\n", retired_table[i].clan); fprintf (fp, "%d\n", retired_table[i].generation); fprintf (fp, "%d\n", retired_table[i].status); fprintf (fp, "%d\n", retired_table[i].displayed); fprintf (fp, "\n"); } fclose (fp); return; } void delete_retirement (int iArg) { int i, j; RETIRED_DATA *new_table; new_table = malloc (sizeof (RETIRED_DATA) * MaxRetired); if (!new_table) return; for (i = 0, j = 0; i < MaxRetired + 1; i++) { if (i != iArg) { new_table[j] = retired_table[i]; j++; } } free (retired_table); retired_table = new_table; MaxRetired--; save_retired (); return; } void do_retireset(CHAR_DATA *ch, char *argument) { int num; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; argument = one_argument (argument, arg1); argument = one_argument (argument, arg2); if(arg1[0]=='\0') { stc("Retireset [name] [option]\n\r",ch); stc("Option being one of: display delete\n\r",ch); return; } if(!str_cmp(arg2, "display")) { if(!dude_exists(arg1)) { stc("Can't find them in the list...\n\r",ch); return; } num = fetch_dudenr(arg1); if(retired_table[num].displayed == 0) { retired_table[num].displayed = 1; stc("They are now displayed on the public command.\n\r",ch); save_retired(); return; } else { retired_table[num].displayed = 0; stc("They are no longer displayed on the public command.\n\r",ch); save_retired(); return; } return; } if (!str_cmp(arg2, "delete")) { if(!dude_exists(arg1)) { stc("Can't find them in the list...\n\r",ch); return; } num = fetch_dudenr(arg1); delete_retirement(num); stc("That retirement is now wiped out.\n\r",ch); save_retired(); return; } return; } void do_retire(CHAR_DATA *ch, char *argument) { RETIRED_DATA *new_table; char buf[MSL]; char ibuf[MSL]; if(IS_NPC(ch)) return; if(ch->played < 360000) { stc("We don't retire players underneath 100 hours playtime.\n\r",ch); return; } if(argument[0]=='\0') { stc("Syntax: retire [password]\n\r",ch); stc("NOTE: #r#FWE WILL NOT REIMB YOU AFTER RETIREMENT!#n\n\r",ch); return; } if (strcmp (crypt (argument, ch->pcdata->pwd), ch->pcdata->pwd)) { send_to_char ("Illegal password.\n\r", ch); WAIT_STATE (ch, 12); return; } MaxRetired++; new_table = realloc (retired_table, sizeof (RETIRED_DATA) * (MaxRetired + 1)); if (!new_table) { /* realloc failed */ send_to_char ("Memory allocation failed. Brace for impact.\n\r", ch); return; } retired_table = new_table; retired_table[MaxRetired - 1].name = str_dup(ch->name); retired_table[MaxRetired - 1].title = str_dup(ch->pcdata->title); retired_table[MaxRetired - 1].class = ch->class; retired_table[MaxRetired - 1].pks = ch->pkill; retired_table[MaxRetired - 1].pds = ch->pdeath; retired_table[MaxRetired - 1].mks = ch->mkill; retired_table[MaxRetired - 1].mds = ch->mdeath; retired_table[MaxRetired - 1].aws = ch->awins; retired_table[MaxRetired - 1].als = ch->alosses; retired_table[MaxRetired - 1].played = ch->played; retired_table[MaxRetired - 1].creation = str_dup(ch->createtime); retired_table[MaxRetired - 1].retired = str_dup(new_date(current_time)); retired_table[MaxRetired - 1].clan = str_dup(nclans_table[ch->clannum].display); if(IS_IMMORTAL(ch)) retired_table[MaxRetired - 1].generation = 1337; else retired_table[MaxRetired - 1].generation = ch->pcdata->stats[UNI_GEN]; if(IS_IMMORTAL(ch)) retired_table[MaxRetired - 1].status = ch->level; else retired_table[MaxRetired - 1].status = ch->race; retired_table[MaxRetired - 1].displayed = 0; save_retired(); sprintf (buf, "%s has retired.", ch->name); log_string (buf, ch); sprintf (buf, "%s%s", PLAYER_DIR, capitalize (ch->name)); ch->fight_timer = 0; ch->pcdata->login_timer = 0; char_from_room (ch); char_to_room (ch, get_room_index (ROOM_VNUM_LIMBO)); sprintf(ibuf, "%s has retired theirself from gameplay!", ch->name); do_info(ch, ibuf); do_quit (ch, ""); unlink (buf); return; } void do_showretired(CHAR_DATA *ch, char *argument) { char buf[MSL]; char show[MSL]; int i; cprintf(buf, "#w[#r%-3s#w][#g%-13s#w][#y%-5s#w][#b%-7s#w][#p%-7s#w][#p%-7s#w][#p%-7s#w][#p%-7s#w][#p%-7s#w][#p%-9s#w]#n\n\r","Num", "Name", "Hours", "Pkills", "Pdeaths", "Mkills", "Mdeaths", "Awins", "Alosses", "Displayed" ); stc(buf, ch); for (i = 1; i < MaxRetired; i++) { if(retired_table[i].displayed == 0) sprintf(show, "No"); else sprintf(show, "Yes"); cprintf(buf, "#w[#r%3d#w][#g%-13s#w][#y%-5d#w][#b%7d#w][#b%7d#w][#b%7d#w][#b%7d#w][#b%7d#w][#p%7d#w][#P%-9s#w]#n\n\r", i, retired_table[i].name, (retired_table[i].played / 3600), retired_table[i].pks, retired_table[i].pds, retired_table[i].mks, retired_table[i].mds, retired_table[i].aws, retired_table[i].als, show ); stc(buf, ch); } return; } void do_halloffame( CHAR_DATA *ch, char *argument ) { int i=0, hit=0, page=0, display=0, actual=0; char buf[MSL], name[MSL]; if (IS_NPC(ch)) return; for (i = 1; i < MaxRetired; i++) { if(retired_table[i].displayed == 0) continue; actual++; } if ((page = atoi(argument)) == 0) page = (actual + 2) / 3; stc("#C---------------#w=#r[#eC#w h r y s t a n c i a #eH #wa l l o f #eF #wa m e#r]#w=#C---------------#n\n\r",ch); for (i = 1; i < MaxRetired; i++) { if(retired_table[i].displayed == 0) continue; display++; if (((display + 2) / 3) != page) continue; if(hit > 0) stc("#C=================================================================================#n\n\r",ch); cprintf(name, "#w%s#e %s#n", retired_table[i].name, retired_table[i].title); cprintf(buf, "#eName:#n %-30s #eCharacter creation: #w%s#n\n\r", name, retired_table[i].creation); stc(buf, ch); cprintf(name, "#w%d#e hours", (retired_table[i].played / 3600 )); cprintf(buf, "#ePlayed: %-28s #eCharacter retirement:#w %s#n\n\r", name, retired_table[i].retired); stc(buf, ch); stc("\n\r",ch); sprintf(buf, "#eClass: #w%-29s#e Clan: #w%s#n\n\r", classname(retired_table[i].class), retired_table[i].clan); stc(buf, ch); sprintf(buf, " #eGeneration: #w%d#n\n\r", retired_table[i].generation); stc(buf, ch); stc("\n\r",ch); switch (retired_table[i].status) { default: cprintf (name, "#wKing #e(#w%d#e)#n", retired_table[i].status); break; case 0: cprintf (name, "#wAvatar #e(#w0#e)#n"); break; case 1: case 2: case 3: case 4: cprintf (name, "#wPeasant #e(#w%d#e)#n", retired_table[i].status); break; case 5: case 6: case 7: case 8: if(retired_table[i].generation == 1337) cprintf(name, "#cBuilder#n"); else cprintf (name, "#wPeasant #e(#w%d#e)#n", retired_table[i].status); break; case 9: if(retired_table[i].generation == 1337) cprintf(name, "#CEnforcer#n"); else cprintf (name, "#wPage #e(#w%d#e)#n", retired_table[i].status); break; case 10: if(retired_table[i].generation == 1337) cprintf(name, "#oJudge#n"); else cprintf (name, "#wPage #e(#w%d#e)#n", retired_table[i].status); break; case 11: if(retired_table[i].generation == 1337) cprintf(name, "#yHigh Judge#n"); else cprintf (name, "#wPage #e(#w%d#e)#n", retired_table[i].status); break; case 12: if(retired_table[i].generation == 1337) cprintf(name, "#rImplementor#n"); else cprintf (name, "#wPage #e(#w%d#e)#n", retired_table[i].status); break; case 13: if(retired_table[i].generation == 1337) cprintf(name, "#rOWNER#n"); else cprintf (name, "#wPage #e(#w%d#e)#n", retired_table[i].status); break; case 14: cprintf (name, "#wApprentice #e(#w%d#e)#n", retired_table[i].status); break; case 15: case 16: case 17: case 18: case 19: cprintf (name, "#wScout #e(#w%d#e)#n", retired_table[i].status); break; case 20: case 21: case 22: case 23: case 24: cprintf (name, "#wSoldier #e(#w%d#e)#n", retired_table[i].status); break; case 25: case 26: case 27: case 28: case 29: cprintf (name, "#wLieutenant #e(#w%d#e)#n", retired_table[i].status); break; case 30: case 31: case 32: case 33: case 34: cprintf (name, "#wCaptain #e(#w%d#e)#n", retired_table[i].status); break; case 35: case 36: case 37: case 38: case 39: cprintf (name, "#wMajor #e(#w%d#e)#n", retired_table[i].status); break; case 40: case 41: case 42: case 43: case 44: cprintf (name, "#wGeneral #e(#w%d#e)#n", retired_table[i].status); break; case 45: case 46: case 47: case 48: case 49: cprintf (name, "#wKnight #e(#w%d#e)#n", retired_table[i].status); break; case 50: case 51: case 52: case 53: case 54: cprintf (name, "#wLord #e(#w%d#e)#n", retired_table[i].status); break; case 55: case 56: case 57: case 58: case 59: cprintf (name, "#wBaron #e(#w%d#e)#n", retired_table[i].status); break; case 60: case 61: case 62: case 63: case 64: cprintf (name, "#wViscount #e(#w%d#e)#n", retired_table[i].status); break; case 65: case 66: case 67: case 68: case 69: cprintf (name, "#wEarl #e(#w%d#e)#n", retired_table[i].status); break; case 70: case 71: case 72: case 73: case 74: cprintf (name, "#wDuke #e(#w%d#e)#n", retired_table[i].status); break; case 75: case 76: case 77: case 78: case 79: cprintf (name, "#wPrince #e(#w%d#e)#n", retired_table[i].status); } if(retired_table[i].generation == 1337) { cprintf(buf, "#eStaff Position: #n%s\n\r", name); stc(buf, ch); } else { cprintf(buf, "#ePlayer kills: #w%-21d #eStatus:#n %s\n\r", retired_table[i].pks, name); stc(buf, ch); } if(retired_table[i].generation < 1337) { sprintf(buf, "#ePlayer deaths: #w%d#n\n\r", retired_table[i].pds); stc(buf, ch); sprintf(buf, "#eMob kills: #w%-21d #eArena Wins: #w%d#n\n\r", retired_table[i].mks, retired_table[i].aws); stc(buf, ch); sprintf(buf, "#eMob deaths: #w%-21d #eArena Losses: #w%d#n\n\r", retired_table[i].mds, retired_table[i].als); stc(buf, ch); } hit++; } if(hit == 0) { stc("#w There are currently no players worthy an entry in the Chrystancia Hall of Fame!\n\r",ch); stc("#C---------------------------------------------------------------------------------#n\n\r", ch); } else { cprintf(buf, "#C---------------------------------- Page %d of %d ----------------------------------#n\n\r", page, ((actual + 2) / 3)); stc(buf, ch); } return; } char *classname( int Value ) { if( Value == CLASS_VAMPIRE ) return "Vampire"; else if ( Value == CLASS_WEREWOLF ) return "Werewolf"; else if ( Value == CLASS_DEMON ) return "Demon"; else if ( Value == CLASS_NINJA ) return "Ninja"; else if ( Value == CLASS_DROW ) return "Drow"; else if ( Value == CLASS_MONK ) return "Monk"; else if ( Value == CLASS_MAGE ) return "Mage"; else if ( Value == CLASS_HIGHLANDER ) return "Highlander"; else if ( Value == CLASS_FAE ) return "Fae"; else if ( Value == CLASS_DRAGON ) return "Dragon"; else if ( Value == CLASS_WRAITH ) return "Wraith"; else if ( Value == CLASS_PHOENIX ) return "Phoenix"; else return "Unclassed"; } bool dude_exists( char *argument) { int i, cnt=0; for (i = 0; i < MaxRetired; i++) { if (!str_cmp(argument, retired_table[i].name)) { cnt++; } } if ( cnt > 0 ) return TRUE; else return FALSE; } int fetch_dudenr( char *argument ) { int i, cnt=0; for (i = 0; i < MaxRetired; i++) { if (!str_cmp(argument, retired_table[i].name)) { cnt += i; } } return cnt; }