/*
* EDITOR.C:
*
* Object, creature, room and player editor routines.
*
* Copyright (C) 1991 Brett J. Vickers
*
*/
#include "mstruct.h"
#include "editor.h"
#include "mtype.h"
#include <time.h>
#ifdef TC
#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>
#endif
void main()
{
int i;
umask(0);
while(1) {
clearscreen();
posit(10,30); printf("1. Edit Object");
posit(11,30); printf("2. Edit Creature");
posit(12,30); printf("3. Edit Room");
posit(13,30); printf("4. Edit Player");
posit(14,30); printf("5. Quit");
posit(16,30); printf("Choice: ");
getnum(&i, 1, 5);
switch(i) {
case 1:
edit_object();
break;
case 2:
edit_monster();
break;
case 3:
edit_room();
break;
case 4:
edit_player();
break;
case 5:
exit(0);
}
}
}
void edit_object()
{
int i, num;
long j;
char str[256];
object *obj_ptr;
clearscreen();
posit(3,20); printf("Enter object number to edit: ");
getnum(&num, 0, 3000);
load_obj_from_file(num, &obj_ptr);
while(1) {
clearscreen();
posit(2,25); printf("Object: %s", obj_ptr->name);
posit(4,30); printf(" 1. Edit object name/description");
posit(5,30); printf(" 2. Edit key names");
posit(6,30); printf(" 3. Edit output string");
posit(7,30); printf(" 4. Edit value/weight/type/adj/quest");
posit(8,30); printf(" 5. Edit shots/dmg/armor/wear/mgc/spcl");
posit(9,30); printf(" 6. Edit flags");
posit(10,30); printf(" 7. Clear this object");
posit(11,30); printf(" 8. Abort edit");
posit(12,30); printf(" 9. Back to main menu");
posit(15,30); printf("Choice: ");
getnum(&i, 1, 9);
switch(i) {
case 1: /* name */
clearscreen();
posit(2,1); printf("Object's name:");
posit(3,1); printf("%s", obj_ptr->name);
posit(5,1); printf("Description:");
posit(6,1); printf("%s", obj_ptr->description);
posit(3,1); getstr(str, obj_ptr->name, 80);
strcpy(obj_ptr->name, str);
posit(6,1); getstr(str, obj_ptr->description, 80);
strcpy(obj_ptr->description, str);
break;
case 2: /* keys */
clearscreen();
posit(2,1); printf("Keys:");
posit(3,1); printf("1:%s", obj_ptr->key[0]);
posit(3,27); printf("2:%s", obj_ptr->key[1]);
posit(3,54); printf("3:%s", obj_ptr->key[2]);
posit(3,3); getstr(str, obj_ptr->key[0], 20);
strcpy(obj_ptr->key[0], str);
posit(3,29); getstr(str, obj_ptr->key[1], 20);
strcpy(obj_ptr->key[1], str);
posit(3,56); getstr(str, obj_ptr->key[2], 20);
strcpy(obj_ptr->key[2], str);
break;
case 3: /* output string */
clearscreen();
posit(2,1); printf("Current output string:");
posit(3,1); printf("%s", obj_ptr->use_output);
posit(3,1); getstr(str, obj_ptr->use_output, 80);
strcpy(obj_ptr->use_output, str);
break;
case 4: /* value/weight/type/adj/quest */
clearscreen();
posit(2,1); printf("Value: %-8d", obj_ptr->value);
posit(2,30); printf("Weight: %-5d",obj_ptr->weight);
posit(3,1); printf(" Type: %-3d", obj_ptr->type);
posit(3,30); printf(" Adj: %-3d", obj_ptr->adjustment);
posit(3,54); printf("Quest: %-3d", obj_ptr->questnum);
posit(2,8); getnums(&j, (long)obj_ptr->value, 0L, 1000000);
obj_ptr->value = j;
posit(2,38); getnums(&j, (long)obj_ptr->weight, 0L, 32000L);
obj_ptr->weight = j;
posit(3,8); getnums(&j, (long)obj_ptr->type, -127L, 127L);
obj_ptr->type = j;
posit(3,38); getnums(&j, (long)obj_ptr->adjustment, -127L, 127L);
obj_ptr->adjustment = j;
posit(3,61); getnums(&j, (long)obj_ptr->questnum, -1L, 127L);
obj_ptr->questnum = j;
break;
case 5: /* shots/dmg/armor/wear/magic */
clearscreen();
posit(2,1); printf(" Shots: %-5d/%-5d", obj_ptr->shotscur, obj_ptr->shotsmax);
posit(3,1); printf("# Dice: %-5d", obj_ptr->ndice);
posit(3,30); printf(" Sides: %-5d", obj_ptr->sdice);
posit(3,60); printf(" Plus: %-5d", obj_ptr->pdice);
posit(4,1); printf(" Armor: %-3d", obj_ptr->armor);
posit(4,30); printf(" Wear: %-3d", obj_ptr->wearflag);
posit(4,60); printf(" Magic: %-3d", obj_ptr->magicpower);
posit(5,30); printf(" Realm: %-1d", obj_ptr->magicrealm);
posit(5,59); printf("Special: %-3d", obj_ptr->special);
posit(2,9); getnums(&j, (long)obj_ptr->shotscur, 0L, 32000L);
obj_ptr->shotscur = j;
posit(2,15); getnums(&j, (long)obj_ptr->shotsmax, 0L, 32000L);
obj_ptr->shotsmax = j;
posit(3,9); getnums(&j, (long)obj_ptr->ndice, 0L, 32000L);
obj_ptr->ndice = j;
posit(3,38); getnums(&j, (long)obj_ptr->sdice, 0L, 32000L);
obj_ptr->sdice = j;
posit(3,68); getnums(&j, (long)obj_ptr->pdice, 0L, 32000L);
obj_ptr->pdice = j;
posit(4,9); getnums(&j, (long)obj_ptr->armor, -127L, 127L);
obj_ptr->armor = j;
posit(4,38); getnums(&j, (long)obj_ptr->wearflag, -127L, 127L);
obj_ptr->wearflag = j;
posit(4,68); getnums(&j, (long)obj_ptr->magicpower, -127L, 127L);
obj_ptr->magicpower = j;
posit(5,38); getnums(&j, (long)obj_ptr->magicrealm, 0L, 128L);
obj_ptr->magicrealm = j;
posit(5,68); getnums(&j, (long)obj_ptr->special, 0L, 32000L);
obj_ptr->special = j;
break;
case 6: /* flags */
clearscreen();
posit(2,10); printf("1");
posit(2,20); printf("2");
posit(2,30); printf("3");
posit(2,40); printf("4");
posit(2,50); printf("5");
posit(2,60); printf("6");
posit(3,1); printf("1234567890123456789012345678901234567890123456789012345678901234");
posit(7,1); printf("Flag #: ");
posit(8,1); printf("(0 to exit)");
while(1) {
for(j=0;j<64;j++)
str[j] = (obj_ptr->flags[j/8] & 1<<(j%8)) ? '*':'.';
str[64] = 0;
posit(4,1); printf("%s",str);
posit(7,9); getnum(&j, 0, 64);
if(!j) break;
if(obj_ptr->flags[(j-1)/8] & 1<<((j-1)%8))
obj_ptr->flags[(j-1)/8] &= ~(1<<((j-1)%8));
else
obj_ptr->flags[(j-1)/8] |= 1<<((j-1)%8);
}
break;
case 7:
clearscreen();
posit(1,1);
printf("Are you sure you want to clear it? ");
getstr(str, "n", 2);
if(str[0]=='y' || str[0]=='Y')
zero(obj_ptr, sizeof(object));
break;
case 8:
free(obj_ptr);
return;
case 9:
save_obj_to_file(num, obj_ptr);
free(obj_ptr);
return;
}
}
}
int load_obj_from_file(num, obj_ptr)
int num;
object **obj_ptr;
{
int fd;
long n;
char file[80];
*obj_ptr = (object *)malloc(sizeof(object));
if(!*obj_ptr)
merror("load_from_file", FATAL);
zero(*obj_ptr, sizeof(object));
#ifdef TC
sprintf(file, "%s\\o%02d", OBJPATH, num/OFILESIZE);
#else
sprintf(file, "%s/o%02d", OBJPATH, num/OFILESIZE);
#endif
fd = open(file, O_RDONLY | O_BINARY, 0);
if(fd < 0)
return(-1);
n = lseek(fd, (long)((num%OFILESIZE)*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];
#ifdef TC
sprintf(file, "%s\\o%02d", OBJPATH, num/OFILESIZE);
#else
sprintf(file, "%s/o%02d", OBJPATH, num/OFILESIZE);
#endif
fd = open(file, O_RDWR | O_BINARY, 0);
if(fd < 0) {
#ifdef TC
fd = open(file, O_RDWR | O_CREAT | O_BINARY, S_IWRITE | S_IREAD);
#else
fd = open(file, O_RDWR | O_CREAT, ACC);
#endif
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);
}
void edit_monster()
{
int i, num;
long j;
char str[256];
creature *crt_ptr;
clearscreen();
posit(3,20); printf("Enter creature number to edit: ");
getnum(&num, 0, 3000);
load_crt_from_file(num, &crt_ptr);
crt_ptr->type = 1; /* monster */
while(1) {
clearscreen();
posit(2,25); printf("Creature: %s",crt_ptr->name);
posit(4,30); printf(" 1. Edit creature name/desc/talk");
posit(5,30); printf(" 2. Edit creature keys");
posit(6,30); printf(" 3. Edit level/class/align/stats");
posit(7,30); printf(" 4. Edit HP/MP/armor/thaco/num");
posit(8,30); printf(" 5. Edit exp/gold/dmg/quest/special");
posit(9,30); printf(" 6. Edit spells");
posit(10,30); printf(" 7. Edit flags");
posit(11,30); printf(" 8. Edit proficiencies");
posit(12,30); printf(" 9. Edit carryable objects");
posit(13,30); printf("10. Clear this creature");
posit(14,30); printf("11. Abort edit");
posit(15,30); printf("12. Back to main menu");
posit(18,30); printf("Choice: ");
getnum(&i, 1, 12);
switch(i) {
case 1:
clearscreen();
posit(2,1); printf("Creature name:");
posit(3,1); printf("%s",crt_ptr->name);
posit(5,1); printf("Description:");
posit(6,1); printf("%s",crt_ptr->description);
posit(8,1); printf("%s", "Talk:");
posit(9,1); printf("%s",crt_ptr->talk);
posit(3,1); getstr(str, crt_ptr->name, 80);
strcpy(crt_ptr->name, str);
posit(6,1); getstr(str, crt_ptr->description, 80);
strcpy(crt_ptr->description, str);
posit(9,1); getstr(str, crt_ptr->talk, 80);
strcpy(crt_ptr->talk, str);
break;
case 2: /* keys */
clearscreen();
posit(2,1); printf("Keys:");
posit(3,1); printf("1:%s", crt_ptr->key[0]);
posit(3,27); printf("2:%s", crt_ptr->key[1]);
posit(3,54); printf("3:%s", crt_ptr->key[2]);
posit(3,3); getstr(str, crt_ptr->key[0], 20);
strcpy(crt_ptr->key[0], str);
posit(3,29); getstr(str, crt_ptr->key[1], 20);
strcpy(crt_ptr->key[1], str);
posit(3,56); getstr(str, crt_ptr->key[2], 20);
strcpy(crt_ptr->key[2], str);
break;
case 3: /* level/class/align/stats */
clearscreen();
posit(2,1); printf("Level: %-3d", crt_ptr->level);
posit(2,20); printf("Class: %-3d", crt_ptr->class);
posit(2,40); printf("Align: %-5d", crt_ptr->alignment);
posit(3,1); printf(" Str: %-2d", crt_ptr->strength);
posit(3,20); printf(" Dex: %-2d", crt_ptr->dexterity);
posit(3,40); printf(" Con: %-2d", crt_ptr->constitution);
posit(4,1); printf(" Int: %-2d", crt_ptr->intelligence);
posit(4,20); printf(" Pty: %-2d", crt_ptr->piety);
posit(2,8); getnums(&j, (long)crt_ptr->level, 0L, 127L);
crt_ptr->level = j;
posit(2,27); getnums(&j, (long)crt_ptr->class, -127L, 127L);
crt_ptr->class = j;
posit(2,47); getnums(&j, (long)crt_ptr->alignment, -30000L, 30000L);
crt_ptr->alignment = j;
posit(3,8); getnums(&j, (long)crt_ptr->strength, 0L, 25L);
crt_ptr->strength = j;
posit(3,27); getnums(&j, (long)crt_ptr->dexterity, 0L, 25L);
crt_ptr->dexterity = j;
posit(3,47); getnums(&j, (long)crt_ptr->constitution, 0L, 25L);
crt_ptr->constitution = j;
posit(4,8); getnums(&j, (long)crt_ptr->intelligence, 0L, 25L);
crt_ptr->intelligence = j;
posit(4,27); getnums(&j, (long)crt_ptr->piety, 0L, 25L);
crt_ptr->piety = j;
break;
case 4: /* HP/MP/Armor/Thaco */
clearscreen();
posit(2,1); printf(" HP: %-5d/%-5d", crt_ptr->hpcur, crt_ptr->hpmax);
posit(2,30); printf(" MP: %-5d/%-5d", crt_ptr->mpcur, crt_ptr->mpmax);
posit(3,1); printf("Armor: %-3d", crt_ptr->armor);
posit(3,30); printf("Thac0: %-3d", crt_ptr->thaco);
posit(4,1); printf(" Num: %-3d", crt_ptr->numwander);
posit(2,8); getnums(&j, (long)crt_ptr->hpcur, 0L, 32000L);
crt_ptr->hpcur = j;
posit(2,14); getnums(&j, (long)crt_ptr->hpmax, 0L, 32000L);
crt_ptr->hpmax = j;
posit(2,37); getnums(&j, (long)crt_ptr->mpcur, 0L, 32000L);
crt_ptr->mpcur = j;
posit(2,43); getnums(&j, (long)crt_ptr->mpmax, 0L, 32000L);
crt_ptr->mpmax = j;
posit(3,8); getnums(&j, (long)crt_ptr->armor, -127L, 127L);
crt_ptr->armor = j;
posit(3,37); getnums(&j, (long)crt_ptr->thaco, -127L, 127L);
crt_ptr->thaco = j;
posit(4,8); getnums(&j, (long)crt_ptr->numwander, -127L, 127L);
crt_ptr->numwander = j;
break;
case 5: /* exp/gold/dmg/quest */
clearscreen();
posit(2,1); printf("Experience: %ld", crt_ptr->experience);
posit(2,30); printf(" Gold: %ld", crt_ptr->gold);
posit(3,1); printf(" # Dice: %-5d", crt_ptr->ndice);
posit(3,30); printf(" Sides: %-5d", crt_ptr->sdice);
posit(3,60); printf(" Plus: %-5d", crt_ptr->pdice);
posit(4,1); printf(" Quest: %-3d", crt_ptr->questnum);
posit(4,29); printf("Special: %-3d", crt_ptr->special);
posit(2,13); getnums(&j, (long)crt_ptr->experience, 0L, 1000000L);
crt_ptr->experience = j;
posit(2,38); getnums(&j, (long)crt_ptr->gold, 0L, 20000000L);
crt_ptr->gold = j;
posit(3,13); getnums(&j, (long)crt_ptr->ndice, 0L, 32000L);
crt_ptr->ndice = j;
posit(3,38); getnums(&j, (long)crt_ptr->sdice, 0L, 32000L);
crt_ptr->sdice = j;
posit(3,68); getnums(&j, (long)crt_ptr->pdice, 0L, 32000L);
crt_ptr->pdice = j;
posit(4,13); getnums(&j, (long)crt_ptr->questnum, -1L, 127L);
crt_ptr->questnum = j;
posit(4,38); getnums(&j, (long)crt_ptr->special, 0L, 32000L);
crt_ptr->special = j;
break;
case 6: /* spells */
clearscreen();
posit(2,10); printf("1");
posit(2,20); printf("2");
posit(2,30); printf("3");
posit(2,40); printf("4");
posit(2,50); printf("5");
posit(2,60); printf("6");
posit(2,70); printf("7");
posit(7,10); printf("8");
posit(7,20); printf("9");
posit(7,30); printf("0");
posit(7,40); printf("1");
posit(7,50); printf("2");
posit(6,30); printf("1");
posit(6,40); printf("1");
posit(6,50); printf("1");
posit(3,1); printf("1234567890123456789012345678901234567890123456789012345678901234567890");
posit(8,1); printf("1234567890123456789012345678901234567890123456789012345678");
posit(11,1); printf("Spell #: ");
posit(12,1); printf("(0 to exit)");
while(1) {
for(j=0;j<128;j++)
str[j] = (crt_ptr->spells[j/8] & 1<<(j%8)) ? '*':'.';
str[128] = 0; j = str[70];
str[70] = 0;
posit(4,1); printf("%s",str);
str[70] = j;
posit(9,1); printf("%s",&str[70]);
posit(11,10); getnum(&j, 0, 128);
if(!j) break;
if(crt_ptr->spells[(j-1)/8] & 1<<((j-1)%8))
crt_ptr->spells[(j-1)/8] &= ~(1<<((j-1)%8));
else
crt_ptr->spells[(j-1)/8] |= 1<<((j-1)%8);
}
break;
case 7: /* flags */
clearscreen();
posit(2,10); printf("1");
posit(2,20); printf("2");
posit(2,30); printf("3");
posit(2,40); printf("4");
posit(2,50); printf("5");
posit(2,60); printf("6");
posit(3,1); printf("1234567890123456789012345678901234567890123456789012345678901234");
posit(7,1); printf("Flag #: ");
posit(8,1); printf("(0 to exit)");
while(1) {
for(j=0;j<64;j++)
str[j] = (crt_ptr->flags[j/8] & 1<<(j%8)) ? '*':'.';
str[64] = 0;
posit(4,1); printf("%s",str);
posit(7,9); getnum(&j, 0, 64);
if(!j) break;
if(crt_ptr->flags[(j-1)/8] & 1<<((j-1)%8))
crt_ptr->flags[(j-1)/8] &= ~(1<<((j-1)%8));
else
crt_ptr->flags[(j-1)/8] |= 1<<((j-1)%8);
}
break;
case 8:
clearscreen();
posit(2,1); printf("Proficiencies:");
posit(3,1); printf("1:%ld", crt_ptr->proficiency[0]);
posit(3,27); printf("2:%ld", crt_ptr->proficiency[1]);
posit(3,54); printf("3:%ld", crt_ptr->proficiency[2]);
posit(4,1); printf("4:%ld", crt_ptr->proficiency[3]);
posit(4,27); printf("5:%ld", crt_ptr->proficiency[4]);
posit(3,3); getnums(&j, (long)crt_ptr->proficiency[0], 0L, 1000000L);
crt_ptr->proficiency[0] = j;
posit(3,29); getnums(&j, (long)crt_ptr->proficiency[1], 0L, 1000000L);
crt_ptr->proficiency[1] = j;
posit(3,56); getnums(&j, (long)crt_ptr->proficiency[2], 0L, 1000000L);
crt_ptr->proficiency[2] = j;
posit(4,3); getnums(&j, (long)crt_ptr->proficiency[3], 0L, 1000000L);
crt_ptr->proficiency[3] = j;
posit(4,29); getnums(&j, (long)crt_ptr->proficiency[4], 0L, 1000000L);
crt_ptr->proficiency[4] = j;
break;
case 9: /* carryables */
clearscreen();
posit(2,1); printf("Items carried:");
posit(3,1); printf("1:%-5d",crt_ptr->carry[0]);
posit(3,17); printf("2:%-5d",crt_ptr->carry[1]);
posit(3,33); printf("3:%-5d",crt_ptr->carry[2]);
posit(3,49); printf("4:%-5d",crt_ptr->carry[3]);
posit(3,65); printf("5:%-5d",crt_ptr->carry[4]);
posit(4,1); printf("6:%-5d",crt_ptr->carry[5]);
posit(4,17); printf("7:%-5d",crt_ptr->carry[6]);
posit(4,33); printf("8:%-5d",crt_ptr->carry[7]);
posit(4,49); printf("9:%-5d",crt_ptr->carry[8]);
posit(4,64); printf("10:%-5d",crt_ptr->carry[9]);
posit(3,3); getnums(&j, (long)crt_ptr->carry[0], 0L, 32000L);
crt_ptr->carry[0] = j;
posit(3,19); getnums(&j, (long)crt_ptr->carry[1], 0L, 32000L);
crt_ptr->carry[1] = j;
posit(3,35); getnums(&j, (long)crt_ptr->carry[2], 0L, 32000L);
crt_ptr->carry[2] = j;
posit(3,51); getnums(&j, (long)crt_ptr->carry[3], 0L, 32000L);
crt_ptr->carry[3] = j;
posit(3,67); getnums(&j, (long)crt_ptr->carry[4], 0L, 32000L);
crt_ptr->carry[4] = j;
posit(4,3); getnums(&j, (long)crt_ptr->carry[5], 0L, 32000L);
crt_ptr->carry[5] = j;
posit(4,19); getnums(&j, (long)crt_ptr->carry[6], 0L, 32000L);
crt_ptr->carry[6] = j;
posit(4,35); getnums(&j, (long)crt_ptr->carry[7], 0L, 32000L);
crt_ptr->carry[7] = j;
posit(4,51); getnums(&j, (long)crt_ptr->carry[8], 0L, 32000L);
crt_ptr->carry[8] = j;
posit(4,67); getnums(&j, (long)crt_ptr->carry[9], 0L, 32000L);
crt_ptr->carry[9] = j;
break;
case 10:
clearscreen();
posit(1,1);
printf("Are you sure you want to clear it? ");
getstr(str, "n", 2);
if(str[0]=='y' || str[0]=='Y')
zero(crt_ptr, sizeof(creature));
break;
case 11:
free(crt_ptr);
return;
case 12:
save_crt_to_file(num, crt_ptr);
free(crt_ptr);
return;
}
}
}
int load_crt_from_file(num, crt_ptr)
int num;
creature **crt_ptr;
{
int fd;
long n;
char file[80];
*crt_ptr = (creature *)malloc(sizeof(creature));
if(!*crt_ptr)
merror("load_from_file", FATAL);
zero(*crt_ptr, sizeof(creature));
#ifdef TC
sprintf(file, "%s\\m%02d", MONPATH, num/MFILESIZE);
#else
sprintf(file, "%s/m%02d", MONPATH, num/MFILESIZE);
#endif
fd = open(file, O_RDONLY | O_BINARY, 0);
if(fd < 0)
return(-1);
n = lseek(fd, (long)((num%MFILESIZE)*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];
#ifdef TC
sprintf(file, "%s\\m%02d", MONPATH, num/MFILESIZE);
#else
sprintf(file, "%s/m%02d", MONPATH, num/MFILESIZE);
#endif
fd = open(file, O_RDWR | O_BINARY, 0);
if(fd < 0) {
#ifdef TC
fd = open(file, O_RDWR | O_CREAT | O_BINARY, S_IWRITE | S_IREAD);
#else
fd = open(file, O_RDWR | O_CREAT, ACC);
#endif
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);
}
void edit_room()
{
int i, num, x;
long j;
char str[256];
char *shortd, *longd;
room *rom_ptr;
clearscreen();
posit(3,20); printf("Enter room number to edit: ");
getnum(&num, 0, 10000);
load_rom_from_file(num, &rom_ptr);
rom_ptr->rom_num = num;
if(!rom_ptr->established)
rom_ptr->established = time(0);
while(1) {
clearscreen();
posit(2,25); printf("Room: (%d) %s",num,rom_ptr->name);
posit(3,30); printf(" 1. Edit name");
posit(4,30); printf(" 2. Edit short description");
posit(5,30); printf(" 3. Edit long description");
posit(6,30); printf(" 4. Edit level/trap/track/special");
posit(7,30); printf(" 5. Edit flags");
posit(8,30); printf(" 6. Edit random monsters");
posit(9,30); printf(" 7. Edit permanent monsters");
posit(10,30); printf(" 8. Edit permanent objects");
posit(11,30); printf(" 9. Edit room statistics");
posit(12,30); printf("10. Edit exits");
posit(13,30); printf("11. Clear this room");
posit(14,30); printf("12. Abort this room");
posit(15,30); printf("13. Back to main menu");
posit(18,30); printf("Choice: ");
getnum(&i, 1, 13);
switch(i) {
case 1:
clearscreen();
posit(2,1); printf("Room name:");
posit(3,1); printf("%s",rom_ptr->name);
posit(3,1); getstr(str, rom_ptr->name, 80);
strcpy(rom_ptr->name, str);
break;
case 2:
clearscreen();
posit(1,1); printf("Current short description:");
posit(2,1); printf("%s",rom_ptr->short_desc);
posit(14,1); printf("Enter new description:");
x = 15;
do {
posit(x,1); printf("]");
posit(x,2); getstr(str, "", 80);
if(!str[0])
break;
if(x==15) {
shortd = (char *)malloc(2000);
shortd[0] = 0;
}
strcat(shortd, str);
strcat(shortd, "\n");
x++;
} while(x < 24);
if(x>15) {
if(rom_ptr->short_desc)
free(rom_ptr->short_desc);
shortd[strlen(shortd)-1] = 0;
rom_ptr->short_desc = shortd;
}
break;
case 3:
clearscreen();
posit(1,1); printf("Current long description:");
posit(2,1); printf("%s",rom_ptr->long_desc);
posit(14,1); printf("Enter new description:");
x = 15;
do {
posit(x,1); printf("]");
posit(x,2); getstr(str, "", 80);
if(!str[0])
break;
if(x==15) {
longd = (char *)malloc(2000);
longd[0] = 0;
}
strcat(longd, str);
strcat(longd, "\n");
x++;
} while(x < 25);
if(x>15) {
if(rom_ptr->long_desc)
free(rom_ptr->long_desc);
longd[strlen(longd)-1] = 0;
rom_ptr->long_desc = longd;
}
break;
case 4: /* level/trap/track */
clearscreen();
posit(2,1); printf("Trap: %-3d", rom_ptr->trap);
posit(2,30); printf("Trap exit: %-5d", rom_ptr->trapexit);
posit(2,59); printf("Special: %-3d", rom_ptr->special);
posit(4,1); printf("Track string:");
posit(5,1); printf("%s",rom_ptr->track);
posit(7,1); printf("Low level: %-2d", rom_ptr->lolevel);
posit(8,1); printf(" Hi level: %-2d", rom_ptr->hilevel);
posit(2,7); getnums(&j, (long)rom_ptr->trap, -127L, 127L);
rom_ptr->trap = j;
posit(2,41); getnums(&j, (long)rom_ptr->trapexit, 0L, 32000L);
rom_ptr->trapexit = j;
posit(2, 68); getnums(&j, (long)rom_ptr->special, 0L, 32000L);
rom_ptr->special = j;
posit(5,1); getstr(str, rom_ptr->track, 80);
strcpy(rom_ptr->track, str);
posit(7,12); getnums(&j, (long)rom_ptr->lolevel, 0L, 50L);
rom_ptr->lolevel = j;
posit(8,12); getnums(&j, (long)rom_ptr->hilevel, 0L, 50L);
rom_ptr->hilevel = j;
break;
case 5: /* flags */
clearscreen();
posit(2,10); printf("1");
posit(2,20); printf("2");
posit(2,30); printf("3");
posit(2,40); printf("4");
posit(2,50); printf("5");
posit(2,60); printf("6");
posit(3,1); printf("1234567890123456789012345678901234567890123456789012345678901234");
posit(7,1); printf("Flag #: ");
posit(8,1); printf("(0 to exit)");
while(1) {
for(j=0;j<64;j++)
str[j] = (rom_ptr->flags[j/8] & 1<<(j%8)) ? '*':'.';
str[64] = 0;
posit(4,1); printf("%s",str);
posit(7,9); getnum(&j, 0, 64);
if(!j) break;
if(rom_ptr->flags[(j-1)/8] & 1<<((j-1)%8))
rom_ptr->flags[(j-1)/8] &= ~(1<<((j-1)%8));
else
rom_ptr->flags[(j-1)/8] |= 1<<((j-1)%8);
}
break;
case 6: /* random monsters */
clearscreen();
posit(2,1); printf("Random monsters:");
for(x=0; x<10; x++) {
posit(x+3,x==9 ? 2:3);
printf("%d:%-5d",x+1,rom_ptr->random[x]);
}
posit(14,2); printf("Traffic: %-3d", rom_ptr->traffic);
for(x=0; x<10; x++) {
posit(x+3,5);
getnums(&j, (long)rom_ptr->random[x], 0L, 32000L);
rom_ptr->random[x] = j;
}
posit(14,11); getnums(&j, (long)rom_ptr->traffic, -127L, 127L);
rom_ptr->traffic = j;
break;
case 7: /* Perm monsters */
clearscreen();
posit(2,1); printf("Permanent monsters:");
posit(4,10); printf("Interval");
posit(4,20); printf("Lastreset");
posit(4,30); printf("Monster");
for(x=0; x<10; x++) {
posit(x+5, 2); printf("%2d:",x+1);
posit(x+5, 10); printf("%lu",rom_ptr->perm_mon[x].interval);
posit(x+5, 20); printf("%lu",rom_ptr->perm_mon[x].ltime);
posit(x+5, 30); printf("%-5d",rom_ptr->perm_mon[x].misc);
}
posit(17,1); printf("Monster #:");
while(1) {
posit(17,12); getnum(&x, 0, 10);
if(!x) break;
posit(x+4, 10); getnums(&j, (long)rom_ptr->perm_mon[x-1].interval, 0L, 10000000L);
rom_ptr->perm_mon[x-1].interval = j;
posit(x+4, 20); getnums(&j, (long)rom_ptr->perm_mon[x-1].ltime, 0L, 10000000L);
rom_ptr->perm_mon[x-1].ltime = j;
posit(x+4, 30); getnums(&j, (long)rom_ptr->perm_mon[x-1].misc, 0L, 32000L);
rom_ptr->perm_mon[x-1].misc = j;
}
break;
case 8: /* Perm objects */
clearscreen();
posit(2,1); printf("Permanent objects:");
posit(4,10); printf("Interval");
posit(4,20); printf("Lastreset");
posit(4,30); printf("Object");
for(x=0; x<10; x++) {
posit(x+5, 2); printf("%2d:",x+1);
posit(x+5, 10); printf("%lu",rom_ptr->perm_obj[x].interval);
posit(x+5, 20); printf("%lu",rom_ptr->perm_obj[x].ltime);
posit(x+5, 30); printf("%-5d",rom_ptr->perm_obj[x].misc);
}
posit(17,1); printf("Object #:");
while(1) {
posit(17,11); getnum(&x, 0, 10);
if(!x) break;
posit(x+4, 10); getnums(&j, (long)rom_ptr->perm_obj[x-1].interval, 0L, 10000000L);
rom_ptr->perm_obj[x-1].interval = j;
posit(x+4, 20); getnums(&j, (long)rom_ptr->perm_obj[x-1].ltime, 0L, 10000000L);
rom_ptr->perm_obj[x-1].ltime = j;
posit(x+4, 30); getnums(&j, (long)rom_ptr->perm_obj[x-1].misc, 0L, 32000L);
rom_ptr->perm_obj[x-1].misc = j;
}
break;
case 9: /* Statistics */
clearscreen();
posit(2,1); printf(" Visits: %lu", (unsigned long)rom_ptr->beenhere);
posit(3,1); printf("Established: %lu", (unsigned long)rom_ptr->established);
posit(2,14); getnums(&j, (long)rom_ptr->beenhere, 0L, 10000000L);
posit(3,14); getnums(&j, (long)rom_ptr->established, 0L, 10000000L);
break;
case 10: /* Exits */
clearscreen();
edit_exits(rom_ptr);
break;
case 11: /* Clear */
clearscreen();
posit(1,1);
printf("Are you sure you want to clear it? ");
getstr(str, "n", 2);
if(str[0]=='y' || str[0]=='Y') {
free_rom(rom_ptr);
rom_ptr = (room *)malloc(sizeof(room));
zero(rom_ptr, sizeof(room));
}
break;
case 12: /* abort */
free_rom(rom_ptr);
return;
case 13: /* save */
save_rom_to_file(num, rom_ptr);
free_rom(rom_ptr);
return;
}
}
}
void edit_exits(rom_ptr)
room *rom_ptr;
{
int x, i, error;
long j;
xtag *xt, *prev;
char str[256];
while(1) {
clearscreen();
posit(5,25); printf("Room: (%d) %s",rom_ptr->rom_num, rom_ptr->name);
posit(6,30); printf("1. Add exit");
posit(7,30); printf("2. Modify exit");
posit(8,30); printf("3. Delete exit");
posit(9,30); printf("4. List exits");
posit(10,30); printf("5. Back to room menu");
posit(12,30); printf("Choice: ");
getnum(&i, 1, 5);
switch(i) {
case 1: /* Add exit */
xt = rom_ptr->first_ext; x = 1;
if(xt) {
while(xt->next_tag) {
x++;
xt = xt->next_tag;
}
x++;
xt->next_tag = (xtag *)malloc(sizeof(xtag));
xt = xt->next_tag;
}
else {
rom_ptr->first_ext = (xtag *)malloc(sizeof(xtag));
xt = rom_ptr->first_ext;
}
xt->ext = (exit_ *)malloc(sizeof(exit_));
zero(xt->ext, sizeof(exit_));
xt->next_tag = 0;
clearscreen();
posit(2,1); printf("Exit #%d:",x);
posit(4,10); printf("Name: %s", xt->ext->name);
posit(5,10); printf("Room: %d", xt->ext->room);
posit(6,11); printf("Key: %d", xt->ext->key);
posit(7,1); printf("Time Interval: %lu", xt->ext->ltime.interval);
posit(8,5); printf("Last Time: %lu", xt->ext->ltime.ltime);
posit(9,10); printf("Misc: %d", xt->ext->ltime.misc);
posit(11,10); printf("1");
posit(11,20); printf("2");
posit(11,30); printf("3");
posit(12,1); printf("12345678901234567890123456789012");
posit(15,1); printf("Flag #: ");
posit(16,1); printf("(0 to exit)");
for(j=0;j<32;j++)
str[j] = (xt->ext->flags[j/8] & 1<<(j%8)) ? '*':'.';
str[32] = 0;
posit(13,1); printf("%s",str);
posit(4,16); getstr(str, xt->ext->name, 20);
strcpy(xt->ext->name, str);
posit(5,16); getnums(&j, (long)xt->ext->room, 0L, 32000L);
xt->ext->room = j;
posit(6,16); getnums(&j, (long)xt->ext->key, -127L, 127L);
xt->ext->key = j;
posit(7,16); getnums(&j, (long)xt->ext->ltime.interval, 0L, 10000000L);
xt->ext->ltime.interval = j;
posit(8,16); getnums(&j, (long)xt->ext->ltime.ltime, 0L, 10000000L);
xt->ext->ltime.ltime = j;
posit(9,16); getnums(&j, (long)xt->ext->ltime.misc, 0L, 32000L);
xt->ext->ltime.misc = j;
while(1) {
posit(15,9); getnum(&j, 0, 32);
if(!j) break;
if(xt->ext->flags[(j-1)/8] & 1<<((j-1)%8))
xt->ext->flags[(j-1)/8] &= ~(1<<((j-1)%8));
else
xt->ext->flags[(j-1)/8] |= 1<<((j-1)%8);
for(j=0;j<32;j++)
str[j] = (xt->ext->flags[j/8] & 1<<(j%8)) ? '*':'.';
str[32] = 0;
posit(13,1); printf("%s",str);
}
break;
case 2: /* modify exit */
clearscreen();
posit(2,1); printf("Exit #");
getnum(&i, 0, 50);
if(!i) break;
xt = rom_ptr->first_ext; x = 1; error = 0;
while(x <= i) {
if(!xt) {
error = 1;
break;
}
if(x == i)
break;
x++;
xt = xt->next_tag;
}
if(error) break;
clearscreen();
posit(2,1); printf("Exit #%d:",x);
posit(4,10); printf("Name: %s", xt->ext->name);
posit(5,10); printf("Room: %d", xt->ext->room);
posit(6,11); printf("Key: %d", xt->ext->key);
posit(7,1); printf("Time Interval: %lu", xt->ext->ltime.interval);
posit(8,5); printf("Last Time: %lu", xt->ext->ltime.ltime);
posit(9,10); printf("Misc: %d", xt->ext->ltime.misc);
posit(11,10); printf("1");
posit(11,20); printf("2");
posit(11,30); printf("3");
posit(12,1); printf("12345678901234567890123456789012");
posit(15,1); printf("Flag #: ");
posit(16,1); printf("(0 to exit)");
for(j=0;j<32;j++)
str[j] = (xt->ext->flags[j/8] & 1<<(j%8)) ? '*':'.';
str[32] = 0;
posit(13,1); printf("%s",str);
posit(4,16); getstr(str, xt->ext->name, 20);
strcpy(xt->ext->name, str);
posit(5,16); getnums(&j, (long)xt->ext->room, 0L, 32000L);
xt->ext->room = j;
posit(6,16); getnums(&j, (long)xt->ext->key, -127L, 127L);
xt->ext->key = j;
posit(7,16); getnums(&j, (long)xt->ext->ltime.interval, 0L, 10000000L);
xt->ext->ltime.interval = j;
posit(8,16); getnums(&j, (long)xt->ext->ltime.ltime, 0L, 10000000L);
xt->ext->ltime.ltime = j;
posit(9,16); getnums(&j, (long)xt->ext->ltime.misc, 0L, 32000L);
xt->ext->ltime.misc = j;
while(1) {
posit(15,9); getnum(&j, 0, 32);
if(!j) break;
if(xt->ext->flags[(j-1)/8] & 1<<((j-1)%8))
xt->ext->flags[(j-1)/8] &= ~(1<<((j-1)%8));
else
xt->ext->flags[(j-1)/8] |= 1<<((j-1)%8);
for(j=0;j<32;j++)
str[j] = (xt->ext->flags[j/8] & 1<<(j%8)) ? '*':'.';
str[32] = 0;
posit(13,1); printf("%s",str);
}
break;
case 3: /* delete */
clearscreen();
posit(2,1); printf("Delete exit #");
getnum(&i, 0, 50);
if(!i) break;
xt = rom_ptr->first_ext; x = 1; error = 0;
while(x <= i) {
if(!xt) {
error = 1;
break;
}
if(x == i)
break;
x++;
prev = xt;
xt = xt->next_tag;
}
if(error) break;
clearscreen();
if(xt == rom_ptr->first_ext) {
rom_ptr->first_ext = xt->next_tag;
free(xt->ext);
free(xt);
}
else {
prev->next_tag = xt->next_tag;
free(xt->ext);
free(xt);
}
break;
case 4: /* list */
clearscreen();
xt = rom_ptr->first_ext; x=0;
while(xt && x<48) {
posit(x%24+1, x/24>0?40:1);
printf("%d: (%d) %s", x+1, xt->ext->room, xt->ext->name);
xt = xt->next_tag;
x++;
}
posit(24,40); printf("Hit Enter:");
getnum(&i,0,0);
break;
case 5:
return;
}
}
}
int load_rom_from_file(num, rom_ptr)
int num;
room **rom_ptr;
{
int fd;
long n;
char file[80];
*rom_ptr = (room *)malloc(sizeof(room));
if(!*rom_ptr)
merror("load_from_file", FATAL);
zero(*rom_ptr, sizeof(room));
#ifdef TC
sprintf(file, "%s\\r%05d", ROOMPATH, num);
#else
sprintf(file, "%s/r%05d", ROOMPATH, num);
#endif
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);
}
close(fd);
return(0);
}
int save_rom_to_file(num, rom_ptr)
int num;
room *rom_ptr;
{
int fd;
long n;
char file[80];
#ifdef TC
sprintf(file, "%s\\r%05d", ROOMPATH, num);
#else
sprintf(file, "%s/r%05d", ROOMPATH, num);
#endif
unlink(file);
#ifdef TC
fd = open(file, O_RDWR | O_CREAT | O_BINARY, S_IWRITE | S_IREAD);
#else
fd = open(file, O_RDWR | O_CREAT, ACC);
#endif
if(fd < 0)
return(-1);
n = write_rom(fd, rom_ptr);
if(n < 0) {
close(fd);
return(-1);
}
close(fd);
return(0);
}
void clearscreen()
{
printf("%c[2J",27);
}
void posit(x, y)
int x,y;
{
printf("%c[%d;%df", 27, x, y);
}
void getnum(i, min, max)
int *i;
int min, max;
{
char str[80];
savepos();
do {
restorepos();
gets(str);
*i = atoi(str);
} while(*i < min || *i > max);
}
void getnums(i, orig, min, max)
long *i;
long orig;
long min, max;
{
char str[80];
savepos();
do {
restorepos();
gets(str);
if(!str[0]) break;
*i = atol(str);
} while(*i < min || *i > max);
if(!str[0])
*i = orig;
}
void getstr(str, origstr, maxlen)
char *str, *origstr;
int maxlen;
{
char tempstr[256];
gets(tempstr);
if(!tempstr[0])
strcpy(str, origstr);
else if(!strcmp(tempstr, "@"))
str[0] = 0;
else
strncpy(str, tempstr, maxlen-1);
}
void savepos()
{
printf("%c[s",27);
}
void restorepos()
{
printf("%c[u",27);
}
void zero(ptr, size)
void *ptr;
int size;
{
char *chptr;
int i;
chptr = (char *)ptr;
for(i=0; i<size; i++)
chptr[i] = 0;
}
void merror(str, errtype)
char *str;
int errtype;
{
printf("Error: %s\n", str);
if(errtype == FATAL)
exit(-1);
}