Hello list, I remember a few months back (I think), alot of people mentioning something about a bug with shop editting in oasis 2.0. The bug I believe was that the strings in certain shops (primarily those immediately after the shop being editted) would be corrupted. I don't remember if there was a solution ever posted or found, but I found what I think is the error and thought I should share the solution I have. First of all from what I can tell by viewing the contents of the patch: ftp://ftp.circlemud.org/pub/CircleMUD/contrib/olc/online/OasisOLCv2.0a-bpl18.patch.gz the error is still there. I believe what causes the error is found in two places, both in genshp.c. In the add_shop function, this for loop: + for (rshop = top_shop - top_shop_offset; rshop > 0; rshop--) { + if (nshp->vnum > SHOP_NUM(rshop - 1)) { + found = rshop; + + /* Make a "nofree" variant and remove these later. */ + shop_index[rshop].in_room = NULL; + shop_index[rshop].producing = NULL; + shop_index[rshop].type = NULL; + + copy_shop(&shop_index[rshop], nshp); + break; + } + shop_index[rshop] = shop_index[rshop - 1]; + } contains part 1 of the error at the second to last line: shop_index[rshop] = shop_index[rshop - 1]; the second part is found in copy_shop, at this line: free_shop_strings(tshop); It seems to me that when you're inserting a new shop that is not at the end of the shop_index, the strings are not copied with str_dup but just the pointers to the strings. Then when the new shop is inserted, that free_shop_strings(tshop) line is called, freeing the still in use strings in the next shop. If you were just editting a shop that already existed, the add_shop function handled all the strings properly. My solution was to comment out the free_shop_strings line in copy_shop, and insert a call to it in this block in add_shop: + /* + * The shop already exists, just update it. + */ + if ((rshop = real_shop(S_NUM(nshp))) != NOWHERE) { + free_shop_strings(&shop_index[rshop]); + copy_shop(&shop_index[rshop], nshp); + if (rznum != NOWHERE) + add_to_save_list(zone_table[rznum].number, SL_SHP); + else + mudlog("SYSERR: GenOLC: Cannot determine shop zone.", BRF, LVL_BUILDER, TRUE); + return rshop; + } + Hope this works for anyone else that doesn't already have a solution in place for it. --- Todd A Laycock -- +---------------------------------------------------------------+ | 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