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.

152 lines
4.6 KiB

#include "entity.h"
#include "raymath.h"
#include <stdio.h>
#include <stdlib.h>
#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;
}
}