- Added object type CHAIR (thanks Dark).

- Added ZZZ directories to plrfiles and plrvars (thanks Zizazat).
- Added 00 files to plrfiles directories (thanks Khorlane).
- Added mail check at reconnect and when coming back from AFK.
- Added JamDog's updated levenshtein_distance that compiles clean with MSVC++.
- Added AFK to player L-desc.
--Rumble
This commit is contained in:
Rumble 2007-03-20 22:26:58 +00:00
parent 1f74a71456
commit f34cc2c8ed
26 changed files with 494 additions and 626 deletions

View file

@ -98,6 +98,9 @@ int *cmd_sort_info;
void show_obj_to_char(struct obj_data *obj, struct char_data *ch, int mode)
{
int found = 0;
struct char_data *temp;
if (!obj || !ch) {
log("SYSERR: NULL pointer in show_obj_to_char(): obj=%p ch=%p", obj, ch);
/* SYSERR_DESC: Somehow a NULL pointer was sent to show_obj_to_char() in
@ -107,6 +110,21 @@ void show_obj_to_char(struct obj_data *obj, struct char_data *ch, int mode)
return;
}
if ((mode == 0) && obj->description) {
if (!GET_OBJ_VAL(obj, 1) == 0 || OBJ_SAT_IN_BY(obj)) {
temp = OBJ_SAT_IN_BY(obj);
for (temp = OBJ_SAT_IN_BY(obj); temp; temp = NEXT_SITTING(temp)) {
if (temp == ch)
found++;
}
if (found) {
send_to_char(ch, "You are %s upon %s.", GET_POS(ch) == POS_SITTING ? "sitting" :
"resting", obj->short_description);
goto end;
}
}
}
switch (mode) {
case SHOW_OBJ_LONG:
/* hide objects starting with . from non-holylighted people Idea from Elaseth of TBA */
@ -158,6 +176,7 @@ void show_obj_to_char(struct obj_data *obj, struct char_data *ch, int mode)
* call with the incorrect mode and change it to an acceptable mode. */
return;
}
end:
show_obj_modifiers(obj, ch);
send_to_char(ch, "\r\n");
@ -289,6 +308,7 @@ void look_at_char(struct char_data *i, struct char_data *ch)
void list_one_char(struct char_data *i, struct char_data *ch)
{
struct obj_data *chair;
const char *positions[] = {
" is lying here, dead.",
" is lying here, mortally wounded.",
@ -337,13 +357,21 @@ void list_one_char(struct char_data *i, struct char_data *ch)
send_to_char(ch, " (linkless)");
if (!IS_NPC(i) && PLR_FLAGGED(i, PLR_WRITING))
send_to_char(ch, " (writing)");
if (!IS_NPC(i) && PRF_FLAGGED(i, PRF_BUILDWALK))
send_to_char(ch, " (buildwalk)");
if (!IS_NPC(i) && PRF_FLAGGED(i, PRF_AFK))
send_to_char(ch, " (AFK)");
if (GET_POS(i) != POS_FIGHTING)
send_to_char(ch, "%s", positions[(int) GET_POS(i)]);
if (GET_POS(i) != POS_FIGHTING) {
if (!SITTING(i))
send_to_char(ch, "%s", positions[(int) GET_POS(i)]);
else {
chair = SITTING(i);
send_to_char(ch, " is %s upon %s.", ((GET_POS(i) == POS_SITTING) ?
"sitting" : "resting"), (CAN_SEE_OBJ(ch, chair) ?
chair->short_description : "something"));
}
} else {
if (FIGHTING(i)) {
send_to_char(ch, " is here, fighting ");
if (FIGHTING(i) == ch)
@ -791,7 +819,12 @@ ACMD(do_score)
send_to_char(ch, "You are resting.\r\n");
break;
case POS_SITTING:
send_to_char(ch, "You are sitting.\r\n");
if (!SITTING(ch))
send_to_char(ch, "You are sitting.\r\n");
else {
struct obj_data *chair = SITTING(ch);
send_to_char(ch, "You are sitting upon %s.\r\n", chair->short_description);
}
break;
case POS_FIGHTING:
send_to_char(ch, "You are fighting %s.\r\n", FIGHTING(ch) ? PERS(FIGHTING(ch), ch) : "thin air");

View file

@ -10,8 +10,6 @@
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "utils.h"
#include "comm.h"
@ -45,18 +43,12 @@ ACMD(do_sleep);
ACMD(do_wake);
ACMD(do_follow);
/* simple function to determine if char can walk on water */
int has_boat(struct char_data *ch)
{
struct obj_data *obj;
int i;
/*
if (ROOM_IDENTITY(IN_ROOM(ch)) == DEAD_SEA)
return (1);
*/
if (GET_LEVEL(ch) > LVL_IMMORT)
return (1);
@ -76,26 +68,16 @@ int has_boat(struct char_data *ch)
return (0);
}
/* do_simple_move assumes
* 1. That there is no master and no followers.
* 2. That the direction exists.
*
* Returns :
* 1 : If succes.
* 0 : If fail
*/
/* do_simple_move assumes that there is no master, no followers and that the
* direction exists. It returns 1 for success, 0 if failure. */
int do_simple_move(struct char_data *ch, int dir, int need_specials_check)
{
char throwaway[MAX_INPUT_LENGTH] = ""; /* Functions assume writable. */
room_rnum was_in = IN_ROOM(ch);
int need_movement;
/*
* Check for special routines (North is 1 in command list, but 0 here) Note
* -- only check if following; this avoids 'double spec-proc' bug
*/
/* Check for special routines (North is 1 in command list, but 0 here) Note
* -- only check if following; this avoids 'double spec-proc' bug */
if (need_specials_check && special(ch, dir + 1, throwaway))
return (0);
@ -169,8 +151,8 @@ int do_simple_move(struct char_data *ch, int dir, int need_specials_check)
char_from_room(ch);
char_to_room(ch, world[was_in].dir_option[dir]->to_room);
/* move them first, then move them back if they aren't allowed to go. */
/* see if an entry trigger disallows the move */
/* move them first, then move them back if they aren't allowed to go. Also,
* see if an entry trigger disallows the move */
if (!entry_mtrigger(ch) || !enter_wtrigger(&world[IN_ROOM(ch)], ch, dir)) {
char_from_room(ch);
char_to_room(ch, was_in);
@ -200,7 +182,6 @@ int do_simple_move(struct char_data *ch, int dir, int need_specials_check)
return (1);
}
int perform_move(struct char_data *ch, int dir, int need_specials_check)
{
room_rnum was_in;
@ -236,18 +217,14 @@ int perform_move(struct char_data *ch, int dir, int need_specials_check)
return (0);
}
ACMD(do_move)
{
/*
* This is basically a mapping of cmd numbers to perform_move indices.
* It cannot be done in perform_move because perform_move is called
* by other functions which do not require the remapping.
*/
/* This is basically a mapping of cmd numbers to perform_move indices. It
* cannot be done in perform_move because perform_move is called by other
* functions which do not require the remapping. */
perform_move(ch, subcmd - 1, 0);
}
int find_door(struct char_data *ch, const char *type, char *dir, const char *cmdname)
{
int door;
@ -287,7 +264,6 @@ int find_door(struct char_data *ch, const char *type, char *dir, const char *cmd
}
}
int has_key(struct char_data *ch, obj_vnum key)
{
struct obj_data *o;
@ -303,8 +279,6 @@ int has_key(struct char_data *ch, obj_vnum key)
return (0);
}
#define NEED_OPEN (1 << 0)
#define NEED_CLOSED (1 << 1)
#define NEED_UNLOCKED (1 << 2)
@ -328,7 +302,6 @@ const int flags_door[] =
NEED_CLOSED | NEED_LOCKED
};
#define EXITN(room, door) (world[room].dir_option[door])
#define OPEN_DOOR(room, obj, door) ((obj) ?\
(REMOVE_BIT(GET_OBJ_VAL(obj, 1), CONT_CLOSED)) :\
@ -417,7 +390,6 @@ void do_doorcmd(struct char_data *ch, struct obj_data *obj, int door, int scmd)
scmd == SCMD_CLOSE ? "d" : "ed");
}
int ok_pick(struct char_data *ch, obj_vnum keynum, int pickproof, int scmd)
{
int percent, skill_lvl;
@ -440,25 +412,19 @@ int ok_pick(struct char_data *ch, obj_vnum keynum, int pickproof, int scmd)
return (0);
}
#define DOOR_IS_OPENABLE(ch, obj, door) ((obj) ? \
((GET_OBJ_TYPE(obj) == ITEM_CONTAINER) && \
OBJVAL_FLAGGED(obj, CONT_CLOSEABLE)) :\
(EXIT_FLAGGED(EXIT(ch, door), EX_ISDOOR)))
#define DOOR_IS_OPEN(ch, obj, door) ((obj) ? \
(!OBJVAL_FLAGGED(obj, CONT_CLOSED)) :\
(!EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED)))
#define DOOR_IS_UNLOCKED(ch, obj, door) ((obj) ? \
(!OBJVAL_FLAGGED(obj, CONT_LOCKED)) :\
(!EXIT_FLAGGED(EXIT(ch, door), EX_LOCKED)))
#define DOOR_IS_PICKPROOF(ch, obj, door) ((obj) ? \
(OBJVAL_FLAGGED(obj, CONT_PICKPROOF)) : \
(EXIT_FLAGGED(EXIT(ch, door), EX_PICKPROOF)))
#define DOOR_IS_CLOSED(ch, obj, door) (!(DOOR_IS_OPEN(ch, obj, door)))
#define DOOR_IS_LOCKED(ch, obj, door) (!(DOOR_IS_UNLOCKED(ch, obj, door)))
#define DOOR_KEY(ch, obj, door) ((obj) ? (GET_OBJ_VAL(obj, 2)) : \
(EXIT(ch, door)->key))
#define DOOR_IS_OPENABLE(ch, obj, door) ((obj) ? ((GET_OBJ_TYPE(obj) == \
ITEM_CONTAINER) && OBJVAL_FLAGGED(obj, CONT_CLOSEABLE)) :\
(EXIT_FLAGGED(EXIT(ch, door), EX_ISDOOR)))
#define DOOR_IS_OPEN(ch, obj, door) ((obj) ? (!OBJVAL_FLAGGED(obj, \
CONT_CLOSED)) : (!EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED)))
#define DOOR_IS_UNLOCKED(ch, obj, door) ((obj) ? (!OBJVAL_FLAGGED(obj, \
CONT_LOCKED)) : (!EXIT_FLAGGED(EXIT(ch, door), EX_LOCKED)))
#define DOOR_IS_PICKPROOF(ch, obj, door) ((obj) ? (OBJVAL_FLAGGED(obj, \
CONT_PICKPROOF)) : (EXIT_FLAGGED(EXIT(ch, door), EX_PICKPROOF)))
#define DOOR_IS_CLOSED(ch, obj, door) (!(DOOR_IS_OPEN(ch, obj, door)))
#define DOOR_IS_LOCKED(ch, obj, door) (!(DOOR_IS_UNLOCKED(ch, obj, door)))
#define DOOR_KEY(ch, obj, door) ((obj) ? (GET_OBJ_VAL(obj, 2)) : \
(EXIT(ch, door)->key))
ACMD(do_gen_door)
{
@ -502,8 +468,6 @@ ACMD(do_gen_door)
return;
}
ACMD(do_enter)
{
char buf[MAX_INPUT_LENGTH];
@ -537,7 +501,6 @@ ACMD(do_enter)
}
}
ACMD(do_leave)
{
int door;
@ -557,7 +520,6 @@ ACMD(do_leave)
}
}
ACMD(do_stand)
{
switch (GET_POS(ch)) {
@ -567,6 +529,8 @@ ACMD(do_stand)
case POS_SITTING:
send_to_char(ch, "You stand up.\r\n");
act("$n clambers to $s feet.", TRUE, ch, 0, 0, TO_ROOM);
/* Were they sitting in a chair? */
char_from_chair(ch);
/* Will be sitting after a successful bash and may still be fighting. */
GET_POS(ch) = FIGHTING(ch) ? POS_FIGHTING : POS_STANDING;
break;
@ -574,6 +538,8 @@ ACMD(do_stand)
send_to_char(ch, "You stop resting, and stand up.\r\n");
act("$n stops resting, and clambers on $s feet.", TRUE, ch, 0, 0, TO_ROOM);
GET_POS(ch) = POS_STANDING;
/* Were they sitting in the chair */
char_from_chair(ch);
break;
case POS_SLEEPING:
send_to_char(ch, "You have to wake up first!\r\n");
@ -590,14 +556,56 @@ ACMD(do_stand)
}
}
ACMD(do_sit)
{
char arg[MAX_STRING_LENGTH];
struct obj_data *chair;
struct char_data *tempch;
int found;
one_argument(argument, arg);
if (!*arg)
found = 0;
if (!(chair = get_obj_in_list_vis(ch, arg, NULL, world[ch->in_room].contents)))
found = 0;
else
found = 1;
switch (GET_POS(ch)) {
case POS_STANDING:
send_to_char(ch, "You sit down.\r\n");
act("$n sits down.", FALSE, ch, 0, 0, TO_ROOM);
GET_POS(ch) = POS_SITTING;
if (found == 0) {
send_to_char(ch, "You sit down.\r\n");
act("$n sits down.", FALSE, ch, 0, 0, TO_ROOM);
GET_POS(ch) = POS_SITTING;
} else {
if (GET_OBJ_TYPE(chair) != ITEM_CHAIR) {
send_to_char(ch, "You can't sit on that!\r\n");
return;
} else if (GET_OBJ_VAL(chair, 1) > GET_OBJ_VAL(chair, 0)) {
/* val 1 is current number in chair, 0 is max in chair */
act("$p looks like it's all full.", TRUE, ch, chair, 0, TO_CHAR);
log("SYSERR: chair %d holding too many people.", GET_OBJ_VNUM(chair));
return;
} else if (GET_OBJ_VAL(chair, 1) == GET_OBJ_VAL(chair, 0)) {
act("There is no where left to sit upon $p.", TRUE, ch, chair, 0, TO_CHAR);
return;
} else {
if (OBJ_SAT_IN_BY(chair) == NULL)
OBJ_SAT_IN_BY(chair) = ch;
for (tempch = OBJ_SAT_IN_BY(chair); tempch != ch ; tempch = NEXT_SITTING(tempch)) {
if (NEXT_SITTING(tempch))
continue;
NEXT_SITTING(tempch) = ch;
}
act("You sit down upon $p.", TRUE, ch, chair, 0, TO_CHAR);
act("$n sits down upon $p.", TRUE, ch, chair, 0, TO_ROOM);
SITTING(ch) = chair;
NEXT_SITTING(ch) = NULL;
GET_OBJ_VAL(chair, 1) += 1;
GET_POS(ch) = POS_SITTING;
}
}
break;
case POS_SITTING:
send_to_char(ch, "You're sitting already.\r\n");
@ -621,7 +629,6 @@ ACMD(do_sit)
}
}
ACMD(do_rest)
{
switch (GET_POS(ch)) {
@ -652,7 +659,6 @@ ACMD(do_rest)
}
}
ACMD(do_sleep)
{
switch (GET_POS(ch)) {
@ -678,7 +684,6 @@ ACMD(do_sleep)
}
}
ACMD(do_wake)
{
char arg[MAX_INPUT_LENGTH];
@ -714,11 +719,12 @@ ACMD(do_wake)
else {
send_to_char(ch, "You awaken, and sit up.\r\n");
act("$n awakens.", TRUE, ch, 0, 0, TO_ROOM);
/* Were they asleep in a chair? */
char_from_chair(ch);
GET_POS(ch) = POS_SITTING;
}
}
ACMD(do_follow)
{
char buf[MAX_INPUT_LENGTH];

View file

@ -28,7 +28,7 @@
extern struct spell_info_type spell_info[];
extern const char *class_abbrevs[];
/* extern procedures */
/* extern functions */
void list_skills(struct char_data *ch);
void appear(struct char_data *ch);
void perform_immort_vis(struct char_data *ch);
@ -36,6 +36,7 @@ SPECIAL(shop_keeper);
ACMD(do_gen_comm);
void die(struct char_data *ch, struct char_data * killer);
void Crash_rentsave(struct char_data *ch, int cost);
int has_mail(long id);
/* local functions */
ACMD(do_quit);
@ -879,8 +880,11 @@ ACMD(do_gen_tog)
result = PRF_TOG_CHK(ch, PRF_AFK);
if (PRF_FLAGGED(ch, PRF_AFK))
act("$n has gone AFK.", TRUE, ch, 0, 0, TO_ROOM);
else
else {
act("$n has come back from AFK.", TRUE, ch, 0, 0, TO_ROOM);
if (has_mail(GET_IDNUM(ch)))
send_to_char(ch, "You have mail waiting.\r\n");
}
break;
default:
log("SYSERR: Unknown subcmd %d in do_gen_toggle.", subcmd);

View file

@ -644,6 +644,7 @@ void do_stat_object(struct char_data *ch, struct obj_data *j)
struct obj_data *j2;
struct extra_descr_data *desc;
char buf[MAX_STRING_LENGTH];
struct char_data *tempch;
send_to_char(ch, "Name: '%s%s%s', Aliases: %s\r\n", CCYEL(ch, C_NRM),
j->short_description ? j->short_description : "<None>",
@ -743,6 +744,13 @@ void do_stat_object(struct char_data *ch, struct obj_data *j)
case ITEM_MONEY:
send_to_char(ch, "Coins: %d\r\n", GET_OBJ_VAL(j, 0));
break;
case ITEM_CHAIR:
send_to_char(ch, "Can hold: [%d] Num. of People in Chair: [%d]\r\n", GET_OBJ_VAL(j, 0), GET_OBJ_VAL(j, 1));
send_to_char(ch, "Holding : ");
for (tempch = OBJ_SAT_IN_BY(j); tempch; tempch = NEXT_SITTING(tempch))
send_to_char(ch, "%s ", GET_NAME(tempch));
send_to_char(ch, "\r\n");
break;
default:
send_to_char(ch, "Values 0-3: [%d] [%d] [%d] [%d]\r\n",
GET_OBJ_VAL(j, 0), GET_OBJ_VAL(j, 1),

View file

@ -319,6 +319,7 @@ const char *item_types[] = {
"PEN",
"BOAT",
"FOUNTAIN",
"CHAIR",
"\n"
};
@ -498,8 +499,7 @@ const char *fullness[] =
""
};
/* str, int, wis, dex, con applies **************************************/
/* [ch] strength apply (all) */
/* str, int, wis, dex, con applies, [ch] strength apply (all) */
cpp_extern const struct str_app_type str_app[] = {
{-5, -4, 0, 0}, /* str = 0 */
{-5, -4, 3, 1}, /* str = 1 */

View file

@ -1719,6 +1719,8 @@ char *parse_object(FILE *obj_f, int nr)
GET_OBJ_RENT(obj_proto + i) = t[2];
GET_OBJ_LEVEL(obj_proto + i) = t[3];
obj_proto[i].sitting_here = NULL;
/* check to make sure that weight of containers exceeds curr. quantity */
if (GET_OBJ_TYPE(obj_proto + i) == ITEM_DRINKCON ||
GET_OBJ_TYPE(obj_proto + i) == ITEM_FOUNTAIN) {
@ -2665,6 +2667,7 @@ void reset_char(struct char_data *ch)
ch->next_fighting = NULL;
ch->next_in_room = NULL;
FIGHTING(ch) = NULL;
char_from_chair(ch);
ch->char_specials.position = POS_STANDING;
ch->mob_specials.default_pos = POS_STANDING;
ch->char_specials.carry_weight = 0;
@ -2954,7 +2957,13 @@ int check_object(struct obj_data *obj)
} while (onealias && *onealias);
}
break;
}
case ITEM_CHAIR:
if (GET_OBJ_VAL(obj, 1) > GET_OBJ_VAL(obj, 0) && (error = TRUE))
log("SYSERR: Object #%d (%s) contains (%d) more than maximum (%d).",
GET_OBJ_VNUM(obj), obj->short_description, GET_OBJ_VAL(obj, 1),
GET_OBJ_VAL(obj, 0));
break;
}
return (error);
}

