Vote for Our Mud on TMC!











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.