Shop.c & assign_the_shops()

From: Rasmus Ronlev (raro94ab@STUDENT.ECON.CBS.DK)
Date: 12/01/97


Hi again ,-)

Ok, thought I'd comment on the mails I just got on my questions pertaining
the assign_the_shops() problem.

I dug through the code I use, as well as (parts - so I'm lazy .-) the
CircleMUD bpl 12 shop.c stuff.

It seems, that at bootup in the boot_the_shops() the following happens:

      SHOP_KEEPER(top_shop) = real_mobile(SHOP_KEEPER(top_shop));

So... erm.... *grin* I'd say we have a real_mobile/rnum assigment in the
shop_index[x].keeper value...

So, the offset into SHOP_KEEPER(index) should be perfectly safe and 'in
bounds' when using > 0 && < top_of_mobt ,-)

This however raises a note, that the comment in some struct is wrong, or
that something else, than what's actually done, was the purpose... *shrug*

Furthermore, as Akuma wrote, I think there's actually a possible cause for
a memory fault in the stock assign_the_shops code.. If the shop the mud
boots has an invalid mobile assigned, that will put -1 into the
shop_index[xxx].keeper value, then the following code 'underwrites' the
shop_index table:

  for (index = 0; index < top_shop; index++) {
    if (mob_index[SHOP_KEEPER(index)].func)
      SHOP_FUNC(index) = mob_index[SHOP_KEEPER(index)].func;
    mob_index[SHOP_KEEPER(index)].func = shop_keeper;
  }

And... yep... this is taken from STOCK CIRCLEMUD BPL12 in:
void assign_the_shopkeepers(void) B-)

So, BUG BUG BUG BUG BUG *grin* Even though I used my own hacked up version
of the function, it inherited a sneaky, creepy bug... *grumble* I hope
someone will fix this in std. circle also... Don't think my way of going
arround it is very neat, but converted into stock type code it would look
like:

void assign_the_shopkeepers(void)
{
  int index;
  extern int top_of_mobt;

  cmd_say = find_command("say");
  cmd_tell = find_command("tell");
  cmd_emote = find_command("emote");
  cmd_slap = find_command("slap");
  cmd_puke = find_command("puke");
  for (index = 0; index < top_shop; index++) {
    if((SHOP_KEEPER(index) > -1) && (SHOP_KEEPER(index) <= top_of_mobt)) {
      if (mob_index[SHOP_KEEPER(index)].func)
        SHOP_FUNC(index) = mob_index[SHOP_KEEPER(index)].func;
      mob_index[SHOP_KEEPER(index)].func = shop_keeper;
    }
  }
}

The check against top_of_mobt is sort of lame, since real_mobile should
have taken care of the check that the mobile it returns a vnum of exists,
but I'm a little 'checkhappy' when it comes to memory trouble by now *G*

Well, I thought this might be of commin interest ,-)

Regards,
Rand

.d
--
        Rasmus Ronlev DOEK'94           http://www.econ.cbs.dk/~raro94ab
             IT-Advisor               mailto:raro94ab@student.econ.cbs.dk

              B.Sc. Computer Science and Business Administration
          Stud. M.Sc. Computer Science and Business Administration


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/08/00 PST