Rich M Carpenter wrote:
>
> My problem is this:
> A select few of my mobs have found a way past an IS_NPC(ch) check,
>
> Here is the code:
> int invalid_race(struct char_data *ch, struct obj_data *obj) {
> if (IS_NPC(ch)) <------- This is the check they
> are bypassing.
Hrmmm, very strange. First check to make sure that the #defines are
correct. Following is the actual #define for IS_NPC() (stock from latest
CVS, I don't think they changed, but you can dbl check them in bpl17
stock if you want)...
#define IS_NPC(ch) (IS_SET(MOB_FLAGS(ch), MOB_ISNPC))
Then the #defines for IS_SET, MOB_FLAGS and MOB_ISNPC...
#define IS_SET(flag,bit) ((flag) & (bit))
#define MOB_FLAGS(ch) ((ch)->char_specials.saved.act)
#define MOB_ISNPC (1 << 3) /* (R) Automatically set on all
Mobs */
If any of these changed there might be a reason (ie a patch or snippet
you put in, maybe 128 bits?). Figure out why and what went wrong.
I would set a breakpoint for invalid_race and then check all the relevent
values for IS_NPC at that time. Since you can't use macros directly in
gdb you have to resolve them yourself to check the actual value that
you're looking for, ie...
print (ch->char_specials.saved.act & (1<<3))
This should be non-zero for a mob (actually it will return 8 which is
1<<3). If it shows as zero then your next task is to figure out why, if
it shows as non-zero then you're really up a creek as the compiler is
messing it up (continue to step through the test to verify this).
If it's zero you may find it helpfull just to get a full dump of the
entire char_data structure, you can do that with...
print *ch
Good luck.
> [OFF-TOPIC]
> diceroll = number(1, 20);
> does it assign a value to diceroll, or does any further use of diceroll
> cause a new number to be generated?
number() is a function just like any other, = is the assignment
operator. The purpose of the number() function is to return a random
number between the two args inclusinve. The purpose of the assignment
value is to copy the return value (or just the value period for
variables/constants/etc) to the variable on the left side. It does not
create a permanent attachment between the two args, it simply does a
basic copy operation. So the short answer is that no, further use of
diceroll will not cause a new number to be generated. To generate a new
number you have to make the assignment again (ie a second
diceroll=number(1,20)).
Regards, Peter
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/05/01 PST