Adding flags

javelin's picture

N.B. This discussion applies to the PennMUSH flag system as of PennMUSH 1.7.7p5. If you're using an earlier version of PennMUSH, you need to find an older edition of Javelin's Guide for PennMUSH Gods

The easiest way to add flags in PennMUSH is to log in as #1 and use @flag. If you don't need your flags to have any special hardcoded effects, this is definitely the way to go.

So from here on out, I'll assume that you are coding your own hardcoded system (e.g. a space system) that you expect to distribute, and your system needs to automatically add a SPACE flag to the database and be able to test it in hardcode in order to implement special effects.

Adding the flag

Adding a new flag is as easy as adding a call to add_flag() in the local_flags() function of src/flaglocal.c, like this:

add_flag("SPACE", '&', NOTYPE, F_ANY, F_ANY);

The arguments, in order, are:

  1. The flag's name, in "quotes".
  2. The flag's character, in 'single quotes'. If you don't want to assign a character to the flag, use '\0'
  3. The set of object types to which the flag can be applied. NOTYPE means all. Otherwise you can use a bitwise-OR combination of TYPE_ROOM, TYPE_PLAYER, TYPE_THING, and TYPE_EXIT
  4. Permissions required to set the flag. See listing in hdrs/flags.h
  5. Permissions required to clear the flag. See listing in hdrs/flags.h

Adding a macro

To make the use of your flag in code easier, add a macro that checks to see if an object has the flag. In PennMUSH, these macros are usually defined in hdrs/dbdefs.h. If your flag only applies to a single object type, you can define it with the IS() macro, like Floating():

#define Floating(x)     (IS(x, TYPE_ROOM, "FLOATING"))

If your flag applies to multiple (or all) object types, use the has_flag_by_name() function instead, like this:

#define Audible(x)      (has_flag_by_name(x, "AUDIBLE", NOTYPE))

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

I like to define the macro

I like to define the macro in something other than dbdefs.h, in ASpace for instance, i have the SpaceObj() macro defined in space.h since the only pieces of code that use that macro are in the space_*.c files.

eg. #define SpaceObj(x) (has_flag_by_name(x, "SPACE-OBJECT", TYPE_THING))

This removes any chance of dbdefs.h not getting patched properly.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.