You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
4.9 KiB

#include "entity.h"
#include "raymath.h"
#include <stdio.h>
#include <stdlib.h>
#include "../Sprite/sprite.h"
#include "../MapObject/building.h"
#include "../definitions.h"
#include "entityacts.h"
#include "../game.h"
Entity * EntityInit(Game *game, int profession, int x, int y){
Entity *new = malloc(sizeof(Entity));
int textureId = 0;
Animation ***animations = 0;
switch(profession){
case PR_BUILDER:
new->act = BuilderAct;
textureId = TE_WORKER;
animations = game->textures->animations[AN_WORKER];
break;
case PR_LUMBERJACK:
new->act = LumberjackAct;
textureId = TE_LUMBERJACK;
animations = game->textures->animations[AN_LUMBERJACK];
break;
default:
printf("WARNING: ENTITYINIT MIT FALSCHER ID AUFGERUFEN!\n");
}
Sprite *newSprite = SpriteCreate(game->textures, textureId, x, y);
SpriteListInsert(game->sprites, newSprite);
new->sprite = newSprite;
new->animationHandler = AnimationHandlerInit(animations, &new->sprite->texture);
new->angle = 0;
new->destX = 0;
new->destY = 0;
new->hasDestination = 0;
new->selected = 0;
new->next = 0;
new->prev = 0;
new->task = TaskInit(profession);
new->profession = profession;
return new;
}
EntityList * EntityListInit(){
EntityList *new = malloc(sizeof(EntityList));
new->head = 0;
new->tail = 0;
return new;
}
void EntityMoveToDestination(Entity *entity){
float movementSpeed = 150.0f * ACT_TIME;
if(entity->hasDestination == 1){
Vector2 movement = {
entity->destX - entity->sprite->x,
entity->destY - entity->sprite->y
};
if(Vector2Length(movement) < movementSpeed){
entity->hasDestination = 0;
entity->sprite->x = entity->destX;
entity->sprite->y = entity->destY;
}
else{
movement = Vector2Normalize(movement);
movement = Vector2Scale(movement, movementSpeed);
entity->sprite->x += movement.x;
entity->sprite->y += movement.y;
// Change sprite according to direction
Vector2 nullvektor = {0,0};
float angle = Vector2Angle(movement, nullvektor);
angle = angle * RAD2DEG;
angle -= 35.26;
if(angle <= 22.5 && angle >= -22.5){
// E
AnimationChangeDirection(entity->animationHandler, E);
}
else if(angle > 0 && angle <= 67.5){
// NE
AnimationChangeDirection(entity->animationHandler, NE);
}
else if(angle > 0 && angle <= 112.5){
// N
AnimationChangeDirection(entity->animationHandler, N);
}
else if(angle > 0 && angle <= 157.5){
// NW
AnimationChangeDirection(entity->animationHandler, NW);
}
else if(angle < 0 && angle >= -67.5){
// SE
AnimationChangeDirection(entity->animationHandler, SE);
}
else if(angle < 0 && angle >= -112.5){
// S
AnimationChangeDirection(entity->animationHandler, S);
}
else if(angle < 0 && angle >= -157.5){
// SW
AnimationChangeDirection(entity->animationHandler, SW);
}
else{
// W
AnimationChangeDirection(entity->animationHandler, W);
}
}
}
}
void EntityListPrintForward(EntityList *entities){
}
void EntityListInsert(EntityList *entities, Entity *data){
if(entities->head == 0){
entities->head = data;
entities->tail = data;
}
else{
entities->tail->next = data;
data->prev = entities->tail;
entities->tail = data;
}
}
void EntityListRemove(EntityList *entities, Entity *remove){
if(remove == 0){
printf("WARNING: TRIED TO REMOVE NULLPOINTER\n");
}
else if(entities->head == remove && entities->tail == remove){
entities->head = 0;
entities->tail = 0;
}
else if(entities->head == remove){
remove->next->prev = 0;
entities->head = remove->next;
}
else if(entities->tail == remove){
remove->prev->next = 0;
entities->tail = remove->prev;
}
else{
remove->prev->next = remove->next;
remove->next->prev = remove->prev;
}
remove->next = 0;
remove->prev = 0;
}
void EntityListActAllEntities(Game *game){
Entity *current = game->entities->head;
while (current != 0){
current->act(game, current);
AnimationUpdate(current->animationHandler);
SpriteUpdate(current->sprite);
SpriteListSpriteChanged(game->sprites, current->sprite);
current = current->next;
}
}