void AntiDOS_update(AntiDOS *dos) { time_t t = time(0); assert(dos!=0); if (t-dos->min_time > ANTIDOS_TIME_BASE) { bool was_changed = false; struct Data *i; dos->min_time = t; for (i = Vector_begin(&dos->data); i!=Vector_end(&dos->data); ++i) { if (t - i->access_time>ANTIDOS_TIME_BASE) { i->ip.s_addr = 0xFFFFFFFF; was_changed = true; } else dos->min_time = MIN(dos->min_time, i->access_time); } if (was_changed) { Vector_sort(&dos->data, Data_sortCompare); for (i=Vector_end(&dos->data); i!=Vector_begin(&dos->data);) { --i; if (i->ip.s_addr!=0xFFFFFFFF) break; Vector_popback(&dos->data); } Vector_resize(&dos->data); } } }
static Image *add_image( ImageManager *manager, char *name, MemoryManager memory) { char * const full_name = join_paths(manager->directory, name, memory); Image image; if (!full_name) { return NULL; } image.name = name; image.surface = load_texture(full_name, manager->format); Deallocator_free(memory.deallocator, full_name); if (!image.surface) { return NULL; } if (!Vector_push_back(&manager->images, &image, sizeof(image), memory.allocator)) { SDL_FreeSurface(image.surface); return NULL; } return ((Image *)Vector_end(&manager->images)) - 1; }
SDL_Surface *ImageManager_get(ImageManager *im, char const *name, MemoryManager memory) { Image *created; Image * const end = (Image *)Vector_end(&im->images); Image * const existing = find(Vector_begin(&im->images), end, sizeof(Image), is_image_name, (void *)name ); char *name_copy; if (existing != end) { return existing->surface; } name_copy = copy_string(name, memory.allocator); created = add_image(im, name_copy, memory); if (created) { return created->surface; } Deallocator_free(memory.deallocator, name_copy); return NULL; }
void ImageManager_free(ImageManager *im, Deallocator images_deallocator) { for_each(Vector_begin(&im->images), Vector_end(&im->images), sizeof(Image), free_image, &images_deallocator); Vector_free(&im->images, images_deallocator); Deallocator_free(images_deallocator, im->directory); }
void Fauna_update(Fauna *fauna, struct TileGrid const *world, TimeSpan delta, TimePoint now, NumberGenerator random) { NPCUpdateArgs args = {world, delta, now, random}; for_each( Vector_begin(&fauna->npcs), Vector_end(&fauna->npcs), sizeof(NPC), update_npc, &args ); }