kettek2/wiki/games/newsboy/Newsboy_0x00/engine/EntityData.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;
}