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

#ifndef __EntityWallCrawler_H__
#define __EntityWallCrawler_H__

typedef struct EntityWallCrawler EntityWallCrawler;
#define EntityWallCrawler_superclass GameEntity

#include "PROJECT_NAME/EntityComponent_attack.h"
#include "PROJECT_NAME/EntityComponent_collidable.h"
#include "PROJECT_NAME/EntityComponent_facing.h"
#include "PROJECT_NAME/EntityComponent_movement.h"
#include "PROJECT_NAME/EntityComponent_position.h"
#include "PROJECT_NAME/EntityComponent_sprite.h"
#include "PROJECT_NAME/EntityComponent_facingSteering.h"
#include "PROJECT_NAME/GameEntity.h"

#define EntityWallCrawler_ivars \
	GameEntity_ivars \
	\
	Vector2i initialPosition; \
	FacingDirection initialFacing; \
	EntityComponent_position positionComponent; \
	EntityComponent_sprite spriteComponent; \
	EntityComponent_facing facingComponent; \
	EntityComponent_movement movementComponent; \
	EntityComponent_facingSteering steeringComponent; \
	EntityComponent_collidable collidableComponent; \
	EntityComponent_attack attackComponent;

#define EntityWallCrawler_vtable(self_type) \
	GameEntity_vtable(self_type)

stemobject_declare(EntityWallCrawler)

EntityWallCrawler * EntityWallCrawler_create(Vector2i position, FacingDirection facing, struct RoomState * roomState);
bool EntityWallCrawler_init(EntityWallCrawler * self, Vector2i position, FacingDirection facing, struct RoomState * roomState);
EntityWallCrawler * EntityWallCrawler_createWithEncodedState(struct memreadContext * memreadContext, struct RoomState * roomState);
void EntityWallCrawler_initWithEncodedState(EntityWallCrawler * self, struct memreadContext * memreadContext, struct RoomState * roomState);
EntityWallCrawler * EntityWallCrawler_copy(EntityWallCrawler * self, struct RoomState * roomState);
void EntityWallCrawler_initCopy(EntityWallCrawler * self, compat_type(EntityWallCrawler *) original, struct RoomState * roomState);
void EntityWallCrawler_dispose(EntityWallCrawler * self);
void EntityWallCrawler_postinit(EntityWallCrawler * self);
compat_type(GameEntityComponent *) EntityWallCrawler_getComponent(EntityWallCrawler * self, ComponentType type);
void EntityWallCrawler_roomEntered(EntityWallCrawler * self);
void EntityWallCrawler_advanceTurn(EntityWallCrawler * self);
bool EntityWallCrawler_isEqual(EntityWallCrawler * self, EntityWallCrawler * compare);
void EntityWallCrawler_enumerateProperties(EntityWallCrawler * self, bool transient, GameEntity_enumeratePropertiesCallback callback, void * context);
void EntityWallCrawler_undoActionPerformed(EntityWallCrawler * self);

#endif
