--- deliantra/server/include/cfperl.h 2006/08/24 17:29:30 1.2 +++ deliantra/server/include/cfperl.h 2006/08/25 13:24:50 1.3 @@ -21,30 +21,45 @@ DT_REGION, }; +enum event_klass { + KLASS_GLOBAL, + KLASS_PLAYER, + KLASS_OBJECT, + KLASS_MAP, +}; + enum event_type { -# define def(name) EV_ ## name, +# define def(klass,name) EV_ ## klass ## name, # include "eventinc.h" # undef def }; -#define DT_INT(v) DT_INT , (int)(v) -#define DT_LONG(v) DT_LONG , (long)(v) -#define DT_DOUBLE(v) DT_DOUBLE, (double)(v) -#define DT_STRING(v) DT_STRING, (char *)(v) -#define DT_DATA(s,l) DT_DATA , (void *)(s), (l) -#define DT_OBJECT(o) DT_OBJECT, (object *)(o) -#define DT_MAP(o) DT_MAP , (map *)(o) -#define DT_PLAYER(o) DT_PLAYER, (player *)(o) -#define DT_ARCH(o) DT_ARCH , (archetype *)(o) -#define DT_PARTY(o) DT_PARTY , (party *)(o) -#define DT_REGION(o) DT_REGION, (region *)(o) - -#define INVOKE(event, ...) cfperl_invoke ("cf::invoke" , EV_ # event, __VA_ARGS__, DT_END) -// should be called on all objects, should be optimised -#define INVOKE_ON(object,event, ...) cfperl_invoke ("cf::invoke_on" , EV_ # event, DT_OBJECT(object), __VA_ARGS__, DT_END) +#define ARG_INT(v) DT_INT , static_cast (v) +#define ARG_LONG(v) DT_LONG , static_cast (v) +#define ARG_DOUBLE(v) DT_DOUBLE, static_cast (v) +#define ARG_STRING(v) DT_STRING, static_cast (v) +#define ARG_DATA(s,l) DT_DATA , static_cast (s), (l) +#define ARG_OBJECT(o) DT_OBJECT, static_cast (o) +#define ARG_MAP(o) DT_MAP , static_cast (o) +#define ARG_PLAYER(o) DT_PLAYER, static_cast (o) +#define ARG_ARCH(o) DT_ARCH , static_cast (o) +#define ARG_PARTY(o) DT_PARTY , static_cast (o) +#define ARG_REGION(o) DT_REGION, static_cast (o) + +// the ", ## __VA_ARGS" is, unfortunately, a gnu-cpp extension + +#define INVOKE(klass, event, ...) cfperl_invoke (EV_ ## klass ## event, ## __VA_ARGS__, DT_END) + +#define INVOKE_GLOBAL(event, ...) INVOKE (GLOBAL, event, ## __VA_ARGS__) +#define INVOKE_OBJECT(event, op, ...) INVOKE (OBJECT, event, ARG_OBJECT (op), ## __VA_ARGS__) +#define INVOKE_PLAYER(event, pl, ...) INVOKE (PLAYER, event, ARG_PLAYER (pl), ## __VA_ARGS__) +#define INVOKE_MAP(event, map, ...) INVOKE (MAP , event, ARG_MAP (map) , ## __VA_ARGS__) -int cfperl_invoke (const char *klass, event_type event, ...); +int cfperl_invoke (event_type event, ...); +void cfperl_free_ob (object *op); +void cfperl_init (); void cfperl_main (); #endif +