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

#include "gamemath/Vector2i.h"
#include "PROJECT_NAME/EntityComponent_position.h"

#define stemobject_implementation EntityComponent_position

stemobject_vtable_begin();
stemobject_vtable_entry(dispose);
stemobject_vtable_entry(initCopy);
stemobject_vtable_entry(update);
stemobject_vtable_entry(moveTo);
stemobject_vtable_entry(teleportTo);
stemobject_vtable_end();

bool EntityComponent_position_init(EntityComponent_position * self, Vector2i position) {
	call_super(init, self);
	self->position = self->lastPosition = position;
	self->lastBumpDirection = VECTOR2i_ZERO;
	return true;
}

void EntityComponent_position_dispose(EntityComponent_position * self) {
	call_super_virtual(dispose, self);
}

void EntityComponent_position_initCopy(EntityComponent_position * self, compat_type(GameEntityComponent *) originalUntyped) {
	call_super_virtual(initCopy, self, originalUntyped);
	EntityComponent_position * original = originalUntyped;
	self->position = original->position;
	self->lastPosition = original->lastPosition;
	self->lastBumpDirection = original->lastBumpDirection;
}

void EntityComponent_position_update(EntityComponent_position * self, struct GameEntity * entity) {
	self->lastPosition = self->position;
	self->lastBumpDirection = VECTOR2i_ZERO;
}

void EntityComponent_position_moveTo(EntityComponent_position * self, Vector2i newPosition) {
	self->position = newPosition;
}

void EntityComponent_position_teleportTo(EntityComponent_position * self, Vector2i newPosition) {
	self->position = self->lastPosition = newPosition;
}
