// Copyright (c) 2023 Alex Diener. All rights reserved.

#ifndef __EntityToken_H__
#define __EntityToken_H__

typedef struct EntityToken EntityToken;
#define EntityToken_superclass GameEntity

#include "PROJECT_NAME/EntityComponent_pickup.h"
#include "PROJECT_NAME/EntityComponent_position.h"
#include "PROJECT_NAME/EntityComponent_sprite.h"
#include "PROJECT_NAME/GameEntity.h"

#define EntityToken_ivars \
	GameEntity_ivars \
	\
	EntityComponent_pickup pickupComponent; \
	EntityComponent_position positionComponent; \
	EntityComponent_sprite spriteComponent;

#define EntityToken_vtable(self_type) \
	GameEntity_vtable(self_type)

stemobject_declare(EntityToken)

EntityToken * EntityToken_create(Vector2i position, struct RoomState * roomState);
bool EntityToken_init(EntityToken * self, Vector2i position, struct RoomState * roomState);
EntityToken * EntityToken_createWithEncodedState(struct memreadContext * memreadContext, struct RoomState * roomState);
void EntityToken_initWithEncodedState(EntityToken * self, struct memreadContext * memreadContext, struct RoomState * roomState);
EntityToken * EntityToken_copy(EntityToken * self, struct RoomState * roomState);
void EntityToken_initCopy(EntityToken * self, compat_type(EntityToken *) original, struct RoomState * roomState);
void EntityToken_dispose(EntityToken * self);
compat_type(GameEntityComponent *) EntityToken_getComponent(EntityToken * self, ComponentType type);
void EntityToken_enumerateProperties(EntityToken * self, bool transient, GameEntity_enumeratePropertiesCallback callback, void * context);

#endif
