#pragma once
#include "olcPixelGameEngine.h"
#include "Animation.h"
#include "olcUTIL_Animate2D.h"
#include "Monster.h"
#include "DEFINES.h"

struct Bullet{
	friend class Crawler;
	vf2d pos;
	vf2d vel;
	float radius;
	int damage;
	Pixel col;
	float lifetime=INFINITE;
	bool hitsMultiple=false;
	bool rotates=false;
	bool animated=false;
	bool deactivated=false; //A deactivated bullet no longer interacts with the world. It's just a visual.
	float fadeOutTime=0;
	bool friendly=false; //Whether or not it's a player bullet or enemy bullet.
	bool upperLevel=false;
private:
	float fadeOutTimer=0;
	void UpdateFadeTime(float fElapsedTime);
public:
	Animate2D::Animation<AnimationState>animation;
	Animate2D::AnimationState internal_animState;
	std::map<Monster*,bool>hitList;
	virtual ~Bullet()=default;
	Bullet(vf2d pos,vf2d vel,float radius,int damage,bool upperLevel,bool friendly=false,Pixel col=WHITE);
	//Initializes a bullet with an animation.
	Bullet(vf2d pos,vf2d vel,float radius,int damage,AnimationState animation,bool upperLevel,bool hitsMultiple=false,float lifetime=INFINITE,bool rotatesWithAngle=false,bool friendly=false,Pixel col=WHITE);
	public:
	virtual void Update(float fElapsedTime);
	//Return true when the bullet should be destroyed. Return false to handle it otherwise (like deactivating it instead). You become responsible for getting rid of the bullet.
	virtual bool PlayerHit(Player*player);
	//Return true when the bullet should be destroyed. Return false to handle it otherwise (like deactivating it instead). You become responsible for getting rid of the bullet.
	virtual bool MonsterHit(Monster&monster);
	Animate2D::Frame GetFrame();
	void Draw();
	bool OnUpperLevel();
};