/* * DM2.C: * * DM functions * * Copyright (C) 1991, 1992, 1993, 1997 Brooke Paul & Brett Vickers * */ #include "mstruct.h" #include "mextern.h" #ifdef DMALLOC #include "/usr/local/include/dmalloc.h" #endif /************************************************************************/ /* dm_stat */ /************************************************************************/ /* This function will allow a DM to display information on an object */ /* creature, player, or room. */ int dm_stat(ply_ptr, cmnd) creature *ply_ptr; cmd *cmnd; { room *rom_ptr; object *obj_ptr; creature *crt_ptr; creature *ply_ptr2; int fd, i, j; if(ply_ptr->class < CARETAKER) return(PROMPT); fd = ply_ptr->fd; /* Give stats on room DM is in or specified room # */ if(cmnd->num < 2) { if(cmnd->val[0] >= RMAX) return(0); if(cmnd->val[0] == 1) rom_ptr = ply_ptr->parent_rom; else { if(load_rom(cmnd->val[0], &rom_ptr) < 0) { print(ply_ptr->fd, "Error (%d)\n", cmnd->val[0]); return(0); } } stat_rom(ply_ptr, rom_ptr); return(0); } /* Use player reference through 2nd parameter or default to DM */ if(cmnd->num < 3) ply_ptr2 = ply_ptr; else { ply_ptr2 = find_crt(ply_ptr, ply_ptr->parent_rom->first_mon, cmnd->str[2], cmnd->val[2]); cmnd->str[2][0] = up(cmnd->str[2][0]); if(!ply_ptr2) ply_ptr2 = find_crt(ply_ptr, ply_ptr->parent_rom->first_ply, cmnd->str[2], cmnd->val[2]); if(!ply_ptr2) ply_ptr2 = find_who(cmnd->str[2]); if(!ply_ptr2 || (ply_ptr->class<DM && F_ISSET(ply_ptr2, PDMINV))) ply_ptr2 = ply_ptr; } rom_ptr = ply_ptr2->parent_rom; /* Give info on object, if found */ obj_ptr = find_obj(ply_ptr2, ply_ptr2->first_obj, cmnd->str[1], cmnd->val[1]); if(!obj_ptr) { for(i=0,j=0; i<MAXWEAR; i++) { if(EQUAL(ply_ptr2->ready[i], cmnd->str[1])) { j++; if(j == cmnd->val[1]) { obj_ptr = ply_ptr2->ready[i]; break; } } } } if(!obj_ptr) obj_ptr = find_obj(ply_ptr2, rom_ptr->first_obj, cmnd->str[1], cmnd->val[1]); if(obj_ptr) { stat_obj(ply_ptr, obj_ptr); return(0); } /* Search for creature or player to get info on */ crt_ptr = find_crt(ply_ptr, rom_ptr->first_mon, cmnd->str[1], cmnd->val[1]); cmnd->str[1][0] = up(cmnd->str[1][0]); if (!crt_ptr) crt_ptr = find_crt(ply_ptr, rom_ptr->first_ply, cmnd->str[1], cmnd->val[1]); if(!crt_ptr) crt_ptr = find_who(cmnd->str[1]); if(crt_ptr && !(ply_ptr->class<CARETAKER && F_ISSET(crt_ptr, PDMINV))) { stat_crt(ply_ptr, crt_ptr); return(0); } else print(fd, "Unable to locate.\n"); return(0); } /************************************************************************/ /* stat_rom */ /************************************************************************/ /* Display information on room given to player given. */ int stat_rom(ply_ptr, rom_ptr) creature *ply_ptr; room *rom_ptr; { int i, fd; char str[1024], key[20]; xtag *next_xtag; exit_ *ext; fd = ply_ptr->fd; print(fd, "Room #: %d\n", rom_ptr->rom_num); print(fd, "Name: %s\n", rom_ptr->name); print(fd, "Traffic: %d%%\n", rom_ptr->traffic); print(fd, "Random monsters:\n"); for(i=0; i<10; i++) print(fd, " %3hd", rom_ptr->random[i]); print(fd, "\n"); print(fd, "Perm objects:\n"); for(i=0; i<10; i++) print(fd, " %3hd", rom_ptr->perm_obj[i].misc); print(fd, "\n"); for(i=0; i<10; i++) print(fd, " %3hd", rom_ptr->perm_obj[i].interval); print(fd, "\n"); print(fd, "Perm monsters:\n"); for(i=0; i<10; i++) print(fd, " %3hd", rom_ptr->perm_mon[i].misc); print(fd, "\n"); for(i=0; i<10; i++) print(fd, " %3hd", rom_ptr->perm_mon[i].interval); print(fd, "\n"); if(rom_ptr->track && F_ISSET(rom_ptr, RPTRAK)) print(fd, "Perm Tracks: %s.\n", rom_ptr->track); if (rom_ptr->lolevel || rom_ptr->hilevel){ print(fd, "Level Boundary: "); if (rom_ptr->lolevel) print(fd,"%d+ level ",rom_ptr->lolevel); if (rom_ptr->hilevel) print(fd,"%d- level ",rom_ptr->hilevel); print(fd,"\n"); } if (rom_ptr->trap) { print(fd, "Trap type: "); switch(rom_ptr->trap){ case TRAP_PIT: print(fd,"Pit Trap (exit rm %d)\n", rom_ptr->trapexit); break; case TRAP_DART: print(fd,"Poison Dart Trap\n"); break; case TRAP_BLOCK: print(fd,"Falling Block Trap\n"); break; case TRAP_MPDAM: print(fd,"MP Damage Trap\n"); break; case TRAP_RMSPL: print(fd,"Negate Spell Trap\n"); break; case TRAP_NAKED: print(fd,"Naked Trap\n"); break; case TRAP_ALARM: print(fd," Alarm Trap (guard rm %d)\n", rom_ptr->trapexit); break; default: print(fd,"inalid trap #\n"); break; } } strcpy(str, "Flags set: "); if(F_ISSET(rom_ptr, RSHOPP)) strcat(str, "Shoppe, "); if(F_ISSET(rom_ptr, RDUMPR)) strcat(str, "DumpRoom, "); if(F_ISSET(rom_ptr, RPAWNS)) strcat(str, "PawnShop, "); if(F_ISSET(rom_ptr, RTRAIN)) strcat(str, "train, "); if(F_ISSET(rom_ptr, RREPAI)) strcat(str, "Repair, "); if(F_ISSET(rom_ptr, RDARKR)) strcat(str, "DarkAlways, "); if(F_ISSET(rom_ptr, RDARKN)) strcat(str, "DarkNight, "); if(F_ISSET(rom_ptr, RPOSTO)) strcat(str, "PostOffice, "); if(F_ISSET(rom_ptr, RNOKIL)) strcat(str, "NoPlyKill, "); if(F_ISSET(rom_ptr, RNOTEL)) strcat(str, "NoTeleport, "); if(F_ISSET(rom_ptr, RHEALR)) strcat(str, "HealFast, "); if(F_ISSET(rom_ptr, RONEPL)) strcat(str, "OnePlayer, "); if(F_ISSET(rom_ptr, RTWOPL)) strcat(str, "TwoPlayer, "); if(F_ISSET(rom_ptr, RTHREE)) strcat(str, "ThreePlyr, "); if(F_ISSET(rom_ptr, RNOMAG)) strcat(str, "NoMagic, "); if(F_ISSET(rom_ptr, RPTRAK)) strcat(str, "PermTrack, "); if(F_ISSET(rom_ptr, REARTH)) strcat(str, "Earth, "); if(F_ISSET(rom_ptr, RWINDR)) strcat(str, "Wind, "); if(F_ISSET(rom_ptr, RFIRER)) strcat(str, "Fire, "); if(F_ISSET(rom_ptr, RWATER)) strcat(str, "Water, "); if(F_ISSET(rom_ptr, RPLWAN)) strcat(str, "Groupwander, "); if(F_ISSET(rom_ptr, RPHARM)) strcat(str, "PHarm, "); if(F_ISSET(rom_ptr, RPPOIS)) strcat(str, "P-Poision, "); if(F_ISSET(rom_ptr, RPMPDR)) strcat(str, "P-mp Drain, "); if(F_ISSET(rom_ptr, RPBEFU)) strcat(str, "Confusion, "); if(F_ISSET(rom_ptr, RNOLEA)) strcat(str, "No Summon, "); if(F_ISSET(rom_ptr, RPLDGK)) strcat(str, "Pledge, "); if(F_ISSET(rom_ptr, RRSCND)) strcat(str, "Rescind, "); if(F_ISSET(rom_ptr, RNOPOT)) strcat(str, "No Potion, "); if(F_ISSET(rom_ptr, RPMEXT)) strcat(str, "Pmagic, "); if(F_ISSET(rom_ptr, RNOLOG)) strcat(str, "NoLog, "); if(F_ISSET(rom_ptr, RELECT)) strcat(str, "Elect, "); if(F_ISSET(rom_ptr, RNDOOR)) strcat(str, "InDoors, "); if(strlen(str) > 13) { str[strlen(str)-2] = '.'; str[strlen(str)-1] = 0; } else strcat(str, "None."); print(fd, "%s\n", str); print(fd, "Exits:\n"); next_xtag = rom_ptr->first_ext; while(next_xtag) { ext = next_xtag->ext; print(fd, " %s: %d", ext->name, ext->room); *str = 0; if(F_ISSET(ext, XSECRT)) strcat(str, "Secret, "); if(F_ISSET(ext, XINVIS)) strcat(str, "Invisible, "); if(F_ISSET(ext, XLOCKD)) strcat(str, "Locked, "); if(F_ISSET(ext, XCLOSD)) strcat(str, "Closed, "); if(F_ISSET(ext, XLOCKS)) { strcat(str, "Lockable "); sprintf(key, "(%d), ", ext->key); strcat(str, key); } if(F_ISSET(ext, XCLOSS)) strcat(str, "Closable, "); if(F_ISSET(ext, XUNPCK)) strcat(str, "Un-pick, "); if(F_ISSET(ext, XNAKED)) strcat(str, "Naked, "); if(F_ISSET(ext, XCLIMB)) strcat(str, "ClimbUp, "); if(F_ISSET(ext, XREPEL)) strcat(str, "ClimbRepel, "); if(F_ISSET(ext, XDCLIM)) strcat(str, "HardClimb, "); if(F_ISSET(ext, XFLYSP)) strcat(str, "Fly, "); if(F_ISSET(ext, XFEMAL)) strcat(str, "Female, "); if(F_ISSET(ext, XMALES)) strcat(str, "Male, "); if(F_ISSET(ext, XNGHTO)) strcat(str, "Night, "); if(F_ISSET(ext, XDAYON)) strcat(str, "Day, "); if(F_ISSET(ext, XPLSEL)) { strcat(str ,"Cls-sel: "); if (F_ISSET(ext, XPASSN)) strcat(str, "A, "); if (F_ISSET(ext, XPBARB)) strcat(str, "Ba, "); if (F_ISSET(ext, XPBARD)) strcat(str, "Bd, "); if (F_ISSET(ext, XPCLER)) strcat(str, "C, "); if (F_ISSET(ext, XPFGHT)) strcat(str, "F, "); if (F_ISSET(ext, XPMAGE)) strcat(str, "Ma, "); if (F_ISSET(ext, XPPALA)) strcat(str, "P, "); if (F_ISSET(ext, XPRNGR)) strcat(str, "R, "); if (F_ISSET(ext, XPTHEF)) strcat(str, "T, "); if (F_ISSET(ext, XPMONK)) strcat(str, "Mo, "); } if(F_ISSET(ext, XNOSEE)) strcat(str, "No-See, "); if(F_ISSET(ext, XPGUAR)) strcat(str, "P-Guard, "); if(F_ISSET(ext, XPLDGK)) if(F_ISSET(ext, XKNGDM)) strcat(str, "Organization 1, "); else strcat(str, "Organization 0, "); if(*str) { str[strlen(str)-2] = '.'; str[strlen(str)-1] = 0; print(fd, ", Flags: %s\n", str); } else print(fd, ".\n"); next_xtag = next_xtag->next_tag; } return(0); } /************************************************************************/ /* stat_crt */ /************************************************************************/ /* Display information on creature given to player given. */ int stat_crt(ply_ptr, crt_ptr) creature *ply_ptr; creature *crt_ptr; { char str[1024], temp[20]; int fd, n, x, i; long t; fd = ply_ptr->fd; t=time(0); if(crt_ptr->type == PLAYER && Ply[crt_ptr->fd].io) { print(fd, "\n%s the %s:\n", crt_ptr->name, title_ply(crt_ptr)); print(fd, "Addr: %s@%s ", Ply[crt_ptr->fd].io->userid, Ply[crt_ptr->fd].io->address); if(ply_ptr->class > CARETAKER && crt_ptr->class < DM) print(fd, "\nPswd: %-35.35s\n",Ply[crt_ptr->fd].ply->password); print(fd, "Idle: %02ld:%02ld\n", (t-Ply[crt_ptr->fd].io->ltime)/60L, (t-Ply[crt_ptr->fd].io->ltime)%60L); print(fd, "Room: %-5hd -- %-35.35s\n", Ply[crt_ptr->fd].ply->rom_num,Ply[crt_ptr->fd].ply->parent_rom->name); if(Ply[crt_ptr->fd].ply->class < DM || ply_ptr->class==DM) print(fd, "Cmd : %s\n\n", Ply[crt_ptr->fd].extr->lastcommand); else print(fd, "Cmd : l\n\n"); } else { print(fd, "Name: %s\n", crt_ptr->name); print(fd, "Desc: %s\n", crt_ptr->description); print(fd, "Talk: %s\n", crt_ptr->talk); print(fd, "Keys: %s %+20s%+20s\n\n",crt_ptr->key[0],crt_ptr->key[1], crt_ptr->key[2]); print(fd, "Index: %d\n", atoi(crt_ptr->password)); } print(fd, "Level: %-20d Race: %s\n", crt_ptr->level, race_str[crt_ptr->race]); print(fd, "Class: %-20s Alignment: %s %d\n\n", class_str[crt_ptr->class], F_ISSET(crt_ptr, PCHAOS) ? "Chaotic":"Lawful", crt_ptr->alignment); print(fd, "Exp: %d", crt_ptr->experience); print(fd, " Gold: %d\n", crt_ptr->gold); print(fd, "HP: %d/%d", crt_ptr->hpcur, crt_ptr->hpmax); print(fd, " MP: %d/%d\n", crt_ptr->mpcur, crt_ptr->mpmax); print(fd, "AC: %d", crt_ptr->armor); print(fd, " THAC0: %d\n", crt_ptr->thaco); if(EATNDRINK) if(crt_ptr->type == PLAYER) print(fd, "Food: %2d Drink: %2d\n", crt_ptr->talk[6], crt_ptr->talk[5]); print(fd, "Hit: %dd%d+%d\n", crt_ptr->ndice, crt_ptr->sdice, crt_ptr->pdice); if(crt_ptr->type == PLAYER) print(fd, "Str[%2d] Dex[%2d] Con[%2d] Int[%2d] Pty[%2d] Lck[%2d]\n", crt_ptr->strength, crt_ptr->dexterity, crt_ptr->constitution, crt_ptr->intelligence, crt_ptr->piety, Ply[crt_ptr->fd].extr->luck); else print(fd, "Str[%2d] Dex[%2d] Con[%2d] Int[%2d] Pty[%2d]\n", crt_ptr->strength, crt_ptr->dexterity, crt_ptr->constitution, crt_ptr->intelligence, crt_ptr->piety); strcpy(str, "Flags set: "); if(crt_ptr->type == PLAYER) { print(fd, "Sharp: %ld Thrust: %ld Blunt: %ld Pole: %ld Missile: %ld\n", crt_ptr->proficiency[0], crt_ptr->proficiency[1], crt_ptr->proficiency[2], crt_ptr->proficiency[3], crt_ptr->proficiency[4]); print(fd, "Earth: %ld Wind: %ld Fire: %ld Water: %ld\n", crt_ptr->realm[0], crt_ptr->realm[1], crt_ptr->realm[2], crt_ptr->realm[3]); if(F_ISSET(crt_ptr, PBLESS)) strcat(str, "Bless, "); if(F_ISSET(crt_ptr, PHIDDN)) strcat(str, "Hidden, "); if(F_ISSET(crt_ptr, PINVIS)) strcat(str, "Invis, "); if(F_ISSET(crt_ptr, PNOBRD)) strcat(str, "NoBroad, "); if(F_ISSET(crt_ptr, PNOLDS)) strcat(str, "NoLong, "); if(F_ISSET(crt_ptr, PNOSDS)) strcat(str, "NoShort, "); if(F_ISSET(crt_ptr, PNORNM)) strcat(str, "NoName, "); if(F_ISSET(crt_ptr, PNOEXT)) strcat(str, "NoExits, "); if(F_ISSET(crt_ptr, PNOAAT)) strcat(str, "NoAutoAttk, "); if(F_ISSET(crt_ptr, PNOEXT)) strcat(str, "NoWaitMsg, "); if(F_ISSET(crt_ptr, PPROTE)) strcat(str, "Protect, "); if(F_ISSET(crt_ptr, PDMINV)) strcat(str, "DMInvis, "); if(F_ISSET(crt_ptr, PNOCMP)) strcat(str, "Noncompact, "); if(F_ISSET(crt_ptr, PMALES)) strcat(str, "Male, "); if(F_ISSET(crt_ptr, PWIMPY)) { sprintf(temp, "Wimpy%d, ", crt_ptr->WIMPYVALUE); strcat(str, temp); } if(F_ISSET(crt_ptr, PEAVES)) strcat(str, "Eaves, "); if(F_ISSET(crt_ptr, PBLIND)) strcat(str, "Blind, "); if(F_ISSET(crt_ptr, PCHARM)) strcat(str, "Charmed, "); if(F_ISSET(crt_ptr, PLECHO)) strcat(str, "Echo, "); if(F_ISSET(crt_ptr, PSECOK)) strcat(str, "Secure, "); if(F_ISSET(crt_ptr, PALIAS)) strcat(str, "Alias, "); if(F_ISSET(crt_ptr, PAUTHD)) strcat(str, "Authd, "); if(F_ISSET(crt_ptr, PNLOGN)) strcat(str, "No-login, "); if(F_ISSET(crt_ptr, PPOISN)) strcat(str, "Poisoned, "); if(F_ISSET(crt_ptr, PDISEA)) strcat(str, "Diseased, "); if(F_ISSET(crt_ptr, PLIGHT)) strcat(str, "Light, "); if(F_ISSET(crt_ptr, PPROMP)) strcat(str, "Prompt, "); if(F_ISSET(crt_ptr, PHASTE)) strcat(str, "Haste, "); if(F_ISSET(crt_ptr, PDMAGI)) strcat(str, "D-magic, "); if(F_ISSET(crt_ptr, PDINVI)) strcat(str, "D-invis, "); if(F_ISSET(crt_ptr, PPRAYD)) strcat(str, "Pray, "); if(F_ISSET(crt_ptr, PPREPA)) strcat(str, "Prepared, "); if(F_ISSET(crt_ptr, PLEVIT)) strcat(str, "Levitate, "); if(F_ISSET(crt_ptr, PANSIC)) strcat(str, "Ansi, "); if(F_ISSET(crt_ptr, PRFIRE)) strcat(str, "R-fire, "); if(F_ISSET(crt_ptr, PFLYSP)) strcat(str, "Fly, "); if(F_ISSET(crt_ptr, PRMAGI)) strcat(str, "R-magic, "); if(F_ISSET(crt_ptr, PKNOWA)) strcat(str, "Know-a, "); if(F_ISSET(crt_ptr, PNOSUM)) strcat(str, "Nosummon, "); if(F_ISSET(crt_ptr, PIGNOR)) strcat(str, "Ignore-a, "); if(F_ISSET(crt_ptr, PRCOLD)) strcat(str, "R-cold, "); if(F_ISSET(crt_ptr, PBRWAT)) strcat(str, "Breath-wtr, "); if(F_ISSET(crt_ptr, PSSHLD)) strcat(str, "Earth-shld, "); if(F_ISSET(crt_ptr, PSILNC)) strcat(str, "Mute, "); if(F_ISSET(crt_ptr, PFEARS)) strcat(str, "Fear, "); if(F_ISSET(crt_ptr, PNSUSN)) strcat(str, "Hungry|Thirsty, "); if(F_ISSET(crt_ptr, PPLDGK)) if(F_ISSET(crt_ptr, PKNGDM)) strcat(str, "Organization 1, "); else strcat(str, "Organization 0, "); } else { if(F_ISSET(crt_ptr, MPERMT)) strcat(str, "Perm, "); if(F_ISSET(crt_ptr, MINVIS)) strcat(str, "Invis, "); if(F_ISSET(crt_ptr, MAGGRE)) strcat(str, "Aggr, "); if(F_ISSET(crt_ptr, MGAGGR)) strcat(str, "Good-Aggr, "); if(F_ISSET(crt_ptr, MEAGGR)) strcat(str, "Evil-Aggr, "); if(F_ISSET(crt_ptr, MGUARD)) strcat(str, "Guard, "); if(F_ISSET(crt_ptr, MBLOCK)) strcat(str, "Block, "); if(F_ISSET(crt_ptr, MFOLLO)) strcat(str, "Follow, "); if(F_ISSET(crt_ptr, MFLEER)) strcat(str, "Flee, "); if(F_ISSET(crt_ptr, MSCAVE)) strcat(str, "Scav, "); if(F_ISSET(crt_ptr, MMALES)) strcat(str, "Male, "); if(F_ISSET(crt_ptr, MPOISS)) strcat(str, "Poison, "); if(F_ISSET(crt_ptr, MUNDED)) strcat(str, "Undead, "); if(F_ISSET(crt_ptr, MUNSTL)) strcat(str, "No-steal, "); if(F_ISSET(crt_ptr, MPOISN)) strcat(str, "Poisoned, "); if(F_ISSET(crt_ptr, MMAGIC)) strcat(str, "Magic, "); if(F_ISSET(crt_ptr, MHASSC)) strcat(str, "Scavenged, "); if(F_ISSET(crt_ptr, MBRETH)) if(!F_ISSET(crt_ptr,MBRWP1) && !F_ISSET(crt_ptr,MBRWP2)) strcat(str, "BR-fire, "); else if(F_ISSET(crt_ptr,MBRWP1) && !F_ISSET(crt_ptr,MBRWP2)) strcat(str, "BR-acid, "); else if(!F_ISSET(crt_ptr,MBRWP1) && F_ISSET(crt_ptr,MBRWP2)) strcat(str, "BR-frost, "); else strcat(str, "BR-gas, "); if(F_ISSET(crt_ptr, MMGONL)) strcat(str, "Magic-only, "); if(F_ISSET(crt_ptr, MBLNDR)) strcat(str, "Blinder, "); if(F_ISSET(crt_ptr, MBLIND)) strcat(str, "Blind, "); if(F_ISSET(crt_ptr, MCHARM)) strcat(str, "Charmed, "); if(F_ISSET(crt_ptr, MMOBIL)) strcat(str, "Mobile, "); if(F_ISSET(crt_ptr, MSILNC)) strcat(str, "Mute, "); if(F_ISSET(crt_ptr, MMAGIO)) strcat(str, "Cast-percent, "); if(F_ISSET(crt_ptr, MRBEFD)) strcat(str, "Resist-stun, "); if(F_ISSET(crt_ptr, MNOCIR)) strcat(str, "No-circle, "); if(F_ISSET(crt_ptr, MDINVI)) strcat(str, "Detect-invis, "); if(F_ISSET(crt_ptr, MENONL)) strcat(str, "Enchant-only, "); if(F_ISSET(crt_ptr, MRMAGI)) strcat(str, "Resist-magic, "); if(F_ISSET(crt_ptr, MTALKS)) strcat(str, "Talks, "); if(F_ISSET(crt_ptr, MUNKIL)) strcat(str, "Unkillable, "); if(F_ISSET(crt_ptr, MNRGLD)) strcat(str, "NonrandGold, "); if(F_ISSET(crt_ptr, MTLKAG)) strcat(str, "Talk-aggr, "); if(F_ISSET(crt_ptr, MENEDR)) strcat(str, "Energy Drain, "); if(F_ISSET(crt_ptr, MDISEA)) strcat(str, "Disease, "); if(F_ISSET(crt_ptr, MDISIT)) strcat(str, "Dissolve, "); if(F_ISSET(crt_ptr, MPURIT)) strcat(str, "Purchase, "); if(F_ISSET(crt_ptr, MTRADE)) strcat(str, "Trade, "); if(F_ISSET(crt_ptr, MFEARS)) strcat(str, "Fear, "); if(F_ISSET(crt_ptr, MPGUAR)) strcat(str, "P-Guard, "); if(F_ISSET(crt_ptr, MDEATH)) strcat(str, "Death scene, "); if(F_ISSET(crt_ptr, MDMFOL)) strcat(str, "Possessed, "); if(F_ISSET(crt_ptr, MROBOT)) strcat(str, "Bot, "); if(F_ISSET(crt_ptr, MIREGP)) strcat(str, "Irrplural, "); if(F_ISSET(crt_ptr, MPLDGK) ) if(F_ISSET(crt_ptr, MKNGDM)) strcat(str, "Pledge 1, "); else strcat(str, "Pledge 0, "); if(F_ISSET(crt_ptr, MRSCND) ) if(F_ISSET(crt_ptr, MKNGDM)) strcat(str, "Rescind 1, "); else strcat(str, "Rescind 0, "); } if(strlen(str) > 11) { str[strlen(str)-2] = '.'; str[strlen(str)-1] = 0; } else strcat(str, "None."); print(fd, "%s\n", str); if(F_ISSET(crt_ptr, MTRADE) && crt_ptr->type==MONSTER) { strcpy(str, "Trade items: "); for(i=0; i<5; i++) { sprintf(temp, "%3d ", crt_ptr->carry[i]); strcat(str, temp); } strcat(str, "\n "); for(i=5; i<10; i++) { sprintf(temp, "%3d ", crt_ptr->carry[i]); strcat(str, temp); } print(fd, "%s\n", str); } /* This creates too much load on most machines */ /* if(F_ISSET(crt_ptr, MPERMT) && crt_ptr->type == MONSTER) { n=find_crt_num(crt_ptr); if(!n) print(fd, "Note: Monster is unique.\n"); else for(x=0;x<10;x++) { if(ply_ptr->parent_rom->perm_mon[x].misc==n) if(ply_ptr->parent_rom->perm_mon[x].interval) print(fd,"Note: Perm interval= %d.\n", ply_ptr->parent_rom->perm_mon[x].interval); else print(fd, "Note: Perm interval is invalid.\n"); } } */ return(0); } /************************************************************************/ /* stat_obj */ /************************************************************************/ /* Display information on object given to player given. */ int stat_obj(ply_ptr, obj_ptr) creature *ply_ptr; object *obj_ptr; { char str[1024]; int fd; fd = ply_ptr->fd; print(fd, "Name: %s\n", obj_ptr->name); print(fd, "Desc: %s\n", obj_ptr->description); print(fd, "Use: %s\n", obj_ptr->use_output); print(fd, "Keys: %s %+20s %+20s\n\n",obj_ptr->key[0],obj_ptr->key[1], obj_ptr->key[2]); print(fd, "Hit: %dd%d + %d", obj_ptr->ndice, obj_ptr->sdice, obj_ptr->pdice); if(obj_ptr->adjustment) print(fd, " (+%d)\n", obj_ptr->adjustment); else print(fd, "\n"); print(fd, "Shots: %d/%d\n", obj_ptr->shotscur, obj_ptr->shotsmax); print(fd, "Type: "); if(obj_ptr->type <= MISSILE) { switch(obj_ptr->type) { case SHARP: print(fd, "sharp"); break; case THRUST: print(fd, "thrusting"); break; case BLUNT: print(fd, "blunt"); break; case POLE: print(fd, "pole"); break; case MISSILE: print(fd, "missile"); break; } print(fd, " weapon.\n"); } else print(fd, "%d\n", obj_ptr->type); print(fd, "AC: %2.2d", obj_ptr->armor); print(fd, " Value: %5.5d", obj_ptr->value); print(fd, " Weight: %2.2d", obj_ptr->weight); if(obj_ptr->questnum) print(fd, " Quest: %d\n", obj_ptr->questnum); else print(fd, "\n"); if(obj_ptr->special) { print(fd, "Special: "); switch(obj_ptr->special) { case SP_MAPSC: print(fd, "Map or Scroll.\n");break; case SP_COMBO: print(fd, "Combo Lock.\n");break; case SP_HERB_HEAL: print(fd, "Healing herb.\n");break; case SP_HERB_HARM: print(fd, "Harming herb.\n");break; case SP_HERB_POISON: print(fd, "Poison herbs.\n");break; case SP_HERB_DISEASE: print(fd, "Disease herbs.\n");break; case SP_HERB_CURE_POISON: print(fd, "Cure poison herb.\n");break; case SP_HERB_CURE_DISEASE: print(fd, "Cure disease herb.\n");break; default: print(fd, "Unknown.\n"); } } strcpy(str, "Flags set: "); if(F_ISSET(obj_ptr, OPERMT)) strcat(str, "Pperm, "); if(F_ISSET(obj_ptr, OHIDDN)) strcat(str, "Hidden, "); if(F_ISSET(obj_ptr, OINVIS)) strcat(str, "Invis, "); if(F_ISSET(obj_ptr, OCONTN)) strcat(str, "Cont, "); if(F_ISSET(obj_ptr, OWTLES)) strcat(str, "Wtless, "); if(F_ISSET(obj_ptr, OTEMPP)) strcat(str, "Tperm, "); if(F_ISSET(obj_ptr, OPERM2)) strcat(str, "Iperm, "); if(F_ISSET(obj_ptr, ONOMAG)) strcat(str, "Nomage, "); if(F_ISSET(obj_ptr, OLIGHT)) strcat(str, "Light, "); if(F_ISSET(obj_ptr, OGOODO)) strcat(str, "Good, "); if(F_ISSET(obj_ptr, OEVILO)) strcat(str, "Evil, "); if(F_ISSET(obj_ptr, OENCHA)) strcat(str, "Ench, "); if(F_ISSET(obj_ptr, ONOFIX)) strcat(str, "Nofix, "); if(F_ISSET(obj_ptr, OCLIMB)) strcat(str, "Climbing, "); if(F_ISSET(obj_ptr, ONOTAK)) strcat(str, "Notake, "); if(F_ISSET(obj_ptr, OSCENE)) strcat(str, "Scenery, "); if(F_ISSET(obj_ptr, OSIZE1) || F_ISSET(obj_ptr, OSIZE2)) strcat(str, "Sized, "); if(F_ISSET(obj_ptr, ORENCH)) strcat(str, "RandEnch, "); if(F_ISSET(obj_ptr, OCURSE)) strcat(str, "Cursed, "); if(F_ISSET(obj_ptr, OLUCKY)) strcat(str, "Lucky, "); if(F_ISSET(obj_ptr, OWEARS)) strcat(str, "Worn, "); if(F_ISSET(obj_ptr, OUSEFL)) strcat(str, "Use-floor, "); if(F_ISSET(obj_ptr, OCNDES)) strcat(str, "Devours, "); if(F_ISSET(obj_ptr, ONOMAL)) strcat(str, "Nomale, "); if(F_ISSET(obj_ptr, ONOFEM)) strcat(str, "Nofemale, "); if(F_ISSET(obj_ptr, ONSHAT)) strcat(str, "Shatterproof, "); if(F_ISSET(obj_ptr, OALCRT)) strcat(str, "Always crit, "); if(F_ISSET(obj_ptr, ODDICE)) strcat(str, "NdS damage, "); if(F_ISSET(obj_ptr, OHBREW)) strcat(str, "Brewing herb, "); if(F_ISSET(obj_ptr, OHPAST)) strcat(str, "Paste herb, "); if(F_ISSET(obj_ptr, OHAPLY)) strcat(str, "Cream herb, "); if(F_ISSET(obj_ptr, ONPREP)) strcat(str, "In preparation, "); if(F_ISSET(obj_ptr, ODPREP)) strcat(str, "Prepared, "); if(F_ISSET(obj_ptr, OTMPEN)) strcat(str, "Temp enchant, "); if(F_ISSET(obj_ptr, OIREGP)) strcat(str, "Irrplural. "); if(F_ISSET(obj_ptr, OPLDGK)) if(F_ISSET(obj_ptr, OKNGDM)) strcat(str, "Organization 1, "); else strcat(str, "Organization 0, "); if(F_ISSET(obj_ptr, OCLSEL)){ strcat(str, "Cls-Sel: "); if (F_ISSET(obj_ptr, OASSNO)) strcat(str, "A, "); if (F_ISSET(obj_ptr, OBARBO)) strcat(str, "Ba, "); if (F_ISSET(obj_ptr, OBARDO)) strcat(str, "Bd, "); if (F_ISSET(obj_ptr, OCLERO)) strcat(str, "C, "); if (F_ISSET(obj_ptr, OFIGHO)) strcat(str, "F, "); if (F_ISSET(obj_ptr, OMAGEO)) strcat(str, "M, "); if (F_ISSET(obj_ptr, OPALAO)) strcat(str, "P, "); if (F_ISSET(obj_ptr, ORNGRO)) strcat(str, "R, "); if (F_ISSET(obj_ptr, OTHIEO)) strcat(str, "T, "); } if(strlen(str) > 11) { str[strlen(str)-2] = '.'; str[strlen(str)-1] = 0; } else strcat(str, "None."); print(fd, "%s\n", str); if(F_ISSET(obj_ptr, OTMPEN)) print(fd, "Enchant timeout: %d.\n", ((int)obj_ptr->magicpower+(int)obj_ptr->magicrealm)*40); return(0); } /**********************************************************************/ /* dm_add_rom */ /**********************************************************************/ /* This function allows a DM to add a new, empty room to the current */ /* database of rooms. */ int dm_add_rom(ply_ptr, cmnd) creature *ply_ptr; cmd *cmnd; { room *new_rom; char file[80], rmfrstprt[4]; int fd, ff, index; fd = ply_ptr->fd; if(ply_ptr->class < DM) return(PROMPT); if(!strcmp(cmnd->str[1], "c") && (cmnd->num > 1)) { dm_add_crt(ply_ptr, cmnd); return(0); } if(!strcmp(cmnd->str[1], "o") && (cmnd->num > 1)) { dm_add_obj(ply_ptr, cmnd); return(0); } if(cmnd->val[1] < 2 || cmnd->num < 2) { print(fd, "Index error: please specify room number.\n"); return(0); } if(HASHROOMS) { index=cmnd->val[1]; sprintf(rmfrstprt,"10/r"); if(index<10000) sprintf(rmfrstprt,"09/r"); if(index<9000) sprintf(rmfrstprt,"08/r"); if(index<8000) sprintf(rmfrstprt,"07/r"); if(index<7000) sprintf(rmfrstprt,"06/r"); if(index<6000) sprintf(rmfrstprt,"05/r"); if(index<5000) sprintf(rmfrstprt,"04/r"); if(index<4000) sprintf(rmfrstprt,"03/r"); if(index<3000) sprintf(rmfrstprt,"02/r"); if(index<2000) sprintf(rmfrstprt,"01/r"); if(index<1000) sprintf(rmfrstprt,"00/r"); sprintf(file, "%s/r%s%05d", ROOMPATH, rmfrstprt, index); } else sprintf(file, "%s/r%05d", ROOMPATH, cmnd->val[1]); ff = open(file, O_RDONLY, 0); if(ff >= 0) { close(ff); print(fd, "Room already exists.\n"); return(0); } new_rom = (room *)malloc(sizeof(room)); if(!new_rom) merror("dm_add_room", FATAL); new_rom->rom_num = cmnd->val[1]; sprintf(new_rom->name, "Room #%d", cmnd->val[1]); zero(new_rom, sizeof(room)); ff = open(file, O_RDWR | O_CREAT | O_BINARY, ACC); if(ff < 0) { print(fd, "Error: Unable to open file.\n"); return(0); } if(write_rom(ff, new_rom, 0) < 0) { print(fd, "Write failed.\n"); return(0); } close(ff); free(new_rom); print(fd, "Room #%d created.\n", cmnd->val[1]); return(0); } int dm_spy(ply_ptr, cmnd) creature *ply_ptr; cmd *cmnd; { int fd, i; creature *crt_ptr; if(HEAVEN) { if(ply_ptr->class < DM) return(PROMPT); } else { if(ply_ptr->class < CARETAKER) return(PROMPT); } fd = ply_ptr->fd; if(cmnd->num < 2 && !F_ISSET(ply_ptr, PSPYON)) { print(fd, "Spy on whom?\n"); return(0); } if(F_ISSET(ply_ptr, PSPYON)) { for(i=0; i<Tablesize; i++) if(Spy[i] == fd) Spy[i] = -1; F_CLR(ply_ptr, PSPYON); print(fd, "Spy mode off.\n"); return(0); } cmnd->str[1][0] = up(cmnd->str[1][0]); crt_ptr = find_who(cmnd->str[1]); if(!crt_ptr) { print(fd, "Spy on whom? Use full names.\n"); return(0); } if(Spy[crt_ptr->fd] > -1) { print(fd, "That person is being spied on already.\n"); return(0); } if(!HEAVEN) { if(crt_ptr->class >= CARETAKER) if(strcmp(ply_ptr->name, dmname[2])){ ANSI(crt_ptr->fd,RED); print(crt_ptr->fd,"%s is observing you.\n",ply_ptr->name); ANSI(crt_ptr->fd,WHITE); output_buf(); } } Spy[crt_ptr->fd] = ply_ptr->fd; F_SET(ply_ptr, PSPYON); if(!HEAVEN) F_SET(ply_ptr, PDMINV); print(fd, "Spy on. Type *spy to turn it off.\n"); return(0); }