151 lines
4.9 KiB
C
151 lines
4.9 KiB
C
#include "EntityData.h"
|
|
#include "string.h"
|
|
#include <stdlib.h>
|
|
#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;
|
|
}
|