#include <stdio.h>
#include "protos.h"
#define MOB_MAIN_MENU 0
#define CHANGE_MOB_NAME 1
#define CHANGE_MOB_SHORT 2
#define CHANGE_MOB_LONG 3
#define CHANGE_MOB_DESC 4
#define CHANGE_MOB_ACT_FLAGS 5
#define CHANGE_MOB_AFF_FLAGS 6
#define CHANGE_MOB_ALIGN 7
#define CHANGE_MOB_HITP 8
#define CHANGE_MOB_ARMOR 9
#define CHANGE_MOB_DAMSIZE 10
#define CHANGE_MOB_DAMNUMB 11
#define CHANGE_MOB_DAMPLUS 12
#define CHANGE_MOB_RACE 13
#define CHANGE_MOB_MULTATT 14
#define CHANGE_MOB_EXP 15
#define CHANGE_MOB_DPOS 16
#define CHANGE_MOB_RESIST 17
#define CHANGE_MOB_IMMUNE 18
#define CHANGE_MOB_SUSCEP 19
#define CHANGE_MOB_SOUND 20
#define CHANGE_MOB_DSOUND 21
#define MOB_HIT_RETURN 99
#define ENTER_CHECK 1
extern const char *action_bits[];
extern const char *affected_bits[];
extern const char *RaceName[];
extern const char *immunity_names[];
char *mob_edit_menu = " 1) Name 2) Short description\n\r"
" 3) Long description 4) Description\n\r"
" 5) Action flags 6) Affect flags\n\r"
" 7) Alignment 8) Maximum hitpoints\n\r"
" 9) Armor class 10) Damage size of die\n\r"
" 11) Damage number of die 12) Damage roll plus\n\r"
" 13) Race 14) Number of attacks\n\r"
" 15) Exp flags/amount 16) Default position\n\r"
" 17) Resistances 18) Immunities\n\r"
" 19) Susceptibilities 20) Sounds\n\r"
" 21) Distant sounds\n\r\n\r";
void ChangeMobName(struct char_data *ch, char *arg, int type);
void ChangeMobShort(struct char_data *ch, char *arg, int type);
void ChangeMobLong(struct char_data *ch, char *arg, int type);
void ChangeMobDesc(struct char_data *ch, char *arg, int type);
void ChangeMobActFlags(struct char_data *ch, char *arg, int type);
void ChangeMobAffFlags(struct char_data *ch, char *arg, int type);
void UpdateMobMenu(struct char_data *ch);
void ChangeMobAlign(struct char_data *ch, char *arg, int type);
void ChangeMobHitp(struct char_data *ch, char *arg, int type);
void ChangeMobArmor(struct char_data *ch, char *arg, int type);
void ChangeMobDamplus(struct char_data *ch, char *arg, int type);
void ChangeMobDamsize(struct char_data *ch, char *arg, int type);
void ChangeMobDamnumb(struct char_data *ch, char *arg, int type);
void ChangeMobMultatt(struct char_data *ch, char *arg, int type);
void ChangeMobExp(struct char_data *ch, char *arg, int type);
void ChangeMobDpos(struct char_data *ch, char *arg, int type);
void MobHitReturn(struct char_data *ch, char *arg, int type);
void ChangeMobRace(struct char_data *ch, char *arg, int type);
void ChangeMobImmune(struct char_data *ch, char *arg, int type);
void ChangeMobResist(struct char_data *ch, char *arg, int type);
void ChangeMobSuscep(struct char_data *ch, char *arg, int type);
void ChangeMobSound(struct char_data *ch, char *arg, int type);
void ChangeMobDsound(struct char_data *ch, char *arg, int type);
void ChangeMobActFlags(struct char_data *ch, char *arg, int type)
{
int i, row, update;
char buf[255];
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
update = atoi(arg);
update--;
if(type != ENTER_CHECK) {
if(update < 0 || update > 15)
return;
i = 1<<update;
if (i != ACT_POLYSELF) { /* do not allow polyself flags */
if(IS_SET(ch->specials.mobedit->specials.act, i))
REMOVE_BIT(ch->specials.mobedit->specials.act, i);
else
SET_BIT(ch->specials.mobedit->specials.act, i);
}
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Mobile Action Flags:");
send_to_char(buf, ch);
row = 0;
for(i = 0; i < 16; i++) {
sprintf(buf, VT_CURSPOS, row + 4, ((i & 1) ? 45 : 5));
if(i & 1)
row++;
send_to_char(buf, ch);
sprintf(buf, "%-2d [%s] %s", i + 1, ((ch->specials.mobedit->specials.act & (1<<i)) ? "X" : " "), action_bits[i]);
send_to_char(buf, ch);
}
sprintf(buf, VT_CURSPOS, 20, 1);
send_to_char(buf, ch);
send_to_char("Select the number to toggle, <C/R> to return to main menu.\n\r--> ",ch);
}
void ChangeMobAffFlags(struct char_data *ch, char *arg, int type)
{
int a, row, update;
char buf[255];
long i, check=0;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
update = atoi(arg);
update--;
if(type != ENTER_CHECK) {
if(update < 0 || update > 31)
return;
i=1;
if(update>0)
for(a=1;a<=update;a++)
i*=2;
if(IS_SET(ch->specials.mobedit->specials.affected_by, i))
REMOVE_BIT(ch->specials.mobedit->specials.affected_by, i);
else
SET_BIT(ch->specials.mobedit->specials.affected_by, i);
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Mobile Affect Flags:");
send_to_char(buf, ch);
row = 0;
for(i = 0; i < 32; i++) {
sprintf(buf, VT_CURSPOS, row + 4, ((i & 1) ? 45 : 5));
if(i & 1)
row++;
send_to_char(buf, ch);
check=1;
if(i>0)
for(a=1;a<=i;a++)
check*=2;
sprintf(buf, "%-2d [%s] %s", i + 1, ((ch->specials.mobedit->specials.affected_by & (check)) ? "X" : " "), affected_bits[i]);
send_to_char(buf, ch);
}
sprintf(buf, VT_CURSPOS, 21, 1);
send_to_char(buf, ch);
send_to_char("Select the number to toggle, <C/R> to return to main menu.\n\r--> ",ch);
}
void do_medit(struct char_data *ch, char *argument, int cmd)
{
char name[20];
struct char_data *mob;
int i;
if(IS_NPC(ch))
return;
if ((IS_NPC(ch)) || (GetMaxLevel(ch)<CREATOR))
return;
if (!ch->desc) /* someone is forced to do something. can be bad! */
return; /* the ch->desc->str field will cause problems... */
for (i = 0; *(argument + i) == ' '; i++);
if (!*(argument + i)) {
send_to_char("Medit who?\n\r", ch);
return;
}
argument = one_argument(argument, name);
if (!(mob = (struct char_data *)get_char_room_vis(ch, name))) {
send_to_char("I don't see that mobile here.\n\r",ch);
return;
}
if(IS_PC(mob)) {
send_to_char("You can not mobedit players.\n\r",ch);
return;
}
if (GetMaxLevel(ch) < GOD && !IS_SET(ch->player.user_flags,CAN_MOB_EDIT)) {
send_to_char("You do not have access to edit mobiles.\n\r",ch);
return;
}
ch->specials.mobedit=mob;
ch->specials.medit = MOB_MAIN_MENU;
ch->desc->connected = CON_MOB_EDITING;
act("$n has begun editing a mobile.", FALSE, ch, 0, 0, TO_ROOM);
GET_POS(ch)=POSITION_SLEEPING;
UpdateMobMenu(ch);
}
void UpdateMobMenu(struct char_data *ch)
{
char buf[255];
struct char_data *mob;
mob = ch->specials.mobedit;
send_to_char(VT_HOMECLR, ch);
sprintf(buf, VT_CURSPOS, 1, 1);
send_to_char(buf, ch);
sprintf(buf, "Mobile Name: %s", GET_NAME(mob));
send_to_char(buf, ch);
sprintf(buf, VT_CURSPOS, 3, 1);
send_to_char(buf, ch);
send_to_char("Menu:\n\r", ch);
send_to_char(mob_edit_menu, ch);
send_to_char("--> ", ch);
}
void MobEdit(struct char_data *ch, char *arg)
{
if(ch->specials.medit == MOB_MAIN_MENU) {
if(!*arg || *arg == '\n') {
ch->desc->connected = CON_PLYNG;
act("$n has returned from editing a mobile.", FALSE, ch, 0, 0, TO_ROOM);
GET_POS(ch)=POSITION_STANDING;
return;
}
switch(atoi(arg)) {
case 0: UpdateMobMenu(ch);
return;
case 1: ch->specials.medit = CHANGE_MOB_NAME;
ChangeMobName(ch, "", ENTER_CHECK);
return;
case 2: ch->specials.medit = CHANGE_MOB_SHORT;
ChangeMobShort(ch, "", ENTER_CHECK);
return;
case 3: ch->specials.medit = CHANGE_MOB_LONG;
ChangeMobLong(ch, "", ENTER_CHECK);
return;
case 4: ch->specials.medit = CHANGE_MOB_DESC;
ChangeMobDesc(ch, "", ENTER_CHECK);
return;
case 5: ch->specials.medit = CHANGE_MOB_ACT_FLAGS;
ChangeMobActFlags(ch, "", ENTER_CHECK);
return;
case 6: ch->specials.medit = CHANGE_MOB_AFF_FLAGS;
ChangeMobAffFlags(ch, "", ENTER_CHECK);
return;
case 7: ch->specials.medit = CHANGE_MOB_ALIGN;
ChangeMobAlign(ch, "", ENTER_CHECK);
return;
case 8: ch->specials.medit = CHANGE_MOB_HITP;
ChangeMobHitp(ch, "", ENTER_CHECK);
return;
case 9: ch->specials.medit = CHANGE_MOB_ARMOR;
ChangeMobArmor(ch, "", ENTER_CHECK);
return;
case 10: ch->specials.medit = CHANGE_MOB_DAMSIZE;
ChangeMobDamsize(ch, "", ENTER_CHECK);
return;
case 11: ch->specials.medit = CHANGE_MOB_DAMNUMB;
ChangeMobDamnumb(ch, "", ENTER_CHECK);
return;
case 12: ch->specials.medit = CHANGE_MOB_DAMPLUS;
ChangeMobDamplus(ch, "", ENTER_CHECK);
return;
case 13: ch->specials.medit = CHANGE_MOB_RACE;
ChangeMobRace(ch, "", ENTER_CHECK);
return;
case 14: ch->specials.medit = CHANGE_MOB_MULTATT;
ChangeMobMultatt(ch, "", ENTER_CHECK);
return;
case 15: ch->specials.medit = CHANGE_MOB_EXP;
ChangeMobExp(ch, "", ENTER_CHECK);
return;
case 16: ch->specials.medit = CHANGE_MOB_DPOS;
ChangeMobDpos(ch, "", ENTER_CHECK);
return;
case 17: ch->specials.medit = CHANGE_MOB_RESIST;
ChangeMobResist(ch, "", ENTER_CHECK);
return;
case 18: ch->specials.medit = CHANGE_MOB_IMMUNE;
ChangeMobImmune(ch, "", ENTER_CHECK);
return;
case 19: ch->specials.medit = CHANGE_MOB_SUSCEP;
ChangeMobSuscep(ch, "", ENTER_CHECK);
return;
case 20: ch->specials.medit = CHANGE_MOB_SOUND;
ChangeMobSound(ch, "", ENTER_CHECK);
return;
case 21: ch->specials.medit = CHANGE_MOB_DSOUND;
ChangeMobDsound(ch, "", ENTER_CHECK);
return;
default: UpdateMobMenu(ch);
return;
}
}
switch(ch->specials.medit) {
case CHANGE_MOB_NAME: ChangeMobName(ch, arg, 0);
return;
case CHANGE_MOB_SHORT: ChangeMobShort(ch, arg, 0);
return;
case CHANGE_MOB_LONG: ChangeMobLong(ch, arg, 0);
return;
case CHANGE_MOB_DESC: ChangeMobDesc(ch, arg, 0);
return;
case CHANGE_MOB_ACT_FLAGS: ChangeMobActFlags(ch, arg, 0);
return;
case CHANGE_MOB_AFF_FLAGS: ChangeMobAffFlags(ch, arg, 0);
return;
case CHANGE_MOB_ALIGN: ChangeMobAlign(ch, arg, 0);
return;
case CHANGE_MOB_HITP: ChangeMobHitp(ch, arg, 0);
return;
case CHANGE_MOB_ARMOR: ChangeMobArmor(ch, arg, 0);
return;
case CHANGE_MOB_DAMSIZE: ChangeMobDamsize(ch, arg, 0);
return;
case CHANGE_MOB_DAMNUMB: ChangeMobDamnumb(ch, arg, 0);
return;
case CHANGE_MOB_DAMPLUS: ChangeMobDamplus(ch, arg, 0);
return;
case CHANGE_MOB_RACE: ChangeMobRace(ch, arg, 0);
return;
case CHANGE_MOB_MULTATT: ChangeMobMultatt(ch, arg, 0);
return;
case CHANGE_MOB_EXP: ChangeMobExp(ch, arg, 0);
return;
case CHANGE_MOB_DPOS: ChangeMobDpos(ch, arg, 0);
return;
case CHANGE_MOB_RESIST: ChangeMobResist(ch, arg, 0);
return;
case CHANGE_MOB_IMMUNE: ChangeMobImmune(ch, arg, 0);
return;
case CHANGE_MOB_SUSCEP: ChangeMobSuscep(ch, arg, 0);
return;
case CHANGE_MOB_SOUND: ChangeMobSound(ch, arg, 0);
return;
case CHANGE_MOB_DSOUND: ChangeMobDsound(ch, arg, 0);
return;
case MOB_HIT_RETURN: MobHitReturn(ch, arg, 0);
return;
default: log_string("Got to bad spot in MobEdit");
return;
}
}
void ChangeMobName(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
if(mob->player.name)
free(mob->player.name);
mob->player.name = (char *)strdup(arg);
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Current Mobile Name: %s",GET_NAME(mob));
send_to_char(buf, ch);
send_to_char("\n\r\n\rNew Mobile Name: ", ch);
return;
}
void ChangeMobShort(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
if(mob->player.short_descr)
free(mob->player.short_descr);
mob->player.short_descr = (char *)strdup(arg);
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Current Mobile Short Description: %s", mob->player.short_descr);
send_to_char(buf, ch);
send_to_char("\n\r\n\rNew Mobile Short Description: ", ch);
return;
}
void ChangeMobLong(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
if(mob->player.long_descr)
free(mob->player.long_descr);
mob->player.long_descr = (char *)strdup(arg);
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Current Mobile Long Description: %s", mob->player.long_descr);
send_to_char(buf, ch);
send_to_char("\n\r\n\rNew Mobile Long Description: ", ch);
return;
}
void ChangeMobDesc(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
if(type != ENTER_CHECK) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
mob=ch->specials.mobedit;
sprintf(buf, "Current Mobile Description:\n\r");
send_to_char(buf, ch);
send_to_char(mob->player.description, ch);
send_to_char("\n\r\n\rNew Mobile Description:\n\r", ch);
send_to_char("(Terminate with a @. Press <C/R> again to continue)\n\r", ch);
if (mob->player.description)
free(mob->player.description);
mob->player.description = NULL;
ch->desc->str = &mob->player.description;
ch->desc->max_str = MAX_STRING_LENGTH;
return;
}
void ChangeMobAlign(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
long change;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
change=atoi(arg);
if(change<-1000 || change>1000) change=0;
GET_ALIGNMENT(mob) = change;
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Current Mob Alignment: %d", GET_ALIGNMENT(mob));
send_to_char(buf, ch);
send_to_char("\n\r\n\rNew Alignment [between -1000[evil] and 1000[good]: ", ch);
return;
}
void ChangeMobHitp(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
int change;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
change=atoi(arg);
if(change<=0) change=1;
mob->points.max_hit = change;
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Current Maximum Hit Points: %d", GET_MAX_HIT(mob));
send_to_char(buf, ch);
send_to_char("\n\r\n\rNew Maximum Hit Points: ", ch);
return;
}
void ChangeMobArmor(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
signed int change;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
change=atoi(arg);
if(change<-100 || change>100) change=0;
mob->points.armor = change;
sprintf(buf,"%d %d",change,mob->points.armor);
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Current Mob Armor Class: %d", mob->points.armor);
send_to_char(buf, ch);
send_to_char("\n\r\n\rNew Mob Armor Class[between -100[armored] and 100[naked]: ", ch);
return;
}
void ChangeMobDamplus(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
int change;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
change=atoi(arg);
if(change<=0 || change>255) change=1;
mob->points.damroll = change;
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Current Mob Damroll Plus: %d", mob->points.damroll);
send_to_char(buf, ch);
send_to_char("\n\r\n\rNew Damroll Plus: ", ch);
return;
}
void ChangeMobDamsize(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
int change;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
change=atoi(arg);
if(change<=0 || change>255) change=1;
mob->specials.damsizedice = change;
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Current Mob Damage Dice Number of Sides: %d", mob->specials.damsizedice);
send_to_char(buf, ch);
send_to_char("\n\r\n\rNew Damage Dice Number of Sides: ", ch);
return;
}
void ChangeMobDamnumb(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
int change;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
change=atoi(arg);
if(change<=0) change=1;
if(change<=0 || change>255) change=1;
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Current Number of Times Damage Dice is rolled: %d", mob->specials.damnodice);
send_to_char(buf, ch);
send_to_char("\n\r\n\rNew Number of Times Damage Dice is rolled: ", ch);
return;
}
void ChangeMobMultatt(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
int change;
if(type != ENTER_CHECK) {
if(!*arg || (*arg == '\n') || (mob->specials.mobtype=='S')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
change=atoi(arg);
if(change<1) change=1;
mob->mult_att = change;
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
if(mob->specials.mobtype=='S') {
send_to_char("This is a simple mobile, and does not have a number of attacks field.\n\rHit return.\n\r\n\r",ch);
ch->specials.medit = MOB_HIT_RETURN;
MobHitReturn(ch, "", ENTER_CHECK);
return;
}
sprintf(buf, "Current Mob Number of Attacks: %d", mob->mult_att);
send_to_char(buf, ch);
send_to_char("\n\r\n\rNew Number of Attacks: ", ch);
return;
}
void MobHitReturn(struct char_data *ch, char *arg, int type)
{
if(type != ENTER_CHECK) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
send_to_char("\n\rHit return: ", ch);
return;
}
void ChangeMobExp(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
long change, expamount;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
change=atoi(arg);
if(change<0) change=0;
if(mob->specials.mobtype=='S')
GET_EXP(mob) = change;
else {
if(change>32) {
send_to_char("That expflag is too high!\n\r",ch);
ch->specials.medit = MOB_HIT_RETURN;
MobHitReturn(ch, "", ENTER_CHECK);
return;
}
mob->specials.exp_flag=change;
expamount=(DetermineExp(mob, mob->specials.exp_flag)+mob->points.gold);
sprintf(buf,"This mobile will have around %d exp the next time it is loaded.\n\r",expamount);
send_to_char(buf,ch);
ch->specials.medit = MOB_HIT_RETURN;
MobHitReturn(ch, "", ENTER_CHECK);
return;
}
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
if(mob->specials.mobtype=='S')
sprintf(buf, "Current Mob Exp: %d", GET_EXP(mob));
else
sprintf(buf, "Current Mob Expflag: %d", mob->specials.exp_flag);
send_to_char(buf, ch);
if(mob->specials.mobtype=='S')
send_to_char("\n\r\n\rNew Exp Amount: ", ch);
else
send_to_char("\n\r\n\rNew Expflag: ", ch);
return;
}
void ChangeMobDpos(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
int change;
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
mob=ch->specials.mobedit;
if(type != ENTER_CHECK) {
change=atoi(arg);
if(change<0 || change>9) change=0;
mob->specials.default_pos = change;
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
send_to_char("Positions:\n\r",ch);
send_to_char(" 0 - dead 1 - mortally wounded\n\r",ch);
send_to_char(" 2 - incapacitated 3 - stunned\n\r",ch);
send_to_char(" 4 - sleeping 5 - resting\n\r",ch);
send_to_char(" 6 - sitting 7 - fighting\n\r",ch);
send_to_char(" 8 - standing 9 - mounted\n\r\n\r\n\r",ch);
sprintf(buf, "Current Mob Default Position: %d", mob->specials.default_pos);
send_to_char(buf, ch);
send_to_char("\n\r\n\rNew Default Position: ", ch);
return;
}
void ChangeMobRace(struct char_data *ch, char *arg, int type)
{
int update,row=2,i,a=0,column;
char buf[255];
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
update = atoi(arg);
update--;
if(type != ENTER_CHECK) {
switch(ch->specials.medit) {
case CHANGE_MOB_RACE: if(update < 0 || update > MAX_RACE)
return;
else {
GET_RACE(ch->specials.mobedit) = update;
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
}
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Mobile race: %s", RaceName[GET_RACE(ch->specials.mobedit)]);
send_to_char(buf, ch);
for(i = 0; i < MAX_RACE; i++) {
a++;
if(a==1) column=5;
else if(a==2) column = 30;
else if(a==3) column = 55;
sprintf(buf, VT_CURSPOS, row + 1, column);
if(a==3) {
row++;
a=0;
}
send_to_char(buf, ch);
sprintf(buf, "%-2d %s", i + 1, RaceName[i]);
send_to_char(buf, ch);
}
sprintf(buf, VT_CURSPOS, 21, 1);
send_to_char(buf, ch);
send_to_char("Select the race number to set to, <C/R> to return to main menu.\n\r--> ",ch);
}
void ChangeMobResist(struct char_data *ch, char *arg, int type)
{
int i, a, check=0, row, update;
char buf[255];
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
update = atoi(arg);
update--;
if(type != ENTER_CHECK) {
if(update < 0 || update > 17)
return;
i=1;
if(update>0)
for(a=1;a<=update;a++)
i*=2;
if(IS_SET(ch->specials.mobedit->immune, i))
REMOVE_BIT(ch->specials.mobedit->immune, i);
else
SET_BIT(ch->specials.mobedit->immune, i);
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Mobile Resistances Flags:");
send_to_char(buf, ch);
row = 0;
for(i = 0; i < 18; i++) {
sprintf(buf, VT_CURSPOS, row + 4, ((i & 1) ? 45 : 5));
if(i & 1)
row++;
send_to_char(buf, ch);
check=1;
if(i>0)
for(a=1;a<=i;a++)
check*=2;
sprintf(buf, "%-2d [%s] %s", i + 1, ((ch->specials.mobedit->immune & (check)) ? "X" : " "), immunity_names[i]);
send_to_char(buf, ch);
}
sprintf(buf, VT_CURSPOS, 20, 1);
send_to_char(buf, ch);
send_to_char("Select the number to toggle, <C/R> to return to main menu.\n\r--> ",ch);
}
void ChangeMobImmune(struct char_data *ch, char *arg, int type)
{
int i, a, check=0, row, update;
char buf[255];
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
update = atoi(arg);
update--;
if(type != ENTER_CHECK) {
if(update < 0 || update > 17)
return;
i=1;
if(update>0)
for(a=1;a<=update;a++)
i*=2;
if(IS_SET(ch->specials.mobedit->M_immune, i))
REMOVE_BIT(ch->specials.mobedit->M_immune, i);
else
SET_BIT(ch->specials.mobedit->M_immune, i);
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Mobile Immunities Flags:");
send_to_char(buf, ch);
row = 0;
for(i = 0; i < 18; i++) {
sprintf(buf, VT_CURSPOS, row + 4, ((i & 1) ? 45 : 5));
if(i & 1)
row++;
send_to_char(buf, ch);
check=1;
if(i>0)
for(a=1;a<=i;a++)
check*=2;
sprintf(buf, "%-2d [%s] %s", i + 1, ((ch->specials.mobedit->M_immune & (check)) ? "X" : " "), immunity_names[i]);
send_to_char(buf, ch);
}
sprintf(buf, VT_CURSPOS, 20, 1);
send_to_char(buf, ch);
send_to_char("Select the number to toggle, <C/R> to return to main menu.\n\r--> ",ch);
}
void ChangeMobSuscep(struct char_data *ch, char *arg, int type)
{
int i, a, check=0, row, update;
char buf[255];
if(type != ENTER_CHECK)
if(!*arg || (*arg == '\n')) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
update = atoi(arg);
update--;
if(type != ENTER_CHECK) {
if(update < 0 || update > 17)
return;
i=1;
if(update>0)
for(a=1;a<=update;a++)
i*=2;
if(IS_SET(ch->specials.mobedit->susc, i))
REMOVE_BIT(ch->specials.mobedit->susc, i);
else
SET_BIT(ch->specials.mobedit->susc, i);
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
sprintf(buf, "Mobile Susceptibilities Flags:");
send_to_char(buf, ch);
row = 0;
for(i = 0; i < 18; i++) {
sprintf(buf, VT_CURSPOS, row + 4, ((i & 1) ? 45 : 5));
if(i & 1)
row++;
send_to_char(buf, ch);
check=1;
if(i>0)
for(a=1;a<=i;a++)
check*=2;
sprintf(buf, "%-2d [%s] %s", i + 1, ((ch->specials.mobedit->susc & (check)) ? "X" : " "), immunity_names[i]);
send_to_char(buf, ch);
}
sprintf(buf, VT_CURSPOS, 20, 1);
send_to_char(buf, ch);
send_to_char("Select the number to toggle, <C/R> to return to main menu.\n\r--> ",ch);
}
void ChangeMobSound(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
if(type != ENTER_CHECK) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
mob=ch->specials.mobedit;
if(mob->specials.mobtype!='L') {
send_to_char("Please use a base mobile that already has sound, this one does not.\n\r",ch);
ch->specials.medit = MOB_HIT_RETURN;
MobHitReturn(ch, "", ENTER_CHECK);
return;
}
sprintf(buf, "Current Mobile Sound:\n\r");
send_to_char(buf, ch);
send_to_char(mob->player.sounds, ch);
send_to_char("\n\r\n\rNew Mobile Sound:\n\r", ch);
send_to_char("(Terminate with a @. Press <C/R> again to continue)\n\r", ch);
if (mob->player.sounds)
free(mob->player.sounds);
mob->player.sounds = NULL;
ch->desc->str = &mob->player.sounds;
ch->desc->max_str = MAX_STRING_LENGTH;
return;
}
void ChangeMobDsound(struct char_data *ch, char *arg, int type)
{
char buf[255];
struct char_data *mob;
if(type != ENTER_CHECK) {
ch->specials.medit = MOB_MAIN_MENU;
UpdateMobMenu(ch);
return;
}
sprintf(buf, VT_HOMECLR);
send_to_char(buf, ch);
mob=ch->specials.mobedit;
if(mob->specials.mobtype!='L') {
send_to_char("Please use a base mobile that already has sound, this one does not.\n\r",ch);
ch->specials.medit = MOB_HIT_RETURN;
MobHitReturn(ch, "", ENTER_CHECK);
return;
}
sprintf(buf, "Current Mobile Distant Sound:\n\r");
send_to_char(buf, ch);
send_to_char(mob->player.distant_snds, ch);
send_to_char("\n\r\n\rNew Mobile Distant Sound:\n\r", ch);
send_to_char("(Terminate with a @. Press <C/R> again to continue)\n\r", ch);
if (mob->player.distant_snds)
free(mob->player.distant_snds);
mob->player.distant_snds = NULL;
ch->desc->str = &mob->player.distant_snds;
ch->desc->max_str = MAX_STRING_LENGTH;
return;
}