aboutsummaryrefslogtreecommitdiff
path: root/src/room.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/room.c')
-rw-r--r--src/room.c89
1 files changed, 83 insertions, 6 deletions
diff --git a/src/room.c b/src/room.c
index 9a92588..23ea5b7 100644
--- a/src/room.c
+++ b/src/room.c
@@ -62,6 +62,9 @@ bool room_user_del(room_id id, struct child_data *child)
void room_free(struct room_t *room)
{
+ if(room->data.hook_destroy)
+ room->data.hook_destroy(room->id);
+
hash_free(room->users);
room->users = NULL;
@@ -77,7 +80,52 @@ void room_free(struct room_t *room)
bool room_obj_add(room_id room, struct object_t *obj)
{
- return !multimap_insert(room_get(room)->objects, obj->name, obj);
+ bool status = true;
+ if(!multimap_insert(room_get(room)->objects, obj->name, obj))
+ status = false;
+ struct obj_alias_t *iter = obj->alias_list;
+ while(iter)
+ {
+ if(!multimap_insert(room_get(room)->objects, iter->alias, obj_dup(obj)))
+ {
+ status = false;
+
+ debugf("Status is false\n");
+ }
+ iter = iter->next;
+ }
+ return status;
+}
+
+bool room_obj_add_alias(room_id room, struct object_t *obj, char *alias)
+{
+ /* the primary name must be added */
+ if(!room_obj_get(room, obj->name))
+ room_obj_add(room, obj);
+
+ /* don't add an alias with the same name as the object */
+ if(!strcmp(alias, obj->name))
+ return false;
+
+ /* make sure this alias isn't already added */
+ struct obj_alias_t *iter = obj->alias_list;
+ while(iter)
+ {
+ if(!strcasecmp(iter->alias, alias))
+ return false;
+ iter = iter->next;
+ }
+
+ struct obj_alias_t *new = calloc(1, sizeof(struct obj_alias_t));
+
+ new->alias = alias;
+
+ new->next = obj->alias_list;
+ obj->alias_list = new;
+
+ ++obj->n_alias;
+
+ return multimap_insert(room_get(room)->objects, alias, obj_dup(obj));
}
const struct multimap_list *room_obj_iterate(room_id room, void **save, size_t *n_pairs)
@@ -103,16 +151,45 @@ size_t room_obj_count(room_id room)
return multimap_size(room_get(room)->objects);
}
-bool room_obj_del(room_id room, const char *name)
+size_t room_obj_count_noalias(room_id id)
{
- return multimap_delete_all(room_get(room)->objects, name);
+ return obj_count_noalias(room_get(id)->objects);
}
-bool room_obj_del_id(room_id room, const char *name, obj_id id)
+/* delete a specific object and its aliases */
+
+bool room_obj_del_by_ptr(room_id room, struct object_t *obj)
{
+ struct obj_alias_t *iter = obj->alias_list;
+
struct object_t tmp;
- tmp.id = id;
- return multimap_delete(room_get(room)->objects, name, &tmp);
+ tmp.id = obj->id;
+
+ while(iter)
+ {
+ multimap_delete(room_get(room)->objects, iter->alias, &tmp);
+ iter = iter->next;
+ }
+
+ return multimap_delete(room_get(room)->objects, obj->name, &tmp);
+}
+
+/* delete all the objects with a matching name, and all their aliases,
+ * from a room */
+
+bool room_obj_del(room_id room, const char *name)
+{
+ const struct multimap_list *iter = multimap_lookup(room_get(room)->objects, name, NULL);
+ if(!iter)
+ return false;
+ while(iter)
+ {
+ struct multimap_list *next = iter->next;
+ struct object_t *obj = iter->val;
+ room_obj_del_by_ptr(room, obj);
+ iter = next;
+ }
+ return true;
}
#define OBJMAP_SIZE 8