/* ****************************************************
* File: medit.cc *
* Mob Editor For AwakeOLC, a component of AwakeMUD *
* (c)2001 The AwakeMUD Consortium, and Andrew Hynek *
**************************************************** */
#include <stdio.h>
#include <stdlib.h>
#include "structs.h"
#include "awake.h"
#include "comm.h"
#include "utils.h"
#include "interpreter.h"
#include "db.h"
#include "olc.h"
#include "boards.h"
#include "screen.h"
#include "memory.h"
#include "spells.h"
void write_mobs_to_disk(int zone);
// extern vars
extern struct char_data *mob_proto;
extern int top_of_mobt;
extern int calc_karma(struct char_data *ch, struct char_data *vict);
extern int max_ability(int i);
extern int real_zone(int vnum);
extern struct index_data *mob_index;
extern struct zone_data *zone_table;
extern struct char_data *character_list;
extern const char *action_bits[];
extern const char *affected_bits[];
extern const char *position_types[];
extern const char *genders[];
extern const char *attack_types[];
extern const char *spells[];
extern const char *npc_classes[];
// extern funcs
extern char *cleanup(char *dest, const char *src);
// mem func
extern class memoryClass *Mem;
// local defines
#define MOB d->edit_mob
#define NUM_MOB_FLAGS 23
#define NUM_MOB_CLASSES 16
#define NUM_MOB_SKILLS 66
#define NUM_UNSKILLS 13
#define NUM_ATTACK_TYPES 28
#define MAX_REG_DESC_LENGTH 160
void medit_disp_menu(struct descriptor_data *d)
{
int base = calc_karma(NULL, MOB);
CLS(CH);
send_to_char(CH, "Mob number: %s%d%s\r\n", CCCYN(CH, C_CMP), d->edit_number,
CCNRM(CH, C_CMP));
send_to_char(CH, "1) Mob namelist: %s%s%s\r\n", CCCYN(CH, C_CMP),
MOB->player.name, CCNRM(CH, C_CMP));
send_to_char(CH, "2) Mob short description: %s%s%s\r\n", CCCYN(CH, C_CMP),
MOB->player.short_descr, CCNRM(CH, C_CMP));
send_to_char(CH, "3) Mob regular description: %s%s%s\r\n", CCCYN(CH, C_CMP),
MOB->player.long_descr, CCNRM(CH, C_CMP));
send_to_char(CH, "4) Mob long description:\r\n%s\r\n",
MOB->player.description);
sprintbit(MOB_FLAGS(MOB), action_bits, buf1);
send_to_char(CH, "5) Mob Flags: %s%s%s\r\n", CCCYN(CH, C_CMP), buf1,
CCNRM(CH, C_CMP));
sprintbit(d->edit_mob->char_specials.saved.affected_by, affected_bits, buf1);
send_to_char(CH, "6) Affected Flags: %s%s%s\r\n", CCCYN(CH, C_CMP), buf1,
CCNRM(CH, C_CMP));
send_to_char(CH, "7) Alignment: %s%d%s\r\n", CCCYN(CH, C_CMP),
GET_ALIGNMENT(MOB), CCNRM(CH, C_CMP));
send_to_char(CH, "8) Avg. nuyen: %s%6d%s Avg. credstick value: %s%6d%s\r\n", CCCYN(CH, C_CMP),
GET_NUYEN(MOB), CCNRM(CH, C_CMP), CCCYN(CH, C_CMP),
GET_BANK(MOB), CCNRM(CH, C_CMP));
send_to_char(CH, "9) Bonus karma points: %s%d%s (Total karma points: %s%d%s)\r\n",
CCCYN(CH, C_CMP), GET_KARMA(MOB), CCNRM(CH, C_CMP), CCCYN(CH, C_CMP), base, CCNRM(CH, C_CMP));
if (IS_IC(MOB)) {
sprintf(buf, "a) IC prevent directions: %s%s%s%s%s%s%s%s%s%s%s%s\r\n", CCCYN(CH, C_CMP),
(MOB->real_abils.bod ? "n " : ""), (MOB->real_abils.qui ? "ne " : ""),
(MOB->real_abils.str ? "e " : ""), (MOB->real_abils.cha ? "se " : ""),
(MOB->real_abils.intel ? "s " : ""), (MOB->real_abils.wil ? "sw " : ""),
(MOB->real_abils.rea ? "w " : ""), (MOB->real_abils.ess ? "nw " : ""),
(GET_BALLISTIC(MOB) ? "u " : ""), (GET_IMPACT(MOB) ? "d " : ""), CCNRM(CH, C_CMP));
send_to_char(buf, CH);
} else send_to_char(CH, "a) Attributes: B(%s%d%s), Q(%s%d%s), S(%s%d%s), C(%s%d%s), "
"I(%s%d%s), W(%s%d%s), M(%s%d%s), R(%s%d%s)\r\n",
CCCYN(CH, C_CMP), MOB->real_abils.bod, CCNRM(CH, C_CMP),
CCCYN(CH, C_CMP), MOB->real_abils.qui, CCNRM(CH, C_CMP),
CCCYN(CH, C_CMP), MOB->real_abils.str, CCNRM(CH, C_CMP),
CCCYN(CH, C_CMP), MOB->real_abils.cha, CCNRM(CH, C_CMP),
CCCYN(CH, C_CMP), MOB->real_abils.intel, CCNRM(CH, C_CMP),
CCCYN(CH, C_CMP), MOB->real_abils.wil, CCNRM(CH, C_CMP),
CCCYN(CH, C_CMP), MOB->real_abils.mag / 100, CCNRM(CH, C_CMP),
CCCYN(CH, C_CMP), MOB->real_abils.rea, CCNRM(CH, C_CMP));
send_to_char(CH, "b) Level: %s%d%s\r\n", CCCYN(CH, C_CMP), GET_LEVEL(MOB),
CCNRM(CH, C_CMP));
if (!IS_IC(MOB))
send_to_char(CH, "c) Ballistic: %s%d%s, ", CCCYN(CH, C_CMP), GET_BALLISTIC(MOB),
CCNRM(CH, C_CMP));
if (!IS_IC(MOB))
send_to_char(CH, "d) Impact: %s%d%s\r\n", CCCYN(CH, C_CMP), GET_IMPACT(MOB),
CCNRM(CH, C_CMP));
send_to_char(CH, "e) Max physical points: %s%d%s, f) Max mental points: %s%d%s\r\n", CCCYN(CH, C_CMP),
(int)(GET_MAX_PHYSICAL(MOB) / 100), CCNRM(CH, C_CMP), CCCYN(CH, C_CMP),
(int)(GET_MAX_MENTAL(MOB) / 100), CCNRM(CH, C_CMP));
sprinttype(GET_POS(MOB), position_types, buf1);
send_to_char(CH, "g) Position: %s%s%s, ", CCCYN(CH, C_CMP), buf1,
CCNRM(CH, C_CMP));
sprinttype(GET_DEFAULT_POS(MOB), position_types, buf1);
send_to_char(CH, "h) Default Position: %s%s%s\r\n", CCCYN(CH, C_CMP), buf1,
CCNRM(CH, C_CMP));
sprinttype(GET_SEX(MOB), genders, buf1);
// strcpy(buf1, genders[GET_SEX(d->edit_mob)]);
send_to_char(CH, "i) Gender: %s%s%s, ", CCCYN(CH, C_CMP), buf1,
CCNRM(CH, C_CMP));
send_to_char(CH, "j) Weight: %s%d%s, ", CCCYN(CH, C_CMP), GET_WEIGHT(MOB),
CCNRM(CH, C_CMP));
send_to_char(CH, "k) Height: %s%d%s\r\n", CCCYN(CH, C_CMP), GET_HEIGHT(MOB),
CCNRM(CH, C_CMP));
sprinttype(GET_RACE(MOB), npc_classes, buf1);
send_to_char(CH, "l) Mob class: %s%s%s\r\n", CCCYN(CH, C_CMP), buf1, CCNRM(CH, C_CMP));
// gotta subtract TYPE_HIT to make it work properly
sprinttype(!(MOB->mob_specials.attack_type) ? 0 :
(MOB->mob_specials.attack_type - TYPE_HIT), attack_types, buf1);
send_to_char(CH, "m) Attack Type: %s%s%s\r\n", CCCYN(CH, C_CMP), buf1,
CCNRM(CH, C_CMP));
send_to_char("n) Skill menu.\r\n", CH);
send_to_char(CH, "o) Arrive text: ^c%s^n, p) Leave text: ^c%s^n\r\n",
MOB->mob_specials.arrive, MOB->mob_specials.leave);
send_to_char("q) Quit and save\r\n", CH);
send_to_char("x) Exit and abort\r\n", CH);
send_to_char("Enter your choice:\r\n", CH);
d->edit_mode = MEDIT_MAIN_MENU;
}
void medit_disp_skills(struct descriptor_data *d) {
int c, line = 0;
CLS(CH);
for (c = 0; c < (SKILL_BACKSTAB - 100); c++) {
line++;
if ((line % 3) == 1)
sprintf(buf, "%2d) %-20s ", c+1, spells[c+100]);
else sprintf(buf, "%s%2d) %-20s ", buf, c+1, spells[c+100]);
if (!(line % 3)) {
sprintf(buf, "%s\r\n", buf);
send_to_char(buf, CH);
}
}
for (; c < NUM_MOB_SKILLS - NUM_UNSKILLS; c++) {
line++;
if ((line % 3) == 1)
sprintf(buf, "%2d) %-20s ", c+1, spells[c+100+NUM_UNSKILLS]);
else sprintf(buf, "%s%2d) %-20s ", buf, c+1, spells[c+100+NUM_UNSKILLS]);
if (!(line % 3)) {
sprintf(buf, "%s\r\n", buf);
send_to_char(buf, CH);
}
}
if ((line % 3) != 0) {
sprintf(buf, "%s\r\nEnter a skill (0 to quit): ", buf);
send_to_char(buf, CH);
}
}
void medit_disp_attack_menu(struct descriptor_data *d) {
int c;
CLS(CH);
for (c = 0; c < (NUM_ATTACK_TYPES - 1); c+= 2)
send_to_char(CH, "%2d) %-20s %2d) %-20s\r\n", c+1 , attack_types[c],
c+2, c+1 < (NUM_ATTACK_TYPES - 1) ? attack_types[c+1] : "");
send_to_char("Enter attack type: ", CH);
}
void medit_disp_skill_menu(struct descriptor_data *d) {
CLS(CH);
send_to_char(CH, "1) Skill: %s%s%s (%s%d%s)\r\n", CCCYN(CH, C_CMP),
spells[MOB->mob_specials.mob_skills[0]], CCNRM(CH, C_CMP), CCCYN(CH, C_CMP),
MOB->mob_specials.mob_skills[1], CCNRM(CH, C_CMP));
send_to_char(CH, "2) Skill: %s%s%s (%s%d%s)\r\n", CCCYN(CH, C_CMP),
spells[MOB->mob_specials.mob_skills[2]], CCNRM(CH, C_CMP), CCCYN(CH, C_CMP),
MOB->mob_specials.mob_skills[3], CCNRM(CH, C_CMP));
send_to_char(CH, "3) Skill: %s%s%s (%s%d%s)\r\n", CCCYN(CH, C_CMP),
spells[MOB->mob_specials.mob_skills[4]], CCNRM(CH, C_CMP), CCCYN(CH, C_CMP),
MOB->mob_specials.mob_skills[5], CCNRM(CH, C_CMP));
send_to_char(CH, "4) Skill: %s%s%s (%s%d%s)\r\n", CCCYN(CH, C_CMP),
spells[MOB->mob_specials.mob_skills[6]], CCNRM(CH, C_CMP), CCCYN(CH, C_CMP),
MOB->mob_specials.mob_skills[7], CCNRM(CH, C_CMP));
send_to_char(CH, "5) Skill: %s%s%s (%s%d%s)\r\n", CCCYN(CH, C_CMP),
spells[MOB->mob_specials.mob_skills[8]], CCNRM(CH, C_CMP), CCCYN(CH, C_CMP),
MOB->mob_specials.mob_skills[9], CCNRM(CH, C_CMP));
send_to_char("0) Quit\r\n", CH);
send_to_char("Enter your choice: ", CH);
}
void medit_disp_mobflags_menu(struct descriptor_data *d) {
int c;
CLS(CH);
for (c = 0; c < NUM_MOB_FLAGS; c += 2) {
send_to_char(CH, "%2d) %-20s %2d) %-20s\r\n",
c + 1, action_bits[c],
c + 2, c + 1 < NUM_MOB_FLAGS ?
action_bits[c + 1] : "");
}
sprintbit(MOB_FLAGS(MOB), action_bits, buf1);
send_to_char(CH, "Mob flags: %s%s%s\r\n"
"Enter mob flag, 0 to quit:", CCCYN(CH, C_CMP),
buf1, CCNRM(CH, C_CMP));
}
void medit_disp_affected_menu(struct descriptor_data *d) {
int c;
CLS(CH);
for (c = 0; c < NUM_AFF_FLAGS; c += 2) {
send_to_char(CH, "%2d) %-20s %2d) %-20s\r\n",
c + 1, affected_bits[c],
c + 2, c + 1 < NUM_AFF_FLAGS ?
affected_bits[c + 1] : "");
}
sprintbit(AFF_FLAGS(MOB), affected_bits, buf1);
send_to_char(CH, "Affected flags: %s%s%s\r\n"
"Enter affected flag, 0 to quit:", CCCYN(CH, C_CMP),
buf1, CCNRM(CH, C_CMP));
}
void medit_disp_pos_menu(struct descriptor_data *d) {
int c;
CLS(CH);
for (c = 1; c < 9; c++)
send_to_char(CH, "%2d) %-20s\r\n", c, position_types[c]);
}
void medit_disp_gender_menu(struct descriptor_data *d) {
send_to_char("1) Neutral\r\n2) Male\r\n3) Female\r\n"
"\r\nEnter gender: ", CH);
}
void medit_disp_class_menu(struct descriptor_data *d) {
int c;
CLS(CH);
for (c = 0; c < NUM_MOB_CLASSES; c++) {
send_to_char(CH, "%2d) %-20s\r\n", c + 1, npc_classes[c]);
}
sprinttype(GET_RACE(MOB), npc_classes, buf1);
send_to_char(CH, "Mob class: %s%s%s\r\n"
"Enter mob class, 0 to quit: ", CCCYN(CH, C_CMP), buf1, CCNRM(CH, C_CMP));
}
void medit_disp_att_menu(struct descriptor_data *d) {
CLS(CH);
if (IS_IC(MOB)) {
send_to_char("Direction to block:\r\n"
" 1) North\r\n 2) Northeast\r\n 3) East\r\n 4) Southeast\r\n"
" 5) South\r\n 6) Southwest\r\n 7) West\r\n 8) Northwest\r\n"
" 9) Up\r\n a) Down\r\n", CH);
sprintf(buf, "IC prevent directions: %s%s%s%s%s%s%s%s%s%s%s%s\r\n", CCCYN(CH, C_CMP),
(MOB->real_abils.bod ? "n " : ""), (MOB->real_abils.qui ? "ne " : ""),
(MOB->real_abils.str ? "e " : ""), (MOB->real_abils.cha ? "se " : ""),
(MOB->real_abils.intel ? "s " : ""), (MOB->real_abils.wil ? "sw " : ""),
(MOB->real_abils.rea ? "w " : ""), (MOB->real_abils.ess ? "nw " : ""),
(GET_BALLISTIC(MOB) ? "u " : ""), (GET_IMPACT(MOB) ? "d " : ""), CCNRM(CH, C_CMP));
send_to_char(buf, CH);
send_to_char("Enter a direction (0 to exit): ", CH);
d->edit_mode = MEDIT_ATTRIBUTES;
return;
}
send_to_char(CH, "1) Body: %s%d%s\r\n", CCCYN(CH, C_CMP), MOB->real_abils.bod,
CCNRM(CH, C_CMP));
send_to_char(CH, "2) Quickness: %s%d%s\r\n", CCCYN(CH, C_CMP), MOB->real_abils.qui,
CCNRM(CH, C_CMP));
send_to_char(CH, "3) Strength: %s%d%s\r\n", CCCYN(CH, C_CMP), MOB->real_abils.str,
CCNRM(CH, C_CMP));
send_to_char(CH, "4) Charisma: %s%d%s\r\n", CCCYN(CH, C_CMP), MOB->real_abils.cha,
CCNRM(CH, C_CMP));
send_to_char(CH, "5) Intel.: %s%d%s\r\n", CCCYN(CH, C_CMP), MOB->real_abils.intel,
CCNRM(CH, C_CMP));
send_to_char(CH, "6) Willpower: %s%d%s\r\n", CCCYN(CH, C_CMP), MOB->real_abils.wil,
CCNRM(CH, C_CMP));
send_to_char(CH, "7) Magic: %s%d%s\r\n", CCCYN(CH, C_CMP), MOB->real_abils.mag / 100,
CCNRM(CH, C_CMP));
send_to_char(CH, "q) Quit\r\n");
send_to_char("\r\nEnter your choice:\r\n", CH);
d->edit_mode = MEDIT_ATTRIBUTES;
}
//**************************************************************************
//* Main Loop *
//***************************************************************************
void medit_parse(struct descriptor_data *d, char *arg) {
int number;
int mob_number; // the RNUM
switch(d->edit_mode) {
case MEDIT_CONFIRM_EDIT:
/* if player hits 'Y' then edit mob */
switch (*arg) {
case 'y':
case 'Y':
medit_disp_menu(d);
break;
case 'n':
case 'N':
STATE(d) = CON_PLAYING;
/* free up the editing mob */
if (d->edit_mob)
Mem->DeleteCh(d->edit_mob);
d->edit_mob = NULL;
d->edit_number = 0;
REMOVE_BIT(PLR_FLAGS(d->character), PLR_EDITING);
break;
default:
send_to_char("That's not a valid choice!\r\n", CH);
send_to_char("Do you wish to edit it?\r\n", CH);
break;
}
break; /* end of MEDIT_CONFIRM_EDIT */
case MEDIT_CONFIRM_SAVESTRING:
switch(*arg) {
case 'y':
case 'Y':
// first write to the internal tables
mob_number = real_mobile(d->edit_number);
if (mob_number > 0) {
// first we go through the entire list of mobs to find out
// which are pointing to this prototype; if it is, it gets
// replaced
struct char_data *i, *temp;
int c;
for (i = character_list; i; i = i->next) {
if (mob_number == i->nr) {
// alloc a temp mobile
temp = Mem->GetCh();
*temp = *i;
*i = *d->edit_mob;
/* copy game-time dependent vars over */
i->in_room = temp->in_room;
i->nr = mob_number;
i->affected = temp->affected;
i->carrying = temp->carrying;
i->cyberware = temp->cyberware;
i->bioware = temp->bioware;
// any eq worn
for (c = 0; c < NUM_WEARS; ++c)
i->equipment[c] = temp->equipment[c];
i->next_in_room = temp->next_in_room;
i->next = temp->next;
i->next_fighting = temp->next_fighting;
i->followers = temp->followers;
i->master = temp->master;
i->char_specials.fighting = temp->char_specials.fighting;
i->char_specials.hunting = temp->char_specials.hunting;
i->mob_specials.last_direction = temp->mob_specials.last_direction;
i->mob_specials.memory = temp->mob_specials.memory;
i->mob_specials.wait_state = temp->mob_specials.wait_state;
Mem->ClearCh(temp);
} // end if statement
} // end for loop
// now you can free the old prototype and put in the new one
if (mob_proto[mob_number].player.name)
delete [] mob_proto[mob_number].player.name;
if (mob_proto[mob_number].player.title)
delete [] mob_proto[mob_number].player.title;
if (mob_proto[mob_number].player.short_descr)
delete [] mob_proto[mob_number].player.short_descr;
if (mob_proto[mob_number].player.long_descr)
delete [] mob_proto[mob_number].player.long_descr;
if (mob_proto[mob_number].player.description)
delete [] mob_proto[mob_number].player.description;
if (mob_proto[mob_number].mob_specials.arrive)
delete [] mob_proto[mob_number].mob_specials.arrive;
if (mob_proto[mob_number].mob_specials.leave)
delete [] mob_proto[mob_number].mob_specials.leave;
mob_proto[mob_number] = *d->edit_mob;
mob_proto[mob_number].nr = mob_number;
} else { // if not, we need to make a new spot in the list
int realcounter;
int counter;
int found = FALSE;
struct char_data *new_mob_proto;
struct index_data *new_mob_index;
struct char_data *temp_mob;
// two because you're adding one and you need one over
new_mob_index = new struct index_data[top_of_mobt + 2];
new_mob_proto = new struct char_data[top_of_mobt + 2];
// count through the tables
for (counter = 0; counter < top_of_mobt + 1; counter++) {
/* if we haven't found it */
if (!found) {
/* check if current virtual is bigger than our virtual */
if (mob_index[counter].virt > d->edit_number) {
/* eureka. insert now */
/*---------*/
new_mob_index[counter].virt = d->edit_number;
new_mob_index[counter].number = 0;
new_mob_index[counter].func = NULL;
/*---------*/
new_mob_proto[counter] = *(d->edit_mob);
new_mob_proto[counter].in_room = NOWHERE;
/* it is now safe (and necessary!) to assign real number to
* the edit_mob, which has been -1 all this time */
d->edit_mob->nr = counter;
/* and assign to prototype as well */
new_mob_proto[counter].nr = counter;
found = TRUE;
/* insert the other proto at this point */
new_mob_index[counter + 1] = mob_index[counter];
new_mob_proto[counter + 1] = mob_proto[counter];
new_mob_proto[counter + 1].nr = counter + 1;
} else {
/* just copy from old to new, no num change */
new_mob_proto[counter] = mob_proto[counter];
new_mob_index[counter] = mob_index[counter];
}
} else { // if !found else
/* we HAVE already found it.. therefore copy to mobile + 1 */
new_mob_index[counter + 1] = mob_index[counter];
new_mob_proto[counter + 1] = mob_proto[counter];
new_mob_proto[counter + 1].nr = counter + 1;
}
} // for loop through list
/* if we STILL haven't found it, means the mobile was > than all
* the other mobs.. so insert at end */
if (!found) {
new_mob_index[top_of_mobt + 1].virt = d->edit_number;
new_mob_index[top_of_mobt + 1].number = 0;
new_mob_index[top_of_mobt + 1].func = NULL;
clear_char(new_mob_proto + top_of_mobt + 1);
new_mob_proto[top_of_mobt + 1] = *(d->edit_mob);
new_mob_proto[top_of_mobt + 1].in_room = NOWHERE;
new_mob_proto[top_of_mobt + 1].nr = top_of_mobt + 1;
/* it is now safe (and necessary!) to assign real number to
* the edit_mob, which has been -1 all this time */
d->edit_mob->nr = top_of_mobt + 1;
}
top_of_mobt++;
/* we also have to renumber all the mobiles currently *
* existing in the world. This is because when I start *
* extracting mobiles, bad things will happen! */
for (temp_mob = character_list; temp_mob; temp_mob = temp_mob->next)
if (GET_MOB_RNUM (temp_mob) >= d->edit_mob->nr)
GET_MOB_RNUM (temp_mob)++;
/* free and replace old tables */
delete [] mob_proto;
delete [] mob_index;
mob_proto = new_mob_proto;
mob_index = new_mob_index;
/* RENUMBER ZONE TABLES HERE, only *
* because I ADDED a mobile! *
* This code shamelessly ripped off from db.c */
extern int top_of_zone_table;
int zone, cmd_no;
for (zone = 0; zone <= top_of_zone_table; zone++)
for (cmd_no = 0; cmd_no < zone_table[zone].num_cmds; cmd_no++) {
switch (ZCMD.command) {
case 'M':
ZCMD.arg1 = (ZCMD.arg1 >= d->edit_mob->nr ? ZCMD.arg1 + 1 : ZCMD.arg1);
break;
}
}
} // finally done putting the mobile into memory
send_to_char("Writing mobile to disk...", CH);
write_mobs_to_disk(d->character->player_specials->saved.zonenum);
// again, here we don't delete it cause we don't want to end up
// deleting the strings from the prototypes
if (d->edit_mob)
Mem->ClearCh(d->edit_mob);
d->edit_mob = NULL;
STATE(d) = CON_PLAYING;
REMOVE_BIT(PLR_FLAGS(d->character), PLR_EDITING);
send_to_char("Done.\r\n", d->character);
break;
case 'n':
case 'N':
send_to_char("Mobile not saved, aborting.\r\n", d->character);
STATE(d) = CON_PLAYING;
// complete nuke
if (d->edit_mob)
Mem->DeleteCh(d->edit_mob);
d->edit_mob = NULL;
d->edit_number = 0;
d->edit_zone = 0;
REMOVE_BIT(PLR_FLAGS(d->character), PLR_EDITING);
break;
default:
send_to_char("Invalid choice!\r\n", d->character);
send_to_char("Do you wish to save this mobile internally?\r\n", d->character);
break;
}
break;
case MEDIT_MAIN_MENU:
switch (*arg) {
case 'q':
case 'Q':
d->edit_mode = MEDIT_CONFIRM_SAVESTRING;
#if CONFIRM_SAVE
send_to_char("Do you wish to save this mob internally?\r\n", CH);
#else
medit_parse(d, "y");
#endif
break;
case 'x':
case 'X':
d->edit_mode = MEDIT_CONFIRM_SAVESTRING;
#if CONFIRM_SAVE
send_to_char("Do you wish to save this mob internally?\r\n", CH);
#else
medit_parse(d, "n");
#endif
break;
case '1':
send_to_char("Enter namelist:", CH);
d->edit_mode = MEDIT_EDIT_NAMELIST;
break;
case '2':
send_to_char("Enter short description:", CH);
d->edit_mode = MEDIT_SHORT_DESCR;
break;
case '3':
send_to_char("Enter regular description:", CH);
d->edit_mode = MEDIT_REG_DESCR;
//d->str = (char **) xmalloc(sizeof(char *));
d->str = new (char *);
if (!d->str) {
mudlog("Malloc failed!", NULL, LOG_SYSLOG, TRUE);
exit(1);
}
*(d->str) = NULL;
d->max_str = MAX_REG_DESC_LENGTH;
d->mail_to = 0;
break;
case '4':
// go to modify.cc
send_to_char("Enter long description:\r\n", CH);
d->edit_mode = MEDIT_LONG_DESCR;
//d->str = (char **) xmalloc(sizeof(char *));
d->str = new (char *);
if (!d->str) {
mudlog("Malloc failed!", NULL, LOG_SYSLOG, TRUE);
exit(1);
}
*(d->str) = NULL;
d->max_str = MAX_MESSAGE_LENGTH;
d->mail_to = 0;
break;
case '5':
medit_disp_mobflags_menu(d);
d->edit_mode = MEDIT_MOB_FLAGS;
break;
case '6':
medit_disp_affected_menu(d);
d->edit_mode = MEDIT_AFF_FLAGS;
break;
case '7':
send_to_char("Enter alignment (-1000 to 1000): ", CH);
d->edit_mode = MEDIT_ALIGNMENT;
break;
case '8':
send_to_char("Enter average nuyen: ", CH);
d->edit_mode = MEDIT_NUYEN;
break;
case '9':
send_to_char("Enter bonus karma points: ", CH);
d->edit_mode = MEDIT_EXPERIENCE;
break;
case 'a':
medit_disp_att_menu(d);
d->edit_mode = MEDIT_ATTRIBUTES;
break;
case 'b':
send_to_char("Enter level: ", CH);
d->edit_mode = MEDIT_LEVEL;
break;
case 'c':
if (IS_IC(MOB))
medit_disp_menu(d);
else {
send_to_char("Enter ballistic armor points: ", CH);
d->edit_mode = MEDIT_BALLISTIC;
}
break;
case 'd':
if (IS_IC(MOB))
medit_disp_menu(d);
else {
send_to_char("Enter impact armor points: ", CH);
d->edit_mode = MEDIT_IMPACT;
}
break;
case 'e':
send_to_char("Enter max physical points: ", CH);
d->edit_mode = MEDIT_PHYSICAL;
break;
case 'f':
send_to_char("Enter max mental points: ", CH);
d->edit_mode = MEDIT_MENTAL;
break;
case 'g':
medit_disp_pos_menu(d);
send_to_char("Enter position: ", CH);
d->edit_mode = MEDIT_POSITION;
break;
case 'h':
medit_disp_pos_menu(d);
send_to_char("Enter default position: ", CH);
d->edit_mode = MEDIT_DEFAULT_POSITION;
break;
case 'i':
medit_disp_gender_menu(d);
d->edit_mode = MEDIT_GENDER;
break;
case 'j':
send_to_char("Enter weight (in kilograms): ", CH);
d->edit_mode = MEDIT_WEIGHT;
break;
case 'k':
send_to_char("Enter height (in centimeters): ", CH);
d->edit_mode = MEDIT_HEIGHT;
break;
case 'l':
medit_disp_class_menu(d);
d->edit_mode = MEDIT_CLASS;
break;
case 'm':
medit_disp_attack_menu(d);
d->edit_mode = MEDIT_ATTACK_TYPE;
break;
case 'n':
medit_disp_skill_menu(d);
d->edit_mode = MEDIT_SKILLS;
break;
case 'o':
send_to_char("Enter arrive text: ", CH);
d->edit_mode = MEDIT_ARRIVE_MSG;
break;
case 'p':
send_to_char("Enter leave text: ", CH);
d->edit_mode = MEDIT_LEAVE_MSG;
break;
default:
medit_disp_menu(d);
break;
}
break;
case MEDIT_EDIT_NAMELIST:
if (MOB->player.name)
delete [] MOB->player.name;
MOB->player.name = str_dup(arg);
medit_disp_menu(d);
break;
case MEDIT_SHORT_DESCR:
if (MOB->player.short_descr)
delete [] MOB->player.short_descr;
MOB->player.short_descr = str_dup(arg);
medit_disp_menu(d);
break;
case MEDIT_ARRIVE_MSG:
if (MOB->mob_specials.arrive)
delete [] MOB->mob_specials.arrive;
MOB->mob_specials.arrive = str_dup(arg);
medit_disp_menu(d);
break;
case MEDIT_LEAVE_MSG:
if (MOB->mob_specials.leave)
delete [] MOB->mob_specials.leave;
MOB->mob_specials.leave = str_dup(arg);
medit_disp_menu(d);
break;
case MEDIT_REG_DESCR:
// you shouldn't come here
break;
case MEDIT_LONG_DESCR:
// you shouldn't come here
break;
case MEDIT_MOB_FLAGS:
number = atoi(arg);
if ((number < 0) || (number > NUM_MOB_FLAGS))
medit_disp_mobflags_menu(d);
else {
if (number == 0) // 0 = quit
medit_disp_menu(d);
else {
if (IS_SET(MOB_FLAGS(MOB), 1 << (number - 1)))
REMOVE_BIT(MOB_FLAGS(MOB), 1 << (number - 1));
else
SET_BIT(MOB_FLAGS(MOB), 1 << (number - 1));
medit_disp_mobflags_menu(d);
}
}
break;
case MEDIT_AFF_FLAGS:
number = atoi(arg);
if ((number < 0) || (number > NUM_AFF_FLAGS))
medit_disp_affected_menu(d);
else {
if (number == 0) // 0 = quit
medit_disp_menu(d);
else {
TOGGLE_BIT(AFF_FLAGS(MOB), 1 << (number - 1));
medit_disp_affected_menu(d);
}
}
break;
case MEDIT_ALIGNMENT:
number = atoi(arg);
if ((number < -1000) || (number > 1000)) {
send_to_char("Value must range between -1000 and 1000.\r\n", CH);
send_to_char("Enter alignment: ", CH);
} else {
GET_ALIGNMENT(MOB) = number;
medit_disp_menu(d);
}
break;
case MEDIT_NUYEN:
number = atoi(arg);
if ((number < 0) || (number > 999999)) {
send_to_char("Value must range between 0 and 999999.\r\n", CH);
send_to_char("Enter average nuyen: ", CH);
} else {
GET_NUYEN(MOB) = number;
send_to_char("Enter average credstick value: ", CH);
d->edit_mode = MEDIT_CREDSTICK;
}
break;
case MEDIT_CREDSTICK:
number = atoi(arg);
if ((number < 0) || (number > 999999)) {
send_to_char("Value must range between 0 and 999999.\r\n", CH);
send_to_char("Enter average credstick value: ", CH);
} else {
GET_BANK(MOB) = number;
medit_disp_menu(d);
}
break;
case MEDIT_EXPERIENCE:
number = atoi(arg);
if ((number < 0) || (number > 7500)) {
send_to_char("Value must range between 0 and 7500.\r\n", CH);
send_to_char("Enter bonus karma points: ", CH);
} else {
GET_KARMA(MOB) = number;
medit_disp_menu(d);
}
break;
case MEDIT_SKILLS:
switch (*arg) {
case '0':
medit_disp_menu(d);
break;
case '1':
medit_disp_skills(d);
send_to_char("Enter a skill (0 to quit): ", CH);
d->edit_mode = MEDIT_SKILL1;
break;
case '2':
medit_disp_skills(d);
send_to_char("Enter a skill (0 to quit): ", CH);
d->edit_mode = MEDIT_SKILL2;
break;
case '3':
medit_disp_skills(d);
send_to_char("Enter a skill (0 to quit): ", CH);
d->edit_mode = MEDIT_SKILL3;
break;
case '4':
medit_disp_skills(d);
send_to_char("Enter a skill (0 to quit): ", CH);
d->edit_mode = MEDIT_SKILL4;
break;
case '5':
medit_disp_skills(d);
send_to_char("Enter a skill (0 to quit): ", CH);
d->edit_mode = MEDIT_SKILL5;
break;
default:
medit_disp_skill_menu(d);
break;
}
break; // end of MEDIT_SKILLS
case MEDIT_SKILL1:
number = atoi(arg);
if ((number < 0) || (number > NUM_MOB_SKILLS - NUM_UNSKILLS)) {
medit_disp_skills(d);
send_to_char(CH, "Value must range between 1 and %d.\r\n", NUM_MOB_SKILLS - NUM_UNSKILLS);
send_to_char("Enter a skill (0 to quit): ", CH);
} else if (number == 0) { // 0 = quit
medit_disp_skill_menu(d);
d->edit_mode = MEDIT_SKILLS;
} else {
if ((number + 99) < SKILL_BACKSTAB)
MOB->mob_specials.mob_skills[0] = number + 99; // to adjust it
else MOB->mob_specials.mob_skills[0] = number + 99 + NUM_UNSKILLS;
send_to_char("Enter skill level (0 to quit): ", CH);
d->edit_mode = MEDIT_SKILL1_VAL;
}
break;
case MEDIT_SKILL2:
number = atoi(arg);
if ((number < 0) || (number > NUM_MOB_SKILLS - NUM_UNSKILLS)) {
medit_disp_skills(d);
send_to_char(CH, "Value must range between 1 and %d.\r\n", NUM_MOB_SKILLS - NUM_UNSKILLS);
send_to_char("Enter a skill (0 to quit): ", CH);
} else if (number == 0) { // 0 = quit
medit_disp_skill_menu(d);
d->edit_mode = MEDIT_SKILLS;
} else {
if ((number + 99) < SKILL_BACKSTAB)
MOB->mob_specials.mob_skills[2] = number + 99; // to adjust it
else MOB->mob_specials.mob_skills[2] = number + 99 + NUM_UNSKILLS;
send_to_char("Enter skill level (0 to quit): ", CH);
d->edit_mode = MEDIT_SKILL2_VAL;
}
break;
case MEDIT_SKILL3:
number = atoi(arg);
if ((number < 0) || (number > NUM_MOB_SKILLS - NUM_UNSKILLS)) {
medit_disp_skills(d);
send_to_char(CH, "Value must range between 1 and %d.\r\n", NUM_MOB_SKILLS - NUM_UNSKILLS);
send_to_char("Enter a skill (0 to quit): ", CH);
} else if (number == 0) { // 0 = quit
medit_disp_skill_menu(d);
d->edit_mode = MEDIT_SKILLS;
} else {
if ((number + 99) < SKILL_BACKSTAB)
MOB->mob_specials.mob_skills[4] = number + 99; // to adjust it
else MOB->mob_specials.mob_skills[4] = number + 99 + NUM_UNSKILLS;
send_to_char("Enter skill level (0 to quit): ", CH);
d->edit_mode = MEDIT_SKILL3_VAL;
}
break;
case MEDIT_SKILL4:
number = atoi(arg);
if ((number < 0) || (number > NUM_MOB_SKILLS - NUM_UNSKILLS)) {
medit_disp_skills(d);
send_to_char(CH, "Value must range between 1 and %d.\r\n", NUM_MOB_SKILLS - NUM_UNSKILLS);
send_to_char("Enter a skill (0 to quit): ", CH);
} else if (number == 0) { // 0 = quit
medit_disp_skill_menu(d);
d->edit_mode = MEDIT_SKILLS;
} else {
if ((number + 99) < SKILL_BACKSTAB)
MOB->mob_specials.mob_skills[6] = number + 99; // to adjust it
else MOB->mob_specials.mob_skills[6] = number + 99 + NUM_UNSKILLS;
send_to_char("Enter skill level (0 to quit): ", CH);
d->edit_mode = MEDIT_SKILL4_VAL;
}
break;
case MEDIT_SKILL5:
number = atoi(arg);
if ((number < 0) || (number > NUM_MOB_SKILLS - NUM_UNSKILLS)) {
medit_disp_skills(d);
send_to_char(CH, "Value must range between 1 and %d.\r\n", NUM_MOB_SKILLS - NUM_UNSKILLS);
send_to_char("Enter a skill (0 to quit): ", CH);
} else if (number == 0) { // 0 = quit
medit_disp_skill_menu(d);
d->edit_mode = MEDIT_SKILLS;
} else {
if ((number + 99) < SKILL_BACKSTAB)
MOB->mob_specials.mob_skills[8] = number + 99; // to adjust it
else MOB->mob_specials.mob_skills[8] = number + 99 + NUM_UNSKILLS;
send_to_char("Enter skill level (0 to quit): ", CH);
d->edit_mode = MEDIT_SKILL5_VAL;
}
break;
case MEDIT_SKILL1_VAL:
number = atoi(arg);
if ((number < 0) || (number > 50)) {
send_to_char("Skill level must be between 1 and 50.\r\n", CH);
send_to_char("Enter skill level: ", CH);
} else if (number == 0) {
MOB->mob_specials.mob_skills[0] = 0;
MOB->mob_specials.mob_skills[1] = 0;
d->edit_mode = MEDIT_SKILLS;
medit_disp_skill_menu(d);
} else {
if (MOB->mob_specials.mob_skills[0] > SKILL_PERCEPTION)
number = MIN(number, max_ability(MOB->mob_specials.mob_skills[0]));
MOB->mob_specials.mob_skills[1] = number;
SET_SKILL(MOB, MOB->mob_specials.mob_skills[0],
MOB->mob_specials.mob_skills[1]);
d->edit_mode = MEDIT_SKILLS;
medit_disp_skill_menu(d);
}
break;
case MEDIT_SKILL2_VAL:
number = atoi(arg);
if ((number < 0) || (number > 50)) {
send_to_char("Skill level must be between 1 and 50.\r\n", CH);
send_to_char("Enter skill level: ", CH);
} else if (number == 0) {
MOB->mob_specials.mob_skills[2] = 0;
MOB->mob_specials.mob_skills[3] = 0;
d->edit_mode = MEDIT_SKILLS;
medit_disp_skill_menu(d);
} else {
if (MOB->mob_specials.mob_skills[2] > SKILL_PERCEPTION)
number = MIN(number, max_ability(MOB->mob_specials.mob_skills[2]));
MOB->mob_specials.mob_skills[3] = number;
SET_SKILL(MOB, MOB->mob_specials.mob_skills[2],
MOB->mob_specials.mob_skills[3]);
d->edit_mode = MEDIT_SKILLS;
medit_disp_skill_menu(d);
}
break;
case MEDIT_SKILL3_VAL:
number = atoi(arg);
if ((number < 0) || (number > 50)) {
send_to_char("Skill level must be between 1 and 50.\r\n", CH);
send_to_char("Enter skill level: ", CH);
} else if (number == 0) {
MOB->mob_specials.mob_skills[4] = 0;
MOB->mob_specials.mob_skills[5] = 0;
d->edit_mode = MEDIT_SKILLS;
medit_disp_skill_menu(d);
} else {
if (MOB->mob_specials.mob_skills[4] > SKILL_PERCEPTION)
number = MIN(number, max_ability(MOB->mob_specials.mob_skills[4]));
MOB->mob_specials.mob_skills[5] = number;
SET_SKILL(MOB, MOB->mob_specials.mob_skills[4],
MOB->mob_specials.mob_skills[5]);
d->edit_mode = MEDIT_SKILLS;
medit_disp_skill_menu(d);
}
break;
case MEDIT_SKILL4_VAL:
number = atoi(arg);
if ((number < 0) || (number > 50)) {
send_to_char("Skill level must be between 1 and 50.\r\n", CH);
send_to_char("Enter skill level: ", CH);
} else if (number == 0) {
MOB->mob_specials.mob_skills[6] = 0;
MOB->mob_specials.mob_skills[7] = 0;
d->edit_mode = MEDIT_SKILLS;
medit_disp_skill_menu(d);
} else {
if (MOB->mob_specials.mob_skills[6] > SKILL_PERCEPTION)
number = MIN(number, max_ability(MOB->mob_specials.mob_skills[6]));
MOB->mob_specials.mob_skills[7] = number;
SET_SKILL(MOB, MOB->mob_specials.mob_skills[6],
MOB->mob_specials.mob_skills[7]);
d->edit_mode = MEDIT_SKILLS;
medit_disp_skill_menu(d);
}
break;
case MEDIT_SKILL5_VAL:
number = atoi(arg);
if ((number < 0) || (number > 50)) {
send_to_char("Skill level must be between 1 and 50.\r\n", CH);
send_to_char("Enter skill level: ", CH);
} else if (number == 0) {
MOB->mob_specials.mob_skills[8] = 0;
MOB->mob_specials.mob_skills[9] = 0;
d->edit_mode = MEDIT_SKILLS;
medit_disp_skill_menu(d);
} else {
if (MOB->mob_specials.mob_skills[8] > SKILL_PERCEPTION)
number = MIN(number, max_ability(MOB->mob_specials.mob_skills[8]));
MOB->mob_specials.mob_skills[9] = number;
SET_SKILL(MOB, MOB->mob_specials.mob_skills[8],
MOB->mob_specials.mob_skills[9]);
d->edit_mode = MEDIT_SKILLS;
medit_disp_skill_menu(d);
}
break;
case MEDIT_ATTRIBUTES:
if (IS_IC(MOB)) {
switch (*arg) {
case '0':
medit_disp_menu(d);
break;
case '1':
if (MOB->real_abils.bod)
MOB->real_abils.bod = 0;
else MOB->real_abils.bod = 1;
medit_disp_att_menu(d);
break;
case '2':
if (MOB->real_abils.qui)
MOB->real_abils.qui = 0;
else MOB->real_abils.qui = 1;
medit_disp_att_menu(d);
break;
case '3':
if (MOB->real_abils.str)
MOB->real_abils.str = 0;
else MOB->real_abils.str = 1;
medit_disp_att_menu(d);
break;
case '4':
if (MOB->real_abils.cha)
MOB->real_abils.cha = 0;
else MOB->real_abils.cha = 1;
medit_disp_att_menu(d);
break;
case '5':
if (MOB->real_abils.intel)
MOB->real_abils.intel = 0;
else MOB->real_abils.intel = 1;
medit_disp_att_menu(d);
break;
case '6':
if (MOB->real_abils.wil)
MOB->real_abils.wil = 0;
else MOB->real_abils.wil = 1;
medit_disp_att_menu(d);
break;
case '7':
if (MOB->real_abils.rea)
MOB->real_abils.rea = 0;
else MOB->real_abils.rea = 1;
medit_disp_att_menu(d);
break;
case '8':
if (MOB->real_abils.ess)
MOB->real_abils.ess = 0;
else MOB->real_abils.ess = 1;
medit_disp_att_menu(d);
break;
case '9':
if (GET_BALLISTIC(MOB))
GET_BALLISTIC(MOB) = 0;
else GET_BALLISTIC(MOB) = 1;
medit_disp_att_menu(d);
break;
case 'a':
if (GET_IMPACT(MOB))
GET_IMPACT(MOB) = 0;
else GET_IMPACT(MOB) = 1;
medit_disp_att_menu(d);
break;
default:
medit_disp_att_menu(d);
break;
}
} else {
switch (*arg) {
case '1':
send_to_char("Enter body attribute: ", CH);
d->edit_mode = MEDIT_BOD;
break;
case '2':
send_to_char("Enter quickness attribute: ", CH);
d->edit_mode = MEDIT_QUI;
break;
case '3':
send_to_char("Enter strength attribute: ", CH);
d->edit_mode = MEDIT_STR;
break;
case '4':
send_to_char("Enter charisma attribute: ", CH);
d->edit_mode = MEDIT_CHA;
break;
case '5':
send_to_char("Enter intelligence attribute: ", CH);
d->edit_mode = MEDIT_INT;
break;
case '6':
send_to_char("Enter willpower attribute: ", CH);
d->edit_mode = MEDIT_WIL;
break;
case '7':
send_to_char("Enter magic attribute: ", CH);
d->edit_mode = MEDIT_MAG;
break;
case 'q':
case 'Q': // back to main menu
medit_disp_menu(d);
break;
default:
medit_disp_att_menu(d);
break;
}
}
break;
case MEDIT_BOD:
number = atoi(arg);
if ((number < 1) || (number > 50)) {
send_to_char("Value must range between 1 and 50.\r\n", CH);
send_to_char("Enter body attribute: ", CH);
} else {
MOB->real_abils.bod = number;
MOB->real_abils.bod_index = number * 100;
medit_disp_att_menu(d);
}
break;
case MEDIT_QUI:
number = atoi(arg);
if ((number < 1) || (number > 50)) {
send_to_char("Value must range between 1 and 50.\r\n", CH);
send_to_char("Enter quickness attribute: ", CH);
} else {
MOB->real_abils.qui = number;
MOB->real_abils.rea = (number + MOB->real_abils.intel) >> 1;
medit_disp_att_menu(d);
}
break;
case MEDIT_STR:
number = atoi(arg);
if ((number < 1) || (number > 50)) {
send_to_char("Value must range between 1 and 50.\r\n", CH);
send_to_char("Enter strength attribute: ", CH);
} else {
MOB->real_abils.str = number;
medit_disp_att_menu(d);
}
break;
case MEDIT_CHA:
number = atoi(arg);
if ((number < 1) || (number > 50)) {
send_to_char("Value must range between 1 and 50.\r\n", CH);
send_to_char("Enter charisma attribute: ", CH);
} else {
MOB->real_abils.cha = number;
medit_disp_att_menu(d);
}
break;
case MEDIT_INT:
number = atoi(arg);
if ((number < 1) || (number > 50)) {
send_to_char("Value must range between 1 and 50.\r\n", CH);
send_to_char("Enter intelligence attribute: ", CH);
} else {
MOB->real_abils.intel = number;
MOB->real_abils.rea = (number + MOB->real_abils.qui) >> 1;
medit_disp_att_menu(d);
}
break;
case MEDIT_WIL:
number = atoi(arg);
if ((number < 1) || (number > 50)) {
send_to_char("Value must range between 1 and 50.\r\n", CH);
send_to_char("Enter willpower attribute: ", CH);
} else {
MOB->real_abils.wil = number;
medit_disp_att_menu(d);
}
break;
case MEDIT_MAG:
number = atoi(arg);
if ((number < 0) || (number > 50)) {
send_to_char("Value must range between 0 and 50.\r\n", CH);
send_to_char("Enter magic attribute: ", CH);
} else {
MOB->real_abils.mag = number * 100;
medit_disp_att_menu(d);
}
break;
case MEDIT_LEVEL:
number = atoi(arg);
if (number < 0 || (!IS_IC(MOB) && number > LVL_PRESIDENT) || (IS_IC(MOB) && number > 15)) {
send_to_char("Invalid choice.\r\n", CH);
send_to_char("Enter level: ", CH);
} else {
GET_LEVEL(MOB) = number;
medit_disp_menu(d);
}
break;
case MEDIT_BALLISTIC:
number = atoi(arg);
if (number < 0) {
send_to_char("Value must be greater than 0.\r\n", CH);
send_to_char("Enter ballistic armor points: ", CH);
} else {
GET_BALLISTIC(MOB) = number;
medit_disp_menu(d);
}
break;
case MEDIT_IMPACT:
number = atoi(arg);
if (number < 0) {
send_to_char("Value must be greater than 0.\r\n", CH);
send_to_char("Enter impact armor points: ", CH);
} else {
GET_IMPACT(MOB) = number;
medit_disp_menu(d);
}
break;
case MEDIT_PHYSICAL:
number = atoi(arg);
if ((number < 0) || (number > 10)) {
send_to_char("Value must range between 0 and 10.\r\n", CH);
send_to_char("Enter max physical points: ", CH);
} else {
GET_MAX_PHYSICAL(MOB) = number * 100;
GET_PHYSICAL(MOB) = number * 100;
medit_disp_menu(d);
}
break;
case MEDIT_MENTAL:
number = atoi(arg);
if ((number < 0) || (number > 10)) {
send_to_char("Value must range between 0 and 10.\r\n", CH);
send_to_char("Enter max mental points: ", CH);
} else {
GET_MAX_MENTAL(MOB) = number * 100;
GET_MENTAL(MOB) = number * 100;
medit_disp_menu(d);
}
break;
case MEDIT_WEIGHT:
number = atoi(arg);
if (number < 0) {
send_to_char("Value must be greater than 0.\r\n", CH);
send_to_char("Enter weight (in kilograms): ", CH);
} else {
GET_WEIGHT(MOB) = number;
medit_disp_menu(d);
}
break;
case MEDIT_HEIGHT:
number = atoi(arg);
if (number < 0) {
send_to_char("Value must be greater than 0.\r\n", CH);
send_to_char("Enter height (in centimeters): ", CH);
} else {
GET_HEIGHT(MOB) = number;
medit_disp_menu(d);
}
break;
case MEDIT_CLASS:
number = atoi(arg);
if ((number < 1) || (number > NUM_MOB_CLASSES))
medit_disp_class_menu(d);
else {
GET_RACE(MOB) = (number - 1);
medit_disp_menu(d);
}
break;
case MEDIT_POSITION:
number = atoi(arg);
if ((number < POS_MORTALLYW) || (number > POS_STANDING)) {
send_to_char("Invalid choice.\r\nEnter position: ", CH);
medit_disp_pos_menu(d);
} else {
GET_POS(MOB) = number;
medit_disp_menu(d);
}
break;
case MEDIT_DEFAULT_POSITION:
number = atoi(arg);
if ((number < POS_MORTALLYW) || (number > POS_STANDING)) {
send_to_char("Invalid choice.\r\nEnter default position: ", CH);
medit_disp_pos_menu(d);
} else {
GET_DEFAULT_POS(MOB) = number;
medit_disp_menu(d);
}
break;
case MEDIT_GENDER:
number = atoi(arg);
if ((number < 0) || (number > 3)) {
send_to_char("Invalid choice.\r\n", CH);
medit_disp_gender_menu(d);
} else
if (number != 0) // 0 = quit
GET_SEX(MOB) = (number - 1);
medit_disp_menu(d);
break;
case MEDIT_ATTACK_TYPE:
number = atoi(arg);
if ((number < 0) || (number > NUM_ATTACK_TYPES)) {
send_to_char("Invalid choice.\r\n", CH);
medit_disp_attack_menu(d);
} else
if (number != 0) // 0 = quit
MOB->mob_specials.attack_type = number-1 + TYPE_HIT;
medit_disp_menu(d);
break;
}
}
void write_mobs_to_disk(int zone)
{
int counter, counter2, realcounter;
FILE *fp;
struct char_data *mob;
zone = real_zone(zone);
mob = Mem->GetCh();
sprintf(buf, "%s/%d.mob", MOB_PREFIX, zone_table[zone].number);
fp = fopen(buf, "w+");
/* start running through all mobiles in this zone */
for (counter = zone_table[zone].number * 100; counter <= zone_table[zone].top; counter++) {
/* write mobile to disk */
realcounter = real_mobile(counter);
if (realcounter >= 0) {
*mob = mob_proto[realcounter];
fprintf(fp, "#%d\n", GET_MOB_VNUM(mob));
fprintf(fp, "%s~\n", mob->player.name ? mob->player.name : "unnamed mob");
fprintf(fp, "%s~\n", mob->player.short_descr ? mob->player.short_descr : "An unnamed mob");
fprintf(fp, "%s~\n", cleanup(buf2, mob->player.long_descr ?
mob->player.long_descr : "An unnamed mob."));
fprintf(fp, "%s~\n", cleanup(buf2, mob->player.description ?
mob->player.description : "An unnamed mob is here."));
fprintf(fp, "%s~\n", mob->mob_specials.arrive);
fprintf(fp, "%s~\n", mob->mob_specials.leave);
fprintf(fp, "%ld %ld %d %d %d\n", MOB_FLAGS(mob), AFF_FLAGS(mob),
GET_ALIGNMENT(mob), GET_BANK(mob), GET_KARMA(mob));
fprintf(fp, "%d %d %d %d %d %d 0 %d 0\n", mob->real_abils.bod,
mob->real_abils.qui, mob->real_abils.str, mob->real_abils.cha,
mob->real_abils.intel, mob->real_abils.wil,
mob->real_abils.mag / 100);
fprintf(fp, "%d %d %d %d %d %d %d %d %d %d\n",
mob->mob_specials.mob_skills[0], mob->mob_specials.mob_skills[1],
mob->mob_specials.mob_skills[2], mob->mob_specials.mob_skills[3],
mob->mob_specials.mob_skills[4], mob->mob_specials.mob_skills[5],
mob->mob_specials.mob_skills[6], mob->mob_specials.mob_skills[7],
mob->mob_specials.mob_skills[8], mob->mob_specials.mob_skills[9]);
fprintf(fp, "%d %d %d %d %d %d\n", GET_LEVEL(mob),
GET_BALLISTIC(mob), GET_IMPACT(mob),
(int)(GET_MAX_PHYSICAL(mob) / 100),
(int)(GET_MAX_MENTAL(mob) / 100), GET_NUYEN(mob));
fprintf(fp, "%d %d %d %d %d %d %d\n", mob->char_specials.position,
mob->mob_specials.default_pos, mob->player.sex,
mob->mob_specials.attack_type, mob->player.race,
mob->player.weight, mob->player.height);
} // close if statement
} // close for loop
fprintf(fp, "$~\n");
fclose(fp);
// we certainly don't want to go round deleting stuff prototype
// strings and such
Mem->ClearCh(mob);
write_index_file("mob");
}