/***************************************************************************
* Emud 2.2 by Igor van den Hoven, Michiel Lange, and Martin Bethlehem. *
* *
* MrMud 1.4 by David Bills and Dug Michael. *
* *
* Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* Original Diku Mud copyright (C) 1990 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeld, Tom Madsen, and Katje Nyboe. *
***************************************************************************/
/*
This file was part of eMud - deprecated in Mud20, but left intact - Kregor
*/
#include "emud.h"
bool clanfounder;
bool get_bitvector_value(char *name, int *number, char *allowed)
{
int cnt;
push_call("get_bitvector_value(%p,%p,%p)",name,number,allowed);
if (allowed == NULL && is_number(name))
{
*number = atol(name);
pop_call();
return TRUE;
}
if (is_name_short(allowed, name))
{
for (cnt = 0 ; cnt < MAX_BITVECTOR ; cnt++)
{
if (is_name(name, bitvector_table[cnt].name))
{
*number = bitvector_table[cnt].value;
pop_call();
return TRUE;
}
}
}
*number = -1;
pop_call();
return FALSE;
}
void list_bitvectors(CHAR_DATA *ch,char *prefix)
{
int cnt;
char buf[81],bigBuf[MAX_STRING_LENGTH];
push_call("list_bitvectors(%p,%p)",ch,prefix);
bigBuf[0] = '\0';
for (cnt = 0 ; cnt < MAX_BITVECTOR ; cnt++)
{
if (is_name_short(prefix, bitvector_table[cnt].name))
{
sprintf(buf," %s\n\r",bitvector_table[cnt].name);
strcat(bigBuf,buf);
}
}
if (bigBuf[0] == '\0')
{
sprintf(buf,"There are no bitvectors starting with '%s'.\n\r",prefix);
send_to_char(buf,ch);
}
else
{
send_to_char(bigBuf,ch);
}
pop_call();
return;
}
bool do_castle_mstat( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char tmp[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
char buf3[MAX_STRING_LENGTH];
char bld[10], dim[10];
CHAR_DATA *victim;
OBJ_DATA *wield;
push_call("do_castle_mstat(%p,%p)",ch,argument);
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char( "Mstat whom?\n\r", ch );
pop_call();
return FALSE;
}
if ((victim = get_char_room(ch, arg)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return FALSE;
}
if (!IS_NPC(victim))
{
send_to_char( "Don't be silly.\n\r", ch );
pop_call();
return FALSE;
}
if (victim->pIndexData->creator_pvnum != ch->pcdata->pvnum)
{
send_to_char( "You can't stat them!\n\r", ch );
pop_call();
return FALSE;
}
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
tmp[0] = '\0';
ch_printf(ch, "%s Name: %s%s\n\r" , dim, bld, victim->name);
ch_printf(ch, "%s Short: %s%s\n\r" , dim, bld, victim->short_descr);
ch_printf(ch, "%s Long: %s%s\n\r" , dim, bld, victim->long_descr);
sprintf(buf1, "%s Vnum: %s%11u " , dim, bld, victim->pIndexData->vnum);
sprintf(buf2, "%s Level: %s%11d " , dim, bld, victim->level);
sprintf(buf3, "%s Room: %s%11u\n\r", dim, bld, victim->in_room->vnum);
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%s Alignment: %s%11d " , dim, bld, victim->alignment);
sprintf(buf2, "%s Armor Class: %s%11d " , dim, bld, 0 - (mob_armor(victim) + victim->level*4 - 100));
sprintf(buf3, "%s Gold: %s%11d\n\r", dim, bld, victim->gold);
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%s Hitroll: %s%11d " , dim, bld, GET_HITROLL(victim));
sprintf(tmp, "%dd%d+%d", victim->npcdata->damnodice, victim->npcdata->damsizedice, GET_DAMROLL(victim) + victim->npcdata->damplus);
sprintf(buf2, "%s Damroll: %s%11s " , dim, bld, tmp);
if ((wield = get_eq_char(victim, WEAR_WIELD)) != NULL && wield->item_type == ITEM_WEAPON)
{
sprintf(tmp, "%dd%d", wield->value[1], wield->value[2]);
}
else
{
sprintf(tmp, "none");
}
sprintf(buf3, "%s Weapon: %s%11s\n\r", dim, bld, tmp);
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(tmp, "%d/%d", victim->hit, victim->max_hit);
sprintf(buf1, "%s Hp: %s%11s " , dim, bld, tmp);
sprintf(tmp, "%d/%d", victim->mana, victim->max_mana);
sprintf(buf2, "%s Mana: %s%11s " , dim, bld, tmp);
sprintf(tmp, "%d/%d", victim->move, victim->max_move);
sprintf(buf3, "%s Move: %s%11s\n\r", dim, bld, tmp);
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%s Race: %s%11s " , dim, bld, race_table[victim->race].race_name);
sprintf(buf2, "%s Sex: %s%11s " , dim, bld, victim->sex <= 0 ? "Neutral" : victim->sex == 1 ? "Male" : "Female");
sprintf(buf3, "%s Position: %s%11s\n\r", dim, bld, victim->position == 8 ? "Standing" : victim->position == 7 ? "fighting" : victim->position == 6 ? "sitting" : victim->position == 5 ? "resting" : victim->position == 4 ? "sleeping" : "dying");
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%sCarry Number: %s%11d " , dim, bld, victim->carry_number);
sprintf(buf2, "%sCarry Weight: %s%11d " , dim, bld, victim->carry_weight);
sprintf(buf3, "%sSaving Spell: %s%11d\n\r", dim, bld, GET_SAVING_THROW(victim));
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
ch_printf(ch, "%sAction Flags: %s%s\n\r", dim, bld, flag_string(victim->act, act_flags));
ch_printf(ch, "%sAffect Flags: %s%s\n\r", dim, bld, affect_bit_name(victim->affected_by));
if (IS_SET(victim->pIndexData->act, ACT_BODY))
{
int cnt;
char buf[MAX_STRING_LENGTH];
strcpy(buf, "");
for (cnt = 0 ; cnt < MAX_BODY ; cnt++)
{
if (IS_SET(victim->pIndexData->body_parts, 1<<cnt))
{
strcat( buf, body_table[cnt].name);
strcat( buf, " ");
}
}
ch_printf(ch, "%s Body Parts: %s%s\n\r", dim, bld, buf);
strcpy(buf, "");
for (cnt = 0; cnt < MAX_BODY ; cnt++)
{
if (IS_SET(victim->pIndexData->attack_parts, 1<<cnt))
{
strcat( buf, body_table[cnt].name);
strcat( buf, " ");
}
}
ch_printf(ch, "%sAttack Parts: %s%s\n\r", dim, bld, buf);
}
pop_call();
return TRUE;
}
bool do_castle_ostat( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
char bld [10], dim [10];
OBJ_DATA *obj;
push_call("do_castle_ostat(%p,%p)",ch,argument);
one_argument(argument, arg);
if (arg[0] == '\0')
{
send_to_char( "Syntax: castle ostat <name>\n\r", ch );
pop_call();
return FALSE;
}
if ((obj = get_obj_here(ch, arg)) == NULL)
{
send_to_char( "You do not see that here.\n\r", ch );
pop_call();
return FALSE;
}
if (obj->pIndexData->creator_pvnum != ch->pcdata->pvnum)
{
send_to_char("You can't ostat that.\n\r", ch );
pop_call();
return FALSE;
}
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
ch_printf(ch, "%s Name:%s %s\n\r", dim, bld, obj->name);
ch_printf(ch, "%s Short:%s %s\n\r", dim, bld, obj->short_descr);
ch_printf(ch, "%s Long:%s %s\n\r", dim, bld, obj->long_descr);
ch_printf(ch, "%s Type:%s %s\n\r", dim, bld, item_type_name(obj));
ch_printf(ch, "%sItemflag:%s %s\n\r", dim, bld, flag_string(obj->extra_flags, o_flags));
switch (obj->item_type)
{
case ITEM_FOUNTAIN:
ch_printf(ch, "%s Liquid:%s %s\n\r", dim, bld, liq_table[(obj->value[2])].liq_name);
break;
case ITEM_CONTAINER:
ch_printf(ch, "%s Carry:%s %d\n\r", dim, bld, obj->value[0]);
ch_printf(ch, "%s Lid:%s %s\n\r", dim, bld, flag_string(obj->value[1], cont_flags));
ch_printf(ch, "%s Key:%s %s\n\r", dim, bld, obj->value[2] < 1 ? "none" : get_obj_index(obj->value[2]) ? get_obj_index(obj->value[2])->short_descr : "unknown");
break;
case ITEM_FURNITURE:
ch_printf(ch, "%s Size:%s %d\n\r", dim, bld, obj->value[0]);
ch_printf(ch, "%s Poses:%s %s\n\r", dim, bld, flag_string(obj->value[2], f_flags));
ch_printf(ch, "%s Regen:%s %d\n\r", dim, bld, obj->value[3]);
break;
}
pop_call();
return TRUE;
}
void do_castle_rstat( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
CHAR_DATA *rch;
char buf1[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
char buf3[MAX_STRING_LENGTH];
char bld [10], dim [10];
int door;
push_call("do_castle_rstat(%p,%p)",ch,argument);
one_argument(argument, argument);
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
ch_printf(ch, "%s Name:%s %s\n\r", dim, bld, ch->in_room->name);
ch_printf(ch, "%s Area:%s %s\n\r", dim, bld, ch->in_room->area->name);
ch_printf(ch, "%s Vnum:%s %u\n\r", dim, bld, ch->in_room->vnum);
ch_printf(ch, "%s Sector:%s %s\n\r", dim, bld, broken_bits(ch->in_room->sector_type, "SECT_", TRUE));
ch_printf(ch, "%s Room flags: %s%s\n\r", dim, bld, flag_string(ch->in_room->room_flags, r_flags));
if (ch->in_room->first_extradesc != NULL )
{
EXTRA_DESCR_DATA *ed;
sprintf(buf1, "%sExtra Descs:%s ", dim, bld);
sprintf(buf2, "%s,%s ", dim, bld);
for (ed = ch->in_room->first_extradesc ; ed ; ed = ed->next)
{
strcat(buf1, ed->keyword);
if (ed->next)
{
strcat(buf1, buf2);
}
}
ch_printf(ch, "%s\n\r", buf1);
}
sprintf( buf1, "%s Characters:%s ", dim, bld);
sprintf( buf2, "%s,%s ", dim, bld);
for (rch = ch->in_room->first_person ; rch ; rch = rch->next_in_room)
{
if (can_see(ch, rch))
{
if (str_suffix(" ", buf1))
{
strcat(buf1, buf2);
}
one_argument_nolower(rch->name, buf3);
strcat(buf1, buf3);
}
}
ch_printf(ch, "%s\n\r", buf1);
if (ch->in_room->first_content)
{
sprintf(buf1, "%s Objects:%s ", dim, bld);
sprintf(buf2, "%s,%s ", dim, bld);
for (obj = ch->in_room->first_content ; obj ; obj = obj->next_content)
{
if (can_see_obj(ch, obj))
{
if (strlen(buf1) > 33)
{
strcat(buf1, buf2);
}
one_argument_nolower(obj->name, buf3);
strcat(buf1, buf3);
}
}
ch_printf(ch, "%s\n\r", buf1);
}
for (door = 0 ; door <= 5 ; door++)
{
EXIT_DATA *pexit;
if ((pexit = ch->in_room->exit[door]) != NULL)
{
sprintf(buf1,"%s %5s:%s %-10s", dim, capitalize(dir_name[door]), bld, room_index[pexit->to_room] ? str_resize(room_index[pexit->to_room]->name, argument, -10) : "null");
sprintf(buf2,"%s Key:%s %-10s", dim, bld, pexit->key < 1 ? "none" : get_obj_index(pexit->key) ? str_resize(get_obj_index(pexit->key)->short_descr, argument, -10) : "unknown");
sprintf(buf3,"%s Flags:%s %s", dim, bld, flag_string(pexit->exit_info, exit_flags));
ch_printf(ch, "%s%s%s\n\r", buf1, buf2, buf3);
}
}
pop_call();
return;
}
void do_castle_entrance( CHAR_DATA *ch, char *argument )
{
CASTLE_DATA *castle;
EXIT_DATA *pexit;
RESET_DATA *reset;
ROOM_INDEX_DATA *pRoomIndex;
char buf[81], dim[10], bld[10];
int vnum, door, argn, cost;
push_call("do_castle_entrance(%p,%p)",ch,argument);
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
castle = ch->pcdata->castle;
if (!IS_SET(ch->in_room->room_flags, ROOM_IS_CASTLE))
{
switch(ch->in_room->sector_type)
{
case SECT_FIELD:
case SECT_FOREST:
case SECT_HILLS:
case SECT_MOUNTAIN:
case SECT_DESERT:
if (IS_SET(ch->in_room->room_flags, ROOM_NO_CASTLE)
|| IS_SET(ch->in_room->area->flags, AFLAG_NOCASTLE))
{
send_to_char("You cannot build a castle here.\n\r",ch);
pop_call();
return;
}
break;
default:
send_to_char("Alas, you cannot build a castle here.\n\r",ch);
pop_call();
return;
break;
}
}
else if (castle == NULL)
{
send_to_char("You cannot build a castle in a castle.\n\r",ch);
pop_call();
return;
}
if (castle != NULL)
{
/*
Debug info for lost entrance.
*/
pRoomIndex = room_index[castle->entrance];
if (pRoomIndex == NULL
|| ch->pcdata->pvnum != pRoomIndex->creator_pvnum
|| !IS_SET(pRoomIndex->room_flags, ROOM_IS_ENTRANCE)
|| !IS_SET(pRoomIndex->room_flags, ROOM_IS_CASTLE))
{
for (vnum = ROOM_VNUM_CASTLE ; vnum < MAX_VNUM ; vnum++)
{
if ((pRoomIndex = room_index[vnum]) == NULL)
{
continue;
}
if (ch->pcdata->pvnum == pRoomIndex->creator_pvnum
&& IS_SET(pRoomIndex->room_flags, ROOM_IS_ENTRANCE)
&& IS_SET(pRoomIndex->room_flags, ROOM_IS_CASTLE))
{
break;
}
}
if (vnum >= MAX_VNUM || room_index[vnum] == NULL)
{
send_to_char("You no longer have a castle entrance. Contact the immortals.\n\r", ch);
pop_call();
return;
}
ch_printf(ch, "Your entrance is located at vnum %d. Contact the immortals.\n\r", vnum);
pop_call();
return;
}
send_to_char("You already have a castle entrance!\n\r",ch);
pop_call();
return;
}
if (!get_bitvector_value(argument, &argn, "DIR_"))
{
char exit_buf[MAX_STRING_LENGTH];
for (door = 0, exit_buf[0] = '\0' ; door <= 5 ; door++)
{
if (ch->in_room->exit[door] == NULL)
{
sprintf(buf, "%s%s%s|", bld, broken_bits(door, "DIR_", TRUE), dim);
strcat(exit_buf, buf);
}
}
if (exit_buf[0] == '\0')
{
send_to_char( "There are no available exits here to create a castle entrance.\n\r", ch);
}
else
{
exit_buf[strlen(exit_buf)-1] = '\0';
ch_printf(ch, "%sSyntax:%s castle entrance %s<%s>\n\r", dim, bld, dim, exit_buf);
}
pop_call();
return;
}
if (ch->in_room->exit[argn] != NULL)
{
send_to_char("You cannot create a castle entrance in that direction.\n\r",ch);
pop_call();
return;
}
/*
Check for random exit reset - Scandum 02-03-2002
*/
for (reset = ch->in_room->area->first_reset ; reset ; reset = reset->next)
{
if (!is_room_reset(reset, ch->in_room))
{
continue;
}
if (reset->command == 'R')
{
break;
}
}
if (reset)
{
send_to_char("Alas, you cannot build a castle here.\n\r",ch);
pop_call();
return;
}
cost = haggle(ch, COST_OF_ENTRANCE) * 1000;
if (ch->gold < cost)
{
ch_printf(ch, "It will cost you %s gold coins to build a room.\n\r", tomoney(cost));
pop_call();
return;
}
for (vnum = ROOM_VNUM_CASTLE ; room_index[vnum] != NULL && vnum < MAX_VNUM ; vnum++);
{
if (vnum >= MAX_VNUM)
{
send_to_char("You cannot create an entrance. Contact the immortals.\n\r",ch);
pop_call();
return;
}
}
/*
create player's castle data
*/
ALLOCMEM(ch->pcdata->castle, CASTLE_DATA, 1);
ch->pcdata->castle->entrance = 0;
ch->pcdata->castle->door_room = -1;
ch->pcdata->castle->door_dir = -1;
ch->pcdata->castle->has_backdoor = FALSE;
ch->pcdata->castle->cost = 0;
ch->pcdata->castle->num_rooms = 0;
ch->pcdata->castle->num_mobiles = 0;
ch->pcdata->castle->num_objects = 0;
castle = ch->pcdata->castle;
ch_printf(ch, "A contractor comes and takes %s gold.\n\r", tomoney(cost));
/*
create room
*/
sprintf(buf, "The Castle of %s", ch->name);
create_room(vnum);
pRoomIndex = room_index[vnum];
pRoomIndex->name = STRALLOC( buf );
pRoomIndex->area = room_index[ROOM_VNUM_CASTLE]->area;
pRoomIndex->vnum = vnum;
pRoomIndex->creator_pvnum = ch->pcdata->pvnum;
pRoomIndex->description = STRALLOC( "This room is bare of all ornamentation and appears to be relatively new." );
pRoomIndex->room_flags = ROOM_IS_CASTLE|ROOM_SAFE|ROOM_IS_ENTRANCE;
pRoomIndex->sector_type = SECT_INSIDE;
for (door = 0 ; door < MAX_LAST_LEFT ; door++)
{
pRoomIndex->last_left[door] = STRDUPE(str_empty);
}
create_exit(pRoomIndex, rev_dir[argn]);
pexit = pRoomIndex->exit[rev_dir[argn]];
RESTRING(pexit->description, buf);
pexit->vnum = ch->in_room->vnum;
pexit->to_room = ch->in_room->vnum;
create_exit(ch->in_room, argn);
pexit = ch->in_room->exit[argn];
RESTRING(pexit->description, buf);
pexit->pvnum = ch->pcdata->pvnum;
pexit->to_room = pRoomIndex->vnum;
if (vnum > pRoomIndex->area->hi_r_vnum)
{
pRoomIndex->area->hi_r_vnum = vnum;
}
if (vnum < pRoomIndex->area->low_r_vnum)
{
pRoomIndex->area->low_r_vnum = vnum;
}
act( "Builders come, work, take a break, and leave.", ch, NULL, NULL, TO_ROOM );
ch_printf(ch, "Builders come and build a room %swards.\n\r", dir_name[argn]);
ch->gold -= cost;
castle->cost += cost/1000;
castle->num_rooms += 1;
castle->entrance = vnum;
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
void do_castle_connect( CHAR_DATA *ch, char *argument )
{
CASTLE_DATA *castle;
EXIT_DATA *pexit, *castleexit;
char buf[81], dim[10], bld[10];
int cost, argn;
push_call("do_castle_connect(%p,%p)",ch,argument);
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
castle = ch->pcdata->castle;
if (!strcasecmp(argument, "clear"))
{
castle->door_room = -1;
castle->door_dir = -1;
send_to_char("Clearing first connection.\n\r", ch);
pop_call();
return;
}
/*
Check for backdoors
Only allow if they already defined first connect - Scandum
*/
if (ch->in_room->creator_pvnum != ch->pcdata->pvnum)
{
if (castle->door_room == -1)
{
send_to_char("You must have defined the first connect to create a backdoor.\n\r", ch);
pop_call();
return;
}
if (castle->has_backdoor && !clanfounder)
{
send_to_char("You can only have one back door.\n\r",ch);
pop_call();
return;
}
if (clanfounder)
{
cost = COST_OF_CLANDOOR * 1000;
if (ch->pcdata->clan->coffers < cost)
{
ch_printf(ch, "It will cost you %s gold coins to build a clan-wide back door.\n\r", tomoney(cost));
pop_call();
return;
}
}
else
{
cost = haggle(ch, COST_OF_BACKDOOR) * 1000;
if (ch->gold < cost)
{
ch_printf(ch, "It will cost you %s gold coins to build a back door.\n\r", tomoney(cost));
pop_call();
return;
}
}
}
else
{
cost = haggle(ch, COST_OF_DOOR) * 1000;
if (ch->gold < cost)
{
ch_printf(ch, "It will cost you %s gold coins to build a connection.\n\r", tomoney(cost));
pop_call();
return;
}
}
if (!get_bitvector_value(argument, &argn, "DIR_") && castle->door_room == -1)
{
int door;
char exit_buf[MAX_STRING_LENGTH];
for (door = 0, exit_buf[0] = '\0' ; door <= 5 ; door++)
{
if (ch->in_room->exit[door] == NULL)
{
sprintf(buf, "%s%s%s|", bld, broken_bits(door, "DIR_", TRUE), dim);
strcat(exit_buf, buf);
}
}
if (exit_buf[0] == '\0')
{
send_to_char( "There are no available exits here to create a castle connection.\n\r", ch);
}
else
{
exit_buf[strlen(exit_buf)-1] = '\0';
ch_printf(ch, "%sSyntax:%s castle connect %s<%s>\n\r", dim, bld, dim, exit_buf);
}
pop_call();
return;
}
/*
default direction is opposite of first one
*/
if (castle->door_room != -1 && argn == -1)
{
argn = rev_dir[castle->door_dir];
}
if (ch->in_room->exit[argn] != NULL)
{
send_to_char("You cannot create a connection in that direction.\n\r",ch);
pop_call();
return;
}
if (!IS_SET(ch->in_room->room_flags, ROOM_IS_CASTLE))
{
switch(ch->in_room->sector_type)
{
case SECT_FIELD:
case SECT_FOREST:
case SECT_HILLS:
case SECT_MOUNTAIN:
case SECT_DESERT:
if (IS_SET(ch->in_room->room_flags, ROOM_NO_CASTLE)
|| IS_SET(ch->in_room->area->flags, AFLAG_NOCASTLE))
{
send_to_char("You cannot build a back door in this room.\n\r",ch);
pop_call();
return;
}
break;
default:
send_to_char("You cannot build a back door in this room.\n\r",ch);
pop_call();
return;
break;
}
}
if (castle->door_room == -1)
{
castle->door_room = ch->in_room->vnum;
castle->door_dir = argn;
send_to_char("Now you have to go define the other side of the connection.\n\r",ch);
pop_call();
return;
}
if (room_index[castle->door_room] == NULL
|| room_index[castle->door_room]->exit[castle->door_dir] != NULL
|| room_index[castle->door_room]->creator_pvnum != ch->pcdata->pvnum)
{
send_to_char("Your first connection became corrupted. Clearing first connection.\n\r",ch);
castle->door_room = -1;
castle->door_dir = -1;
pop_call();
return;
}
if (ch->in_room->creator_pvnum != ch->pcdata->pvnum)
{
if (IS_SET(room_index[castle->door_room]->room_flags, ROOM_IS_ENTRANCE))
{
send_to_char("You cannot build a back door from your castle entrance.\n\r", ch);
pop_call();
return;
}
if (IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE))
{
send_to_char("You cannot build a back door from an entrance.\n\r", ch);
pop_call();
return;
}
}
/*
other rooms exit points to room
*/
create_exit(room_index[castle->door_room], castle->door_dir);
pexit = room_index[castle->door_room]->exit[castle->door_dir];
pexit->pvnum = ch->pcdata->pvnum;
pexit->vnum = ch->in_room->vnum;
pexit->to_room = ch->in_room->vnum;
castleexit = pexit;
/*
room exit points to other room
*/
if (room_index[ch->in_room->vnum]->creator_pvnum == ch->pcdata->pvnum)
{
create_exit(ch->in_room, argn);
pexit = ch->in_room->exit[argn];
pexit->pvnum = ch->pcdata->pvnum;
pexit->vnum = castle->door_room;
pexit->to_room = castle->door_room;
castleexit = pexit;
}
act("Builders come, take a break, and leave.",ch,NULL,NULL,TO_ROOM);
/*
modify the appropriate character and castle data
*/
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
castle->door_room = -1;
castle->door_dir = -1;
if (ch->in_room->creator_pvnum != ch->pcdata->pvnum)
{
if (!clanfounder)
{
SET_BIT(castleexit->exit_info, EX_BACKDOOR);
castle->has_backdoor = TRUE;
ch->gold -= cost;
castle->cost += cost/1000;
send_to_char("The back door has been made.\n\r",ch);
}
else
{
SET_BIT(castleexit->exit_info, EX_CLAN_BACKDOOR);
ch->pcdata->clan->num_backdoors++;
ch->pcdata->clan->coffers -= cost;
ch_printf(ch, "You just made a clan-wide backdoor for %s.\n\r", ch->pcdata->clan->name);
}
}
else
{
ch->gold -= cost;
castle->cost += cost/1000;
send_to_char("The door has been made.\n\r",ch);
}
pop_call();
return;
}
void do_castle_rcreate( CHAR_DATA *ch, char *argument )
{
CASTLE_DATA *castle;
EXIT_DATA *pexit;
ROOM_INDEX_DATA *pRoomIndex;
char buf[81], dim[10], bld[10];
int vnum, door, cost, argn;
push_call("do_castle_rcreate(%p,%p)",ch,argument);
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
castle = ch->pcdata->castle;
if (!get_bitvector_value(argument, &argn, "DIR_"))
{
char exit_buf[MAX_STRING_LENGTH];
for (door = 0, exit_buf[0] = '\0' ; door <= 5 ; door++)
{
if (ch->in_room->exit[door] == NULL)
{
sprintf(buf, "%s%s%s|", bld, broken_bits(door, "DIR_", TRUE), dim);
strcat(exit_buf, buf);
}
}
if (exit_buf[0] == '\0')
{
send_to_char( "There are no available exits here to create a room.\n\r", ch);
}
else
{
exit_buf[strlen(exit_buf)-1] = '\0';
ch_printf(ch, "%sSyntax:%s castle rcreate %s<%s>\n\r", dim, bld, dim, exit_buf);
}
pop_call();
return;
}
if (ch->in_room->exit[argn] != NULL)
{
send_to_char("You cannot create a room in that direction.\n\r",ch);
pop_call();
return;
}
cost = (haggle(ch, COST_OF_CREATE)) * 1000;
if (ch->gold < cost)
{
ch_printf(ch, "It will cost you %s gold coins to build a room.\n\r", tomoney(cost));
pop_call();
return;
}
if (castle != NULL && castle->num_rooms >= 20)
{
send_to_char("You cannot make any more rooms.\n\r",ch);
pop_call();
return;
}
/* find an empty vnum */
for (vnum = ROOM_VNUM_CASTLE ; room_index[vnum] != NULL && vnum < MAX_VNUM ; vnum++);
{
if (vnum >= MAX_VNUM)
{
send_to_char("I'm sorry, you can't create a room, tell the Implementors.\n\r",ch);
pop_call();
return;
}
}
ch_printf(ch, "A contractor comes and takes %s gold coins.\n\r", tomoney(cost));
sprintf(buf, "The Castle of %s", ch->name);
create_room(vnum);
pRoomIndex = room_index[vnum];
pRoomIndex->name = STRALLOC(buf);
pRoomIndex->area = room_index[ROOM_VNUM_CASTLE]->area;
pRoomIndex->vnum = vnum;
pRoomIndex->creator_pvnum = ch->pcdata->pvnum;
pRoomIndex->description = STRALLOC( "This room is bare of all ornamentation and appears to be relatively new." );
pRoomIndex->room_flags = ROOM_IS_CASTLE;
pRoomIndex->sector_type = SECT_INSIDE;
for (door = 0 ; door < MAX_LAST_LEFT ; door++)
{
pRoomIndex->last_left[door] = STRDUPE(str_empty);
}
create_exit(pRoomIndex, rev_dir[argn]);
pexit = pRoomIndex->exit[rev_dir[argn]];
RESTRING(pexit->description, buf);
pexit->vnum = ch->in_room->vnum;
pexit->to_room = ch->in_room->vnum;
create_exit(ch->in_room, argn);
pexit = ch->in_room->exit[argn];
RESTRING(pexit->description, buf);
pexit->pvnum = ch->pcdata->pvnum;
pexit->vnum = pRoomIndex->vnum;
pexit->to_room = pRoomIndex->vnum;
if (vnum > pRoomIndex->area->hi_r_vnum)
{
pRoomIndex->area->hi_r_vnum = vnum;
}
if (vnum < pRoomIndex->area->low_r_vnum)
{
pRoomIndex->area->low_r_vnum = vnum;
}
act("Builders come, work, take a break, and leave.",ch,NULL,NULL,TO_ROOM);
ch_printf(ch, "Builders come and build a room %swards.\n\r", dir_name[argn]);
ch->gold -= cost;
castle->cost += cost / 1000;
castle->num_rooms += 1;
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
void do_castle_mcreate( CHAR_DATA *ch )
{
AREA_DATA *pArea;
MOB_INDEX_DATA *pMobIndex;
CHAR_DATA *mob;
RESET_DATA *pReset;
int vnum, cost;
push_call("do_castle_mcreate(%p)",ch);
cost = haggle(ch, COST_OF_CREATE) * 1000;
if (ch->gold < cost)
{
ch_printf(ch, "It will cost you %s gold coins to create a mobile.\n\r", tomoney(cost));
pop_call();
return;
}
if (ch->pcdata->castle->num_mobiles >= 20)
{
send_to_char("You cannot create more than 20 mobiles.\n\r", ch);
pop_call();
return;
}
for (vnum = ROOM_VNUM_CASTLE ; get_mob_index(vnum) != NULL && vnum < MAX_VNUM ; vnum++);
{
if (vnum >= MAX_VNUM)
{
send_to_char("You can't create a mobile, tell the Immortals.\n\r",ch);
pop_call();
return;
}
}
ALLOCMEM( pMobIndex, MOB_INDEX_DATA, 1);
pMobIndex->creator_pvnum = ch->pcdata->pvnum;
pMobIndex->vnum = vnum;
pMobIndex->area = ch->in_room->area;
pMobIndex->player_name = STRALLOC("golem wafer");
pMobIndex->short_descr = STRALLOC("a wafer golem");
pMobIndex->long_descr = STRALLOC("A wafer golem stands here, looking useless.");
pMobIndex->description = STRALLOC("The wafer golem looks *very* dumb.");
pMobIndex->act = ACT_SENTINEL;
pMobIndex->affected_by = 0;
pMobIndex->pShop = NULL;
pMobIndex->alignment = ch->alignment;
pMobIndex->level = 0;
pMobIndex->body_parts = 0;
pMobIndex->attack_parts = 0;
pMobIndex->hitnodice = 1;
pMobIndex->hitsizedice = 1;
pMobIndex->hitplus = 0;
pMobIndex->damnodice = 1;
pMobIndex->damsizedice = 1;
pMobIndex->damplus = 0;
pMobIndex->gold = 0;
pMobIndex->race = ch->race;
pMobIndex->position = POS_STANDING;
pMobIndex->sex = SEX_NEUTRAL;
pMobIndex->first_prog = NULL;
pMobIndex->last_prog = NULL;
mob_index[vnum] = pMobIndex;
if (vnum > pMobIndex->area->hi_m_vnum)
{
pMobIndex->area->hi_m_vnum = vnum;
}
if (vnum < pMobIndex->area->low_m_vnum)
{
pMobIndex->area->low_m_vnum = vnum;
}
mud->top_mob_index++;
/* make the mobile reset in this room */
pReset = make_reset('M', vnum, 100, ch->in_room->vnum);
pArea = room_index[ROOM_VNUM_CASTLE]->area;
LINK(pReset, pArea->first_reset, pArea->last_reset, next, prev);
mob = create_mobile( pMobIndex );
mob->reset = pReset;
pReset->mob = mob;
char_to_room( mob, ch->in_room->vnum );
act("A being takes form in the center of the room.",ch,NULL,NULL,TO_ROOM);
act("A being takes form in the center of the room.",ch,NULL,NULL,TO_CHAR);
ch->gold -= cost;
ch->pcdata->castle->cost += cost/1000;
ch->pcdata->castle->num_mobiles += 1;
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
void do_castle_screate( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
int cost;
push_call("do_castle_screate(%p)",ch);
cost = haggle(ch, COST_OF_CREATE) * 1000;
if (argument[0] == '\0')
{
send_to_char("Syntax: castle screate <mob>\n\r", ch);
pop_call();
return;
}
if (ch->gold < cost)
{
ch_printf(ch, "It will cost you %s gold coins to create a shop.\n\r", tomoney(cost));
pop_call();
return;
}
if ((victim = get_char_room(ch, argument)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
if (!IS_NPC(victim) || victim->pIndexData->creator_pvnum != ch->pcdata->pvnum)
{
ch_printf(ch, "You cannot turn %s into a shopkeeper.\n\r", get_name(victim));
pop_call();
return;
}
if (victim->pIndexData->pShop != NULL)
{
ch_printf(ch, "%s is already a shopkeeper.\n\r", capitalize(get_name(victim)));
pop_call();
return;
}
create_shop(victim->pIndexData);
act("Builders come and build a shop for $N.", ch, NULL, victim, TO_ROOM);
act("Builders come and build a shop for $N.", ch, NULL, victim, TO_CHAR);
ch->gold -= cost;
ch->pcdata->castle->cost += cost/1000;
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
void do_castle_ocreate( CHAR_DATA *ch )
{
AREA_DATA *pArea;
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
RESET_DATA *pReset;
int vnum, cost;
push_call("do_castle_ocreate(%p)",ch);
cost = haggle(ch, COST_OF_CREATE) * 1000;
if (ch->gold < cost)
{
ch_printf(ch, "It will cost you %s gold coins to create an object.\n\r", tomoney(cost));
pop_call();
return;
}
if (ch->pcdata->castle->num_objects >= 20)
{
send_to_char("You cannot create more than 20 objects.\n\r", ch);
pop_call();
return;
}
for (vnum = ROOM_VNUM_CASTLE ; get_obj_index(vnum) != NULL && vnum < MAX_VNUM ; vnum++);
{
if (vnum >= MAX_VNUM)
{
send_to_char("You can't create an object, tell the Immortals.\n\r",ch);
pop_call();
return;
}
}
ALLOCMEM( pObjIndex, OBJ_INDEX_DATA, 1);
pObjIndex->creator_pvnum = ch->pcdata->pvnum;
pObjIndex->vnum = vnum;
pObjIndex->area = ch->in_room->area;
pObjIndex->name = STRALLOC("pile dust");
pObjIndex->short_descr = STRALLOC("a pile of dust");
pObjIndex->long_descr = STRALLOC("A pile of dust lies here.");
pObjIndex->description = STRALLOC("The pile of dust looks very dusty.");
pObjIndex->attack_string = STRALLOC("");
pObjIndex->item_type = ITEM_TRASH;
pObjIndex->extra_flags = 0;
pObjIndex->wear_flags = 0;
pObjIndex->value[0] = 0;
pObjIndex->value[1] = 0;
pObjIndex->value[2] = 0;
pObjIndex->value[3] = 0;
pObjIndex->weight = 100;
pObjIndex->cost = 100;
pObjIndex->level = 100;
obj_index[vnum] = pObjIndex;
mud->top_obj_index++;
if (vnum > pObjIndex->area->hi_o_vnum)
{
pObjIndex->area->hi_o_vnum = vnum;
}
if (vnum < pObjIndex->area->low_o_vnum)
{
pObjIndex->area->low_o_vnum = vnum;
}
/* make the object reset in this room */
pReset = make_reset('O', vnum, 100, ch->in_room->vnum);
pArea = room_index[ROOM_VNUM_CASTLE]->area;
LINK(pReset, pArea->first_reset, pArea->last_reset, next, prev);
obj = create_object(pObjIndex, 0);
obj->reset = pReset;
pReset->obj = obj;
obj_to_room( obj, ch->in_room->vnum);
act("A pile of dust heaps up in the center of the room.", ch, NULL, NULL, TO_ROOM);
act("A pile of dust heaps up in the center of the room.", ch, NULL, NULL, TO_CHAR);
ch->gold -= cost;
ch->pcdata->castle->cost += cost/1000;
ch->pcdata->castle->num_objects += 1;
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
void do_castle_mdelete( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
push_call("do_castle_mdelete(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
send_to_char("Syntax: castle mdelete <mob>\n\r", ch);
pop_call();
return;
}
if ((victim = get_char_room(ch, argument)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
if (victim->pIndexData->creator_pvnum != ch->pcdata->pvnum)
{
act("You cannot delete $N.", ch, NULL, victim, TO_CHAR);
pop_call();
return;
}
if (clanfounder)
{
if (IS_SET(victim->act, ACT_CLAN_GUARD))
{
ch->pcdata->clan->num_guards--;
}
if (IS_SET(victim->act, ACT_CLAN_HEALER))
{
ch->pcdata->clan->num_healers--;
}
if (IS_SET(victim->act, ACT_TRAIN))
{
ch->pcdata->clan->num_trainers--;
}
if (IS_SET(victim->act, ACT_PRACTICE))
{
ch->pcdata->clan->num_trainers--;
}
}
act("Demolishers come and butcher $N.", ch, NULL, victim, TO_ROOM);
act("Demolishers come and butcher $N.", ch, NULL, victim, TO_CHAR);
delete_mob(victim->pIndexData);
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
ch->pcdata->castle->num_mobiles -= 1;
pop_call();
return;
}
void do_castle_odelete( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
push_call("do_castle_odelete(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
send_to_char("Syntax: castle odelete <obj>\n\r", ch);
pop_call();
return;
}
if ((obj = get_obj_list(ch, argument, ch->in_room->first_content)) == NULL)
{
send_to_char( "You can't find it.\n\r", ch );
pop_call();
return;
}
if (obj->pIndexData->creator_pvnum != ch->pcdata->pvnum)
{
act("You can't delete $p.", ch, obj, NULL, TO_CHAR);
pop_call();
return;
}
act("Demolishers come and pulverize $p.", ch, obj, NULL, TO_ROOM);
act("Demolishers come and pulverize $p.", ch, obj, NULL, TO_CHAR);
delete_obj(obj->pIndexData);
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
ch->pcdata->castle->num_objects -= 1;
pop_call();
return;
}
void do_castle_sdelete( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
push_call("do_castle_sdelete(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
send_to_char("Syntax: castle sdelete <mob>\n\r", ch);
pop_call();
return;
}
if ((victim = get_char_room(ch, argument)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
if (!IS_NPC(victim) || victim->pIndexData->pShop == NULL)
{
ch_printf(ch, "%s is not a shopkeeper.\n\r", capitalize(get_name(victim)));
pop_call();
return;
}
if (victim->pIndexData->creator_pvnum != ch->pcdata->pvnum)
{
ch_printf(ch, "You cannot delete %s's shop.\n\r", get_name(victim));
pop_call();
return;
}
act("Demolishers come and dismantle $N's shop.", ch, NULL, victim, TO_ROOM);
act("Demolishers come and dismantle $N's shop.", ch, NULL, victim, TO_CHAR);
delete_shop(victim->pIndexData);
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
void do_castle_rset( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char bld[10], dim[10], grn[10];
int argn, cost;
push_call("do_castle_rset(%p,%p)",ch,argument);
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
strcpy(grn, ansi_translate_text(ch, "{128}"));
if (strlen(argument) > 160)
{
argument[160] = '\0';
}
smash_tilde( argument );
argument = one_argument( argument, arg1 );
if (arg1[0] == '\0')
{
send_to_char( "Syntax: castle rset <name|desc|flag|sector|door|extra> <argument>\n\r", ch );
pop_call();
return;
}
cost = haggle(ch, COST_OF_SET) * 1000;
if (ch->gold < cost)
{
ch_printf(ch, "It will cost you %s gold coins to do a rset.\n\r", tomoney(cost));
pop_call();
return;
}
if (!strcasecmp(arg1, "name"))
{
STRFREE (ch->in_room->name );
ch->in_room->name = STRALLOC( argument );
}
else if (!strcasecmp(arg1, "desc"))
{
if (ch->pcdata->editmode == MODE_NONE)
{
ch->gold -= cost;
ch->pcdata->editmode = MODE_ROOM_DESC;
ch->pcdata->edit_ptr = ch->in_room;
start_editing( ch, ch->in_room->description );
}
else
{
bug("do_castle_rset: bad mode");
}
pop_call();
return;
}
else if (!strcasecmp(arg1, "flag"))
{
get_bitvector_value(argument, &argn, "ROOM_");
if (argn == -1 || (!IS_SET(CASTLE_R_FLAG_LIST, argn) && (!clanfounder || !IS_SET(CLAN_R_FLAG_LIST, argn))))
{
int bit;
char flag_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle rset flag %s<%sroom_flag%s>\n\r\n\r", dim, bld, dim, bld, dim);
for (bit = 0, flag_buf[0] = '\0' ; bit < 32 ; bit++)
{
if (IS_SET(CASTLE_R_FLAG_LIST, 1 << bit))
{
cat_sprintf(flag_buf, "%s%-20s", bld, broken_bits(1 << bit, "ROOM_", TRUE));
}
if (IS_SET(CLAN_R_FLAG_LIST, 1 << bit) && clanfounder)
{
cat_sprintf(flag_buf, "%s%-20s", grn, broken_bits(1 << bit, "ROOM_", TRUE));
}
if (strlen(flag_buf) == 120)
{
ch_printf(ch, "%s\n\r", flag_buf);
flag_buf[0] = '\0';
}
}
if (strlen(flag_buf) > 0)
{
ch_printf(ch, "%s\n\r", flag_buf);
}
pop_call();
return;
}
if (clanfounder && IS_SET(CLAN_R_FLAG_LIST, argn))
{
if (ch->pcdata->clan->coffers < CLANHALL_FLAG)
{
ch_printf(ch, "It will cost you %s gold coins to set a clan flag.\n\r", tomoney(CLANHALL_FLAG));
pop_call();
return;
}
ch->pcdata->clan->coffers -= CLANHALL_FLAG;
switch (argn)
{
case ROOM_ALTAR: ch->pcdata->clan->num_altars += IS_SET(ch->in_room->room_flags, ROOM_ALTAR) ? -1 : 1; break;
case ROOM_BANK: ch->pcdata->clan->num_banks += IS_SET(ch->in_room->room_flags, ROOM_BANK) ? -1 : 1; break;
case ROOM_MORGUE: ch->pcdata->clan->num_morgues += IS_SET(ch->in_room->room_flags, ROOM_MORGUE) ? -1 : 1; break;
}
}
TOGGLE_BIT(ch->in_room->room_flags, argn);
}
else if (!strcasecmp(arg1, "sector"))
{
if (!get_bitvector_value(argument, &argn, "SECT_"))
{
int cnt;
char sect_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle rset sector %s<%ssector_type%s>\n\r\n\r", dim, bld, dim, bld, dim);
for (cnt = 0, sect_buf[0] = '\0' ; cnt < SECT_MAX ; cnt++)
{
cat_sprintf(sect_buf, "%s%-20s", bld, broken_bits(cnt, "SECT_", TRUE));
if (strlen(sect_buf) == 120)
{
ch_printf(ch, "%s\n\r", sect_buf);
sect_buf[0] = '\0';
}
}
if (strlen(sect_buf) > 0)
{
ch_printf(ch, "%s\n\r", sect_buf);
}
pop_call();
return;
}
ch->in_room->sector_type = argn;
}
else if (!strcasecmp(arg1, "extra"))
{
EXTRA_DESCR_DATA *ed;
int cnt;
argument = one_argument( argument, arg1 );
if (!strcasecmp(arg1, "desc"))
{
argument = one_argument( argument, arg1 );
strcpy(arg2, arg1);
}
else if (!strcasecmp(arg1, "del"))
{
argument = one_argument( argument, arg1 );
for (ed = ch->in_room->first_extradesc ; ed ; ed = ed->next)
{
if (is_name(arg1, ed->keyword))
{
ch_printf(ch, "Deleted the following extras: '%s'\n\r", ed->keyword);
UNLINK( ed, ch->in_room->first_extradesc, ch->in_room->last_extradesc, next, prev);
STRFREE (ed->description);
STRFREE (ed->keyword);
FREEMEM(ed);
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
}
ch_printf(ch, "Couldn't find an extra named '%s' to delete.\n\r", arg1);
pop_call();
return;
}
else
{
send_to_char("Syntax: castle rset extra <del|desc> 'keywords'\n\r",ch);
pop_call();
return;
}
for (cnt = 1, ed = ch->in_room->first_extradesc ; ed ; ed = ed->next, cnt++)
{
if (is_name(arg1, ed->keyword))
{
break;
}
if (cnt >= 10)
{
ch_printf(ch, "You cannot create more than ten extra descriptions per room.\n\r");
pop_call();
return;
}
}
if (ed == NULL)
{
ALLOCMEM(ed, EXTRA_DESCR_DATA, 1);
ed->description = STRALLOC("");
ed->keyword = STRALLOC(arg2);
LINK( ed, ch->in_room->first_extradesc, ch->in_room->last_extradesc, next, prev);
}
if (ch->pcdata->editmode == MODE_NONE)
{
ch->gold -= cost;
ch->pcdata->editmode = MODE_ROOM_EXTRA;
ch->pcdata->edit_ptr = ed;
start_editing( ch, ed->description);
}
else
{
bug( "do_castle_rset: bad mode");
}
pop_call();
return;
}
else
{
do_castle_rset( ch, "" );
pop_call();
return;
}
act("The room appears to flicker for an instant.",ch,NULL,NULL,TO_ROOM);
act("The contractor comes, takes your money, looks around, hammers on a post, then\n\rheads back the way he came.",ch,NULL,NULL,TO_CHAR);
ch->gold -= cost;
ch->pcdata->castle->cost += cost/1000;
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
void do_castle_mset( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
char buf2 [MAX_INPUT_LENGTH];
char *buf1 = '\0';
char bld[10], dim[10], grn[10];
int argn, cost;
push_call("do_castle_mset(%p,%p)",ch,argument);
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
strcpy(grn, ansi_translate_text(ch, "{128}"));
if (strlen(argument) > 160)
{
argument[160] = '\0';
}
smash_tilde( argument );
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char("Syntax: castle mset <mob> <sex|race|act|affect|body|attack> <bitvector>\n\r", ch);
send_to_char("Syntax: castle mset <mob> <level|alignment> <value>\n\r", ch);
send_to_char("Syntax: castle mset <mob> <name|short|long|desc> <string>\n\r", ch);
pop_call();
return;
}
cost = haggle(ch, COST_OF_SET) * 1000;
if (ch->gold < cost)
{
ch_printf(ch,"It will cost you %s gold coins to do an mset.\n\r", tomoney(cost));
pop_call();
return;
}
if ((victim = get_char_room(ch, arg1)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
if (!IS_NPC(victim) || victim->pIndexData->creator_pvnum != ch->pcdata->pvnum)
{
ch_printf(ch, "You cannot mset them.\n\r");
pop_call();
return;
}
if (!strcasecmp(arg2, "sex"))
{
if (!get_bitvector_value(argument, &argn, "SEX_"))
{
int sex;
char sex_buf[MAX_STRING_LENGTH];
for (sex = 0, sex_buf[0] = '\0' ; sex <= 2 ; sex++)
{
cat_sprintf(sex_buf, "%s%s%s|", bld, broken_bits(sex, "SEX_", TRUE), dim);
}
sex_buf[strlen(sex_buf)-1] = '\0';
ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s sex %s<%s>\n\r", dim, bld, dim, bld, dim, bld, dim, sex_buf);
pop_call();
return;
}
victim->sex = argn;
}
else if (!strcasecmp(arg2, "level"))
{
int value = is_number(arg3) ? atol(arg3) : -1;
if (value < 1 || value > ch->level)
{
ch_printf(ch, "Level range is between 1 and %d\n\r", ch->level);
pop_call();
return;
}
victim->pIndexData->level = victim->level = value;
victim->pIndexData->damplus = victim->npcdata->damplus = value;
victim->pIndexData->hitplus = victim->hit = victim->max_hit = value * value;
}
else if (!strcasecmp(arg2, "alignment"))
{
int value = atol(arg3);
if (value < -1000 || value > 1000)
{
ch_printf(ch, "Alignment range is between -1000 and 1000.\n\r");
pop_call();
return;
}
victim->pIndexData->alignment = victim->alignment = value;
}
else if (!strcasecmp(arg2, "race"))
{
if (!get_bitvector_value(argument, &argn, "RACE_"))
{
int cnt;
char race_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s race %s<%ssector_type%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);
for (cnt = 0, race_buf[0] = '\0' ; cnt < MAX_RACE ; cnt++)
{
cat_sprintf(race_buf, "%s%-20s", bld, broken_bits(cnt, "RACE_", TRUE));
if (strlen(race_buf) == 120)
{
ch_printf(ch, "%s\n\r", race_buf);
race_buf[0] = '\0';
}
}
if (strlen(race_buf) > 0)
{
ch_printf(ch, "%s\n\r", race_buf);
}
pop_call();
return;
}
SET_BIT(victim->act, ACT_RACE);
victim->race = argn;
victim->pIndexData->race = victim->race;
victim->pIndexData->act = victim->act;
}
else if (!strcasecmp(arg2, "act"))
{
get_bitvector_value(argument, &argn, "ACT_");
if (argn == -1 || (!IS_SET(CASTLE_M_ACT_LIST, argn) && (!clanfounder || !IS_SET(CLAN_M_ACT_LIST, argn))))
{
int bit;
char act_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s act %s<%sact_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);
for (bit = 0, act_buf[0] = '\0' ; bit < 32 ; bit++)
{
if (IS_SET(CASTLE_M_ACT_LIST, 1 << bit))
{
cat_sprintf(act_buf, "%s%-20s", bld, broken_bits(1 << bit, "ACT_", TRUE));
}
if (IS_SET(CLAN_M_ACT_LIST, 1 << bit) && clanfounder)
{
cat_sprintf(act_buf, "%s%-20s", grn, broken_bits(1 << bit, "ACT_", TRUE));
}
if (strlen(act_buf) == 120)
{
ch_printf(ch, "%s\n\r", act_buf);
act_buf[0] = '\0';
}
}
if (strlen(act_buf) > 0)
{
ch_printf(ch, "%s\n\r", act_buf);
}
pop_call();
return;
}
if (clanfounder && IS_SET(CLAN_M_ACT_LIST, argn))
{
if (ch->pcdata->clan->coffers < CLANHALL_FLAG)
{
ch_printf(ch, "It will cost you %s gold coins to set a clan act.\n\r", tomoney(CLANHALL_FLAG));
pop_call();
return;
}
ch->pcdata->clan->coffers -= CLANHALL_FLAG;
switch (argn)
{
case ACT_CLAN_GUARD:
ch->pcdata->clan->num_guards += IS_SET(victim->act, ACT_CLAN_GUARD) ? -1 : 1;
break;
case ACT_CLAN_HEALER:
ch->pcdata->clan->num_healers += IS_SET(victim->act, ACT_CLAN_HEALER) ? -1 : 1;
break;
case ACT_TRAIN:
ch->pcdata->clan->num_trainers += IS_SET(victim->act, ACT_TRAIN) ? -1 : 1;
break;
case ACT_PRACTICE:
ch->pcdata->clan->num_trainers += IS_SET(victim->act, ACT_PRACTICE) ? -1 : 1;
break;
}
}
TOGGLE_BIT(victim->act, argn);
victim->pIndexData->act = victim->act;
}
else if (!strcasecmp(arg2, "affect"))
{
get_bitvector_value(argument, &argn, "AFF_");
if (argn == -1 || !IS_SET(CASTLE_M_AFF_LIST, argn))
{
int bit;
char aff_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s affect %s<%saffect_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);
for (bit = 0, aff_buf[0] = '\0' ; bit < 32 ; bit++)
{
if (IS_SET(CASTLE_M_AFF_LIST, 1 << bit))
{
cat_sprintf(aff_buf, "%s%-20s", bld, broken_bits(1 << bit, "AFF_", TRUE));
}
if (strlen(aff_buf) == 120)
{
ch_printf(ch, "%s\n\r", aff_buf);
aff_buf[0] = '\0';
}
}
if (strlen(aff_buf) > 0)
{
ch_printf(ch, "%s\n\r", aff_buf);
}
pop_call();
return;
}
TOGGLE_BIT(victim->affected_by, argn);
victim->pIndexData->affected_by = victim->affected_by;
}
else if (!strcasecmp(arg2, "body"))
{
get_bitvector_value(argument, &argn, "BODY_");
if (argn == -1 || !IS_SET(CASTLE_M_BODY_LIST, argn))
{
int bit;
char body_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s body %s<%sbody_part%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);
for (bit = 0, body_buf[0] = '\0' ; bit < 32 ; bit++)
{
if (IS_SET(CASTLE_M_BODY_LIST, 1 << bit))
{
cat_sprintf(body_buf, "%s%-20s", bld, broken_bits(1 << bit, "BODY_", TRUE));
}
if (strlen(body_buf) == 120)
{
ch_printf(ch, "%s\n\r", body_buf);
body_buf[0] = '\0';
}
}
if (strlen(body_buf) > 0)
{
ch_printf(ch, "%s\n\r", body_buf);
}
pop_call();
return;
}
TOGGLE_BIT(victim->pIndexData->body_parts, argn);
}
else if (!strcasecmp(arg2, "attack"))
{
get_bitvector_value(argument, &argn, "BODY_");
if (argn == -1 || !IS_SET(CASTLE_M_BODY_LIST, argn))
{
int bit;
char body_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle mset %s<%smob%s>%s attack %s<%sattack_part%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);
for (bit = 0, body_buf[0] = '\0' ; bit < 32 ; bit++)
{
if (IS_SET(CASTLE_M_BODY_LIST, 1 << bit))
{
cat_sprintf(body_buf, "%s%-20s", bld, broken_bits(1 << bit, "BODY_", TRUE));
}
if (strlen(body_buf) == 120)
{
ch_printf(ch, "%s\n\r", body_buf);
body_buf[0] = '\0';
}
}
if (strlen(body_buf) > 0)
{
ch_printf(ch, "%s\n\r", body_buf);
}
pop_call();
return;
}
TOGGLE_BIT(victim->pIndexData->attack_parts, argn);
}
else if (!strcasecmp(arg2, "name"))
{
int cnt;
for (cnt = 0 ; cnt < strlen(arg3) ; cnt++)
{
if (!isalpha(arg3[cnt]) && !isspace(arg3[cnt]))
{
ch_printf(ch, "You may only use alpha characters.\n\r");
pop_call();
return;
}
}
for (buf1 = one_argument(arg3, buf2) ; buf2[0] != '\0' ; buf1 = one_argument(buf1, buf2))
{
if (char_exists(buf2))
{
ch_printf(ch, "There is already a player with that name.\n\r");
pop_call();
return;
}
}
STRFREE (victim->name);
STRFREE (victim->pIndexData->player_name);
victim->pIndexData->player_name = STRALLOC(arg3);
victim->name = STRALLOC(arg3);
}
else if (!strcasecmp(arg2, "short"))
{
STRFREE (victim->short_descr );
STRFREE (victim->pIndexData->short_descr);
victim->pIndexData->short_descr = STRALLOC(arg3);
victim->short_descr = STRALLOC(arg3);
}
else if (!strcasecmp(arg2, "long"))
{
STRFREE (victim->long_descr );
STRFREE (victim->pIndexData->long_descr );
victim->pIndexData->long_descr = STRALLOC(arg3);
victim->long_descr = STRALLOC(arg3);
}
else if (!strcasecmp(arg2, "desc"))
{
if (ch->pcdata->editmode == MODE_NONE)
{
ch->gold -= cost;
ch->pcdata->editmode = MODE_MOB_DESC;
ch->pcdata->edit_ptr = victim;
start_editing( ch, victim->pIndexData->description);
}
else
{
bug( "do_castle_mset: bad mode");
}
pop_call();
return;
}
else
{
do_castle_mset(ch, "");
pop_call();
return;
}
act("Your eyes go fuzzy for a moment.",ch,NULL,NULL,TO_ROOM);
act("The contractor comes, takes your money, looks around, pinches the mobile, then\n\rheads back the way he came.",ch,NULL,NULL,TO_CHAR);
ch->gold -= cost;
ch->pcdata->castle->cost += cost/1000;
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
void do_castle_oset( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
OBJ_DATA *key;
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
char bld[10], dim[10], grn[10];
int argn, cost;
push_call("do_castle_oset(%p,%p)",ch,argument);
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
strcpy(grn, ansi_translate_text(ch, "{128}"));
if (strlen(argument) > 160)
{
argument[160] = '\0';
}
smash_tilde( argument );
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char("Syntax: castle oset <obj> <flag|type> <bitvector>\n\r", ch);
send_to_char("Syntax: castle oset <obj> <name|short|long|desc> <string>\n\r\n\r", ch);
send_to_char("Syntax: castle oset <fountain> <liquid> <argument>\n\r", ch);
send_to_char("Syntax: castle oset <container> <carry|lid|key|max> <argument>\n\r", ch);
send_to_char("Syntax: castle oset <furniture> <size|pose|regen> <argument>\n\r", ch);
pop_call();
return;
}
cost = haggle(ch, COST_OF_SET) * 1000;
if (ch->gold < cost)
{
ch_printf(ch,"It will cost you %s gold coins to do an oset.\n\r", tomoney(cost));
pop_call();
return;
}
if ((obj = get_obj_list(ch, arg1, ch->in_room->first_content)) == NULL)
{
send_to_char( "You can't find it.\n\r", ch );
pop_call();
return;
}
if (obj->pIndexData->creator_pvnum != ch->pcdata->pvnum)
{
ch_printf(ch, "You cannot oset that.\n\r");
pop_call();
return;
}
if (!strcasecmp(arg2, "flag"))
{
get_bitvector_value(argument, &argn, "ITEM_FLAG_");
if (argn == -1 || !IS_SET(CASTLE_O_FLAG_LIST, argn))
{
int bit;
char flag_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle oset %s<%sobj%s>%s flag %s<%sobj_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);
for (bit = 0, flag_buf[0] = '\0' ; bit < 32 ; bit++)
{
if (IS_SET(CASTLE_O_FLAG_LIST, 1 << bit))
{
cat_sprintf(flag_buf, "%s%-20s", bld, broken_bits(1 << bit, "ITEM_FLAG_", TRUE));
}
if (strlen(flag_buf) == 120)
{
ch_printf(ch, "%s\n\r", flag_buf);
flag_buf[0] = '\0';
}
}
if (strlen(flag_buf) > 0)
{
ch_printf(ch, "%s\n\r", flag_buf);
}
pop_call();
return;
}
TOGGLE_BIT(obj->extra_flags, argn);
obj->pIndexData->extra_flags = obj->extra_flags;
}
else if (!strcasecmp(arg2, "type"))
{
get_bitvector_value(argument, &argn, "ITEM_TYPE_");
if (argn == -1 || (argn != ITEM_FURNITURE && argn != ITEM_CONTAINER && argn != ITEM_FOUNTAIN))
{
int bit;
char flag_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle oset %s<%sobj%s>%s type %s<%sobj_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);
for (bit = 0, flag_buf[0] = '\0' ; bit <= ITEM_FOUNTAIN ; bit++)
{
if (bit == ITEM_FURNITURE || bit == ITEM_CONTAINER || bit == ITEM_FOUNTAIN)
{
cat_sprintf(flag_buf, "%s%-20s", bld, broken_bits(bit, "ITEM_TYPE_", TRUE));
}
if (strlen(flag_buf) == 120)
{
ch_printf(ch, "%s\n\r", flag_buf);
flag_buf[0] = '\0';
}
}
if (strlen(flag_buf) > 0)
{
ch_printf(ch, "%s\n\r", flag_buf);
}
pop_call();
return;
}
obj->item_type = argn;
obj->pIndexData->item_type = obj->item_type;
obj->value[0] = 0;
obj->value[1] = 0;
obj->value[2] = 0;
obj->value[3] = 0;
}
else if (!strcasecmp(arg2, "liquid"))
{
if (obj->item_type != ITEM_FOUNTAIN)
{
act("$p is not a fountain.", ch, obj, NULL, TO_CHAR);
pop_call();
return;
}
if (!get_bitvector_value(argument, &argn, "LIQ_"))
{
int cnt;
char liq_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle oset %s<%sobj%s>%s liquid %s<%ssector_type%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);
for (cnt = 0, liq_buf[0] = '\0' ; cnt < LIQ_MAX ; cnt++)
{
cat_sprintf(liq_buf, "%s%-20s", bld, broken_bits(cnt, "LIQ_", TRUE));
if (strlen(liq_buf) == 120)
{
ch_printf(ch, "%s\n\r", liq_buf);
liq_buf[0] = '\0';
}
}
if (strlen(liq_buf) > 0)
{
ch_printf(ch, "%s\n\r", liq_buf);
}
pop_call();
return;
}
obj->value[2] = argn;
obj->pIndexData->value[2] = obj->value[2];
}
else if (!strcasecmp(arg2, "lid"))
{
if (obj->item_type != ITEM_CONTAINER)
{
act("$p is not a container.", ch, obj, NULL, TO_CHAR);
pop_call();
return;
}
get_bitvector_value(argument, &argn, "CONT_");
if (argn == -1 || !IS_SET(CASTLE_O_LID_LIST, argn))
{
int bit;
char lid_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle oset %s<%sobj%s>%s lid %s<%slid_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);
for (bit = 0, lid_buf[0] = '\0' ; bit < 32 ; bit++)
{
if (IS_SET(CASTLE_O_LID_LIST, 1 << bit))
{
cat_sprintf(lid_buf, "%s%-20s", bld, broken_bits(1 << bit, "CONT_", TRUE));
}
if (strlen(lid_buf) == 120)
{
ch_printf(ch, "%s\n\r", lid_buf);
lid_buf[0] = '\0';
}
}
if (strlen(lid_buf) > 0)
{
ch_printf(ch, "%s\n\r", lid_buf);
}
pop_call();
return;
}
TOGGLE_BIT(obj->value[1], argn);
obj->pIndexData->value[1] = obj->value[1];
}
else if (!strcasecmp(arg2, "carry"))
{
int value = is_number(arg3) ? atol(arg3) : -1;
if (obj->item_type != ITEM_CONTAINER)
{
act("$p is not a container.", ch, obj, NULL, TO_CHAR);
pop_call();
return;
}
if (value < 1 || value > 1500)
{
ch_printf(ch, "A container's carry weight range is between 1 and 1500.\n\r");
pop_call();
return;
}
obj->value[0] = value;
obj->pIndexData->value[0] = value;
}
else if (!strcasecmp(arg2, "max"))
{
int value = is_number(arg3) ? atol(arg3) : -1;
if (obj->item_type != ITEM_CONTAINER)
{
act("$p is not a container.", ch, obj, NULL, TO_CHAR);
pop_call();
return;
}
if (value < 1 || value > 150)
{
ch_printf(ch, "A container's max item range is between 1 and 150.\n\r");
pop_call();
return;
}
obj->value[3] = obj->pIndexData->value[3] = value;
}
else if (!strcasecmp(arg2, "key"))
{
if (obj->item_type != ITEM_CONTAINER)
{
act("$p is not a container.", ch, obj, NULL, TO_CHAR);
pop_call();
return;
}
if ((key = get_obj_carry(ch, argument)) == NULL)
{
send_to_char("You are not carrying that.\n\r", ch);
pop_call();
return;
}
else
{
obj->pIndexData->value[2] = obj->value[2] = key->pIndexData->vnum;
}
}
else if (!strcasecmp(arg2, "pose"))
{
if (obj->item_type != ITEM_FURNITURE)
{
act("$p is not a piece of furniture.", ch, obj, NULL, TO_CHAR);
pop_call();
return;
}
get_bitvector_value(argument, &argn, "FURNITURE_");
if (argn == -1 || !IS_SET(CASTLE_O_FURNIT_LIST, argn))
{
int bit;
char pos_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle oset %s<%sobj%s>%s position %s<%slid_flag%s>\n\r\n\r", dim, bld, dim, bld, dim, bld, dim, bld, dim);
for (bit = 0, pos_buf[0] = '\0' ; bit < 32 ; bit++)
{
if (IS_SET(CASTLE_O_FURNIT_LIST, 1 << bit))
{
cat_sprintf(pos_buf, "%s%-20s", bld, broken_bits(1 << bit, "FURNITURE_", TRUE));
}
if (strlen(pos_buf) == 120)
{
ch_printf(ch, "%s\n\r", pos_buf);
pos_buf[0] = '\0';
}
}
if (strlen(pos_buf) > 0)
{
ch_printf(ch, "%s\n\r", pos_buf);
}
pop_call();
return;
}
TOGGLE_BIT(obj->value[2], argn);
obj->pIndexData->value[2] = obj->value[2];
}
else if (!strcasecmp(arg2, "size"))
{
int value = is_number(arg3) ? atol(arg3) : -1;
if (obj->item_type != ITEM_FURNITURE)
{
act("$p is not a piece of furniture.", ch, obj, NULL, TO_CHAR);
pop_call();
return;
}
if (value < 1 || value > 100)
{
ch_printf(ch, "A piece of furniture's size range is between 1 and 100.\n\r");
pop_call();
return;
}
obj->value[0] = value;
obj->pIndexData->value[0] = value;
}
else if (!strcasecmp(arg2, "regen"))
{
int value = is_number(arg3) ? atol(arg3) : -1;
if (obj->item_type != ITEM_FURNITURE)
{
act("$p is not a piece of furniture.", ch, obj, NULL, TO_CHAR);
pop_call();
return;
}
if (value < 1 || value > 200)
{
ch_printf(ch, "A piece of furniture's regen range is between 1 and 200.\n\r");
pop_call();
return;
}
obj->value[3] = value;
obj->pIndexData->value[3] = value;
}
else if (!strcasecmp(arg2, "name"))
{
int cnt;
for (cnt = 0 ; cnt < strlen(arg3) ; cnt++)
{
if (!isalpha(arg3[cnt]) && !isspace(arg3[cnt]))
{
ch_printf(ch, "You may only use alpha characters.\n\r");
pop_call();
return;
}
}
STRFREE (obj->name);
STRFREE (obj->pIndexData->name);
obj->pIndexData->name = STRALLOC(arg3);
obj->name = STRALLOC(arg3);
}
else if (!strcasecmp(arg2, "short"))
{
STRFREE (obj->short_descr );
STRFREE (obj->pIndexData->short_descr);
obj->pIndexData->short_descr = STRALLOC(arg3);
obj->short_descr = STRALLOC(arg3);
}
else if (!strcasecmp(arg2, "long"))
{
STRFREE (obj->long_descr);
STRFREE (obj->pIndexData->long_descr);
obj->pIndexData->long_descr = STRALLOC(arg3);
obj->long_descr = STRALLOC(arg3);
}
else if (!strcasecmp(arg2, "desc"))
{
if (ch->pcdata->editmode == MODE_NONE)
{
ch->gold -= cost;
ch->pcdata->editmode = MODE_OBJ_DESC;
ch->pcdata->edit_ptr = obj;
start_editing(ch, obj->pIndexData->description);
}
else
{
bug( "do_castle_oset: bad mode");
}
pop_call();
return;
}
else
{
do_castle_oset(ch, "");
pop_call();
return;
}
act("Your eyes go fuzzy for a moment.",ch,NULL,NULL,TO_ROOM);
act("The contractor comes, takes your money, looks around, pinches the mobile, then\n\rheads back the way he came.",ch,NULL,NULL,TO_CHAR);
ch->gold -= cost;
ch->pcdata->castle->cost += cost/1000;
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
void do_castle_dset( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *key;
EXIT_DATA *pexit;
char arg1[MAX_INPUT_LENGTH];
char buf [MAX_INPUT_LENGTH];
char bld[10], dim[10];
int argn, cost, door_dir;
push_call("do_castle_dset(%p,%p)",ch,argument);
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
if (strlen(argument) > 200)
{
argument[200] = '\0';
}
smash_tilde( argument );
argument = one_argument( argument, arg1 );
if (arg1[0] == '\0')
{
send_to_char( "Syntax: castle dset <dir> <name|desc|flag|key|del> <argument>\n\r", ch );
pop_call();
return;
}
cost = haggle(ch, COST_OF_SET) * 1000;
if (ch->gold < cost)
{
ch_printf(ch, "It will cost you %s gold coins to do a rset.\n\r", tomoney(cost));
pop_call();
return;
}
if (!get_bitvector_value(arg1, &argn, "DIR_"))
{
int door;
char exit_buf[MAX_STRING_LENGTH];
for (door = 0, exit_buf[0] = '\0' ; door <= 5 ; door++)
{
sprintf(buf, "%s%s%s|", bld, broken_bits(door, "DIR_", TRUE), dim);
strcat(exit_buf, buf);
}
exit_buf[strlen(exit_buf)-1] = '\0';
ch_printf(ch, "%sSyntax:%s castle dset %s<%s>\n\r", dim, bld, dim, exit_buf);
pop_call();
return;
}
door_dir = argn;
if ((pexit = ch->in_room->exit[door_dir]) == NULL)
{
create_exit(ch->in_room, door_dir);
pexit = ch->in_room->exit[door_dir];
pexit->pvnum = ch->pcdata->pvnum;
pexit->vnum = ch->in_room->vnum;
}
argument = one_argument( argument, arg1 );
if (!strcasecmp(arg1, "name"))
{
STRFREE (pexit->keyword );
if (argument[0] == '\'' || argument[0]=='"')
{
argument = one_argument_nolower(argument, arg1);
}
pexit->keyword = STRALLOC( argument );
if (room_index[pexit->to_room] != NULL && room_index[pexit->to_room]->creator_pvnum != ch->pcdata->pvnum && IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE))
{
EXIT_DATA *pexit2 = room_index[pexit->to_room]->exit[rev_dir[door_dir]];
if (pexit2 != NULL)
{
if (pexit2->keyword != NULL)
{
STRFREE (pexit2->keyword);
}
pexit2->keyword = STRALLOC( pexit->keyword );
}
}
}
else if (!strcasecmp(arg1, "del"))
{
if (room_index[pexit->to_room] != NULL
&& room_index[pexit->to_room]->creator_pvnum != ch->pcdata->pvnum
&& IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE)
&& !IS_SET(pexit->exit_info, EX_BACKDOOR)
&& !IS_SET(pexit->exit_info, EX_CLAN_BACKDOOR))
{
send_to_char("You wouldn't want to delete your entrance.\n\r",ch);
pop_call();
return;
}
if (IS_SET(pexit->exit_info, EX_BACKDOOR))
{
ch->pcdata->castle->has_backdoor = FALSE;
}
if (IS_SET(pexit->exit_info, EX_CLAN_BACKDOOR) && clanfounder)
{
ch->pcdata->clan->num_backdoors--;
}
delete_exit(ch->in_room, door_dir);
cost = 0;
}
else if (!strcasecmp(arg1, "desc"))
{
STRFREE (pexit->description);
pexit->description = STRALLOC( justify(argument, 80) );
if (room_index[pexit->to_room] && room_index[pexit->to_room]->creator_pvnum != ch->pcdata->pvnum && IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE))
{
EXIT_DATA *pexit2;
pexit2 = room_index[pexit->to_room]->exit[rev_dir[door_dir]];
if (pexit2 != NULL)
{
if (pexit2->description != NULL)
{
STRFREE (pexit2->description);
}
pexit2->description = STRALLOC( pexit->description );
}
}
}
else if (!strcasecmp(arg1, "flag"))
{
get_bitvector_value(argument, &argn, "EX_");
if (argn == -1 || !IS_SET(CASTLE_D_FLAG_LIST, argn))
{
int bit;
char flag_buf[MAX_STRING_LENGTH];
ch_printf(ch, "%sSyntax:%s castle dset %s flag %s<%sdoor_flag%s>\n\r\n\r", dim, bld, broken_bits(door_dir, "DIR_", TRUE), dim, bld, dim);
for (bit = 0, flag_buf[0] = '\0' ; bit < 32 ; bit++)
{
if (IS_SET(CASTLE_D_FLAG_LIST, 1 << bit))
{
cat_sprintf(flag_buf, "%s%-20s", bld, broken_bits(1 << bit, "EX_", TRUE));
}
if (strlen(flag_buf) == 120)
{
ch_printf(ch, "%s\n\r", flag_buf);
flag_buf[0] = '\0';
}
}
if (strlen(flag_buf) > 0)
{
ch_printf(ch, "%s\n\r", flag_buf);
}
pop_call();
return;
}
TOGGLE_BIT(pexit->exit_info, argn);
if (room_index[pexit->to_room] && room_index[pexit->to_room]->creator_pvnum != ch->pcdata->pvnum && IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE))
{
EXIT_DATA *pexit2 = room_index[pexit->to_room]->exit[rev_dir[door_dir]];
if (pexit2)
{
pexit2->exit_info = pexit->exit_info;
}
}
}
else if (!strcasecmp(arg1, "key"))
{
if ((key = get_obj_carry(ch, argument)) == NULL)
{
send_to_char("You are not carrying that.\n\r", ch);
pop_call();
return;
}
else
{
pexit->key = key->pIndexData->vnum;
}
if (room_index[pexit->to_room] && room_index[pexit->to_room]->creator_pvnum != ch->pcdata->pvnum && IS_SET(ch->in_room->room_flags, ROOM_IS_ENTRANCE))
{
EXIT_DATA *pexit2 = room_index[pexit->to_room]->exit[rev_dir[door_dir]];
if (pexit2)
{
pexit2->key = pexit->key;
}
}
}
else
{
do_castle_dset(ch, "");
pop_call();
return;
}
act("The surrounding exits appear to shimmer for an instant.", ch,NULL,NULL,TO_ROOM);
act("The contractor comes, takes your money, looks around, hammers on a post, then\n\rheads back the way he came.",ch,NULL,NULL,TO_CHAR);
ch->gold -= cost;
ch->pcdata->castle->cost += cost/1000;
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
void do_castle( CHAR_DATA *ch, char *argument )
{
CASTLE_DATA *castle;
ROOM_INDEX_DATA *location;
EXTRA_DESCR_DATA *ed;
CHAR_DATA *victim;
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
char dim[10], bld[10];
push_call("do_castle(%p,%p)",ch,argument);
if (IS_NPC(ch))
{
pop_call();
return;
}
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
switch (ch->pcdata->editmode)
{
default: break;
case MODE_RESTRICTED:
send_to_char( "You cannot use this command from while editing something else.\n\r",ch);
pop_call();
return;
case MODE_ROOM_DESC:
if (!ch->pcdata->edit_ptr)
{
send_to_char("Editor Error: Report to the Immortals.\n\r", ch);
bug( "do_castle_rset: sub_room_desc: NULL ch->pcdata->edit_ptr", 0);
ch->pcdata->editmode = MODE_NONE;
}
else
{
location = ch->pcdata->edit_ptr;
STRFREE(location->description);
location->description = copy_buffer(ch);
stop_editing( ch );
}
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
case MODE_ROOM_EXTRA:
if (!ch->pcdata->edit_ptr)
{
send_to_char("Editor Error: Report to the Immortals.\n\r", ch);
bug( "do_castle_rset: sub_room_extra: NULL ch->pcdata->edit_ptr", 0 );
ch->pcdata->editmode = MODE_NONE;
}
else
{
ed = ch->pcdata->edit_ptr;
STRFREE( ed->description );
ed->description = copy_buffer( ch );
stop_editing( ch );
}
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
case MODE_MOB_DESC:
if (!ch->pcdata->edit_ptr)
{
send_to_char("Fatal error: report to Chaste.\n\r", ch);
bug( "do_castle: sub_mob_desc: NULL ch->pcdata->edit_ptr", 0);
ch->pcdata->editmode = MODE_NONE;
}
else
{
victim = ch->pcdata->edit_ptr;
STRFREE (victim->description );
STRFREE (victim->pIndexData->description );
victim->description = copy_buffer(ch);
victim->pIndexData->description = copy_buffer(ch);
stop_editing( ch );
}
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
case MODE_OBJ_DESC:
if (!ch->pcdata->edit_ptr)
{
send_to_char("Fatal error: report to Demise.\n\r", ch);
bug( "do_castle: sub_obj_desc: NULL ch->pcdata->edit_ptr", 0);
ch->pcdata->editmode = MODE_NONE;
}
else
{
obj = ch->pcdata->edit_ptr;
STRFREE (obj->description);
STRFREE (obj->pIndexData->description);
obj->description = copy_buffer(ch);
obj->pIndexData->description = copy_buffer(ch);
stop_editing( ch );
}
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}
if (ch->pcdata->clan && !strcasecmp(ch->name, ch->pcdata->clan->leader[0]))
{
clanfounder = TRUE;
}
else
{
clanfounder = FALSE;
}
if (argument[0] == '\0')
{
if ((castle = ch->pcdata->castle) != NULL)
{
if (room_index[castle->entrance] == NULL)
{
ch_printf(ch, "Your castle entrance no longer exists. Contact the immortals.\n\r");
}
else
{
ch_printf(ch, "%s Castle Cost:%s %s,000\n\r", dim, bld, tomoney(castle->cost));
ch_printf(ch, "%s Rooms:%s %d\n\r", dim, bld, castle->num_rooms);
ch_printf(ch, "%s Creatures:%s %d\n\r", dim, bld, castle->num_mobiles);
ch_printf(ch, "%s Objects:%s %d\n\r", dim, bld, castle->num_objects);
ch_printf(ch, "%s Back Doors:%s %d\n\r", dim, bld, castle->has_backdoor);
if (room_index[castle->door_room])
{
ch_printf(ch, "%s Connect Room:%s %s\n\r", dim, bld, room_index[castle->door_room]->name);
ch_printf(ch, "%s Connect Dir:%s %s\n\r", dim, bld, broken_bits(castle->door_dir, "DIR_", TRUE));
}
}
}
else
{
switch(ch->in_room->sector_type)
{
case SECT_FIELD:
case SECT_FOREST:
case SECT_HILLS:
case SECT_MOUNTAIN:
case SECT_DESERT:
if (!IS_SET(ch->in_room->room_flags, ROOM_NO_CASTLE)
&& !IS_SET(ch->in_room->area->flags, AFLAG_NOCASTLE))
{
send_to_char("CASTLE: You could start a castle here.\n\r",ch);
}
else
{
send_to_char("CASTLE: You can't start a castle here.\n\r",ch);
}
break;
default:
send_to_char("CASTLE: You can't start a castle here.\n\r",ch);
break;
}
}
pop_call();
return;
}
argument = one_argument( argument, arg );
smash_tilde( argument );
castle = ch->pcdata->castle;
clanfounder = (ch->pcdata->clan && !strcasecmp(ch->name, ch->pcdata->clan->leader[0]));
if (!strcasecmp(arg, "entrance"))
{
do_castle_entrance(ch, argument);
pop_call();
return;
}
if ((castle = ch->pcdata->castle) == NULL)
{
send_to_char("You have no castle established yet.\n\r",ch);
pop_call();
return;
}
if (!strcasecmp(arg, "connect"))
{
do_castle_connect(ch, argument);
pop_call();
return;
}
if (ch->in_room->creator_pvnum != ch->pcdata->pvnum)
{
send_to_char("You are NOT in your castle!\n\r",ch);
pop_call();
return;
}
if (!strcasecmp(arg, "rcreate"))
{
do_castle_rcreate(ch, argument);
}
else if (!strcasecmp(arg, "rstat"))
{
do_castle_rstat(ch, argument);
}
else if (!strcasecmp(arg, "mstat"))
{
do_castle_mstat(ch, argument);
}
else if (!strcasecmp(arg, "ostat"))
{
do_castle_ostat(ch, argument);
}
else if (!strcasecmp(arg, "mcreate"))
{
do_castle_mcreate(ch);
}
else if (!strcasecmp(arg, "ocreate"))
{
do_castle_ocreate(ch);
}
else if (!strcasecmp(arg, "screate"))
{
do_castle_screate(ch, argument);
}
else if (!strcasecmp(arg, "mdelete"))
{
do_castle_mdelete(ch, argument);
}
else if (!strcasecmp(arg, "rdelete"))
{
ch_printf(ch, "Deletion of rooms has not been implemented yet.\n\r");
}
else if (!strcasecmp(arg, "odelete"))
{
do_castle_odelete(ch, argument);
}
else if (!strcasecmp(arg, "sdelete"))
{
do_castle_sdelete(ch, argument);
}
else if (!strcasecmp(arg, "rset"))
{
do_castle_rset(ch, argument);
}
else if (!strcasecmp(arg, "mset"))
{
do_castle_mset(ch, argument);
}
else if (!strcasecmp(arg, "oset"))
{
do_castle_oset(ch, argument);
}
else if (!strcasecmp(arg, "dset"))
{
do_castle_dset(ch, argument);
}
else
{
send_to_char("Use what castle option? (see 'help castles')\n\r", ch);
/*
<connect|rcreate|mcreate|screate|rset|mset|dset|mstat|rstat>
*/
}
pop_call();
return;
}
void del_castle( CHAR_DATA *victim)
{
ROOM_INDEX_DATA *pRoomIndex;
MOB_INDEX_DATA *pMobIndex;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
push_call("del_castle(%p)",victim);
if (victim->pcdata->castle == NULL)
{
pop_call();
return;
}
if (victim->pcdata->pvnum == 0)
{
log_printf("del_castle: corrupted pvnum found");
pop_call();
return;
}
log_printf("del_castle: %s", victim->name);
for (vnum = ROOM_VNUM_CASTLE ; vnum < MAX_VNUM ; vnum++)
{
if ((pMobIndex = mob_index[vnum]) != NULL
&& pMobIndex->area->low_r_vnum == ROOM_VNUM_CASTLE
&& victim->pcdata->pvnum == pMobIndex->creator_pvnum)
{
delete_mob(pMobIndex);
}
if ((pObjIndex = obj_index[vnum]) != NULL
&& pObjIndex->area->low_r_vnum == ROOM_VNUM_CASTLE
&& victim->pcdata->pvnum == pObjIndex->creator_pvnum)
{
delete_obj(pObjIndex);
}
if ((pRoomIndex = room_index[vnum]) != NULL
&& pRoomIndex->area->low_r_vnum == ROOM_VNUM_CASTLE
&& victim->pcdata->pvnum == pRoomIndex->creator_pvnum)
{
delete_room(pRoomIndex);
}
}
FREEMEM(victim->pcdata->castle);
victim->pcdata->castle = NULL;
CHECK_AUTOSAVE(room_index[ROOM_VNUM_CASTLE]->area);
pop_call();
return;
}