|
help > w > guide new wizard A guide for new wizards, in no particular order. Presumably, this could better be labelled as tips and tricks. 1. Strong type everything you code - it will save time later. 2. Note that storing objects in arrays (e.g. this_player(), etc) will not work when the object disappears (e.g. the player logs out). Better to store a string (e.g. this_player()->query_real_name()). 3. You may have seen locker_init locker_arg functions on objects that save a particular configuration. This is outdated and replaced by add_configuration in std/object/config.c Here is how it works. Suppose a particular variable on an object is changed (e.g. quest items which are bound to a player), or the number of uses remaining for an orb. Let's take the orb for example. In the old code, you would have to set locker_arg() { return healing; } locker_init(arg) { healing = to_int(arg); } because healing is a variable that has to be stored across reboots, etc. Simply create a function in the orb void set_healing(int x){ healing = x; } and then each time the value of healing is changed when the orb is used, put a: remove_configuration("set_healing"); // remove old var add_configuration("set_healing", x); // add new var so the question now is: locker_arg() and locker_init(arg) looks easier than creating a setter function, as well as having remove_configuration / add_configuration in the code. Why should we do this? The main issue is when we have many more variables to store and locker_arg / locker_init(arg) functions can get trickier. 4. inherit where possible 5. Best to store data as mappings (or mappings of mappings), rather than have many different variables / storing them in an array. For example, the mapping lots has "d/gladstadt/ariston/room/roads/lot":({"fosters","This is Fosters's lot.", "pub","Fosters'spub",1582419152,0,57,0,}) as one of its keys. The value of the key is slightly incomprehensible. On the other hand, "d/gladstadt/ariston/room/roads/lot":([ "owner_name":"fosters", "short_desc":"This is Foster's lot.", "shop_type":"pub", "long_desc":"Fosters'spub", "last_visit":1582419152, "non_humanoid":0, "owner_id":57]) makes more sense. Moreover, in the first example, the array only has 8 elements, and 7 are used. If we want to add more info as time goes by, deleting and constructing a new array is tricky (see locker allocation bug which caused lockers to bloat). But we can easily add new elements to a mapping, in this case: lots["d/gladstadt/ariston/room/roads/lot"] = lots["d/gladstadt/ariston/room/roads/lot"] += (["new_key":"new_val"]); 6. See more more /obj/shared/managed_bonuses.c for adding skill bonuses, and /d/rymalind/fdcastle/obj/luckycharm.c for an example. |
|