/* ************************************************************************ * File: mobedit.c Part of Archipelago * * Usage: online mobile editing commands. A Neil - June 1994 * * * * All rights reserved. See license.doc for complete information. * * * * Archipelago is based on * * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * * Archipelago changes by Alastair J. Neil Copyright (C) 1993, 94, 95, 96 * ************************************************************************ */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "spells.h" #include "limits.h" #include "screen.h" #include "mobedit.h" void mobedit(struct descriptor_data *d, char *str); void print_mob(struct descriptor_data *d); int print_maff(struct descriptor_data *d); int print_mflags(struct descriptor_data *d); void print_mstats(struct descriptor_data *d); void print_acsvs(struct descriptor_data *d); void print_ac(struct descriptor_data *d); void print_st(struct descriptor_data *d); void print_sv(struct descriptor_data *d); void print_mstr(struct descriptor_data *d); void print_matt(struct descriptor_data *d); int print_mpos(struct descriptor_data *d); int print_mdpos(struct descriptor_data *d); void print_msex(struct descriptor_data *d); void print_mobstats(struct descriptor_data *d); void copy_mob(struct char_data *from, struct char_data *to); void free_mob(struct char_data *mob); void print_races(struct descriptor_data *d); int compute_mob_exp(struct char_data *mob); int compute_mobproto_exp(struct char_data *mob); extern struct str_app_type str_app[]; extern struct list_index_type npc_races[]; extern struct char_data *mob_proto; extern char *affected_bits[]; extern char *action_bits[]; extern char *position_types[]; extern char *npc_class_types[]; extern struct index_data *mob_index; extern struct dual_list_type attack_hit_text[]; char *rev_search_list(int num, struct list_index_type *list); void mobedit(struct descriptor_data *d, char *str) { struct char_data *mob_edit; int ja_flag,points, rmob; char *ctmp; char bufme[MAX_STRING_LENGTH]; const char *save[] = { "Breath", "Paralysis", "Rods", "Petrification", "Spells"}; const char *locs[] = { "Breath", "Paralysis", "Rods", "Petrification", "Spells"}; mob_edit = d->mob_edit; switch (d->medit_mode){ case MAIN_MODE: for (; isspace(*str); str++) ; if (!*str){ d->medit_mode = MAIN_MODE; print_mob(d); break;} *str = LOWER(*str); if (*str == 'q'){ if ((rmob = real_mobile(d->virtual)) < 0){ SEND_TO_Q("Yikes mob doesn't exist.\r\nReport this!\r\n",d); free_mob(d->mob_edit); d->mob_edit = 0; d->virtual = 0; d->ia_flag = 0; d->n_att = 0; d->isave =0; d->iloc = 0; d->prompt_mode = 1; REMOVE_BIT(PLR_FLAGS(d->character), PLR_BUILDING); act("$n returns from creating part of the world.",TRUE, d->character,0, 0, TO_ROOM); return;} d->mob_edit->nr = rmob; copy_mob(d->mob_edit, mob_proto + rmob); free_mob(d->mob_edit); d->mob_edit = 0; d->virtual = 0; d->ia_flag = 0; d->n_att = 0; d->isave = 0; d->iloc = 0; d->prompt_mode = 1; REMOVE_BIT(PLR_FLAGS(d->character), PLR_BUILDING); act("$n returns from creating part of the world.",TRUE, d->character,0, 0, TO_ROOM); return;} else switch (*str){ case 'm': d->medit_mode = MFLAG_EDIT; d->ia_flag = print_mflags(d); return; case 'f': d->medit_mode = MAFF_EDIT; d->ia_flag = print_maff(d); return; case 's': d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; case 'p': d->medit_mode = MSTAT_EDIT; print_mstats(d); return; case 'a': d->medit_mode = MACS_EDIT; print_acsvs(d); return; case 't': if (mob_index[mob_edit->nr].number != 0) { SEND_TO_Q("Cannot modify string info on active mobs.\r\n",d); SEND_TO_Q("Press return to continue.\r\n",d); d->medit_mode = MAIN_MODE; return; } d->medit_mode = MSTRI_EDIT; print_mstr(d); return; default: SEND_TO_Q("Illegal Entry, try again\r\n",d); print_mob(d); SEND_TO_Q("\r\nEnter a letter a-w or Q to Quit\r\n",d); return; } break; case MMSTAT_EDIT: for( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MSV_EDIT; print_sv(d); break;} *str = LOWER(*str); if (*str != '1' && *str != '2' && *str != '3' && *str != '4' && *str != '5' && *str != 'q'){ SEND_TO_Q("No such option.",d); break;} switch(*str){ case '1': d->medit_mode = MALIGN_EDIT; sprintf(bufme,"%sAlignment: %s%s%d%s\r\n\r\n",cy,nrm,rd,GET_ALIGNMENT(mob_edit),nrm); SEND_TO_Q(bufme,d); SEND_TO_Q("Enter a new alignment >= -1000 <= 1000.\r\n",d); return; case '2': d->medit_mode = MNHD_EDIT; sprintf(bufme,"%sHit Dice: %s%d%s\r\n",cy,rd,mob_edit->points.hit,nrm); SEND_TO_Q(bufme,d); SEND_TO_Q("Enter new Hit dice.\r\n",d); return; case '3': SEND_TO_Q("Enter new position.\r\n",d); d->ia_flag = print_mpos(d); d->medit_mode = MPOS_EDIT; return; case '4': d->medit_mode = MGOLD_EDIT; sprintf(bufme,"%sHas Gold?:%s %s%s%s\r\n\r\n",cy,nrm,rd,(GET_GOLD(mob_edit) ? "yes": "no"),nrm); SEND_TO_Q(bufme,d); return; case '5': d->medit_mode = MCLASS_EDIT; print_races(d); return; case 'q': d->medit_mode = MAIN_MODE; print_mob(d); return; } case MALIGN_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MLEVEL_EDIT; sprintf(bufme,"Alignment Unchanged.\r\n\r\n%sLevel: %s%s%d%s\r\nEnter a new Mob Level:\r\n",cy,nrm,rd,GET_LEVEL(mob_edit),nrm); SEND_TO_Q(bufme,d); return;} if (*str == 'Q' || *str == 'q') { d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } points = atoi(str); if (points > 1000 || points < -1000){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new Alignment, >= -1000, <= 1000:",d); break; } else{ GET_ALIGNMENT(mob_edit) = points; d->medit_mode = MLEVEL_EDIT; sprintf(bufme,"%sLevel: %s%s%d%s\r\n\r\n",cy,nrm,rd,GET_LEVEL(mob_edit),nrm); SEND_TO_Q(bufme,d); SEND_TO_Q("Enter a new Mob Level:",d); return; } case MLEVEL_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MTHACO_EDIT; sprintf(bufme,"Level Unchanged.\r\n\r\n%sHitroll: %s%s%d%s\r\n\r\nEnter a new Mob Hitroll:\r\n",cy,nrm,rd,mob_edit->points.hitroll,nrm); SEND_TO_Q(bufme,d); return;} if (*str == 'Q' || *str == 'q') { d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } points = atoi(str); if (points < 0 || points > 227){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new Mob Level, >= 0, <= 227y:",d); break; } else{ GET_LEVEL(mob_edit) = points; d->medit_mode = MTHACO_EDIT; sprintf(bufme,"%sHitroll: %s%s%d%s\r\n\r\nEnter a new Mob Hitroll:\r\n",cy,nrm,rd,mob_edit->points.hitroll,nrm); SEND_TO_Q(bufme,d); return;} case MTHACO_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MHEIGHT_EDIT; sprintf(bufme,"Hitroll Unchanged.\r\n\r\n%sHeight: %s%s%d%s\r\n\r\nEnter a new Mob Height:\r\n",cy,nrm,rd,mob_edit->player.height,nrm); SEND_TO_Q(bufme,d); return;} if (*str == 'Q' || *str == 'q') { d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } points = atoi(str); if (points < 0 || points > 20){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new Mob Hitroll, >= 0, <= 20:",d); break; } else{ mob_edit->points.hitroll = points; d->medit_mode = MHEIGHT_EDIT; sprintf(bufme,"%sHeight: %s%s%d%s\r\n\r\nEnter a new Mob Height:\r\n",cy,nrm,rd,mob_edit->player.height,nrm); SEND_TO_Q(bufme,d); return;} case MHEIGHT_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MWEIGHT_EDIT; sprintf(bufme,"Height Unchanged.\r\n\r\n%sWeight: %s%s%d%s\r\n\r\nEnter a new Mob Weight:\r\n",cy,nrm,rd,mob_edit->player.weight,nrm); SEND_TO_Q(bufme,d); return;} if (*str == 'Q' || *str == 'q') { d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } points = atoi(str); if (points < 0 || points > 1000){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new Mob height, >= 0, <= 1000:",d); break; } else{ mob_edit->player.height = points; d->medit_mode = MWEIGHT_EDIT; sprintf(bufme,"%sWeight: %s%s%d%s\r\n\r\nEnter a new Mob Weight:\r\n",cy,nrm,rd,mob_edit->player.weight,nrm); SEND_TO_Q(bufme,d); return;} case MWEIGHT_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MMSTAT_EDIT; sprintf(bufme,"Weight Unchanged.\r\n\r\n"); print_mobstats(d); SEND_TO_Q(bufme,d); return;} if (*str == 'Q' || *str == 'q') { d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } points = atoi(str); if (points < 0 || points > 10000){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new Mob weight, >= 0, <= 10000:",d); break; } else{ mob_edit->player.weight = atoi(str); d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return;} case MNHD_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MSHD_EDIT; sprintf(bufme,"Hit Dice unchanged.\r\n\r\n%sSize of Hit Dice: %s%d%s\r\n\r\nEnter a new Size of Hit Dice:\r\n",cy,rd,mob_edit->points.mana,nrm); SEND_TO_Q(bufme,d); return;} if (*str == 'Q' || *str == 'q') { d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new number of hit dice, > 0, <= 100:",d); break; } else if (atoi(str) <= 0 || atoi(str) > 100){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new number of hit dice, > 0, <= 100:",d); break; } else{ mob_edit->points.hit = atoi(str); d->medit_mode = MSHD_EDIT; sprintf(bufme,"Size of Hit Dice: %s%s%d%s\r\n\r\nEnter a new Size of Hit Dice:\r\n",cy,rd,mob_edit->points.mana,nrm); SEND_TO_Q(bufme,d); return;} case MSHD_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MHBON_EDIT; sprintf(bufme,"Size of Hit Dice unchanged.\r\n\r\n%sHit Bonus: %s%d%s\r\n\r\nEnter a new Hit bonus:\r\n",cy,rd,mob_edit->points.move,nrm); SEND_TO_Q(bufme,d); return;} if (*str == 'Q' || *str == 'q') { d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new size of hit dice, > 0, <= 100:",d); break; } else if (atoi(str) <= 0 || atoi(str) > 100){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new size of hit dice, > 0, <= 100:",d); break; } else{ mob_edit->points.mana = atoi(str); d->medit_mode = MHBON_EDIT; sprintf(bufme,"%sHit Bonus: %s%d%s\r\n\r\nEnter a new Hit Bonus:",cy,rd,mob_edit->points.move,nrm); SEND_TO_Q(bufme,d); sprintf(bufme,">= 0 <= %d:", 31999 - (mob_edit->points.hit*mob_edit->points.mana)); SEND_TO_Q(bufme,d); return;} case MHBON_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MNDD_EDIT; sprintf(bufme,"Size of Hit Bonus unchanged.\r\n\r\n%sDam Dice: %s%d%s\r\n\r\nEnter new Dam Dice:\r\n",cy,rd,mob_edit->specials.damnodice,nrm); SEND_TO_Q(bufme,d); return;} if (*str == 'Q' || *str == 'q') { d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } if (!is_number(str)){ sprintf(bufme,"\r\nIllegal Value\r\nEnter new hit bonus, > 0, <= %d:",31999 - (mob_edit->points.hit*mob_edit->points.mana)); SEND_TO_Q(bufme,d); break; } else if (atoi(str) <= 0 || atoi(str) > 31999 - (mob_edit->points.hit*mob_edit->points.mana)){ sprintf(bufme,"\r\nIllegal Value\r\nEnter new hit bonus, > 0, <= %d:",31999 - (mob_edit->points.hit*mob_edit->points.mana)); SEND_TO_Q(bufme,d); break; } else{ mob_edit->points.move = atoi(str); d->medit_mode = MNDD_EDIT; sprintf(bufme,"%sDam Dice: %s%d%s\r\n\r\nEnter new Dam Dice:\r\n",cy,rd,mob_edit->specials.damnodice,nrm); SEND_TO_Q(bufme,d); return;} case MNDD_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MSDD_EDIT; sprintf(bufme,"Number of Dam Dice Unchanged.\r\n\r\n%sDam Dice Size: %s%s%d%s\r\n\r\nEnter new Dam Dice Size:\r\n",cy,nrm,rd,mob_edit->specials.damsizedice,nrm); SEND_TO_Q(bufme,d); return;} if (*str == 'Q' || *str == 'q') { d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new number of dam dice, > 0, <= 50:",d); break; } else if (atoi(str) <= 0 || atoi(str) > 50){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new number of dam dice, > 0, <= 50:",d); break; } else{ mob_edit->specials.damnodice = atoi(str); d->medit_mode = MSDD_EDIT; sprintf(bufme,"%sDam Dice Size: %s%s%d%s\r\n\r\nEnter new Dam Dice Size:\r\n",cy,nrm,rd,mob_edit->specials.damsizedice,nrm); SEND_TO_Q(bufme,d); return;} case MSDD_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MDBON_EDIT; sprintf(bufme,"Dam Dice Size Unchanged.\r\n\r\n%sDam Bonus: %s%d%s\r\n\r\nEnter new Dam Bonus:\r\n",cy,rd,mob_edit->points.damroll,nrm); SEND_TO_Q(bufme,d); return;} if (*str == 'Q' || *str == 'q') { d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new size of dam dice, > 0, <= 50:",d); break; } else if (atoi(str) < 0){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new size of dam dice, > 0, <= 50:",d); break; } else{ mob_edit->specials.damsizedice = atoi(str); d->medit_mode = MDBON_EDIT; sprintf(bufme,"%sDam Bonus: %s%s%d%s\r\n\r\nEnter new Dam Bonus:\r\n\r\n",cy,nrm,rd,mob_edit->points.damroll,nrm); SEND_TO_Q(bufme,d); return;} case MDBON_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MATT_EDIT; SEND_TO_Q("Dam bonus Unchanged.\r\nEnter a attack type:\r\n",d); print_matt(d); return;} if (*str == 'Q' || *str == 'q') { d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new dam bonus, > 0, <= 50:",d); break; } else if (atoi(str) <= 0 || atoi(str) > 50){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new dam bonus, > 0, <= 50:",d); break; } else{ mob_edit->points.damroll = atoi(str); d->medit_mode = MATT_EDIT; print_matt(d); SEND_TO_Q("Enter a new attack type, Q to quit:",d); return;} case MATT_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MATT_EDIT; print_matt(d); return;} if (is_number(str)){ d->n_att = atoi(str); if (d->n_att >= TYPE_HIT && d->n_att <= TYPE_WHIP ) { mob_edit->specials.attack_type = d->n_att; } print_matt(d); break; } else if (*str == 'Q' || *str == 'q'){ d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } else{ SEND_TO_Q("Illegal Attck.\r\n",d); print_matt(d); break;} case MPOS_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MPOS_EDIT; d->ia_flag = print_mpos(d); return;} if (is_number(str)){ d->n_att = atoi(str); if (d->n_att >= 0 && d->n_att <= d->ia_flag ) { mob_edit->specials.position = d->n_att; } d->ia_flag = print_mpos(d); break; } else if (*str == 'Q' || *str == 'q'){ d->ia_flag = print_mdpos(d); d->medit_mode = MDPOS_EDIT; break;} else{ SEND_TO_Q("Illegal Position.\r\n",d); print_mpos(d); break;} case MDPOS_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MDPOS_EDIT; d->ia_flag = print_mdpos(d); return;} if (is_number(str)){ d->n_att = atoi(str); if (d->n_att >= 0 && d->n_att <= d->ia_flag ) { mob_edit->specials.default_pos = d->n_att; } d->ia_flag = print_mdpos(d); break; } else if (*str == 'Q' || *str == 'q'){ print_msex(d); d->medit_mode = MSEX_EDIT; break;} else{ SEND_TO_Q("Illegal Position.\r\n",d); ja_flag = print_mdpos(d); break;} case MSEX_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MSEX_EDIT; print_msex(d); break;} *str = LOWER(*str); if (*str != 'n' && *str != 'f' && *str != 'm' && *str != 'q'){ SEND_TO_Q("No such Sex.",d); break;} switch (*str){ case 'n': mob_edit->player.sex = SEX_NEUTRAL; d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; case 'm': mob_edit->player.sex = SEX_MALE; d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; case 'f': mob_edit->player.sex = SEX_FEMALE; d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; case 'q': d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } case MCLASS_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ print_races(d); break; } if (is_number(str)){ ja_flag = atoi(str); if (rev_search_list(ja_flag, npc_races)) { GET_RACE(d->mob_edit) = ja_flag; print_races(d); break; } else { SEND_TO_Q("Illegal class code.\r\n",d); print_races(d); break; } } else if (*str == 'Q' || *str == 'q'){ d->medit_mode = MMSTAT_EDIT; print_mobstats(d); break; } else{ SEND_TO_Q("Illegal class code.\r\n",d); print_races(d); break; } case MGOLD_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MFAME_EDIT; sprintf(bufme,"Gold Unchanged.\r\n\r\n%sMob Fame:%s %s%d%s\r\n\r\n",cy,nrm,rd,GET_FAME(mob_edit),nrm); SEND_TO_Q(bufme,d); SEND_TO_Q("Enter Mob Fame:\r\n",d); return;} if (*str == 'Q' || *str == 'q'){ d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } if (!((*str == 'Y') || (*str == 'y') || (*str == 'N') || (*str == 'n'))){ SEND_TO_Q("\r\nIllegal Value\r\nToggle Mob Gold:",d); break; } else if (*str == 'Y' || *str == 'y') GET_GOLD(mob_edit) = 1; else GET_GOLD(mob_edit) = 0; d->medit_mode = MFAME_EDIT; sprintf(bufme,"%sMob Fame:%s %s%d%s\r\n\r\n",cy,nrm,rd,GET_FAME(mob_edit),nrm); SEND_TO_Q(bufme,d); SEND_TO_Q("Enter Mob Fame >= -1000 <= 1000:\r\n",d); return; case MFAME_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MAIN_MODE; SEND_TO_Q("Mob Fame Unchanged.\r\n",d); print_mob(d); return; } if (*str == 'Q' || *str == 'q'){ d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } points = atoi(str); if ((points > 1000) || (points < -1000)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter Mob Fame:",d); break; } else{ GET_FAME(mob_edit) = points; d->medit_mode = MMSTAT_EDIT; print_mobstats(d); return; } case MSTRI_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MSTRI_EDIT; print_mstr(d); break;} *str = LOWER(*str); if (*str != 'n' && *str != 's' && *str != 'l' && *str != 'd' && *str != 'q'){ SEND_TO_Q("No such string.",d); break;} switch(*str){ case 'n': d->str = &(mob_edit->player.name); free(*d->str); *d->str = 0; d->max_str = 80; SEND_TO_Q("Enter a new name list, terminate with a @@.\r\n",d); return; case 's': d->str = &(mob_edit->player.short_descr); free(*d->str); *d->str = 0; d->max_str = 80; SEND_TO_Q("Enter a new short description, terminate with a @@.\r\n",d); return; case 'l': d->str = &(mob_edit->player.long_descr); free(*d->str); *d->str = 0; d->max_str = 80; SEND_TO_Q("Enter a new long decription. Remember the carriage return at the end\r\n, terminate with a @@.\r\n",d); return; case 'd': d->str = &(mob_edit->player.description); free(*d->str); *d->str = 0; d->max_str = 1440; SEND_TO_Q("Enter a new decription. Remember the carriage return at the end\r\n, terminate with a @@,\r\n",d); return; case 'q': d->medit_mode = MAIN_MODE; print_mob(d); return; } case MACS_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MACS_EDIT; print_acsvs(d); break;} *str = LOWER(*str); if (*str != 'a' && *str != 's' && *str != 't' && *str != 'q'){ SEND_TO_Q("No such option.",d); break;} switch(*str){ case 'a': d->medit_mode = MAC_EDIT; print_ac(d); return; case 's': d->medit_mode = MST_EDIT; print_st(d); return; case 't': d->medit_mode = MSV_EDIT; print_sv(d); return; case 'q': d->medit_mode = MAIN_MODE; print_mob(d); return; } break; case MSV_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MSV_EDIT; print_sv(d); break;} *str = LOWER(*str); if (*str != 'b' && *str != '0' && *str != 'p' && *str != 'r' && *str != 's' && *str != 't' && *str != 'q'){ SEND_TO_Q("No such option.",d); break;} switch(*str){ case '0': d->medit_mode = MSAVEA_EDIT; SEND_TO_Q("\r\nEnter new Saving Throws, > 0, <= 100",d); return; case 'b': d->medit_mode = MSAVE_EDIT; SEND_TO_Q("\r\nEnter new Breath Saving Throw, > 0, <= 100",d); d->isave = 3; return; case 'p': d->medit_mode = MSAVE_EDIT; SEND_TO_Q("\r\nEnter new Paralysis Saving Throw, > 0, <= 100",d); d->isave = 0; return; case 'r': d->medit_mode = MSAVE_EDIT; SEND_TO_Q("\r\nEnter new Rods Saving Throw, > 0, <= 100",d); d->isave = 1; return; case 't': d->medit_mode = MSAVE_EDIT; SEND_TO_Q("\r\nEnter new Petrification Saving Throw, > 0, <= 100",d); d->isave = 2; return; case 's': d->medit_mode = MSAVE_EDIT; SEND_TO_Q("\r\nEnter new Spell Saving Throw, > 0, <= 100",d); d->isave = 4; return; case 'q': d->medit_mode = MACS_EDIT; print_acsvs(d); return; } case MSAVEA_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSV_EDIT; print_sv(d); break;} points = atoi(str); if (points < 0 || points > 100){ sprintf(bufme,"\r\n%sIllegal Value\r\n%sEnter new Saving Throws, > 0, <= 100:%s",rd,cy,nrm); SEND_TO_Q(bufme,d); break; } else{ mob_edit->specials2.apply_saving_throw[0] = points; mob_edit->specials2.apply_saving_throw[1] = points; mob_edit->specials2.apply_saving_throw[2] = points; mob_edit->specials2.apply_saving_throw[3] = points; mob_edit->specials2.apply_saving_throw[4] = points; d->medit_mode = MSV_EDIT; print_sv(d); break;} case MSAVE_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSV_EDIT; print_sv(d); break;} points = atoi(str); if (points < 0 || points > 100){ sprintf(bufme,"\r\n%sIllegal Value\r\n%sEnter new %s Save, > 0, <= 100:%s",rd,cy,save[d->isave],nrm); SEND_TO_Q(bufme,d); break; } else{ mob_edit->specials2.apply_saving_throw[d->isave] = points; d->medit_mode = MSV_EDIT; print_sv(d); break;} case MST_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MST_EDIT; print_st(d); break;} *str = LOWER(*str); if (*str != 'b' && *str != 'h' && *str != 's' && *str != 'a' && *str != 'l' && *str != 'q'){ SEND_TO_Q("No such option.",d); break;} switch(*str){ case 's': d->medit_mode = MSTOPA_EDIT; SEND_TO_Q("\r\nEnter new stopping value, >= 0, <= 20",d); return; case 'b': d->medit_mode = MSTOP_EDIT; SEND_TO_Q("\r\nEnter new Body stopping value, >= 0, <= 20",d); d->iloc = 0; return; case 'h': d->medit_mode = MSTOP_EDIT; SEND_TO_Q("\r\nEnter new Head stopping value, >= 0, <= 20",d); d->iloc = 3; return; case 'a': d->medit_mode = MSTOP_EDIT; SEND_TO_Q("\r\nEnter new Arms stopping value, >= 0, <= 20",d); d->iloc = 2; return; case 'l': d->medit_mode = MSTOP_EDIT; SEND_TO_Q("\r\nEnter new Legs stopping value, >= 0, <= 20",d); d->iloc = 1; return; case 'q': d->medit_mode = MACS_EDIT; print_acsvs(d); return; } case MSTOPA_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MST_EDIT; print_st(d); break;} points = atoi(str); if (points < 0 || points > 20){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new stopping value, >= 0, <= 30:",d); break; } else{ GET_LEGS_STOPPING(mob_edit) = points; GET_ARMS_STOPPING(mob_edit) = points; GET_HEAD_STOPPING(mob_edit) = points; GET_BODY_STOPPING(mob_edit) = points; d->medit_mode = MST_EDIT; print_st(d); break;} case MSTOP_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MST_EDIT; print_st(d); break;} points = atoi(str); if (points < 0 || points > 20){ sprintf(bufme,"\r\n%sIllegal Value\r\n%sEnter new %s stopping value, >= 0, <= 30:%s",rd,cy,locs[d->iloc],nrm); SEND_TO_Q(bufme,d); break; } else{ mob_edit->points.stopping[d->iloc] = points; d->medit_mode = MST_EDIT; print_st(d); break;} case MAC_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MAC_EDIT; print_ac(d); break;} *str = LOWER(*str); if (*str != 'b' && *str != 'h' && *str != 's' && *str != 'a' && *str != 'l' && *str != 'q'){ SEND_TO_Q("No such option.",d); break;} switch(*str){ case 's': d->medit_mode = MARMORA_EDIT; SEND_TO_Q("\r\nEnter new A/C values, >= -100, <= 100",d); return; case 'b': d->medit_mode = MARMOR_EDIT; SEND_TO_Q("\r\nEnter new Body A/C value, >= -100, <= 100",d); d->iloc = 0; return; case 'h': d->medit_mode = MARMOR_EDIT; SEND_TO_Q("\r\nEnter new Head A/C value, >= -100, <= 100",d); d->iloc = 3; return; case 'a': d->medit_mode = MARMOR_EDIT; SEND_TO_Q("\r\nEnter new Arms A/C value, >= -100, <= 100",d); d->iloc = 2; return; case 'l': d->medit_mode = MARMOR_EDIT; SEND_TO_Q("\r\nEnter new Legs A/C value, >= -100, <= 100",d); d->iloc = 1; return; case 'q': d->medit_mode = MACS_EDIT; print_acsvs(d); return; } case MARMORA_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MAC_EDIT; print_ac(d); break;} points = atoi(str); if (points <-100 || points > 100){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new A/C value, >= -100, <= 100:",d); break; } else{ GET_LEGS_AC(mob_edit) = points; GET_BODY_AC(mob_edit) = points; GET_HEAD_AC(mob_edit) = points; GET_ARMS_AC(mob_edit) = points; d->medit_mode = MAC_EDIT; print_ac(d); break;} case MARMOR_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MAC_EDIT; print_ac(d); break;} points = atoi(str); if (points <-100 || points > 100){ sprintf(bufme,"\r\n%sIllegal Value\r\n%sEnter new %s a/c value, >= -100, <= 100:%s",rd,cy,locs[d->iloc],nrm); SEND_TO_Q(bufme,d); break; } else{ mob_edit->points.armor[d->iloc] = points; d->medit_mode = MAC_EDIT; print_ac(d); break;} case MSTAT_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} *str = LOWER(*str); if (*str != 's' && *str != 'i' && *str != 'w' && *str != 'c' && *str != 'h' && *str != 'd' && *str != 'p' && *str != 'g' && *str != 'v' && *str != 'f' && *str != 'l' && *str != 'q'){ SEND_TO_Q("That's not a stat.\r\nEnter a Stat to change, Q to quit: ",d); break;} switch(*str){ case 's': d->medit_mode = MSTR_EDIT; SEND_TO_Q("\r\nEnter new strength value, >= 0, <=30:",d); return; case 'i': d->medit_mode = MINT_EDIT; SEND_TO_Q("\r\nEnter new intelligence value, >= 0, <30:",d); return; case 'w': d->medit_mode = MWIS_EDIT; SEND_TO_Q("\r\nEnter new wisdom value, >= 0, <=30:",d); return; case 'd': d->medit_mode = MDEX_EDIT; SEND_TO_Q("\r\nEnter new dexterity value, >= 0, <= 30:",d); return; case 'c': d->medit_mode = MCON_EDIT; SEND_TO_Q("\r\nEnter new constitution value, >= 0, <= 30:",d); return; case 'h': d->medit_mode = MCHR_EDIT; SEND_TO_Q("\r\nEnter new charisma value, >= 0, <= 30:",d); return; case 'p': d->medit_mode = MPER_EDIT; SEND_TO_Q("\r\nEnter new perception value, >= 0, <= 30:",d); return; case 'g': d->medit_mode = MGUI_EDIT; SEND_TO_Q("\r\nEnter new guile value, >= 0, <= 30:",d); return; case 'v': d->medit_mode = MDEV_EDIT; SEND_TO_Q("\r\nEnter new devotion value, >= 0, <= 30:",d); return; case 'f': d->medit_mode = MFOC_EDIT; SEND_TO_Q("\r\nEnter new focus value, >= 0, <= 30:",d); return; case 'l': d->medit_mode = MLUC_EDIT; SEND_TO_Q("\r\nEnter new luck value, >= 0, <= 30:",d); return; case 'q': d->medit_mode = MAIN_MODE; print_mob(d); SEND_TO_Q("\r\nEnter a letter a-w or Q to Quit\r\n",d); return; default: print_mstats(d); return; } case MSTR_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new strength value, > 0, <= 30:",d); break; } else if (atoi(str) <0 || atoi(str) > 30){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new strength value, > 0, <= 30:",d); break; } else{ points = atoi(str); GET_STR(mob_edit) = points; GET_RAW_STR(mob_edit) = points; d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} case MINT_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new intelligence value, > 0, <= 30:",d); break; } else if (atoi(str) <0 || atoi(str) > 30){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new intelligence value, > 0, <= 30:",d); break; } else{ points = atoi(str); GET_RAW_INT(mob_edit) = points; GET_INT(mob_edit) = points; d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} case MWIS_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new wisdom value, > 0, <= 30:",d); break; } else if (atoi(str) <0 || atoi(str) > 30){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new wisdom value, > 0, <= 30:",d); break; } else{ points = atoi(str); GET_RAW_WIS(mob_edit) = points; GET_WIS(mob_edit) = points; d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} case MDEX_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new dexterity value, > 0, <= 30:",d); break; } else if (atoi(str) <0 || atoi(str) > 30){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new dexterity value, > 0, <= 30:",d); break; } else{ points = atoi(str); GET_RAW_DEX(mob_edit) = points; GET_DEX(mob_edit) = points; d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} case MCON_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new constitution value, > 0, <= 30:",d); break; } else if (atoi(str) <0 || atoi(str) > 30){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new constitution value, > 0, <= 30:",d); break; } else{ points = atoi(str); GET_RAW_CON(mob_edit) = points; GET_CON(mob_edit) = points; d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} case MCHR_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new charisma value, > 0, <= 30:",d); break; } else if (atoi(str) <0 || atoi(str) > 30){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new charisma value, > 0, <= 30:",d); break; } else{ points = atoi(str); GET_RAW_CHR(mob_edit) = points; GET_CHR(mob_edit) = points; d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} case MPER_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new perception value, > 0, <= 30:",d); break; } else if (atoi(str) <0 || atoi(str) > 30){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new perception value, > 0, <= 30:",d); break; } else{ points = atoi(str); GET_RAW_PER(mob_edit) = points; GET_PER(mob_edit) = points; d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} case MGUI_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new guile value, > 0, <= 30:",d); break; } else if (atoi(str) <0 || atoi(str) > 30){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new guile value, > 0, <= 30:",d); break; } else{ points = atoi(str); GET_RAW_GUI(mob_edit) = points; GET_GUI(mob_edit) = points; d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} case MDEV_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new devotion value, > 0, <= 30:",d); break; } else if (atoi(str) <0 || atoi(str) > 30){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new devotion value, > 0, <= 30:",d); break; } else{ points = atoi(str); GET_RAW_DEV(mob_edit) = points; GET_DEV(mob_edit) = points; d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} case MFOC_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new focus value, > 0, <= 30:",d); break; } else if (atoi(str) <0 || atoi(str) > 30){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new focus value, > 0, <= 30:",d); break; } else{ points = atoi(str); GET_RAW_FOC(mob_edit) = points; GET_FOC(mob_edit) = points; d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} case MLUC_EDIT: for ( ; isspace(*str); str++ ) ; if (!*str){ d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} if (!is_number(str)){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new luck value, > 0, <= 30:",d); break; } else if (atoi(str) <0 || atoi(str) > 30){ SEND_TO_Q("\r\nIllegal Value\r\nEnter new luck value, > 0, <= 30:",d); break; } else{ points = atoi(str); GET_RAW_LUC(mob_edit) = points; GET_LUC(mob_edit) = points; d->medit_mode = MSTAT_EDIT; print_mstats(d); break;} case MAFF_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MAFF_EDIT; print_maff(d); break;} if (is_number(str)){ ja_flag = atoi(str); if (ja_flag >= 0 && ja_flag <= d->ia_flag ) { if (!IS_SET(mob_edit->specials.affected_by, 1<<ja_flag)) SET_BIT(mob_edit->specials.affected_by, 1<<ja_flag); else REMOVE_BIT(mob_edit->specials.affected_by, 1<<ja_flag); d->ia_flag = print_maff(d); break; } else{ SEND_TO_Q("Illegal Flag.\r\n",d); d->ia_flag = print_maff(d); break; } } else if (*str == 'Q' || *str == 'q'){ print_mob(d); d->medit_mode = MAIN_MODE; break;} else{ SEND_TO_Q("Illegal Flag.\r\n",d); d->ia_flag = print_maff(d); break;} case MFLAG_EDIT: for ( ; isspace(*str); str++) ; if (!*str){ d->medit_mode = MFLAG_EDIT; d->ia_flag = print_mflags(d); break;} if (is_number(str)){ ja_flag = atoi(str); if (ja_flag >= 0 && ja_flag <= d->ia_flag && ((1 << ja_flag) != MOB_ISNPC)) { if (!IS_SET(MOB_FLAGS(mob_edit), 1<<ja_flag)) SET_BIT(MOB_FLAGS(mob_edit), 1<<ja_flag); else REMOVE_BIT(MOB_FLAGS(mob_edit), 1<<ja_flag); d->ia_flag = print_mflags(d); break; } else{ SEND_TO_Q("Illegal Flag.\r\n",d); d->ia_flag = print_mflags(d); break; } } else if (*str == 'Q' || *str == 'q'){ print_mob(d); d->medit_mode = MAIN_MODE; break;} else{ SEND_TO_Q("Illegal Flag.\r\n",d); d->ia_flag = print_mflags(d); break;} } } void print_matt(struct descriptor_data *d) { char bufme[MAX_STRING_LENGTH]; int i,attck; struct char_data *mob_edit; i = TYPE_HIT; mob_edit = d->mob_edit; if (mob_edit->specials.attack_type < TYPE_HIT) attck = TYPE_HIT; else attck = mob_edit->specials.attack_type; sprintf(bufme,"Attack Type: %s%s%s\r\n\r\n",rd,attack_hit_text[attck-TYPE_HIT].singular,nrm); SEND_TO_Q(bufme,d); while (i <= TYPE_WHIP) { if (i+1 <= TYPE_KICK){ sprintf(bufme,"[%3d] %s%-20.20s%s [%3d] %s%-20.20s%s \r\n",i,rd,attack_hit_text[i-TYPE_HIT].singular,nrm,i+1,rd,attack_hit_text[i+1-TYPE_HIT].singular,nrm); i +=2;} else{ sprintf(bufme,"[%3d] %s%-20.20s%s \r\n",i,rd,attack_hit_text[i-TYPE_HIT].singular,nrm); i +=1;} SEND_TO_Q(bufme,d); } sprintf(bufme ,"\r\n%sEnter attack # to toggle or Q to quit.%s ",cy,nrm); SEND_TO_Q(bufme,d); } int print_maff(struct descriptor_data *d) { char bufme[MAX_STRING_LENGTH]; char bufm[MAX_STRING_LENGTH]; int i; struct char_data *mob_edit; mob_edit = d->mob_edit; sprintbit(mob_edit->specials.affected_by, affected_bits, bufme); sprintf(bufm ,"\r\n%sAffected by Flags:%s %s%s%s\r\n\r\n",cy,nrm,gn,bufme,nrm); SEND_TO_Q(bufm,d); i = 0; while (*affected_bits[i] != '\n') { if (*affected_bits[i+2] != '\n'&& *affected_bits[i+1] != '\n'){ sprintf(bufm,"[%2d] %s%-15.15s%s [%2d] %s%-15.15s%s [%2d] %s%-15.15s%s \r\n",i,gn,affected_bits[i],nrm,i+1,gn,affected_bits[i+1],nrm,i+2,gn,affected_bits[i+2],nrm); i +=3;} else if (*affected_bits[i+1] != '\n') { sprintf(bufm,"[%2d] %s%-15.15s%s [%2d] %s%-15.15s%s \r\n",i,gn,affected_bits[i],nrm,i+1,gn,affected_bits[i+1],nrm); i +=2;} else{ sprintf(bufm,"[%2d] %s%-15.15s%s\r\n",i,gn,affected_bits[i],nrm); i +=1;} SEND_TO_Q(bufm,d); } sprintf(bufm ,"\r\n%sEnter flag # to toggle or Q to quit.%s ",cy,nrm); SEND_TO_Q(bufm,d); return(i-1); } int print_mflags(struct descriptor_data *d) { char bufme[MAX_STRING_LENGTH]; char bufm[MAX_STRING_LENGTH]; int i; struct char_data *mob_edit; mob_edit = d->mob_edit; sprintbit(MOB_FLAGS(mob_edit), action_bits, bufme); sprintf(bufm ,"\r\n%sMob Flags: %s%s%s%s\r\n\r\n",cy,nrm,gn,bufme,nrm); SEND_TO_Q(bufm,d); i = 0; while (*action_bits[i] != '\n') { if (*action_bits[i+1] != '\n'){ sprintf(bufm,"[%2d] %s%-20.20s%s [%2d] %s%-20.20s%s \r\n",i,gn,action_bits[i],nrm,i+1,gn,action_bits[i+1],nrm); i +=2;} else{ sprintf(bufm,"[%2d] %s%-20.20s%s \r\n",i,gn,action_bits[i],nrm); i +=1;} SEND_TO_Q(bufm,d); } sprintf(bufm ,"\r\n%sEnter flag # to toggle or Q to quit.%s ",cy,nrm); SEND_TO_Q(bufm,d); return(i-1); } void print_mstats(struct descriptor_data *d) { char bufme[MAX_STRING_LENGTH]; struct char_data *mob_edit; mob_edit = d->mob_edit; sprintf(bufme,"%sPlayer Stats:%s\r\n\r\n",cy,nrm); SEND_TO_Q(bufme,d); sprintf(bufme,"%s(S)tr: %2d, (I)nt: %2d, (W)is: %2d, (D)ex: %2d, (C)on: %2d, C(h)r %2d.\r\n", yl, GET_RAW_STR(mob_edit), GET_RAW_INT(mob_edit), GET_RAW_WIS(mob_edit), GET_RAW_DEX(mob_edit), GET_RAW_CON(mob_edit), GET_RAW_CHR(mob_edit)); SEND_TO_Q(bufme,d); sprintf(bufme,"(P)er: %2d, (G)ui: %2d, De(v): %2d, (F)oc: %2d, (L)uc: %2d, (Q)uit.%s\r\n\r\n", GET_RAW_PER(mob_edit), GET_RAW_GUI(mob_edit), GET_RAW_DEV(mob_edit), GET_RAW_FOC(mob_edit), GET_RAW_LUC(mob_edit),nrm); SEND_TO_Q(bufme,d); sprintf(bufme,"%sEnter a Stat to change, Q to to Quit:%s ",cy,nrm); SEND_TO_Q(bufme,d); } void print_acsvs(struct descriptor_data *d) { char bufme[MAX_STRING_LENGTH]; sprintf(bufme,"%s(A)rmour class, (S)topping and Saving (T)hrows:%s\r\n\r\n",cy,nrm); SEND_TO_Q(bufme,d); sprintf(bufme ,"%sEnter option to change or Q to quit.%s ",cy,nrm); SEND_TO_Q(bufme,d); } void print_st(struct descriptor_data *d) { char bufme[MAX_STRING_LENGTH]; struct char_data *mob_edit; mob_edit = d->mob_edit; sprintf(bufme,"%sStopping:%s\r\n\r\n",cy,nrm); SEND_TO_Q(bufme,d); sprintf(bufme,"%sStop:\r\n(%sS%s)et All, (%sB%s)ody: %s%3d%s (%sH%s)ead: %s%3d%s (%sA%s)rms: %s%3d%s (%sL%s)egs: %s%3d%s\r\n\r\n", nrm,cy,nrm,cy,nrm,gn, GET_BODY_STOPPING(mob_edit), nrm,cy,nrm,gn, GET_HEAD_STOPPING(mob_edit), nrm,cy,nrm,gn, GET_ARMS_STOPPING(mob_edit), nrm,cy,nrm,gn, GET_LEGS_STOPPING(mob_edit),nrm); SEND_TO_Q(bufme,d); sprintf(bufme ,"%sEnter location to change or Q to quit.%s ",cy,nrm); SEND_TO_Q(bufme,d); } void print_ac(struct descriptor_data *d) { char bufme[MAX_STRING_LENGTH]; struct char_data *mob_edit; mob_edit = d->mob_edit; sprintf(bufme,"%sArmour class:%s\r\n\r\n",cy,nrm); SEND_TO_Q(bufme,d); sprintf(bufme,"%sA/C:\r\n(%sS%s)et All, (%sB%s)ody: %s%3d%s (%sH%s)ead: %s%3d%s (%sA%s)rms: %s%3d%s (%sL%s)egs: %s%3d%s\r\n\r\n", nrm,cy,nrm,cy,nrm,gn, GET_BODY_AC(mob_edit), nrm,cy,nrm,gn, GET_HEAD_AC(mob_edit), nrm,cy,nrm,gn, GET_ARMS_AC(mob_edit), nrm,cy,nrm,gn, GET_LEGS_AC(mob_edit),nrm); SEND_TO_Q(bufme,d); sprintf(bufme ,"%sEnter location to change or Q to quit.%s ",cy,nrm); SEND_TO_Q(bufme,d); } void print_sv(struct descriptor_data *d) { char bufme[MAX_STRING_LENGTH]; struct char_data *mob_edit; mob_edit = d->mob_edit; sprintf(bufme,"%sSaving Throws:%s\r\n\r\n",cy,nrm); SEND_TO_Q(bufme,d); sprintf(bufme,"%sSave:\r\n(%s0%s) Set all (%sP%s)ARA: %s%3d%s (%sR%s)OD: %s %3d%s PE(%sT%s)R:%s %3d%s (%sB%s)RTH: %s%3d%s (%sS%s)PELL: %s%3d%s\r\n\r\n",nrm,cy,nrm,cy,nrm,gn, mob_edit->specials2.apply_saving_throw[0], nrm,cy,nrm,gn, mob_edit->specials2.apply_saving_throw[1], nrm,cy,nrm,gn, mob_edit->specials2.apply_saving_throw[2], nrm,cy,nrm,gn, mob_edit->specials2.apply_saving_throw[3], nrm,cy,nrm,gn, mob_edit->specials2.apply_saving_throw[4],nrm); SEND_TO_Q(bufme,d); sprintf(bufme ,"%sEnter location to change or Q to quit.%s ",cy,nrm); SEND_TO_Q(bufme,d); } void print_mstr(struct descriptor_data *d) { char bufme[MAX_STRING_LENGTH]; struct char_data *mob_edit; mob_edit = d->mob_edit; sprintf(bufme,"%sText:%s\r\n",cy,nrm); send_to_char(bufme,d->character); sprintf(bufme,"%s(N)ame:%s %s%s%s, ",cy,nrm,wh,mob_edit->player.name,nrm); send_to_char(bufme,d->character); sprintf(bufme,"%s(S)hort Descr:%s %s%s%s\r\n",cy,nrm,wh,mob_edit->player.short_descr,nrm); send_to_char(bufme,d->character); sprintf(bufme,"%s(L)ong Descr:%s %s%s%s",cy,nrm,wh,mob_edit->player.long_descr,nrm); send_to_char(bufme,d->character); sprintf(bufme,"%s(D)escription:%s\r\n%s%s%s",cy,nrm,wh,mob_edit->player.description,nrm); send_to_char(bufme,d->character); SEND_TO_Q("\r\nChoose a string to change, Q to quit:",d); } int print_mpos(struct descriptor_data *d) { char bufme[MAX_STRING_LENGTH]; char bufm[MAX_STRING_LENGTH]; int i; struct char_data *mob_edit; mob_edit = d->mob_edit; sprinttype(mob_edit->specials.position, position_types,bufm); sprintf(bufme,"Position: %s%s%s\r\n\r\n",rd,bufm,nrm); SEND_TO_Q(bufme,d); i = 0; while (*position_types[i] != '\n') { if (*position_types[i+1] != '\n') { sprintf(bufm,"[%2d] %s%-15.15s%s [%2d] %s%-15.15s%s \r\n",i,rd,position_types[i],nrm,i+1,rd,position_types[i+1],nrm); i +=2;} else{ sprintf(bufm,"[%2d] %s%-15.15s%s\r\n",i,rd,position_types[i],nrm); i +=1;} SEND_TO_Q(bufm,d); } sprintf(bufm ,"\r\n%sEnter position type # to toggle or Q to quit.%s ",cy,nrm); SEND_TO_Q(bufm,d); return(i-1); } int print_mdpos(struct descriptor_data *d) { char bufme[MAX_STRING_LENGTH]; char bufm[MAX_STRING_LENGTH]; int i; struct char_data *mob_edit; mob_edit = d->mob_edit; sprinttype(mob_edit->specials.default_pos, position_types,bufm); sprintf(bufme,"Default Position: %s%s%s\r\n\r\n",rd,bufm,nrm); SEND_TO_Q(bufme,d); i = 0; while (*position_types[i] != '\n') { if (*position_types[i+1] != '\n') { sprintf(bufm,"[%2d] %s%-15.15s%s [%2d] %s%-15.15s%s \r\n",i,rd,position_types[i],nrm,i+1,rd,position_types[i+1],nrm); i +=2;} else{ sprintf(bufm,"[%2d] %s%-15.15s%s\r\n",i,rd,position_types[i],nrm); i +=1;} SEND_TO_Q(bufm,d); } sprintf(bufm ,"\r\n%sEnter position type # to toggle or Q to quit.%s ",cy,nrm); SEND_TO_Q(bufm,d); return(i-1); } void print_msex(struct descriptor_data *d) { char bufm[MAX_STRING_LENGTH]; struct char_data *mob_edit; mob_edit = d->mob_edit; switch(mob_edit->player.sex) { case SEX_NEUTRAL: send_to_char("Sex: NEUTER\r\n\r\n",d->character); break; case SEX_MALE: send_to_char("Sex: MALE\r\n\r\n",d->character); break; case SEX_FEMALE: send_to_char("Sex: FEMALE\r\n\r\n",d->character); break; default: send_to_char("Sex: ILLEGAL\r\n\r\n",d->character); } sprintf(bufm,"Sex: %s(N)euter, (F)emale, (M)ale%s\r\n\r\n",rd,nrm); SEND_TO_Q(bufm,d); SEND_TO_Q("Select a sex, Q to Quit.",d); } void print_mobstats(struct descriptor_data *d) { int attck; char bufme[MAX_STRING_LENGTH], *tmp; char bufm[MAX_STRING_LENGTH]; struct char_data *mob_edit; mob_edit = d->mob_edit; sprintf(bufme,"(%sS)tats:%s\r\n",cy,nrm); send_to_char(bufme,d->character); sprintf(bufme,"(%s1%s) Alignment:%s %d %sLevel:%s %d%s Hitroll:%s %d%s ",cy,nrm,gn,GET_ALIGNMENT(mob_edit),nrm,gn,GET_LEVEL(mob_edit),nrm,gn,mob_edit->points.hitroll,nrm); send_to_char(bufme,d->character); sprintf(bufme,"Height:%s %d%s Weight:%s %d%s\r\n",gn,mob_edit->player.height,nrm,gn,mob_edit->player.weight,nrm); send_to_char(bufme,d->character); sprintf(bufme,"(%s2%s) Hit dice:%s %dd%d+%d%s ",cy,nrm,gn,mob_edit->points.hit,mob_edit->points.mana,mob_edit->points.move,nrm); send_to_char(bufme,d->character); sprintf(bufme,"Dam dice: %s%dd%d+%d%s ",gn,mob_edit->specials.damnodice,mob_edit->specials.damsizedice,mob_edit->points.damroll,nrm); send_to_char(bufme,d->character); if (mob_edit->specials.attack_type >= 300) attck = mob_edit->specials.attack_type -300; else attck = mob_edit->specials.attack_type; sprintf(bufme,"Attack type: %s%s%s\r\n",gn,attack_hit_text[attck].singular,nrm); send_to_char(bufme,d->character); sprinttype(mob_edit->specials.position, position_types,bufm); sprintf(bufme,"(%s3%s) Position: %s%s%s ",cy,nrm,gn,bufm,nrm); send_to_char(bufme,d->character); sprinttype(mob_edit->specials.default_pos, position_types,bufm); sprintf(bufme,"Def Position: %s%s%s ",gn,bufm,nrm); send_to_char(bufme,d->character); switch(mob_edit->player.sex) { case SEX_NEUTRAL: sprintf(bufme,"%sNEUTRAL%s\r\n",gn,nrm); break; case SEX_MALE: sprintf(bufme,"%sMALE%s\r\n",gn,nrm); break; case SEX_FEMALE: sprintf(bufme,"%sFEMALE%s\r\n",gn,nrm); break; default: sprintf(bufme,"%sILLEGAL%s\r\n",gn,nrm); } sprintf(bufm,"Sex: %s",bufme); SEND_TO_Q(bufm,d); sprintf(bufme,"(%s4%s) Gold: %s%s%s Fame: %s%d%s.\r\n",cy,nrm,gn,(GET_GOLD(mob_edit) ? "yes" :"no"),nrm,gn,GET_FAME(mob_edit),nrm); send_to_char(bufme,d->character); tmp = rev_search_list(GET_RACE(mob_edit), npc_races); sprintf(bufme,"(%s5%s) Class: %s%s%s.\r\n",cy,nrm,gn, ((tmp) ? tmp : "Unknown Class"),nrm); send_to_char(bufme,d->character); sprintf(bufme,"(%sQ%s) uit.\r\n",cy,nrm); send_to_char(bufme,d->character); } void print_mob(struct descriptor_data *d) { int attck; char bufme[MAX_STRING_LENGTH], *ctemp; char bufm[MAX_STRING_LENGTH]; struct char_data *mob_edit; mob_edit = d->mob_edit; sprintf(cy,"%s",CCCYN(d->character,C_NRM)); sprintf(wh,"%s",CCWHT(d->character,C_NRM)); sprintf(ma,"%s",CCMAG(d->character,C_NRM)); sprintf(nrm,"%s",CCNRM(d->character,C_NRM)); sprintf(gn,"%s",CCGRN(d->character,C_NRM)); sprintf(yl,"%s",CCBYEL(d->character,C_NRM)); sprintf(rd,"%s",CCRED(d->character,C_NRM)); sprintf(bufme,"%sMob Number: %s%d%s Mob Creation Points: %s%d%s\r\n", cy,gn,d->virtual,cy,yl,compute_mobproto_exp(mob_edit),nrm); send_to_char(bufme,d->character); sprintf(bufme,"(%sT%s)ext:\r\n",cy,nrm); send_to_char(bufme,d->character); sprintf(bufme,"Name: %s%s%s, ",wh,mob_edit->player.name,nrm); send_to_char(bufme,d->character); sprintf(bufme,"Short Descr: %s%s%s\r\n",wh,mob_edit->player.short_descr,nrm); send_to_char(bufme,d->character); sprintf(bufme,"Long Descr: %s%s%s",wh,mob_edit->player.long_descr,nrm); send_to_char(bufme,d->character); sprintf(bufme,"Description:\r\n%s%s%s",wh,mob_edit->player.description,nrm); send_to_char(bufme,d->character); sprintbit(MOB_FLAGS(mob_edit), action_bits, bufme); sprintf(bufm ,"(%sM%s)ob Flags: %s%s%s\r\n",cy,nrm,gn, bufme,nrm); send_to_char(bufm,d->character); sprintbit(mob_edit->specials.affected_by, affected_bits, bufme); sprintf(bufm ,"Affect (%sF%s)lags: %s%s%s\r\n",cy,nrm,gn, bufme,nrm); send_to_char(bufm,d->character); sprintf(bufme,"(%sP%s)layer Stats:\r\n",cy,nrm); send_to_char(bufme,d->character); sprintf(bufme,"%sStr:%s %2d,%s Int:%s %2d,%s Wis:%s %2d,%s Dex:%s %2d,%s Con:%s %2d,%s Chr:%s %2d\r\n" ,nrm,gn, GET_RAW_STR(mob_edit), nrm,gn, GET_RAW_INT(mob_edit), nrm,gn, GET_RAW_WIS(mob_edit), nrm,gn, GET_RAW_DEX(mob_edit), nrm,gn, GET_RAW_CON(mob_edit), nrm,gn, GET_RAW_CHR(mob_edit)); send_to_char(bufme,d->character); sprintf(bufme,"%sPer:%s %2d,%s Gui:%s %2d,%s Dev:%s %2d,%s Foc:%s %2d,%s Luc:%s %2d%s\r\n", nrm,gn, GET_RAW_PER(mob_edit), nrm,gn, GET_RAW_GUI(mob_edit), nrm,gn, GET_RAW_DEV(mob_edit), nrm,gn, GET_RAW_FOC(mob_edit), nrm,gn, GET_RAW_LUC(mob_edit),nrm); send_to_char(bufme,d->character); sprintf(bufme,"(%sA%s)rmour class, Stopping and Saving throws:\r\n",cy,nrm); send_to_char(bufme,d->character); sprintf(bufme,"%sa/c: Body:%s %3d%s Head:%s %3d%s Arms: %s%3d%s Legs:%s %3d%s\r\n", nrm,gn, GET_BODY_AC(mob_edit), nrm,gn, GET_HEAD_AC(mob_edit), nrm,gn, GET_ARMS_AC(mob_edit), nrm,gn, GET_LEGS_AC(mob_edit),nrm); send_to_char(bufme,d->character); sprintf(bufme,"%sstop: Body:%s %3d%s Head:%s %3d%s Arms:%s %3d%s Legs:%s %3d%s\r\n", nrm,gn, GET_BODY_STOPPING(mob_edit), nrm,gn, GET_HEAD_STOPPING(mob_edit), nrm,gn, GET_ARMS_STOPPING(mob_edit), nrm,gn, GET_LEGS_STOPPING(mob_edit),nrm); send_to_char(bufme,d->character); sprintf(bufme,"%sSave: PARA:%s %3d%s ROD:%s %3d%s PETR:%s %3d%s BRTH:%s %3d%s SPELL:%s %3d%s\r\n", nrm,gn, mob_edit->specials2.apply_saving_throw[0], nrm,gn, mob_edit->specials2.apply_saving_throw[1], nrm,gn, mob_edit->specials2.apply_saving_throw[2], nrm,gn, mob_edit->specials2.apply_saving_throw[3], nrm,gn, mob_edit->specials2.apply_saving_throw[4],nrm); send_to_char(bufme,d->character); sprintf(bufme,"(%sS%s)tats:\r\n",cy,nrm); send_to_char(bufme,d->character); sprintf(bufme,"%sAlignment:%s %d %sLevel:%s %d%s Hitroll:%s %d%s ",nrm,gn,GET_ALIGNMENT(mob_edit),nrm,gn,GET_LEVEL(mob_edit),nrm,gn,mob_edit->points.hitroll,nrm); send_to_char(bufme,d->character); sprintf(bufme,"Height:%s %d%s Weight:%s %d%s\r\n",gn,mob_edit->player.height,nrm,gn,mob_edit->player.weight,nrm); send_to_char(bufme,d->character); sprintf(bufme,"Hit dice:%s %dd%d+%d%s ",gn,mob_edit->points.hit,mob_edit->points.mana,mob_edit->points.move,nrm); send_to_char(bufme,d->character); sprintf(bufme,"Dam dice: %s%dd%d+%d%s ",gn,mob_edit->specials.damnodice,mob_edit->specials.damsizedice,mob_edit->points.damroll,nrm); send_to_char(bufme,d->character); if (mob_edit->specials.attack_type >= 300) attck = mob_edit->specials.attack_type -300; else attck = mob_edit->specials.attack_type; sprintf(bufme,"Attack type: %s%s%s\r\n",gn,attack_hit_text[attck].singular,nrm); send_to_char(bufme,d->character); sprinttype(mob_edit->specials.position, position_types,bufm); sprintf(bufme,"Position: %s%s%s ",gn,bufm,nrm); send_to_char(bufme,d->character); sprinttype(mob_edit->specials.default_pos, position_types,bufm); sprintf(bufme,"Def Position: %s%s%s ",gn,bufm,nrm); send_to_char(bufme,d->character); switch(mob_edit->player.sex) { case SEX_NEUTRAL: sprintf(bufme,"%sNEUTRAL%s\r\n",gn,nrm); break; case SEX_MALE: sprintf(bufme,"%sMALE%s\r\n",gn,nrm); break; case SEX_FEMALE: sprintf(bufme,"%sFEMALE%s\r\n",gn,nrm); break; default: sprintf(bufme,"%sILLEGAL%s\r\n",gn,nrm); } sprintf(bufm,"Sex: %s",bufme); SEND_TO_Q(bufm,d); sprintf(bufme,"Gold: %s%s%s Fame: %s%d%s.\r\n",gn, (GET_GOLD(mob_edit) ? "yes":"no"),nrm,gn,GET_FAME(mob_edit),nrm); send_to_char(bufme,d->character); ctemp = rev_search_list(GET_RACE(mob_edit), npc_races); sprintf(bufme,"Class: %s%s%s.\r\n",gn, (ctemp ? ctemp: "Unknown Class"),nrm); send_to_char(bufme,d->character); } void print_races(struct descriptor_data *d) { int i; char *race, bufm[MAX_STRING_LENGTH]; bzero(bufm,MAX_STRING_LENGTH); race = rev_search_list(GET_RACE(d->mob_edit),npc_races); sprintf(bufm, "%sClass:%s %s%s%s\r\n\r\n",cy,nrm,rd, (race ? race : "Unknown Class"), nrm); SEND_TO_Q(bufm,d); for (i=0;*npc_races[i].entry != '\n';i++) sprintf(bufm, "%s[%s%3d%s] %s%s%s\r\n", bufm, cy, npc_races[i].index,nrm ,gn,npc_races[i].entry,nrm); SEND_TO_Q(bufm,d); sprintf(bufm,"\r\nEnter New class code for the mobile 'Q' to quit"); SEND_TO_Q(bufm,d); return; } int compute_mobproto_exp(struct char_data *mob) { int points=0, ac=0, stop=0, abils=0, maxhit=0; maxhit = (mob->points.hit*mob->points.mana + mob->points.move); points += (mob->points.hit*mob->points.mana + mob->points.move); points += str_app[STRENGTH_APPLY_INDEX(mob)].tohit; points += GET_HITROLL(mob); points += ((mob->specials.damnodice*mob->specials.damsizedice + mob->specials.damnodice)/2); points += mob->points.damroll; points += str_app[STRENGTH_APPLY_INDEX(mob)].todam; ac += (100 - GET_BODY_AC(mob))*4; ac += (100 - GET_LEGS_AC(mob))*3; ac += (100 - GET_ARMS_AC(mob))*2; ac += (100 - GET_HEAD_AC(mob)); ac /= 10; stop += GET_BODY_STOPPING(mob)*4; stop += GET_ARMS_STOPPING(mob)*2; stop += GET_LEGS_STOPPING(mob)*3; stop += GET_HEAD_STOPPING(mob); stop /= 10; abils += GET_STR(mob)*2; abils += GET_INT(mob)*2; abils += GET_DEX(mob)*2; abils += GET_WIS(mob); abils += GET_CON(mob); abils += GET_PER(mob); abils += GET_FOC(mob); abils += GET_CHR(mob); abils += GET_GUI(mob); abils /= 12; points += abils; points += stop; points += ac; points *= MAX(8, MIN(100,maxhit/20)); return(points); } int compute_mob_exp(struct char_data *mob) { int points=0, ac=0, stop=0, abils=0, maxhit; maxhit = GET_MAX_HIT(mob); points += GET_MAX_HIT(mob); points += str_app[STRENGTH_APPLY_INDEX(mob)].tohit; points += 3*GET_HITROLL(mob); points += 10*((mob->specials.damnodice*mob->specials.damsizedice + mob->specials.damnodice)/2); points += 10*mob->points.damroll; points += 10*str_app[STRENGTH_APPLY_INDEX(mob)].todam; ac += (100 - GET_BODY_AC(mob))*4; ac += (100 - GET_LEGS_AC(mob))*3; ac += (100 - GET_ARMS_AC(mob))*2; ac += (100 - GET_HEAD_AC(mob)); ac /= 10; stop += GET_BODY_STOPPING(mob)*4; stop += GET_ARMS_STOPPING(mob)*2; stop += GET_LEGS_STOPPING(mob)*3; stop += GET_HEAD_STOPPING(mob); stop /= 10; abils += GET_STR(mob)*2; abils += GET_INT(mob)*2; abils += GET_DEX(mob)*2; abils += GET_WIS(mob); abils += GET_CON(mob); abils += GET_PER(mob); abils += GET_FOC(mob); abils += GET_CHR(mob); abils += GET_GUI(mob); abils /= 12; points += 4*abils; points += 4*stop; points += 4*ac; points *= MAX(3, MIN(45,maxhit/30)); return(points); }