#include "entity.h" #include "raymath.h" #include #include #include "../Sprite/sprite.h" #include "../MapObject/mapobject.h" #include "../MapObject/mapobjectIDs.h" #include "../Entity/professions.h" #include "../Textures/textureIDs.h" Entity * EntityInit(Sprite *sprite, int profession){ Entity *new = malloc(sizeof(Entity)); new->sprite = sprite; new->destX = 0; new->destY = 0; new->hasDestination = 0; new->selected = 0; new->next = 0; new->prev = 0; new->task = TaskInit(); new->profession = profession; return new; } EntityList * EntityListInit(){ EntityList *new = malloc(sizeof(EntityList)); new->head = 0; new->tail = 0; return new; } 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){ EntityList *entities = game->entities; //SpriteListPrintForward(game->sprites); // Sprites move towards their destination float movementSpeed = 150.0f * GetFrameTime(); Entity *current = entities->head; int counter = 0; while (current != 0){ counter ++; if(current->hasDestination == 1){ Vector2 movement = { current->destX - current->sprite->x, current->destY - current->sprite->y }; if(Vector2Length(movement) < movementSpeed){ current->hasDestination = 0; current->sprite->x = current->destX; current->sprite->y = current->destY; } else{ movement = Vector2Normalize(movement); movement = Vector2Scale(movement, movementSpeed); current->sprite->x += movement.x; current->sprite->y += movement.y; // Change sprite according to direction Vector2 nullvektor = {0,0}; float angle = Vector2Angle(movement, nullvektor); angle = angle * RAD2DEG; angle -= 35.26; current->sprite->angle = angle; } } else{ if(current->profession == PR_BUILDER){ if(current->task->target == 0){ // Prüft, ob eine Baustelle existiert MapObject *currentMO = game->mapObjects->head; while(currentMO != 0){ if(currentMO->id == MO_Baustelle){ current->hasDestination = 1; current->destX = currentMO->sprite->x; current->destY = currentMO->sprite->y; current->task->target = currentMO; break; } currentMO = currentMO->next; } } else{ // Is beim target angekommen MapObject *obj = current->task->target; printf("Hier\n"); Sprite *new = SpriteCreate(game->textures, 2, obj->sprite->x, obj->sprite->y); SpriteListRemove(game->sprites, obj->sprite); SpriteListInsert(game->sprites, new); free(obj->sprite); MapObject *newObject = MapObjectInit(new, MO_Building); MapObjectListRemove(game->mapObjects, obj); MapObjectListInsert(game->mapObjects, newObject); current->task->target = 0; free(obj); } } } SpriteUpdate(current->sprite); SpriteListSpriteChanged(game->sprites, current->sprite); current = current->next; } }