I was tinkering with the enchant_weapon() spell and found one particular problem: The enchanted object is reset when someone oedits the same obj. Now I had a few ideas to fix this, but I thought I'd see what people here thought about them. I think the obj enchantment needs a little bit of work for stock, because that is the kind of things players like. :) So I was thinking, first, make an ITEM_ENCHANTED flag, and then update oedit to copy the appropriate variables back from the swap. In the instance of obj->affects, given an object with no applies, and was enchanted with +n to hit/dam: If the builder later upgrades that object to also apply to strength, the enchanted obj will not get the new str apply, while all the others will. The player could just go enchant a new obj, but why punish the player for using their spells? So on to my other idea. I could get complicated and add an 'enchanted' variable to the obj struct and make it a bitvector. The bitvector will store what was enchanted, so if changes were made, everything will change, but not the enchanted affect. As you add skills or spells that enchant various values or applies, you can add them to the enchanted bitvector. When you oedit the obj, only the changes in the enchanted bitvector are copied and all the new ones are added. I know there are probably many other options, so I'd like to hear em... :P Oh, I made a nifty little obj apply adding function which will, given an apply and modifier: 1) Search for the specified apply and increment/decrement it 2) Add a new one if the specified apply was not found It makes the enchant_weapon() spell really short, and makes any other enchantment spells really easy. //* This function will search the object for a specified APPLY_XX and adjust it according //* to modifier. If it does not find a similar apply, it will look for an empty one. bool enchant_obj(struct obj_data *obj, int apply, int mod) { int pos = 0; bool add = false; while (pos < MAX_OBJ_AFFECT) { //**** If add is true: add a new apply. If found specified apply: increment the mod ** if ((add && (obj->affected[pos].location == APPLY_NONE)) || (obj->affected[pos].location == apply)) { obj->affected[pos].location = apply; obj->affected[pos].modifier += mod; return true; } else if ((++pos == MAX_OBJ_AFFECT) && !add) { add = true; //** Didnt'd find a similar apply, add a new one. pos = 0; //** Start back at 0 and add the new apply. } } return false; } +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST