#include "EntityData.h" #include "string.h" #include #include "fifo.h" #include "globals.h" #include "string.h" struct EntityData *newEntityData() { struct EntityData *entity_data = malloc(sizeof(struct EntityData)); entity_data->name = malloc(1); entity_data->name[0] = '\0'; // eww entity_data->filename = malloc(1); entity_data->filename[0] = '\0'; entity_data->anim = malloc(1); entity_data->anim[0] = '\0'; entity_data->set = malloc(1); entity_data->set[0] = '\0'; entity_data->face = malloc(1); entity_data->face[0] = '\0'; entity_data->frame = 0; entity_data->spawn = malloc(1); entity_data->spawn[0] = '\0'; return entity_data; } int freeEntityData(struct EntityData *entity_data) { if (entity_data == NULL) return 1; free(entity_data->filename); free(entity_data->name); free(entity_data->anim); free(entity_data->set); free(entity_data->face); free(entity_data->spawn); free(entity_data); return 0; } int saveEntityData(struct EntityData *entity_data) { if (entity_data == NULL) return 1; // create our filename string // open file for output FILE *output = fopen(entity_data->filename, "wb"); if (output == NULL) { report(ERROR, "saveEntityData", "cannot open \"%s\" for writing", entity_data->filename); return 2; } char magic[4]; magic[0] = 'N'; magic[1] = 'b'; magic[2] = 'E'; magic[3] = 1; writeData(output, T_MAGIC, (void*)&magic); writeData(output, T_STRING, (void*)&entity_data->name); writeData(output, T_STRING, (void*)&entity_data->anim); writeData(output, T_STRING, (void*)&entity_data->set); writeData(output, T_STRING, (void*)&entity_data->face); writeData(output, T_INT, (void*)&entity_data->frame); // writeData(output, T_INT, (void*)&entity_data->type); writeData(output, T_INT, (void*)&entity_data->behave); // int temp = (int)(entity_data->mass*1000); writeData(output, T_INT, (void*)&temp); temp = (int)(entity_data->radius*1000); writeData(output, T_INT, (void*)&temp); temp = (int)(entity_data->speed*1000); writeData(output, T_INT, (void*)&temp); temp = (int)(entity_data->turn*1000); writeData(output, T_INT, (void*)&temp); // writeData(output, T_INT, (void*)&entity_data->hp); temp = (int)(entity_data->sight*1000); writeData(output, T_INT, (void*)&temp); // temp = (int)(entity_data->range*1000); writeData(output, T_INT, (void*)&temp); writeData(output, T_INT, (void*)&entity_data->attack); writeData(output, T_INT, (void*)&entity_data->damage); writeData(output, T_STRING, (void*)&entity_data->spawn); // writeData(output, T_INT, (void*)&entity_data->time); fclose(output); return 0; } int loadEntityData(struct EntityData *entity_data, const char *filename) { if (entity_data == NULL) return 1; if (filename == NULL) return 2; // open file for reading binary FILE *input = fopen(filename, "rb"); if (input == NULL) { report(ERROR, "loadEntityData", "cannot open \"%s\" for reading", filename); return 3; } void *val = malloc(4); // read in magic number readData(input, T_MAGIC, val); if (((char *)val)[0] != 'N' || ((char *)val)[1] != 'b' || ((char *)val)[2] != 'E' || ((char *)val)[3] != 1) { report(ERROR, "loadEntityData", "magic number mismatch, expected %d, got %d", ((char *)val)[3], 1); free(val); return 5; } entity_data->name = readData(input, T_STRING, entity_data->name); entity_data->anim = readData(input, T_STRING, entity_data->anim); entity_data->set = readData(input, T_STRING, entity_data->set); entity_data->face = readData(input, T_STRING, entity_data->face); readData(input, T_INT, &entity_data->frame); // readData(input, T_INT, &entity_data->type); readData(input, T_INT, &entity_data->behave); // int temp = 0; readData(input, T_INT, &temp); entity_data->mass = (float)temp/1000.0f; readData(input, T_INT, &temp); entity_data->radius = (float)temp/1000.0f; readData(input, T_INT, &temp); entity_data->speed = (float)temp/1000.0f; readData(input, T_INT, &temp); entity_data->turn = (float)temp/1000.0f; // readData(input, T_INT, &entity_data->hp); readData(input, T_INT, &temp); entity_data->sight = (float)temp/1000.0f; // readData(input, T_INT, &temp); entity_data->range = (float)temp/1000.0f; readData(input, T_INT, &entity_data->attack); readData(input, T_INT, &entity_data->damage); entity_data->spawn = readData(input, T_STRING, entity_data->spawn); // readData(input, T_INT, &entity_data->time); free(val); fclose(input); // success, we hope return 0; } struct EntityData *loadEntityData_res(const char *filename) { char *full_path = malloc(1); full_path = setStringF(full_path, "%s%s%s", ENT_DIR, filename, ENT_EXT); struct EntityData *entity_data = newEntityData(); if (loadEntityData(entity_data, full_path) != 0) { printf("failed to load entity data\n"); freeEntityData(entity_data); free(full_path); return NULL; } free(full_path); return entity_data; }