#include #include #include #include "object.h" #include void Object_destroy(void *self) { assert(self != NULL); Object *obj = self; if(obj) { if(obj->description) free(obj->description); free(obj); } } void Object_describe(void *self) { assert(self != NULL); Object *obj = self; printf("%s\n", obj->description); } int Object_init(void *self) { assert(self != NULL); // do nothing really return 1; } void *Object_move(void *self, Direction direction) { assert(self != NULL); assert(direction); printf("You can't go that direction.\n"); return NULL; } int Object_attack(void *self, int damage) { assert(self != NULL); assert(damage); printf("You can't attack that.\n"); return 0; } void *Object_new(size_t size, Object proto, char *description) { assert(size); assert(description != NULL); // setup the default functions in case they aren't set if(!proto.init) proto.init = Object_init; if(!proto.describe) proto.describe = Object_describe; if(!proto.destroy) proto.destroy = Object_destroy; if(!proto.attack) proto.attack = Object_attack; if(!proto.move) proto.move = Object_move; // this seems weird, but we can make a struct of one size, // then point a different pointer at it to "cast" it Object *el = calloc(size, 1); assert(el != NULL); *el = proto; // copy the description over el->description = strdup(description); assert(el->description != NULL); // initialize it with whatever init we were given if(!el->init(el)) { // looks like it didn't initialize properly el->destroy(el); return NULL; } else { // all done, we made an object of any type assert(el != NULL); return el; } }