Beispiel #1
0
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
	);
}