#include "mstruct.h"
#include "mextern.h"
int load_rom_from_file(file, rom_ptr)
room **rom_ptr;
char *file;
{
int fd;
long n;
*rom_ptr = (room *)malloc(sizeof(room));
if(!*rom_ptr)
merror("load_from_file", FATAL);
zero(*rom_ptr, sizeof(room));
fd = open(file, O_RDONLY | O_BINARY, 0);
if(fd < 0)
return(-1);
n = read_rom(fd, *rom_ptr);
if(n < 0) {
close(fd);
return(-1);
}
if (atoi(file+1)) (*rom_ptr)->rom_num = atoi(file+1);
close(fd);
return(0);
}
int save_rom_to_file(num, rom_ptr)
int num;
room *rom_ptr;
{
int fd;
long n;
char file[80];
sprintf(file, "%s/r%05d", ROOMPATH, num);
unlink(file);
fd = open(file, O_RDWR | O_CREAT, 00666);
if(fd < 0)
return(-1);
n = write_rom(fd, rom_ptr);
if(n < 0) {
close(fd);
return(-1);
}
close(fd);
return(0);
}
int load_ply_from_file(str, ply_ptr)
char *str;
creature **ply_ptr;
{
int fd;
long n;
char file[80];
#ifdef COMPRESS
char *a_buf, *b_buf;
int size;
#endif
*ply_ptr = (creature *)malloc(sizeof(creature));
if(!*ply_ptr)
merror("load_from_file", FATAL);
zero(*ply_ptr, sizeof(creature));
sprintf(file, "%s/%s", PLAYERPATH, str);
fd = open(file, O_RDONLY | O_BINARY, 0);
if(fd < 0)
return(-1);
#ifdef COMPRESS
a_buf = (char *)malloc(30000);
if(!a_buf) merror("Memory allocation", FATAL);
size = read(fd, a_buf, 30000);
if(size >= 30000) merror("Player too large", FATAL);
if(size < 1) {
close(fd);
return(-1);
}
b_buf = (char *)malloc(80000);
if(!b_buf) merror("Memory allocation", FATAL);
n = uncompress(a_buf, b_buf, size);
if(n > 80000) merror("Player too large", FATAL);
n = read_crt_from_mem(b_buf, *ply_ptr, 0);
free(a_buf);
free(b_buf);
#else
n = read_crt(fd, *ply_ptr);
if(n < 0) {
close(fd);
return(-1);
}
#endif
close(fd);
return(0);
}
int save_ply_to_file(str, ply_ptr)
char *str;
creature *ply_ptr;
{
int fd;
long n;
char file[80];
#ifdef COMPRESS
char *a_buf, *b_buf;
int size;
#endif
sprintf(file, "%s/%s", PLAYERPATH, str);
unlink(file);
fd = open(file, O_RDWR | O_CREAT, 00666);
if(fd < 0)
return(-1);
#ifdef COMPRESS
a_buf = (char *)malloc(80000);
if(!a_buf) merror("Memory allocation", FATAL);
n = write_crt_to_mem(a_buf, ply_ptr, 0);
if(n > 80000) merror("Player too large", FATAL);
b_buf = (char *)malloc(n);
if(!b_buf) merror("Memory allocation", FATAL);
size = compress(a_buf, b_buf, n);
n = write(fd, b_buf, size);
free(a_buf);
free(b_buf);
#else
n = write_crt(fd, ply_ptr, 0);
if(n < 0) {
close(fd);
return(-1);
}
#endif
close(fd);
return(0);
}
int load_obj_from_file(num, obj_ptr, file)
/* num specifies the relative object # in the file named by file */
int num;
object **obj_ptr;
char *file;
{
int fd;
long n;
*obj_ptr = (object *)malloc(sizeof(object));
if(!*obj_ptr)
merror("load_from_file", FATAL);
zero(*obj_ptr, sizeof(object));
fd = open(file, O_RDONLY | O_BINARY, 0);
if(fd < 0)
return(-1);
n = lseek(fd, (long)((num)*sizeof(object)), 0);
if(n < 0L) {
close(fd);
return(-1);
}
n = read(fd, *obj_ptr, sizeof(object));
if(n < sizeof(object)) {
close(fd);
return(-1);
}
close(fd);
return(0);
}
int save_obj_to_file(num, obj_ptr)
int num;
object *obj_ptr;
{
int fd;
long n;
char file[80];
sprintf(file, "%s/o%02d", OBJPATH, num/OFILESIZE);
fd = open(file, O_RDWR | O_BINARY, 0);
if(fd < 0) {
fd = open(file, O_RDWR | O_CREAT, 00666);
if(fd < 0)
return(-1);
}
n = lseek(fd, (long)((num%OFILESIZE)*sizeof(object)), 0);
if(n < 0L) {
close(fd);
return(-1);
}
n = write(fd, obj_ptr, sizeof(object));
if(n < sizeof(object)) {
close(fd);
return(-1);
}
close(fd);
return(0);
}
int load_crt_from_file(num, crt_ptr, file)
int num;
creature **crt_ptr;
char *file;
{
int fd;
long n;
*crt_ptr = (creature *)malloc(sizeof(creature));
if(!*crt_ptr)
merror("load_from_file", FATAL);
zero(*crt_ptr, sizeof(creature));
fd = open(file, O_RDONLY | O_BINARY, 0);
if(fd < 0)
return(-1);
n = lseek(fd, (long)((num)*sizeof(creature)), 0);
if(n < 0L) {
close(fd);
return(-1);
}
n = read(fd, *crt_ptr, sizeof(creature));
if(n < sizeof(creature)) {
close(fd);
return(-1);
}
close(fd);
return(0);
}
int save_crt_to_file(num, crt_ptr)
int num;
creature *crt_ptr;
{
int fd;
long n;
char file[80];
sprintf(file, "%s/m%02d", MONPATH, num/MFILESIZE);
fd = open(file, O_RDWR | O_BINARY, 0);
if(fd < 0) {
fd = open(file, O_RDWR | O_CREAT, 00666);
if(fd < 0)
return(-1);
}
n = lseek(fd, (long)((num%MFILESIZE)*sizeof(creature)), 0);
if(n < 0L) {
close(fd);
return(-1);
}
n = write(fd, crt_ptr, sizeof(creature));
if(n < sizeof(creature)) {
close(fd);
return(-1);
}
close(fd);
return(0);
}