#include "entity.h" #include "raymath.h" #include #include #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 * GetFrameTime(); 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; } }