/*
 * This software is licensed under the terms of the MIT License.
 * See COPYING for further information.
 * ---
 * Copyright (c) 2011-2024, Lukas Weber <laochailan@web.de>.
 * Copyright (c) 2012-2024, Andrei Alexeyev <akari@taisei-project.org>.
 */

#pragma once
#include "taisei.h"

#include "enemy.h"
#include "item.h"
#include "stageutils.h"

typedef Enemy *(*EnemySpawner)(cmplx pos, const ItemCounts *item_drops);

Enemy *espawn_swirl(cmplx pos, const ItemCounts *item_drops);
Enemy *espawn_fairy_blue(cmplx pos, const ItemCounts *item_drops);
Enemy *espawn_fairy_red(cmplx pos, const ItemCounts *item_drops);
Enemy *espawn_big_fairy(cmplx pos, const ItemCounts *item_drops);
Enemy *espawn_huge_fairy(cmplx pos, const ItemCounts *item_drops);
Enemy *espawn_super_fairy(cmplx pos, const ItemCounts *item_drops);

#ifdef ENEMY_DEBUG
	#define WRAP_ENEMY_SPAWNER(spawner, ...) \
		_enemy_attach_dbginfo((spawner)(__VA_ARGS__), _DEBUG_INFO_PTR_)

	#define espawn_swirl(...)           WRAP_ENEMY_SPAWNER(espawn_swirl, __VA_ARGS__)
	#define espawn_fairy_blue(...)      WRAP_ENEMY_SPAWNER(espawn_fairy_blue, __VA_ARGS__)
	#define espawn_fairy_red(...)       WRAP_ENEMY_SPAWNER(espawn_fairy_red, __VA_ARGS__)
	#define espawn_big_fairy(...)       WRAP_ENEMY_SPAWNER(espawn_big_fairy, __VA_ARGS__)
	#define espawn_huge_fairy(...)      WRAP_ENEMY_SPAWNER(espawn_huge_fairy, __VA_ARGS__)
	#define espawn_super_fairy(...)     WRAP_ENEMY_SPAWNER(espawn_super_fairy, __VA_ARGS__)
#endif

#define espawn_swirl_box(...)           ENT_BOX(espawn_swirl(__VA_ARGS__))
#define espawn_fairy_blue_box(...)      ENT_BOX(espawn_fairy_blue(__VA_ARGS__))
#define espawn_fairy_red_box(...)       ENT_BOX(espawn_fairy_red(__VA_ARGS__))
#define espawn_big_fairy_box(...)       ENT_BOX(espawn_big_fairy(__VA_ARGS__))
#define espawn_huge_fairy_box(...)      ENT_BOX(espawn_huge_fairy(__VA_ARGS__))
#define espawn_super_fairy_box(...)     ENT_BOX(espawn_super_fairy(__VA_ARGS__))

SpriteParams ecls_anyfairy_sprite_params(
	Enemy *fairy,
	EnemyDrawParams draw_params,
	SpriteParamsBuffer *out_spbuf
);

float ecls_anyenemy_set_scale(Enemy *e, float s);
float ecls_anyenemy_get_scale(Enemy *e);
float ecls_anyenemy_set_opacity(Enemy *e, float o);
float ecls_anyenemy_get_opacity(Enemy *e);

void ecls_anyenemy_fake3dmovein(
	Enemy *e,
	Camera3D *cam,
	vec3 initpos_3d,
	int duration
);

void ecls_anyfairy_summon(Enemy *e, int duration);
