void roomSetPersistent(ROOM_DATA *room, bool val) { PERSISTENT_DATA *data = roomGetAuxiliaryData(room, "persistent_data"); // if it was persistent before and not now, clear our database entry if(data->persistent == TRUE && val == FALSE) worldClearPersistentRoom(gameworld, roomGetClass(room)); data->persistent = val; }
// // add 'activity' to a persistent room. If a persistent room is active, make it // automatically load at bootup, so the activity can continue void roomAddActivity(ROOM_DATA *room) { PERSISTENT_DATA *data = roomGetAuxiliaryData(room, "persistent_data"); data->activity++; data->last_use = current_time; // add us to the list of active rooms //*********** // FINISH ME //*********** }
void roomRemoveActivity(ROOM_DATA *room) { PERSISTENT_DATA *data = roomGetAuxiliaryData(room, "persistent_data"); data->activity--; // remove us from the list of active rooms if(data->activity == 0) { //*********** // FINISH ME //*********** } }
// // every pulse, randomly sample our room table. If we find a persistent // room that hasn't been active for awhile, unload it to disk so we aren't // hogging up memory usage with a ton of unused rooms. Notably, this function // kind of sucks because rooms get their UIDs from the same pool as objects // and characters. That means a randomly generated UID is not always a room // uid. It may also select room UIDs that have already been unloaded. What we // really want to do is just sample a room from a known set of existing rooms. // // This function has been disabled until it is improved a little. // void close_unused_rooms_event(void *owner, void *unused, const char *arg) { int top = top_uid(); if(top == NOTHING) return; // randomly sample from the room table int uid_to_try = (rand() % (top - START_UID)) + START_UID; ROOM_DATA *room = propertyTableGet(room_table, uid_to_try); if(room == NULL) return; PERSISTENT_DATA *data = roomGetAuxiliaryData(room, "persistent_data"); // we've been inactive for more than 15 minutes, unload us if(data->persistent && data->activity == 0 && difftime(current_time, roomGetLastUse(room)) > 60 * 15) extract_room(room); }
PyObject *roomGetPyFormBorrowed(ROOM_DATA *room) { TRIGGER_AUX_DATA *data = roomGetAuxiliaryData(room, "trigger_data"); if(data->pyform == NULL) data->pyform = newPyRoom(room); return data->pyform; }
LIST *roomGetTriggers(ROOM_DATA *room) { TRIGGER_AUX_DATA *data = roomGetAuxiliaryData(room, "trigger_data"); return data->triggers; }
void roomClearPersistentDirty(ROOM_DATA *room) { PERSISTENT_DATA *data = roomGetAuxiliaryData(room, "persistent_data"); data->dirty = FALSE; }
void roomSetPersistentDirty(ROOM_DATA *room) { PERSISTENT_DATA *data = roomGetAuxiliaryData(room, "persistent_data"); data->dirty = TRUE; }
bool roomIsPersistentDirty(ROOM_DATA *room) { PERSISTENT_DATA *data = roomGetAuxiliaryData(room, "persistent_data"); return data->dirty; }
time_t roomGetLastUse(ROOM_DATA *room) { PERSISTENT_DATA *data = roomGetAuxiliaryData(room, "persistent_data"); return data->last_use; }
//***************************************************************************** // interaction with the persistent aux data //***************************************************************************** void roomUpdateLastUse(ROOM_DATA *room) { PERSISTENT_DATA *data = roomGetAuxiliaryData(room, "persistent_data"); data->last_use = current_time; }