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

#ifndef __EntityPushBlock_H__
#define __EntityPushBlock_H__

typedef struct EntityPushBlock EntityPushBlock;
#define EntityPushBlock_superclass GameEntity

#include "PROJECT_NAME/EntityComponent_collidable.h"
#include "PROJECT_NAME/EntityComponent_position.h"
#include "PROJECT_NAME/EntityComponent_pushable.h"
#include "PROJECT_NAME/EntityComponent_sprite.h"
#include "PROJECT_NAME/GameEntity.h"

#define EntityPushBlock_ivars \
	GameEntity_ivars \
	\
	EntityComponent_position positionComponent; \
	EntityComponent_sprite spriteComponent; \
	EntityComponent_collidable collidableComponent; \
	EntityComponent_pushable pushableComponent;

#define EntityPushBlock_vtable(self_type) \
	GameEntity_vtable(self_type)

stemobject_declare(EntityPushBlock)

EntityPushBlock * EntityPushBlock_create(Vector2i position, bool multipush, struct RoomState * roomState);
bool EntityPushBlock_init(EntityPushBlock * self, Vector2i position, bool multipush, struct RoomState * roomState);
EntityPushBlock * EntityPushBlock_createWithEncodedState(struct memreadContext * memreadContext, struct RoomState * roomState);
void EntityPushBlock_initWithEncodedState(EntityPushBlock * self, struct memreadContext * memreadContext, struct RoomState * roomState);
EntityPushBlock * EntityPushBlock_copy(EntityPushBlock * self, struct RoomState * roomState);
void EntityPushBlock_initCopy(EntityPushBlock * self, compat_type(EntityPushBlock *) original, struct RoomState * roomState);
void EntityPushBlock_dispose(EntityPushBlock * self);
compat_type(GameEntityComponent *) EntityPushBlock_getComponent(EntityPushBlock * self, ComponentType type);
void EntityPushBlock_preadvance(EntityPushBlock * self);
void EntityPushBlock_postadvance(EntityPushBlock * self);
bool EntityPushBlock_isEqual(EntityPushBlock * self, EntityPushBlock * compare);
void EntityPushBlock_enumerateProperties(EntityPushBlock * self, bool transient, GameEntity_enumeratePropertiesCallback callback, void * context);

#endif
