Mirai's Miscellaneous Misadventures

M37 / core / cameras.c

// copyright 2022 zamfofex
// license: AGPLv3 or later

#include <mimimi/cameras.h>
#include <mimimi/behaviors.h>
#include <mimimi/allocators.h>
#include <mimimi/geometry.h>

struct mimimi_camera_data
{
	struct mimimi_allocator *allocator;
	struct mimimi_behavior *behavior;
	struct mimimi_position *camera;
	struct mimimi_position *position;
	int x, y;
};

static void mimimi_camera_behave(void *data)
{
	struct mimimi_camera_data *camera_data = data;
	
	camera_data->camera->x *= 3;
	camera_data->camera->y *= 3;
	camera_data->camera->x += camera_data->position->x + camera_data->x;
	camera_data->camera->y += camera_data->position->y + camera_data->y;
	camera_data->camera->x /= 4;
	camera_data->camera->y /= 4;
}

static void mimimi_camera_finish(void *data)
{
	struct mimimi_camera_data *camera_data = data;
	mimimi_deallocate(camera_data->allocator, camera_data->behavior);
	mimimi_deallocate(camera_data->allocator, camera_data);
}

struct mimimi_behavior *mimimi_camera(struct mimimi_position *camera, struct mimimi_position *position, int x, int y, struct mimimi_allocator *allocator)
{
	struct mimimi_camera_data *data = mimimi_allocate(allocator, sizeof *data);
	data->allocator = allocator;
	data->camera = camera;
	data->position = position;
	
	data->x = x;
	data->y = y;
	
	camera->x = position->x + x;
	camera->y = position->y + y;
	
	data->behavior = mimimi_allocate(allocator, sizeof *data->behavior);
	data->behavior->behave = &mimimi_camera_behave;
	data->behavior->finish = &mimimi_camera_finish;
	data->behavior->data = data;
	
	return data->behavior;
}