View file

@ -31,9 +31,7 @@ obj_rnum add_object(struct obj_data *newobj, obj_vnum ovnum)
int found = NOTHING;
zone_rnum rznum = real_zone_by_thing(ovnum);
/*
* Write object to internal tables.
*/
/* Write object to internal tables. */
if ((newobj->item_number = real_object(ovnum)) != NOTHING) {
copy_object(&obj_proto[newobj->item_number], newobj);
update_all_objects(&obj_proto[newobj->item_number]);
@ -47,15 +45,10 @@ obj_rnum add_object(struct obj_data *newobj, obj_vnum ovnum)
return found;
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
/*
* Fix all existing objects to have these values.
* We need to run through each and every object currently in the
* game to see which ones are pointing to this prototype.
* if object is pointing to this prototype, then we need to replace it
* with the new one.
*/
/* Fix all existing objects to have these values. We need to run through each
* and every object currently in the game to see which ones are pointing to
* this prototype. If object is pointing to this prototype, then we need to
* replace it with the new one. */
int update_all_objects(struct obj_data *refobj)
{
struct obj_data *obj, swap;
@ -80,17 +73,15 @@ int update_all_objects(struct obj_data *refobj)
obj->contains = swap.contains;
obj->next_content = swap.next_content;
obj->next = swap.next;
obj->sitting_here = swap.sitting_here;
}
return count;
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
/*
* Adjust the internal values of other objects as if something was inserted at the given array index.
* Might also be useful to make 'holes' in the array for some reason.
*/
/* Adjust the internal values of other objects as if something was inserted at
* the given array index. Might also be useful to make 'holes' in the array
* for some reason. */
obj_rnum adjust_objects(obj_rnum refpt)
{
int shop, i, zone, cmd_no;
@ -103,23 +94,17 @@ obj_rnum adjust_objects(obj_rnum refpt)
#endif
return NOTHING;
/*
* Renumber live objects.
*/
/* Renumber live objects. */
for (obj = object_list; obj; obj = obj->next)
GET_OBJ_RNUM(obj) += (GET_OBJ_RNUM(obj) >= refpt);
/*
* Renumber zone table.
*/
/* Renumber zone table. */
for (zone = 0; zone <= top_of_zone_table; zone++) {
for (cmd_no = 0; ZCMD(zone, cmd_no).command != 'S'; cmd_no++) {
switch (ZCMD(zone, cmd_no).command) {
case 'P':
ZCMD(zone, cmd_no).arg3 += (ZCMD(zone, cmd_no).arg3 >= refpt);
/*
* No break here - drop into next case.
*/
/* No break here - drop into next case. */
case 'O':
case 'G':
case 'E':
@ -132,15 +117,11 @@ obj_rnum adjust_objects(obj_rnum refpt)
}
}
/*
* Renumber notice boards.
*/
/* Renumber notice boards. */
for (i = 0; i < NUM_OF_BOARDS; i++)
BOARD_RNUM(i) += (BOARD_RNUM(i) >= refpt);
/*
* Renumber shop produce.
*/
/* Renumber shop produce. */
for (shop = 0; shop <= top_shop - top_shop_offset; shop++)
for (i = 0; SHOP_PRODUCT(shop, i) != NOTHING; i++)
SHOP_PRODUCT(shop, i) += (SHOP_PRODUCT(shop, i) >= refpt);
@ -148,12 +129,9 @@ obj_rnum adjust_objects(obj_rnum refpt)
return refpt;
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
/*
* Function handle the insertion of an object within the prototype framework. Note that this does not adjust internal values
* of other objects, use add_object() for that.
*/
/* Function handle the insertion of an object within the prototype framework.
* Note that this does not adjust internal values of other objects, use
* add_object() for that. */
obj_rnum insert_object(struct obj_data *obj, obj_vnum ovnum)
{
obj_rnum i;
@ -162,13 +140,9 @@ obj_rnum insert_object(struct obj_data *obj, obj_vnum ovnum)
RECREATE(obj_index, struct index_data, top_of_objt + 1);
RECREATE(obj_proto, struct obj_data, top_of_objt + 1);
/*
* Start counting through both tables.
*/
/* Start counting through both tables. */
for (i = top_of_objt; i > 0; i--) {
/*
* Check if current virtual is bigger than our virtual number.
*/
/* Check if current virtual is bigger than our virtual number. */
if (ovnum > obj_index[i - 1].vnum)
return index_object(obj, ovnum, i);
@ -182,8 +156,6 @@ obj_rnum insert_object(struct obj_data *obj, obj_vnum ovnum)
return index_object(obj, ovnum, 0);
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
obj_rnum index_object(struct obj_data *obj, obj_vnum ovnum, obj_rnum ornum)
{
#if CIRCLE_UNSIGNED_INDEX
@ -204,8 +176,6 @@ obj_rnum index_object(struct obj_data *obj, obj_vnum ovnum, obj_rnum ornum)
return ornum;
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
int save_objects(zone_rnum zone_num)
{
char fname[128], buf[MAX_STRING_LENGTH], bit1[64], bit2[64];
@ -228,9 +198,7 @@ int save_objects(zone_rnum zone_num)
mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: OLC: Cannot open objects file %s!", fname);
return FALSE;
}
/*
* Start running through all objects in this zone.
*/
/* Start running through all objects in this zone. */
for (counter = genolc_zone_bottom(zone_num); counter <= zone_table[zone_num].top; counter++) {
if ((realcounter = real_object(counter)) != NOTHING) {
if ((obj = &obj_proto[realcounter])->action_description) {
@ -266,19 +234,13 @@ int save_objects(zone_rnum zone_num)
GET_OBJ_WEIGHT(obj), GET_OBJ_COST(obj), GET_OBJ_RENT(obj), GET_OBJ_LEVEL(obj)
);
/*
* Do we have script(s) attached ?
*/
/* Do we have script(s) attached? */
script_save_to_disk(fp, obj, OBJ_TRIGGER);
/*
* Do we have extra descriptions?
*/
/* Do we have extra descriptions? */
if (obj->ex_description) { /* Yes, save them too. */
for (ex_desc = obj->ex_description; ex_desc; ex_desc = ex_desc->next) {
/*
* Sanity check to prevent nasty protection faults.
*/
/* Sanity check to prevent nasty protection faults. */
if (!ex_desc->keyword || !ex_desc->description || !*ex_desc->keyword || !*ex_desc->description) {
mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: OLC: oedit_save_to_disk: Corrupt ex_desc!");
continue;
@ -290,9 +252,7 @@ int save_objects(zone_rnum zone_num)
"%s~\n", ex_desc->keyword, buf);
}
}
/*
* Do we have affects?
*/
/* Do we have affects? */
for (counter2 = 0; counter2 < MAX_OBJ_AFFECT; counter2++)
if (obj->affected[counter2].modifier)
fprintf(fp, "A\n"
@ -301,9 +261,7 @@ int save_objects(zone_rnum zone_num)
}
}
/*
* Write the final line, close the file.
*/
/* Write the final line, close the file. */
fprintf(fp, "$~\n");
fclose(fp);
snprintf(buf, sizeof(buf), "%s/%d.obj", OBJ_PREFIX, zone_table[zone_num].number);
@ -315,9 +273,7 @@ int save_objects(zone_rnum zone_num)
return TRUE;
}
/*
* Free all, unconditionally.
*/
/* Free all, unconditionally. */
void free_object_strings(struct obj_data *obj)
{
if (obj->name)
@ -332,9 +288,7 @@ void free_object_strings(struct obj_data *obj)
free_ex_descriptions(obj->ex_description);
}
/*
* For object instances that are not the prototype.
*/
/* For object instances that are not the prototype. */
void free_object_strings_proto(struct obj_data *obj)
{
int robj_num = GET_OBJ_RNUM(obj);
@ -421,34 +375,34 @@ int delete_object(obj_rnum rnum)
if (tmp->item_number != obj->item_number)
continue;
// extract_obj() will just axe contents.
/* extract_obj() will just axe contents. */
if (tmp->contains) {
struct obj_data *this_content, *next_content;
for (this_content = tmp->contains; this_content; this_content = next_content) {
next_content = this_content->next_content;
if (IN_ROOM(tmp)) {
// transfer stuff from object to room
/* Transfer stuff from object to room. */
obj_from_obj(this_content);
obj_to_room(this_content, IN_ROOM(tmp));
} else if (tmp->worn_by || tmp->carried_by) {
// transfer stuff from object to person inventory
/* Transfer stuff from object to person inventory. */
obj_from_char(this_content);
obj_to_char(this_content, tmp->carried_by);
} else if (tmp->in_obj) {
// transfer stuff from object to containing object
/* Transfer stuff from object to containing object. */
obj_from_obj(this_content);
obj_to_obj(this_content, tmp->in_obj);
}
}
}
// remove from object_list, etc. - handles weightchanges, and similar.
/* Remove from object_list, etc. - handles weightchanges, and similar. */
extract_obj(tmp);
}
// make sure all are removed.
/* Make sure all are removed. */
assert(obj_index[rnum].number == 0);
// adjust rnums of all other objects.
/* Adjust rnums of all other objects. */
for (tmp = object_list; tmp; tmp = tmp->next) {
GET_OBJ_RNUM(tmp) -= (GET_OBJ_RNUM(tmp) > rnum);
}
@ -463,22 +417,16 @@ int delete_object(obj_rnum rnum)
RECREATE(obj_index, struct index_data, top_of_objt + 1);
RECREATE(obj_proto, struct obj_data, top_of_objt + 1);
/*
* Renumber notice boards.
*/
/* Renumber notice boards. */
for (j = 0; j < NUM_OF_BOARDS; j++)
BOARD_RNUM(j) -= (BOARD_RNUM(j) > rnum);
/*
* Renumber shop produce;
*/
/* Renumber shop produce. */
for (shop = 0; shop <= top_shop - top_shop_offset; shop++)
for (j = 0; SHOP_PRODUCT(shop, j) != NOTHING; j++)
SHOP_PRODUCT(shop, j) -= (SHOP_PRODUCT(shop, j) > rnum);
/*
* Renumber zone table.
*/
/* Renumber zone table. */
int zone, cmd_no;
for (zone = 0; zone <= top_of_zone_table; zone++) {
for (cmd_no = 0; ZCMD(zone, cmd_no).command != 'S'; cmd_no++) {

View file

@ -800,10 +800,10 @@ void object_list_new_owner(struct obj_data *list, struct char_data *ch)
}
}
/* Extract an object from the world */
void extract_obj(struct obj_data *obj)
{
struct char_data *ch, *next = NULL;
struct obj_data *temp;
if (obj->worn_by != NULL)
@ -816,6 +816,17 @@ void extract_obj(struct obj_data *obj)
else if (obj->in_obj)
obj_from_obj(obj);
if (OBJ_SAT_IN_BY(obj)){
for (ch = OBJ_SAT_IN_BY(obj); OBJ_SAT_IN_BY(obj); ch = next){
if (!NEXT_SITTING(ch))
OBJ_SAT_IN_BY(obj) = NULL;
else
OBJ_SAT_IN_BY(obj) = (next = NEXT_SITTING(ch));
SITTING(ch) = NULL;
NEXT_SITTING(ch) = NULL;
}
}
/* Get rid of the contents of the object, as well. */
while (obj->contains)
extract_obj(obj->contains);
@ -834,8 +845,6 @@ void extract_obj(struct obj_data *obj)
free_obj(obj);
}
void update_object(struct obj_data *obj, int use)
{
/* dont update objects with a timer trigger */
@ -847,7 +856,6 @@ void update_object(struct obj_data *obj, int use)
update_object(obj->next_content, use);
}
void update_char_objects(struct char_data *ch)
{
int i;
@ -874,7 +882,6 @@ void update_char_objects(struct char_data *ch)
update_object(ch->carrying, 1);
}
/* Extract a ch completely from the world, and leave his stuff behind */
void extract_char_final(struct char_data *ch)
{
@ -889,11 +896,9 @@ void extract_char_final(struct char_data *ch)
exit(1);
}
/*
* We're booting the character of someone who has switched so first we
* need to stuff them back into their own body. This will set ch->desc
* we're checking below this loop to the proper value.
*/
/* We're booting the character of someone who has switched so first we need
* to stuff them back into their own body. This will set ch->desc we're
* checking below this loop to the proper value. */
if (!IS_NPC(ch) && !ch->desc) {
for (d = descriptor_list; d; d = d->next)
if (d->original == ch) {
@ -903,24 +908,18 @@ void extract_char_final(struct char_data *ch)
}
if (ch->desc) {
/*
* This time we're extracting the body someone has switched into
* (not the body of someone switching as above) so we need to put
* the switcher back to their own body.
*
* If this body is not possessed, the owner won't have a
* body after the removal so dump them to the main menu.
*/
/* This time we're extracting the body someone has switched into (not the
* body of someone switching as above) so we need to put the switcher back
* to their own body. If this body is not possessed, the owner won't have a
* body after the removal so dump them to the main menu. */
if (ch->desc->original)
do_return(ch, NULL, 0, 0);
else {
/*
* Now we boot anybody trying to log in with the same character, to
* help guard against duping. CON_DISCONNECT is used to close a
* descriptor without extracting the d->character associated with it,
* for being link-dead, so we want CON_CLOSE to clean everything up.
* If we're here, we know it's a player so no IS_NPC check required.
*/
/* Now we boot anybody trying to log in with the same character, to help
* guard against duping. CON_DISCONNECT is used to close a descriptor
* without extracting the d->character associated with it, for being
* link-dead, so we want CON_CLOSE to clean everything up. If we're
* here, we know it's a player so no IS_NPC check required. */
for (d = descriptor_list; d; d = d->next) {
if (d == ch->desc)
continue;
@ -933,7 +932,6 @@ void extract_char_final(struct char_data *ch)
}
/* On with the character's assets... */
if (ch->followers || ch->master)
die_follower(ch);
@ -985,21 +983,16 @@ void extract_char_final(struct char_data *ch)
}
/*
* Q: Why do we do this?
* A: Because trying to iterate over the character
* list with 'ch = ch->next' does bad things if
* the current character happens to die. The
* trivial workaround of 'vict = next_vict'
* doesn't work if the _next_ person in the list
* gets killed, for example, by an area spell.
*
* Q: Why do we leave them on the character_list?
* A: Because code doing 'vict = vict->next' would
* get really confused otherwise.
*/
/* Why do we do this? Because trying to iterate over the character list with
* 'ch = ch->next' does bad things if the current character happens to die. The
* trivial workaround of 'vict = next_vict' doesn't work if the _next_ person
* in the list gets killed, for example, by an area spell. Why do we leave them
* on the character_list? Because code doing 'vict = vict->next' would get
* really confused otherwise. */
void extract_char(struct char_data *ch)
{
char_from_chair(ch);
if (IS_NPC(ch))
SET_BIT(MOB_FLAGS(ch), MOB_NOTDEADYET);
else
@ -1008,17 +1001,10 @@ void extract_char(struct char_data *ch)
extractions_pending++;
}
/*
* I'm not particularly pleased with the MOB/PLR
* hoops that have to be jumped through but it
* hardly calls for a completely new variable.
* Ideally it would be its own list, but that
* would change the '->next' pointer, potentially
* confusing some code. Ugh. -gg 3/15/2001
*
* NOTE: This doesn't handle recursive extractions.
*/
/* I'm not particularly pleased with the MOB/PLR hoops that have to be jumped
* through but it hardly calls for a completely new variable. Ideally it would
* be its own list, but that would change the '->next' pointer, potentially
* confusing some code. -gg This doesn't handle recursive extractions. */
void extract_pending_chars(void)
{
struct char_data *vict, *next_vict, *prev_vict;
@ -1054,13 +1040,8 @@ void extract_pending_chars(void)
extractions_pending = 0;
}
/* ***********************************************************************
* Here follows high-level versions of some earlier routines, ie functions*
* which incorporate the actual player-data *.
*********************************************************************** */
/* Here follows high-level versions of some earlier routines, ie functions
* which incorporate the actual player-data */
struct char_data *get_player_vis(struct char_data *ch, char *name, int *number, int inroom)
{
struct char_data *i;
@ -1088,7 +1069,6 @@ struct char_data *get_player_vis(struct char_data *ch, char *name, int *number,
return (NULL);
}
struct char_data *get_char_room_vis(struct char_data *ch, char *name, int *number)
{
struct char_data *i;
@ -1116,7 +1096,6 @@ struct char_data *get_char_room_vis(struct char_data *ch, char *name, int *numbe
return (NULL);
}
struct char_data *get_char_world_vis(struct char_data *ch, char *name, int *number)
{
struct char_data *i;
@ -1148,7 +1127,6 @@ struct char_data *get_char_world_vis(struct char_data *ch, char *name, int *numb
return (NULL);
}
struct char_data *get_char_vis(struct char_data *ch, char *name, int *number, int where)
{
if (where == FIND_CHAR_ROOM)
@ -1159,7 +1137,6 @@ struct char_data *get_char_vis(struct char_data *ch, char *name, int *number, in
return (NULL);
}
struct obj_data *get_obj_in_list_vis(struct char_data *ch, char *name, int *number, struct obj_data *list)
{
struct obj_data *i;
@ -1182,7 +1159,6 @@ struct obj_data *get_obj_in_list_vis(struct char_data *ch, char *name, int *numb
return (NULL);
}
/* search the entire world for an object, and return a pointer */
struct obj_data *get_obj_vis(struct char_data *ch, char *name, int *number)
{
@ -1215,7 +1191,6 @@ struct obj_data *get_obj_vis(struct char_data *ch, char *name, int *number)
return (NULL);
}
struct obj_data *get_obj_in_equip_vis(struct char_data *ch, char *arg, int *number, struct obj_data *equipment[])
{
int j, num;
@ -1236,7 +1211,6 @@ struct obj_data *get_obj_in_equip_vis(struct char_data *ch, char *arg, int *numb
return (NULL);
}
int get_obj_pos_in_equip_vis(struct char_data *ch, char *arg, int *number, struct obj_data *equipment[])
{
int j, num;
@ -1257,7 +1231,6 @@ int get_obj_pos_in_equip_vis(struct char_data *ch, char *arg, int *number, struc
return (-1);
}
const char *money_desc(int amount)
{
int cnt;
@ -1294,7 +1267,6 @@ const char *money_desc(int amount)
return ("an absolutely colossal mountain of gold coins");
}
struct obj_data *create_money(int amount)
{
struct obj_data *obj;
@ -1347,10 +1319,7 @@ struct obj_data *create_money(int amount)
return (obj);
}
/* Generic Find, designed to find any object/character
*
* Calling:
/* Generic Find, designed to find any object orcharacter.
* *arg is the pointer containing the string to be searched for.
* This string doesn't have to be a single word, the routine
* extracts the next word itself.
@ -1362,8 +1331,7 @@ struct obj_data *create_money(int amount)
*
* The routine used to return a pointer to the next word in *arg (just
* like the one_argument routine), but now it returns an integer that
* describes what it filled in.
*/
* describes what it filled in. */
int generic_find(char *arg, bitvector_t bitvector, struct char_data *ch,
struct char_data **tar_ch, struct obj_data **tar_obj)
{
@ -1419,7 +1387,6 @@ int generic_find(char *arg, bitvector_t bitvector, struct char_data *ch,
return (0);
}
/* a function to scan for "all" or "all.x" */
int find_all_dots(char *arg)
{

View file

@ -1213,6 +1213,8 @@ int perform_dupe_check(struct descriptor_data *d)
write_to_output(d, "Reconnecting.\r\n");
act("$n has reconnected.", TRUE, d->character, 0, 0, TO_ROOM);
mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "%s [%s] has reconnected.", GET_NAME(d->character), d->host);
if (has_mail(GET_IDNUM(d->character)))
write_to_output(d, "You have mail waiting.\r\n");
break;
case USURP:
write_to_output(d, "You take over your own body, already in use!\r\n");

View file

@ -24,7 +24,7 @@
#define NUM_AFF_FLAGS 22
#define NUM_ATTACK_TYPES 15
#define NUM_ITEM_TYPES 24
#define NUM_ITEM_TYPES 25
#define NUM_ITEM_FLAGS 17
#define NUM_ITEM_WEARS 15
#define NUM_APPLIES 25
@ -36,6 +36,8 @@
#define NUM_SHOP_FLAGS 3
#define NUM_TRADERS 7
#define MAX_PEOPLE_IN_CHAIR 10 /* The maximum number of people you want
to sit in a chair at the same time. */
/* Limit information. */
#define MAX_ROOM_NAME 75
#define MAX_MOB_NAME 50
@ -64,8 +66,8 @@
#define MAX_OBJ_TIMER 1071000
/* this defines how much memory is alloacted for 'bit strings' when
saving in OLC. Remember to change it if you go for longer bitvectors. */
/* this defines how much memory is alloacted for 'bit strings' when saving in
* OLC. Remember to change it if you go for longer bitvectors. */
#define BIT_STRING_LENGTH 33
/* The data types for miscellaneous functions. */

View file

@ -188,11 +188,7 @@ int objsave_save_obj_record(struct obj_data *obj, FILE *fp, int locate)
#undef TEST_OBJS
#undef TEST_OBJN
/*
* AutoEQ by Burkhard Knopf <burkhard.knopf@informatik.tu-clausthal.de>
*/
/* AutoEQ by Burkhard Knopf <burkhard.knopf@informatik.tu-clausthal.de> */
void auto_equip(struct char_data *ch, struct obj_data *obj, int location)
{
int j;
@ -270,10 +266,8 @@ void auto_equip(struct char_data *ch, struct obj_data *obj, int location)
if (location > 0) { /* Wearable. */
if (!GET_EQ(ch,j)) {
/*
* Check the characters's alignment to prevent them from being
* zapped through the auto-equipping.
*/
/* Check the characters's alignment to prevent them from being zapped
* through the auto-equipping. */
if (invalid_align(ch, obj) || invalid_class(ch, obj))
location = LOC_INVENTORY;
else
@ -311,7 +305,6 @@ int Crash_delete_file(char *name)
return TRUE;
}
int Crash_delete_crashfile(struct char_data *ch)
{
char fname[MAX_INPUT_LENGTH];
@ -341,7 +334,6 @@ int Crash_delete_crashfile(struct char_data *ch)
return TRUE;
}
int Crash_clean_file(char *name)
{
char fname[MAX_INPUT_LENGTH], filetype[20];
@ -353,10 +345,7 @@ int Crash_clean_file(char *name)
if (!get_filename(fname, sizeof(fname), CRASH_FILE, name))
return FALSE;
/*
* open for write so that permission problems will be flagged now, at boot
* time.
*/
/* Open so that permission problems will be flagged now, at boot time. */
if (!(fl = fopen(fname, "rw"))) {
if (errno != ENOENT) /* if it fails, NOT because of no file */
log("SYSERR: OPENING OBJECT FILE %s (4): %s", fname, strerror(errno));
@ -403,7 +392,6 @@ int Crash_clean_file(char *name)
return FALSE;
}
void update_obj_file(void)
{
int i;
@ -413,7 +401,6 @@ void update_obj_file(void)
Crash_clean_file(player_table[i].name);
}
void Crash_listrent(struct char_data *ch, char *name)
{
FILE *fl;
@ -469,9 +456,7 @@ void Crash_listrent(struct char_data *ch, char *name)
GET_OBJ_RENT(current->obj),
current->obj->short_description);
/*
* now it's safe to free the obj_save_data list and the objects on it.
*/
/* Now it's safe to free the obj_save_data list and the objects on it. */
while (loaded != NULL) {
current = loaded;
loaded = loaded->next;
@ -483,19 +468,15 @@ void Crash_listrent(struct char_data *ch, char *name)
fclose(fl);
}
/*
* Return values:
/* Return values:
* 0 - successful load, keep char in rent room.
* 1 - load failure or load of crash items -- put char in temple.
* 2 - rented equipment lost (no $)
*/
* 2 - rented equipment lost (no $) */
int Crash_load(struct char_data *ch)
{
return (Crash_load_objs(ch));
}
int Crash_save(struct obj_data *obj, FILE *fp, int location)
{
struct obj_data *tmp;
@ -516,7 +497,6 @@ int Crash_save(struct obj_data *obj, FILE *fp, int location)
return (TRUE);
}
void Crash_restore_weight(struct obj_data *obj)
{
if (obj) {
@ -527,10 +507,8 @@ void Crash_restore_weight(struct obj_data *obj)
}
}
/*
* Get !RENT items from equipment to inventory and
* extract !RENT out of worn containers.
*/
/* Get !RENT items from equipment to inventory and extract !RENT out of worn
* containers. */
void Crash_extract_norent_eq(struct char_data *ch)
{
int j;
@ -555,7 +533,6 @@ void Crash_extract_objs(struct obj_data *obj)
}
}
int Crash_is_unrentable(struct obj_data *obj)
{
if (!obj)
@ -572,7 +549,6 @@ int Crash_is_unrentable(struct obj_data *obj)
return FALSE;
}
void Crash_extract_norents(struct obj_data *obj)
{
if (obj) {
@ -583,7 +559,6 @@ void Crash_extract_norents(struct obj_data *obj)
}
}
void Crash_extract_expensive(struct obj_data *obj)
{
struct obj_data *tobj, *max;
@ -595,8 +570,6 @@ void Crash_extract_expensive(struct obj_data *obj)
extract_obj(max);
}
void Crash_calculate_rent(struct obj_data *obj, int *cost)
{
if (obj) {
@ -606,7 +579,6 @@ void Crash_calculate_rent(struct obj_data *obj, int *cost)
}
}
void Crash_crashsave(struct char_data *ch)
{
char buf[MAX_INPUT_LENGTH];
@ -645,7 +617,6 @@ void Crash_crashsave(struct char_data *ch)
REMOVE_BIT(PLR_FLAGS(ch), PLR_CRASH);
}
void Crash_idlesave(struct char_data *ch)
{
char buf[MAX_INPUT_LENGTH];
@ -720,7 +691,6 @@ void Crash_idlesave(struct char_data *ch)
Crash_extract_objs(ch->carrying);
}
void Crash_rentsave(struct char_data *ch, int cost)
{
char buf[MAX_INPUT_LENGTH];
@ -823,11 +793,7 @@ void Crash_cryosave(struct char_data *ch, int cost)
SET_BIT(PLR_FLAGS(ch), PLR_CRYO);
}
/* ************************************************************************
* Routines used for the receptionist *
************************************************************************* */
/* Routines used for the receptionist. */
void Crash_rent_deadline(struct char_data *ch, struct char_data *recep,
long cost)
{
@ -861,11 +827,8 @@ int Crash_report_unrentables(struct char_data *ch, struct char_data *recep,
return (has_norents);
}
void Crash_report_rent(struct char_data *ch, struct char_data *recep,
struct obj_data *obj, long *cost, long *nitems,
int display, int factor)
void Crash_report_rent(struct char_data *ch, struct char_data *recep, struct
obj_data *obj, long *cost, long *nitems, int display, int factor)
{
static char buf[256];
@ -884,8 +847,6 @@ void Crash_report_rent(struct char_data *ch, struct char_data *recep,
}
}
int Crash_offer_rent(struct char_data *ch, struct char_data *receptionist,
int display, int factor)
{
@ -935,8 +896,8 @@ int Crash_offer_rent(struct char_data *ch, struct char_data *receptionist,
return (totalcost);
}
int gen_receptionist(struct char_data *ch, struct char_data *recep,
int cmd, char *arg, int mode)
int gen_receptionist(struct char_data *ch, struct char_data *recep, int cmd,
char *arg, int mode)
{
int cost;
const char *action_table[] = { "smile", "dance", "sigh", "blush", "burp",
@ -1014,19 +975,16 @@ int gen_receptionist(struct char_data *ch, struct char_data *recep,
return (TRUE);
}
SPECIAL(receptionist)
{
return (gen_receptionist(ch, (struct char_data *)me, cmd, argument, RENT_FACTOR));
}
SPECIAL(cryogenicist)
{
return (gen_receptionist(ch, (struct char_data *)me, cmd, argument, CRYO_FACTOR));
}
void Crash_save_all(void)
{
struct descriptor_data *d;
@ -1041,21 +999,19 @@ void Crash_save_all(void)
}
}
/*
* parses the object records stored in fl, and returns the first object in a
* linked list, which also handles location if worn.
* this list can then be handled by house code, listrent code, autoeq code, etc.
*/
/* Parses the object records stored in fl, and returns the first object in a
* linked list, which also handles location if worn. This list can then be
* handled by house code, listrent code, autoeq code, etc. */
obj_save_data *objsave_parse_objects(FILE *fl)
{
obj_save_data *head, *current;
obj_save_data *head, *current;
char line[READ_SIZE];
int t[4],i, nr;
struct obj_data *temp;
CREATE(current, obj_save_data, 1);
head = current;
current->locate = 0;
CREATE(current, obj_save_data, 1);
head = current;
current->locate = 0;
temp = NULL;
while (TRUE) {
@ -1063,59 +1019,45 @@ obj_save_data *objsave_parse_objects(FILE *fl)
int num;
/* if the file is done, wrap it all up */
if(get_line(fl, line) == FALSE || (*line == '$' && line[1] == '~'))
{
if (temp == NULL && current->obj == NULL)
{
// remove current from list
obj_save_data *t = head;
if (t == current)
{
free(current);
head = NULL;
}
else
{
while (t)
{
if (t->next == current)
t->next = NULL;
if(get_line(fl, line) == FALSE || (*line == '$' && line[1] == '~')) {
if (temp == NULL && current->obj == NULL) {
/* Remove current from list. */
obj_save_data *t = head;
if (t == current) {
free(current);
head = NULL;
} else {
while (t) {
if (t->next == current)
t->next = NULL;
t = t->next;
}
free(current);
}
}
else if (temp != NULL && current->obj == NULL)
current->obj = temp;
else if (temp == NULL && current->obj != NULL) {
/* Do nothing. */
} else if (temp != NULL && current->obj != NULL) {
if (temp != current->obj)
log("inconsistent object pointers in objsave_parse_objects: %p/%p", temp, current->obj);
}
t = t->next;
}
free(current);
}
}
else if (temp != NULL && current->obj == NULL)
{
current->obj = temp;
}
else if (temp == NULL && current->obj != NULL)
{
// do nothing
}
else if (temp != NULL && current->obj != NULL)
{
if (temp != current->obj)
log("inconsistent object pointers in objsave_parse_objects: %p/%p", temp, current->obj);
}
break;
break;
}
/* if it's a new record, wrap up the old one, and make space for a new one */
if (*line == '#') {
/* check for false alarm. */
if (sscanf(line, "#%d", &nr) == 1)
{
if (temp)
{
if (sscanf(line, "#%d", &nr) == 1) {
if (temp) {
current->obj = temp;
CREATE(current->next, obj_save_data, 1);
current=current->next;
CREATE(current->next, obj_save_data, 1);
current=current->next;
current->locate = 0;
temp = NULL;
current->locate = 0;
temp = NULL;
}
}
else
@ -1129,12 +1071,12 @@ obj_save_data *objsave_parse_objects(FILE *fl)
} else {
if(real_object(nr) != NOTHING) {
temp=read_object(nr,VIRTUAL);
// go read next line - nothing more to see here
/* Go read next line - nothing more to see here. */
} else {
log("Nonexistent object %d found in rent file.", nr);
}
}
// go read next line - nothing more to see here
/* go read next line - nothing more to see here. */
continue;
}
@ -1221,14 +1163,13 @@ obj_save_data *objsave_parse_objects(FILE *fl)
}
break;
default:
log("Unknown tag in rentfile: %s", tag);
log("Unknown tag in rentfile: %s", tag);
}
}
return head;
return head;
}
int Crash_load_objs(struct char_data *ch) {
FILE *fl;
char fname[MAX_STRING_LENGTH];
@ -1306,10 +1247,8 @@ int Crash_load_objs(struct char_data *ch) {
for (current = loaded; current != NULL; current=current->next)
num_objs += handle_obj(current->obj, ch, current->locate, cont_row);
/*
* now it's safe to free the obj_save_data list - all members of it
* have been put in the correct lists by handle_obj()
*/
/* now it's safe to free the obj_save_data list - all members of it
* have been put in the correct lists by handle_obj() */
while (loaded != NULL) {
current = loaded;
loaded = loaded->next;
@ -1328,7 +1267,6 @@ int Crash_load_objs(struct char_data *ch) {
return 1;
}
int handle_obj(struct obj_data *temp, struct char_data *ch, int locate, struct obj_data **cont_row)
{
int j;
@ -1339,29 +1277,17 @@ int handle_obj(struct obj_data *temp, struct char_data *ch, int locate, struct o
auto_equip(ch, temp, locate);
/*
what to do with a new loaded item:
if there's a list with <locate> less than 1 below this:
(equipped items are assumed to have <locate>==0 here) then its
container has disappeared from the file *gasp*
-> put all the list back to ch's inventory
if there's a list of contents with <locate> 1 below this:
check if it's a container
- if so: get it from ch, fill it, and give it back to ch (this way the
container has its correct weight before modifying ch)
- if not: the container is missing -> put all the list to ch's inventory
for items with negative <locate>:
if there's already a list of contents with the same <locate> put obj to it
if not, start a new list
Confused? Well maybe you can think of some better text to be put here ...
since <locate> for contents is < 0 the list indices are switched to
non-negative
*/
/* What to do with a new loaded item:
* If there's a list with <locate> less than 1 below this: (equipped items
* are assumed to have <locate>==0 here) then its container has disappeared
* from the file *gasp* -> put all the list back to ch's inventory if
* there's a list of contents with <locate> 1 below this: check if it's a
* container - if so: get it from ch, fill it, and give it back to ch (this
* way the container has its correct weight before modifying ch) - if not:
* the container is missing -> put all the list to ch's inventory. For items
* with negative <locate>: If there's already a list of contents with the
* same <locate> put obj to it if not, start a new list. Since <locate> for
* contents is < 0 the list indices are switched to non-negative. */
if (locate > 0) { /* item equipped */
for (j = MAX_BAG_ROWS-1;j > 0;j--)

View file

@ -65,8 +65,7 @@ ACMD(do_oasis_oedit)
/* Parse any arguments. */
buf3 = two_arguments(argument, buf1, buf2);
/* If there aren't any arguments...well...they can't modify nothing now
can they? */
/* If there aren't any arguments they can't modify anything. */
if (!*buf1) {
send_to_char(ch, "Specify an object VNUM to edit.\r\n");
return;
@ -164,8 +163,7 @@ ACMD(do_oasis_oedit)
OLC_NUM(d) = number;
/* If this is a new object, setup a new object, otherwise setup the existing
object. */
/* If a new object, setup new, otherwise setup the existing object. */
if ((real_num = real_object(number)) != NOTHING)
oedit_setup_existing(d, real_num);
else
@ -213,8 +211,8 @@ void oedit_setup_existing(struct descriptor_data *d, int real_num)
OLC_VAL(d) = 0;
OLC_ITEM_TYPE(d) = OBJ_TRIGGER;
dg_olc_script_copy(d);
/* The edited obj must not have a script. It will be assigned to the updated
obj later, after editing. */
/* The edited obj must not have a script. It will be assigned to the updated
* obj later, after editing. */
SCRIPT(obj) = NULL;
OLC_OBJ(d)->proto_script = NULL;
@ -411,7 +409,7 @@ void oedit_disp_spells_menu(struct descriptor_data *d)
get_char_colors(d->character);
clear_screen(d);
for (counter = 0; counter < NUM_SPELLS; counter++) {
for (counter = 1; counter <= NUM_SPELLS; counter++) {
write_to_output(d, "%s%2d%s) %s%-20.20s %s", grn, counter, nrm, yel,
spell_info[counter].name, !(++columns % 3) ? "\r\n" : "");
}
@ -424,9 +422,7 @@ void oedit_disp_val1_menu(struct descriptor_data *d)
OLC_MODE(d) = OEDIT_VALUE_1;
switch (GET_OBJ_TYPE(OLC_OBJ(d))) {
case ITEM_LIGHT:
/*
* values 0 and 1 are unused.. jump to 2
*/
/* values 0 and 1 are unused.. jump to 2 */
oedit_disp_val3_menu(d);
break;
case ITEM_SCROLL:
@ -436,9 +432,7 @@ void oedit_disp_val1_menu(struct descriptor_data *d)
write_to_output(d, "Spell level : ");
break;
case ITEM_WEAPON:
/*
* This doesn't seem to be used if I remembe right.
*/
/* This doesn't seem to be used if I remembe right. */
write_to_output(d, "Modifier to Hitroll : ");
break;
case ITEM_ARMOR:
@ -458,9 +452,9 @@ void oedit_disp_val1_menu(struct descriptor_data *d)
write_to_output(d, "Number of gold coins : ");
break;
case ITEM_NOTE:
/*
* This is supposed to be language, but it's unused.
*/
break;
case ITEM_CHAIR:
write_to_output(d, "Number of people the chair can hold : ");
break;
default:
oedit_disp_menu(d);
@ -488,9 +482,7 @@ void oedit_disp_val2_menu(struct descriptor_data *d)
oedit_disp_val4_menu(d);
break;
case ITEM_CONTAINER:
/*
* These are flags, needs a bit of special handling.
*/
/* These are flags, needs a bit of special handling. */
oedit_disp_container_flags_menu(d);
break;
case ITEM_DRINKCON:
@ -846,9 +838,7 @@ void oedit_parse(struct descriptor_data *d, char *arg)
oedit_disp_menu(d);
break;
}
return; /*
* end of OEDIT_MAIN_MENU
*/
return; /* end of OEDIT_MAIN_MENU */
case OLC_SCRIPT_EDIT:
if (dg_script_edit_parse(d, arg)) return;
@ -950,7 +940,16 @@ void oedit_parse(struct descriptor_data *d, char *arg)
return;
case OEDIT_VALUE_1:
number = atoi(arg);
switch (GET_OBJ_TYPE(OLC_OBJ(d))) {
case ITEM_CHAIR:
if (number < 0 || number > MAX_PEOPLE_IN_CHAIR)
oedit_disp_val1_menu(d);
else {
GET_OBJ_VAL(OLC_OBJ(d), 0) = number;
oedit_disp_val2_menu(d);
}
break;
case ITEM_WEAPON:
GET_OBJ_VAL(OLC_OBJ(d), 0) = MIN(MAX(atoi(arg), -50), 50);
break;
@ -1168,9 +1167,7 @@ void oedit_parse(struct descriptor_data *d, char *arg)
OLC_DESC(d) = OLC_DESC(d)->next;
}
}
/*
* No break - drop into default case.
*/
/* No break - drop into default case. */
default:
oedit_disp_extradesc_menu(d);
return;

View file

@ -295,6 +295,8 @@ int load_char(const char *name, struct char_data *ch)
GET_HOST(ch) = NULL;
GET_PAGE_LENGTH(ch) = PFDEF_PAGELENGTH;
GET_ALIASES(ch) = NULL;
SITTING(ch) = NULL;
NEXT_SITTING(ch) = NULL;
while (get_line(fl, line)) {
tag_argument(line, tag);

View file

@ -312,6 +312,7 @@
#define ITEM_PEN 21 /* Item is a pen */
#define ITEM_BOAT 22 /* Item is a boat */
#define ITEM_FOUNTAIN 23 /* Item is a fountain */
#define ITEM_CHAIR 24 /* Item is a chair */
/* Take/Wear flags: used by obj_data.obj_flags.wear_flags */
#define ITEM_WEAR_TAKE (1 << 0) /* Item can be taken */
@ -585,6 +586,7 @@ struct obj_data {
struct obj_data *next_content; /* For 'contains' lists */
struct obj_data *next; /* For the object list */
struct char_data *sitting_here;/* who is sitting in it */
};
/* File Element for Objects BEWARE: Changing it will ruin rent files */
@ -745,6 +747,8 @@ struct char_special_data_saved {
struct char_special_data {
struct char_data *fighting; /* Opponent */
struct char_data *hunting; /* Char hunted by this char */
struct obj_data *chair; /* Object the char is sitting in */
struct char_data *next_in_chair; /* The next person in the chair */
byte position; /* Standing, fighting, sleeping, etc. */

View file

@ -10,8 +10,6 @@
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "utils.h"
#include "db.h"
@ -21,7 +19,6 @@
#include "handler.h"
#include "interpreter.h"
/* external globals */
extern struct time_data time_info;
@ -30,7 +27,6 @@ struct time_info_data *real_time_passed(time_t t2, time_t t1);
struct time_info_data *mud_time_passed(time_t t2, time_t t1);
void prune_crlf(char *txt);
/* creates a random number in interval [from;to] */
int rand_number(int from, int to)
{
@ -42,21 +38,15 @@ int rand_number(int from, int to)
log("SYSERR: rand_number() should be called with lowest, then highest. (%d, %d), not (%d, %d).", from, to, to, from);
}
/*
* This should always be of the form:
*
* ((float)(to - from + 1) * rand() / (float)(RAND_MAX + from) + from);
*
* if you are using rand() due to historical non-randomness of the
* lower bits in older implementations. We always use circle_random()
* though, which shouldn't have that problem. Mean and standard
* deviation of both are identical (within the realm of statistical
* identity) if the rand() implementation is non-broken.
*/
/* This should always be of the form: ((float)(to - from + 1) * rand() /
* (float)(RAND_MAX + from) + from); If you are using rand() due to historical
* non-randomness of the lower bits in older implementations. We always use
* circle_random() though, which shouldn't have that problem. Mean and
* standard deviation of both are identical (within the realm of statistical
* identity) if the rand() implementation is non-broken. */
return ((circle_random() % (to - from + 1)) + from);
}
/* simulates dice roll */
int dice(int num, int size)
{
@ -71,7 +61,6 @@ int dice(int num, int size)
return (sum);
}
/* Be wary of sign issues with this. */
int MIN(int a, int b)
{
@ -84,7 +73,6 @@ int MAX(int a, int b)
return (a > b ? a : b);
}
/* color issue fix -- skip color codes, _then_ capitalize */
char *CAP(char *txt)
{
@ -97,19 +85,13 @@ char *CAP(char *txt)
return (txt);
}
#if !defined(HAVE_STRLCPY)
/*
* A 'strlcpy' function in the same fashion as 'strdup' below.
*
* This copies up to totalsize - 1 bytes from the source string, placing
* them and a trailing NUL into the destination string.
*
* Returns the total length of the string it tried to copy, not including
* the trailing NUL. So a '>= totalsize' test says it was truncated.
* (Note that you may have _expected_ truncation because you only wanted
* a few characters from the source string.)
*/
/* A 'strlcpy' function in the same fashion as 'strdup' below. This copies up
* to totalsize - 1 bytes from the source string, placing them and a trailing
* NUL into the destination string. Returns the total length of the string it
* tried to copy, not including the trailing NUL. So a '>= totalsize' test
* says it was truncated. (Note that you may have _expected_ truncation
* because you only wanted a few characters from the source string.) */
size_t strlcpy(char *dest, const char *source, size_t totalsize)
{
strncpy(dest, source, totalsize - 1); /* strncpy: OK (we must assume 'totalsize' is correct) */
@ -118,7 +100,6 @@ size_t strlcpy(char *dest, const char *source, size_t totalsize)
}
#endif
#if !defined(HAVE_STRDUP)
/* Create a duplicate of a string */
char *strdup(const char *source)
@ -130,10 +111,7 @@ char *strdup(const char *source)
}
#endif
/*
* Strips \r\n from end of string.
*/
/* Strips \r\n from end of string. */
void prune_crlf(char *txt)
{
int i = strlen(txt) - 1;
@ -142,14 +120,10 @@ void prune_crlf(char *txt)
txt[i--] = '\0';
}
#ifndef str_cmp
/*
* str_cmp: a case-insensitive version of strcmp().
* Returns: 0 if equal, > 0 if arg1 > arg2, or < 0 if arg1 < arg2.
*
* Scan until strings are found different or we reach the end of both.
*/
/* str_cmp: a case-insensitive version of strcmp(). Returns: 0 if equal, > 0
* if arg1 > arg2, or < 0 if arg1 < arg2. Scan until strings are found
* different or we reach the end of both. */
int str_cmp(const char *arg1, const char *arg2)
{
int chk, i;
@ -167,14 +141,10 @@ int str_cmp(const char *arg1, const char *arg2)
}
#endif
#ifndef strn_cmp
/*
* strn_cmp: a case-insensitive version of strncmp().
* Returns: 0 if equal, > 0 if arg1 > arg2, or < 0 if arg1 < arg2.
*
* Scan until strings are found different, the end of both, or n is reached.
*/
/* strn_cmp: a case-insensitive version of strncmp(). Returns: 0 if equal, > 0
* if arg1 > arg2, or < 0 if arg1 < arg2. Scan until strings are found
* different, the end of both, or n is reached. */
int strn_cmp(const char *arg1, const char *arg2, int n)
{
int chk, i;
@ -192,10 +162,8 @@ int strn_cmp(const char *arg1, const char *arg2, int n)
}
#endif
/*
* New variable argument log() function. Works the same as the old for
* previously written code but is very nice for new code.
*/
/* New variable argument log() function. Works the same as the old for
* previously written code but is very nice for new code. */
void basic_mud_vlog(const char *format, va_list args)
{
time_t ct = time(0);
@ -217,7 +185,6 @@ void basic_mud_vlog(const char *format, va_list args)
fflush(logfile);
}
/* So mudlog() can use the same function. */
void basic_mud_log(const char *format, ...)
{
@ -228,7 +195,6 @@ void basic_mud_log(const char *format, ...)
va_end(args);
}
/* the "touch" command, essentially. */
int touch(const char *path)
{
@ -243,11 +209,8 @@ int touch(const char *path)
}
}
/*
* mudlog -- log mud messages to a file & to online imm's syslogs
* based on syslog by Fen Jul 3, 1992
*/
/* mudlog -- log mud messages to a file & to online imm's syslogs based on
* syslog by Fen Jul 3, 1992 */
void mudlog(int type, int level, int file, const char *str, ...)
{
char buf[MAX_STRING_LENGTH];
@ -288,11 +251,9 @@ void mudlog(int type, int level, int file, const char *str, ...)
/*
* If you don't have a 'const' array, just cast it as such. It's safer
* to cast a non-const array as const than to cast a const one as non-const.
* Doesn't really matter since this function doesn't change the array though.
*/
/* If you don't have a 'const' array, just cast it as such. It's safer to cast
* a non-const array as const than to cast a const one as non-const. Doesn't
* really matter since this function doesn't change the array though. */
size_t sprintbit(bitvector_t bitvector, const char *names[], char *result, size_t reslen)
{
size_t len = 0;
@ -319,7 +280,6 @@ size_t sprintbit(bitvector_t bitvector, const char *names[], char *result, size_
return (len);
}
size_t sprinttype(int type, const char *names[], char *result, size_t reslen)
{
int nr = 0;
@ -332,7 +292,6 @@ size_t sprinttype(int type, const char *names[], char *result, size_t reslen)
return strlcpy(result, *names[nr] != '\n' ? names[nr] : "UNDEFINED", reslen);
}
/* Calculate the REAL time passed over the last t2-t1 centuries (secs) */
struct time_info_data *real_time_passed(time_t t2, time_t t1)
{
@ -353,8 +312,6 @@ struct time_info_data *real_time_passed(time_t t2, time_t t1)
return (&now);
}
/* Calculate the MUD time passed over the last t2-t1 centuries (secs) */
struct time_info_data *mud_time_passed(time_t t2, time_t t1)
{
@ -377,7 +334,6 @@ struct time_info_data *mud_time_passed(time_t t2, time_t t1)
return (&now);
}
time_t mud_time_to_secs(struct time_info_data *now)
{
time_t when = 0;
@ -390,7 +346,6 @@ time_t mud_time_to_secs(struct time_info_data *now)
return (time(NULL) - when);
}
struct time_info_data *age(struct char_data *ch)
{
static struct time_info_data player_age;
@ -402,9 +357,7 @@ struct time_info_data *age(struct char_data *ch)
return (&player_age);
}
/* Check if making CH follow VICTIM will create an illegal */
/* Follow "Loop/circle" */
/* Check if making CH follow VICTIM will create an illegal Follow Loop. */
bool circle_follow(struct char_data *ch, struct char_data *victim)
{
struct char_data *k;
@ -417,10 +370,8 @@ bool circle_follow(struct char_data *ch, struct char_data *victim)
return (FALSE);
}
/* Called when stop following persons, or stopping charm */
/* This will NOT do if a character quits/dies!! */
/* Called when stop following persons, or stopping charm. This will NOT do if
* a character quits or dies. */
void stop_follower(struct char_data *ch)
{
struct follow_type *j, *k;
@ -458,7 +409,6 @@ void stop_follower(struct char_data *ch)
REMOVE_BIT(AFF_FLAGS(ch), AFF_CHARM | AFF_GROUP);
}
int num_followers_charmed(struct char_data *ch)
{
struct follow_type *lackey;
@ -471,7 +421,6 @@ int num_followers_charmed(struct char_data *ch)
return (total);
}
/* Called when a character that follows/is followed dies */
void die_follower(struct char_data *ch)
{
@ -486,10 +435,8 @@ void die_follower(struct char_data *ch)
}
}
/* Do NOT call this before having checked if a circle of followers */
/* will arise. CH will follow leader */
/* Do NOT call this before having checked if a circle of followers will arise.
* CH will follow leader. */
void add_follower(struct char_data *ch, struct char_data *leader)
{
struct follow_type *k;
@ -513,15 +460,10 @@ void add_follower(struct char_data *ch, struct char_data *leader)
act("$n starts to follow $N.", TRUE, ch, 0, leader, TO_NOTVICT);
}
/*
* get_line reads the next non-blank line off of the input stream.
* The newline character is removed from the input. Lines which begin
* with '*' are considered to be comments.
*
* Returns the number of lines advanced in the file. Buffer given must
* be at least READ_SIZE (256) characters large.
*/
/* get_line reads the next non-blank line off of the input stream. The newline
* character is removed from the input. Lines which begin with '*' are
* considered to be comments. Returns the number of lines advanced in the file.
* Buffer given must be at least READ_SIZE (256) characters large. */
int get_line(FILE *fl, char *buf)
{
char temp[READ_SIZE];
@ -543,7 +485,6 @@ int get_line(FILE *fl, char *buf)
return (lines);
}
int get_filename(char *filename, size_t fbufsize, int mode, const char *orig_name)
{
const char *prefix, *middle, *suffix;
@ -609,7 +550,6 @@ int get_filename(char *filename, size_t fbufsize, int mode, const char *orig_nam
return (1);
}
int num_pc_in_room(struct room_data *room)
{
int i = 0;
@ -622,19 +562,13 @@ int num_pc_in_room(struct room_data *room)
return (i);
}
/*
* This function (derived from basic fork(); abort(); idea by Erwin S.
* Andreasen) causes your MUD to dump core (assuming you can) but
* continue running. The core dump will allow post-mortem debugging
* that is less severe than assert(); Don't call this directly as
* core_dump_unix() but as simply 'core_dump()' so that it will be
* excluded from systems not supporting them. (e.g. Windows '95).
*
* You still want to call abort() or exit(1) for
* non-recoverable errors, of course...
*
* XXX: Wonder if flushing streams includes sockets?
*/
/* This function (derived from basic fork() abort() idea by Erwin S. Andreasen)
* causes your MUD to dump core (assuming you can) but continue running. The
* core dump will allow post-mortem debugging that is less severe than assert();
* Don't call this directly as core_dump_unix() but as simply 'core_dump()' so
* that it will be excluded from systems not supporting them. You still want to
* call abort() or exit(1) for non-recoverable errors, of course. Wonder if
* flushing streams includes sockets? */
extern FILE *player_fl;
void core_dump_real(const char *who, int line)
{
@ -649,10 +583,8 @@ void core_dump_real(const char *who, int line)
/* Everything, just in case, for the systems that support it. */
fflush(NULL);
/*
* Kill the child so the debugger or script doesn't think the MUD
* crashed. The 'autorun' script would otherwise run it again.
*/
/* Kill the child so the debugger or script doesn't think the MUD crashed.
* The 'autorun' script would otherwise run it again. */
if (fork() == 0)
abort();
#endif
@ -679,12 +611,8 @@ int count_color_chars(char *string)
}
return num;
}
/*
* Rules (unless overridden by ROOM_DARK):
*
* Inside and City rooms are always lit.
* Outside rooms are dark at sunset and night.
*/
/* Rules (unless overridden by ROOM_DARK): Inside and City rooms are always
* lit. Outside rooms are dark at sunset and night. */
int room_is_dark(room_rnum room)
{
if (!VALID_ROOM_RNUM(room)) {
@ -710,19 +638,78 @@ int room_is_dark(room_rnum room)
int levenshtein_distance(char *s1, char *s2)
{
int s1_len = strlen(s1), s2_len = strlen(s2);
int d[s1_len + 1][s2_len + 1];
int i, j;
int *d = NULL;
int i, j, k;
for (i = 0; i <= s1_len; i++)
d[i][0] = i;
for (j = 0; j <= s2_len; j++)
d[0][j] = j;
s1_len++;
s2_len++;
for (i = 1; i <= s1_len; i++)
for (j = 1; j <= s2_len; j++)
d[i][j] = MIN(d[i - 1][j] + 1,
MIN(d[i][j - 1] + 1,
d[i - 1][j - 1] + ((s1[i - 1] == s2[j - 1]) ? 0 : 1)));
CREATE(d, int, (s1_len * s2_len));
return d[s1_len][s2_len];
for (i = 0; i < s1_len; i++)
d[i] = i;
for (j = 0; j < s2_len; j++)
d[j*s1_len] = j;
for (i = 1; i < s1_len; i++)
for (j = 1; j < s2_len; j++)
d[(j*s1_len)+i] = MIN(d[(j*s1_len) + i - 1] + 1, MIN(d[i+((j-1)*s1_len)]
+ 1, d[((j-1)*s1_len) + i - 1] + ((s1[i - 1] == s2[j - 1]) ? 0 : 1)));
k = d[s1_len*s2_len-1];
free (d);
return k;
}
void char_from_chair(struct char_data *ch)
{
struct obj_data *chair;
struct char_data *tempch;
int i, found = 0;
if (!SITTING(ch))
return;
if (!(chair = SITTING(ch))){
log("SYSERR: ACK, no chair for char in char from chair");
SITTING(ch) = NULL;
NEXT_SITTING(ch) = NULL;
return;
}
if (!(tempch = OBJ_SAT_IN_BY(chair))){
log("SYSERR: Char from chair, but no chair!");
SITTING(ch) = NULL;
NEXT_SITTING(ch) = NULL;
return;
}
if (tempch == ch){
if (!NEXT_SITTING(ch))
OBJ_SAT_IN_BY(chair) = NULL;
else
OBJ_SAT_IN_BY(chair) = NEXT_SITTING(ch);
GET_OBJ_VAL(chair, 1) -= 1;
SITTING(ch) = NULL;
NEXT_SITTING(ch) = NULL;
return;
}
for (i = 0; i < GET_OBJ_VAL(chair, 1) && found == 0; i++){
if (NEXT_SITTING(tempch) == ch){
NEXT_SITTING(tempch) = NEXT_SITTING(ch);
found++;
}
}
if (found)
log("SYSERR: Char flagged as sitting, but not in chair");
else
GET_OBJ_VAL(chair, 1) -= 1;
SITTING(ch) = NULL;
NEXT_SITTING(ch) = NULL;
return;
}

View file

@ -8,9 +8,7 @@
* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. *
************************************************************************ */
/* external declarations and prototypes **********************************/
/* external declarations and prototypes */
extern struct weather_data weather_info;
extern FILE *logfile;
@ -40,10 +38,8 @@ int levenshtein_distance(char *s1, char *s2);
#define core_dump() core_dump_real(__FILE__, __LINE__)
/*
* Only provide our versions if one isn't in the C library. These macro names
* will be defined by sysdep.h if a strcasecmp or stricmp exists.
*/
/* Only provide our versions if one isn't in the C library. These macro names
* will be defined by sysdep.h if a strcasecmp or stricmp exists. */
#ifndef str_cmp
int str_cmp(const char *arg1, const char *arg2);
#endif
@ -95,8 +91,12 @@ void gain_condition(struct char_data *ch, int condition, int value);
void point_update(void);
void update_pos(struct char_data *victim);
void char_from_chair(struct char_data *ch);
#define SITTING(ch) ((ch)->char_specials.chair)
#define NEXT_SITTING(ch) ((ch)->char_specials.next_in_chair)
#define OBJ_SAT_IN_BY(obj) ((obj)->sitting_here)
/* various constants *****************************************************/
/* various constants */
/* defines for mudlog() */
#define OFF 0
@ -117,10 +117,8 @@ void update_pos(struct char_data *victim);
#define BFS_ALREADY_THERE (-2)
#define BFS_NO_PATH (-3)
/*
* XXX: These constants should be configurable. See act.informative.c
* and utils.c for other places to change.
*/
/* These constants should be configurable. See act.informative.c and utils.c
* for other places to change. */
/* mud-life time */
#define SECS_PER_MUD_HOUR 75
#define SECS_PER_MUD_DAY (24*SECS_PER_MUD_HOUR)
@ -133,10 +131,7 @@ void update_pos(struct char_data *victim);
#define SECS_PER_REAL_DAY (24*SECS_PER_REAL_HOUR)
#define SECS_PER_REAL_YEAR (365*SECS_PER_REAL_DAY)
/* string utils **********************************************************/
/* string utils */
#define YESNO(a) ((a) ? "YES" : "NO")
#define ONOFF(a) ((a) ? "ON" : "OFF")
@ -148,10 +143,7 @@ void update_pos(struct char_data *victim);
/* See also: ANA, SANA */
#define AN(string) (strchr("aeiouAEIOU", *string) ? "an" : "a")
/* memory utils **********************************************************/
/* memory utils */
#define CREATE(result, type, number) do {\
if ((number) * sizeof(type) <= 0) \
log("SYSERR: Zero bytes or less requested at %s:%d.", __FILE__, __LINE__); \
@ -162,14 +154,12 @@ void update_pos(struct char_data *victim);
if (!((result) = (type *) realloc ((result), sizeof(type) * (number))))\
{ perror("SYSERR: realloc failure"); abort(); } } while(0)
/*
* the source previously used the same code in many places to remove an item
/* the source previously used the same code in many places to remove an item
* from a list: if it's the list head, change the head, else traverse the
* list looking for the item before the one to be removed. Now, we have a
* macro to do this. To use, just make sure that there is a variable 'temp'
* declared as the same type as the list to be manipulated. BTW, this is
* a great application for C++ templates but, alas, this is not C++.
*/
* a great application for C++ templates but, alas, this is not C++. */
#define REMOVE_FROM_LIST(item, head, next) \
if ((item) == (head)) \
head = (item)->next; \
@ -181,22 +171,17 @@ void update_pos(struct char_data *victim);
temp->next = (item)->next; \
} \
/* basic bitvector utils *************************************************/
/* basic bitvector utils */
#define IS_SET(flag,bit) ((flag) & (bit))
#define SET_BIT(var,bit) ((var) |= (bit))
#define REMOVE_BIT(var,bit) ((var) &= ~(bit))
#define TOGGLE_BIT(var,bit) ((var) ^= (bit))
/*
* Accessing player specific data structures on a mobile is a very bad thing
/* Accessing player specific data structures on a mobile is a very bad thing
* to do. Consider that changing these variables for a single mob will change
* it for every other single mob in the game. If we didn't specifically check
* for it, 'wimpy' would be an extremely bad thing for a mob to do, as an
* example. If you really couldn't care less, change this to a '#if 0'.
*/
* example. If you really couldn't care less, change this to a '#if 0'. */
#if 1
/* Subtle bug in the '#var', but works well for now. */
#define CHECK_PLAYER_SPECIAL(ch, var) \
@ -238,9 +223,7 @@ void update_pos(struct char_data *victim);
/* new define for quick check */
#define DEAD(ch) (PLR_FLAGGED((ch), PLR_NOTDEADYET) || MOB_FLAGGED((ch), MOB_NOTDEADYET))
/* room utils ************************************************************/
/* room utils */
#define SECT(room) (VALID_ROOM_RNUM(room) ? \
world[(room)].sector_type : SECT_INSIDE)
@ -253,9 +236,7 @@ void update_pos(struct char_data *victim);
#define GET_ROOM_SPEC(room) \
(VALID_ROOM_RNUM(room) ? world[(room)].func : NULL)
/* char utils ************************************************************/
/* char utils */
#define IN_ROOM(ch) ((ch)->in_room)
#define GET_WAS_IN(ch) ((ch)->was_in_room)
#define GET_AGE(ch) (age(ch)->year)
@ -268,10 +249,8 @@ void update_pos(struct char_data *victim);
#define GET_PASSWD(ch) ((ch)->player.passwd)
#define GET_PFILEPOS(ch)((ch)->pfilepos)
/*
* I wonder if this definition of GET_REAL_LEVEL should be the definition
* of GET_LEVEL? JE
*/
/* I wonder if this definition of GET_REAL_LEVEL should be the definition of
* GET_LEVEL? JE */
#define GET_REAL_LEVEL(ch) \
(ch->desc && ch->desc->original ? GET_LEVEL(ch->desc->original) : \
GET_LEVEL(ch))
@ -363,7 +342,6 @@ void update_pos(struct char_data *victim);
#define IS_EVIL(ch) (GET_ALIGNMENT(ch) <= -350)
#define IS_NEUTRAL(ch) (!IS_GOOD(ch) && !IS_EVIL(ch))
/* These three deprecated. */
#define WAIT_STATE(ch, cycle) do { GET_WAIT_STATE(ch) = (cycle); } while(0)
#define CHECK_WAIT(ch) ((ch)->wait > 0)
@ -371,10 +349,7 @@ void update_pos(struct char_data *victim);
/* New, preferred macro. */
#define GET_WAIT_STATE(ch) ((ch)->wait)
/* descriptor-based utils ************************************************/
/* Hrm, not many. We should make more. -gg 3/4/99 */
/* descriptor-based utils. We should make more. -gg */
#define STATE(d) ((d)->connected)
#define IS_PLAYING(d) (STATE(d) == CON_TEDIT || STATE(d) == CON_REDIT || \
@ -387,13 +362,11 @@ void update_pos(struct char_data *victim);
#define SENDOK(ch) (((ch)->desc || SCRIPT_CHECK((ch), MTRIG_ACT)) && \
(to_sleeping || AWAKE(ch)) && \
!PLR_FLAGGED((ch), PLR_WRITING))
/* object utils **********************************************************/
/*
* Check for NOWHERE or the top array index?
* If using unsigned types, the top array index will catch everything.
* If using signed types, NOTHING will catch the majority of bad accesses.
*/
/* object utils */
/* Check for NOWHERE or the top array index? If using unsigned types, the top
* array index will catch everything. If using signed types, NOTHING will
* catch the majority of bad accesses. */
#define VALID_OBJ_RNUM(obj) (GET_OBJ_RNUM(obj) <= top_of_objt && \
GET_OBJ_RNUM(obj) != NOTHING)
@ -420,12 +393,9 @@ void update_pos(struct char_data *victim);
#define CAN_WEAR(obj, part) OBJWEAR_FLAGGED((obj), (part))
#define GET_OBJ_SHORT(obj) ((obj)->short_description)
/* compound utilities and other macros **********************************/
/*
* Used to compute CircleMUD version. To see if the code running is newer
* than 3.0pl13, you would use: #if _CIRCLEMUD > CIRCLEMUD_VERSION(3,0,13)
*/
/* compound utilities and other macros */
/* Used to compute CircleMUD version. To see if the code running is newer than
* 3.0pl13, you would use: #if _CIRCLEMUD > CIRCLEMUD_VERSION(3,0,13) */
#define CIRCLEMUD_VERSION(major, minor, patchlevel) \
(((major) << 16) + ((minor) << 8) + (patchlevel))
@ -436,7 +406,6 @@ void update_pos(struct char_data *victim);
#define ANA(obj) (strchr("aeiouAEIOU", *(obj)->name) ? "An" : "A")
#define SANA(obj) (strchr("aeiouAEIOU", *(obj)->name) ? "an" : "a")
/* Various macros building up to CAN_SEE */
#define LIGHT_OK(sub) (!AFF_FLAGGED(sub, AFF_BLIND) && \
@ -457,10 +426,8 @@ void update_pos(struct char_data *victim);
#define CAN_SEE(sub, obj) (SELF(sub, obj) || \
((GET_REAL_LEVEL(sub) >= (IS_NPC(obj) ? 0 : GET_INVIS_LEV(obj))) && \
IMM_CAN_SEE(sub, obj)))
/* End of CAN_SEE */
#define INVIS_OK_OBJ(sub, obj) \
(!OBJ_FLAGGED((obj), ITEM_INVISIBLE) || AFF_FLAGGED((sub), AFF_DETECT_INVIS))
@ -491,7 +458,6 @@ void update_pos(struct char_data *victim);
#define OBJN(obj, vict) (CAN_SEE_OBJ((vict), (obj)) ? \
fname((obj)->name) : "something")
#define EXIT(ch, door) (world[IN_ROOM(ch)].dir_option[door])
#define W_EXIT(room, num) (world[(room)].dir_option[(num)])
#define R_EXIT(room, num) ((room)->dir_option[(num)])
@ -500,7 +466,6 @@ void update_pos(struct char_data *victim);
(EXIT(ch,door)->to_room != NOWHERE) && \
!IS_SET(EXIT(ch, door)->exit_info, EX_CLOSED))
#define CLASS_ABBR(ch) (IS_NPC(ch) ? "--" : class_abbrevs[(int)GET_CLASS(ch)])
#define IS_MAGIC_USER(ch) (!IS_NPC(ch) && \
@ -514,10 +479,7 @@ void update_pos(struct char_data *victim);
#define OUTSIDE(ch) (!ROOM_FLAGGED(IN_ROOM(ch), ROOM_INDOORS))
/* OS compatibility ******************************************************/
/* OS compatibility */
/* there could be some strange OS which doesn't have NULL... */
#ifndef NULL
#define NULL (void *)0
@ -546,20 +508,16 @@ void update_pos(struct char_data *victim);
#define SEEK_END 2
#endif
/*
* NOCRYPT can be defined by an implementor manually in sysdep.h.
* CIRCLE_CRYPT is a variable that the 'configure' script
* automatically sets when it determines whether or not the system is
* capable of encrypting.
*/
/* NOCRYPT can be defined by an implementor manually in sysdep.h. CIRCLE_CRYPT
* is a variable that the 'configure' script automatically sets when it
* determines whether or not the system is capable of encrypting. */
#if defined(NOCRYPT) || !defined(CIRCLE_CRYPT)
#define CRYPT(a,b) (a)
#else
#define CRYPT(a,b) ((char *) crypt((a),(b)))
#endif
/******************* Config macros *********************/
/* Config macros */
#define CONFIG_CONFFILE config_info.CONFFILE
#define CONFIG_PK_ALLOWED config_info.play.pk_allowed
@ -582,7 +540,7 @@ void update_pos(struct char_data *victim);
#define CONFIG_NOPERSON config_info.play.NOPERSON
#define CONFIG_NOEFFECT config_info.play.NOEFFECT
/** Crash Saves **/
/* Crash Saves */
#define CONFIG_FREE_RENT config_info.csd.free_rent
#define CONFIG_MAX_OBJ_SAVE config_info.csd.max_obj_save
#define CONFIG_MIN_RENT_COST config_info.csd.min_rent_cost
@ -591,7 +549,7 @@ void update_pos(struct char_data *victim);
#define CONFIG_CRASH_TIMEOUT config_info.csd.crash_file_timeout
#define CONFIG_RENT_TIMEOUT config_info.csd.rent_file_timeout
/** Room Numbers **/
/* Room Numbers */
#define CONFIG_MORTAL_START config_info.room_nums.mortal_start_room
#define CONFIG_IMMORTAL_START config_info.room_nums.immort_start_room
#define CONFIG_FROZEN_START config_info.room_nums.frozen_start_room
@ -599,7 +557,7 @@ void update_pos(struct char_data *victim);
#define CONFIG_DON_ROOM_2 config_info.room_nums.donation_room_2
#define CONFIG_DON_ROOM_3 config_info.room_nums.donation_room_3
/** Game Operation **/
/* Game Operation */
#define CONFIG_DFLT_PORT config_info.operation.DFLT_PORT
#define CONFIG_DFLT_IP config_info.operation.DFLT_IP
#define CONFIG_MAX_PLAYING config_info.operation.max_playing
@ -615,7 +573,7 @@ void update_pos(struct char_data *victim);
#define CONFIG_WELC_MESSG config_info.operation.WELC_MESSG
#define CONFIG_START_MESSG config_info.operation.START_MESSG
/** Autowiz **/
/* Autowiz */
#define CONFIG_USE_AUTOWIZ config_info.autowiz.use_autowiz
#define CONFIG_MIN_WIZLIST_LEV config_info.autowiz.min_wizlist_lev