/*****************************************************************************
* *
* Project : Diku-Mud-World-Creator *
* *
* Program : Diku-Mud-Item-Editor *
* Version : 1.6 *
* Last changed on: 27.7.93 *
* *
* Code by: Georg Essl (essl@fstgds06.tu-graz.ac.at) *
* *
*****************************************************************************/
/******* ITEMS ******/
/***** Original Includes *****/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
/****** Project Includes *****/
#include "strext.h"
#include "dutil.h"
#include "iedit.h"
/****** DEFINES from "structs.h" *****/
#define APPLY_NONE 0
#define NOWHERE -1
#define ITEM_WEAPON 5
/***** TYPEDEFS *****/
/*typedef char bool;
typedef char byte;*/
typedef signed char sbyte;
typedef unsigned char ubyte;
#if !defined(sgi) && !defined(m88k) &&!defined(_AIX)
typedef unsigned long ulong;
#endif
typedef signed short sh_int;
/****** STRUCTS from "structs.h" *****/
struct extra_descr_data
{
char *keyword; /* Keyword in look/examine */
char *description; /* What to see */
struct extra_descr_data *next; /* Next in list */
};
#define MAX_OBJ_AFFECT 2 /* Used in OBJ_FILE_ELEM *DO*NOT*CHANGE* */
#define OBJ_NOTIMER -7000000
struct obj_flag_data
{
int value[4]; /* Values of the item (see list) */
char type_flag; /* Type of item */
long wear_flags; /* Where you can wear it */
long extra_flags; /* If it hums,glows etc */
int weight; /* Weigt what else */
long cost; /* Value when sold (gp.) */
long cost_per_day; /* Cost to keep pr. real day */
int timer; /* Timer for object */
long bitvector; /* To set chars bits */
};
/* Used in OBJ_FILE_ELEM *DO*NOT*CHANGE* */
struct obj_affected_type
{
char location; /* Which ability to change (APPLY_XXX) */
sh_int modifier; /* How much it changes by */
};
/* ======================== Structure for object ========================= */
struct obj_data
{
sh_int item_number; /* Where in data-base */
int virt_number;
sh_int in_room; /* In what room -1 when conta/carr */
struct obj_flag_data obj_flags;/* Object information */
struct obj_affected_type
affected[MAX_OBJ_AFFECT]; /* Which abilities in PC to change */
char *name; /* Title of object :get etc. */
char *description ; /* When in room */
char *short_description; /* when worn/carry/in cont. */
char *action_description; /* What to write when used */
struct extra_descr_data *ex_description; /* extra descriptions */
};
/* ======================================================================= */
/*** The default initial item ***/
struct obj_data ie_defaultitem=
{
0,
0,
0,
{ {0,0,0,0},
13, /* TRASH */
1, /* Take */
0, /* No Extras */
1,
1,
1,
0,
0
},
{{0,0},{0,0}},
"dummy fake",
"a dummy fake floats through the database here.",
"a dummy fake",
NULL,
NULL
};
/****** DEFINES *****/
/* Item-Edit */
#define IE_COMM '#'
#define IE_MAXSTRLEN 128
#define IE_OBJFILE "tobj.obj"
#define IE_TEMPFILE "ietemp.obj"
#define IE_ITFILE "itypes.def"
#define IE_IWFILE "iwears.def"
#define IE_IEXFILE "iextras.def"
#define IE_IDLFILE "iliquids.def"
#define IE_ICTFILE "icontain.def"
#define IE_IPAFILE "ipaffect.def"
#define IE_IAFILE "iapplies.def"
#define IE_ITVFILE "itvals.def"
#define IE_ISFILE "ispells.def"
#define IE_ITWFILE "iweapons.def"
#define IE_EDITMAX 16
#define IE_SM_DELETE 1
#define IE_SM_SAVE 2
#define IE_SM_INSERT 3
#define IE_M_QUIT 0
/* Item Spells */
#define IS_MAXVALID 255
/* Item-File-Format */
#define IF_START '#'
#define IF_EOS '~'
#define IF_EXDISC 'E'
#define IF_AFF 'A'
#define IF_IPAFF 'B'
#define IF_EOF "$~"
#define REAL 0
#define VIRTUAL 1
/***** STRUCTS *****/
struct if_affected
{
long ia_affwhat;
};
typedef struct if_fileformat
{
sh_int if_number;
char *if_namelist;
char *if_shdisc;
char *if_longdisc;
char *if_actdisc;
int if_value[4];
int if_weight;
long if_cvalue;
long if_ccost;
int *If_exdisc;
struct if_affected affected[MAX_OBJ_AFFECT+1];
} if_fileformat;
struct itv_entry
{
int special[4];
char *str[4];
} *itv_entries;
struct itw_entry
{
int nr;
char *str;
struct itw_entry *next;
};
struct itw_entry *itw_first;
struct is_entry *is_first;
int is_valid[IS_MAXVALID+1];
struct is_entry
{
int nr;
int potion,scroll,wand,staff;
int minlevel;
char *str;
struct is_entry *next;
};
/***** Constants *****/
const char itv_notused[12]="<NOT USED>";
/***** Global Vars *****/
char ie_objfile[IE_MAXSTRLEN]=IE_OBJFILE;
char ie_tempfile[IE_MAXSTRLEN]=IE_TEMPFILE;
char ie_dbpath[IE_MAXSTRLEN]="";
int ie_affbitvec=0;
int it_max;
int iw_max;
int iex_max;
int idl_max;
int ict_max;
int ipa_max;
int ia_max;
int ie_changed;
char **it_str;
char **iw_str;
char **iex_str;
char **idl_str;
char **ict_str;
char **ipa_str;
char **ia_str;
FILE *ie_workfile;
FILE *it_file;
FILE *iw_file;
FILE *iex_file;
FILE *idl_file;
FILE *ict_file;
FILE *ipa_file;
FILE *ia_file;
FILE *itv_file;
FILE *itw_file;
FILE *is_file;
FILE *ie_temp;
/***** ERROR-DEFINES *****/
#define IE_ERR_NOERROR 0
#define IE_ERR_LINEINVALID 1
#define IE_ERR_INVALIDSTART 2
#define IE_ERR_OOMFOROBJ 3
#define IE_ERR_STRINGTOOLONG 4
#define IE_ERR_CANTOPEN 5
/***** Vars from db.c from original DikuMud! *****/
struct obj_data *object_list = 0; /* the global linked list of obj's */
FILE *obj_f; /* obj prototypes */
struct index_data *obj_index; /* index table for object file */
int top_of_objt = 0; /* top of object index table */
/* prototypes */
void clear_object(struct obj_data *obj);
int real_object(int virtual);
struct obj_data *read_object(int nr, int type);
void ie_EditNr(struct obj_data *);
void ie_EditNameList(struct obj_data *);
void ie_EditShortDesc(struct obj_data *);
void ie_EditLongDesc(struct obj_data *);
void ie_EditActDesc(struct obj_data *);
void ie_EditType(struct obj_data *);
void ie_EditExtras(struct obj_data *);
void ie_EditWear(struct obj_data *);
void ie_EditWeight(struct obj_data *);
void ie_EditCost(struct obj_data *);
void ie_EditCPD(struct obj_data *);
void ie_EditTimer(struct obj_data *);
void ie_EditValues(struct obj_data *);
void ie_EditApply(struct obj_data *);
void ie_EditAffects(struct obj_data *);
void ie_EditExtraDesc(struct obj_data *);
/*** A FUNCTION ARRAY (OH GREAT :-D) ***/
void (*ie_edit[IE_EDITMAX+1])(struct obj_data *) =
{
ie_EditNr,
ie_EditNameList,
ie_EditShortDesc,
ie_EditLongDesc,
ie_EditActDesc,
ie_EditType,
ie_EditExtras,
ie_EditWear,
ie_EditWeight,
ie_EditCost,
ie_EditCPD,
ie_EditTimer,
ie_EditValues,
ie_EditApply,
ie_EditAffects,
ie_EditExtraDesc
};
char getch(void)
{
int wint1,wint2;
wint1=getchar();
wint2=wint1;
while(wint1!='\n')
wint1=getchar();
return(wint2);
}
/* Open the object-file defined in ie_objfile */
int OpenObjFile(void)
{
struct obj_data *wobj;
if (!(obj_f = fopen(ie_objfile, "r")))
{
printf("*** Can't open %s-file!\n",ie_objfile);
printf("Want to create a new one (YES/no)? ");
if(AskYesNo("no"))
exit(0);
else
{
if(!(obj_f = fopen(ie_objfile,"w")))
{
printf("*** Can't create %s-file!\n",ie_objfile);
exit(0);
}
else
{
fprintf(obj_f,"#0\n");
wobj= &ie_defaultitem;
fwrite_string(obj_f,wobj->name);
fwrite_string(obj_f,wobj->short_description);
fwrite_string(obj_f,wobj->description);
fwrite_string(obj_f,wobj->action_description);
fprintf(obj_f,"%u %lu %lu\n",wobj->obj_flags.type_flag,wobj->obj_flags.extra_flags,wobj->obj_flags.wear_flags);
fprintf(obj_f,"%d %d %d %d\n",wobj->obj_flags.value[0],wobj->obj_flags.value[1],wobj->obj_flags.value[2],wobj->obj_flags.value[3]);
fprintf(obj_f,"%u %lu %lu\n",wobj->obj_flags.weight,wobj->obj_flags.cost,wobj->obj_flags.cost_per_day);
fprintf(obj_f,"#19999\n");
fprintf(obj_f,IF_EOF);
fprintf(obj_f,"\n");
fclose(obj_f);
if (!(obj_f = fopen(ie_objfile, "r")))
{
printf("*** Can't reopen %s-file!\n",ie_objfile);
exit(0);
}
}
}
}
obj_index = generate_indices(obj_f, &top_of_objt);
return(IE_ERR_NOERROR);
}
char *ie_ReadLDesc(int nr)
{
char *buf;
int tmp;
if((nr=real_object(nr))<0)
return(NULL);
fseek(obj_f, obj_index[nr].pos, 0);
fscanf(obj_f,"#%d\n",&tmp);
buf = fread_string(obj_f);
free(buf);
buf = fread_string(obj_f);
free(buf);
buf = fread_string(obj_f);
return(buf);
}
char *ie_ReadSDesc(int nr)
{
char *buf;
int tmp;
if((nr=real_object(nr))<0)
return(NULL);
fseek(obj_f, obj_index[nr].pos, 0);
fscanf(obj_f,"#%d\n",&tmp);
buf = fread_string(obj_f);
free(buf);
buf = fread_string(obj_f);
return(buf);
}
char *ie_ReadName(int nr)
{
char *buf;
int tmp;
if((nr=real_object(nr))<0)
return(NULL);
fseek(obj_f, obj_index[nr].pos, 0);
fscanf(obj_f,"#%d\n",&tmp);
buf = fread_string(obj_f);
return(buf);
}
/* read an object from OBJ_FILE */
struct obj_data *read_object(int nr, int type)
{
struct obj_data *obj;
int tmp, i;
long tmp2;
char chk[50], buf[100];
struct extra_descr_data *new_descr;
i = nr;
if (type == VIRTUAL)
if ((nr = real_object(nr)) < 0)
{
sprintf(buf, "Object (V) %d does not exist in database.", i);
return(IE_ERR_NOERROR);
}
fseek(obj_f, obj_index[nr].pos, 0);
CREATE(obj, struct obj_data, 1);
clear_object(obj);
/* *** string data *** */
fscanf(obj_f, "#%d\n", &tmp);
obj->virt_number=tmp;
obj->name = fread_string(obj_f);
obj->short_description = fread_string(obj_f);
obj->description = fread_string(obj_f);
obj->action_description = fread_string(obj_f);
/* *** numeric data *** */
fscanf(obj_f, " %d ", &tmp);
obj->obj_flags.type_flag = tmp;
fscanf(obj_f, " %lu ", &tmp2);
obj->obj_flags.extra_flags = tmp2;
fscanf(obj_f, " %lu ", &tmp2);
obj->obj_flags.wear_flags = tmp2;
fscanf(obj_f, " %d ", &tmp);
obj->obj_flags.value[0] = tmp;
fscanf(obj_f, " %d ", &tmp);
obj->obj_flags.value[1] = tmp;
fscanf(obj_f, " %d ", &tmp);
obj->obj_flags.value[2] = tmp;
fscanf(obj_f, " %d ", &tmp);
obj->obj_flags.value[3] = tmp;
fscanf(obj_f, " %d ", &tmp);
obj->obj_flags.weight = tmp;
fscanf(obj_f, " %lu \n", &tmp2);
obj->obj_flags.cost = tmp2;
fscanf(obj_f, " %lu \n", &tmp2);
obj->obj_flags.cost_per_day = tmp2;
/* *** extra descriptions *** */
obj->ex_description = 0;
while (fscanf(obj_f, " %s \n", chk), *chk == 'E')
{
CREATE(new_descr, struct extra_descr_data, 1);
new_descr->keyword = fread_string(obj_f);
new_descr->description = fread_string(obj_f);
new_descr->next = obj->ex_description;
obj->ex_description = new_descr;
}
for( i = 0 ; (i < MAX_OBJ_AFFECT) && (*chk == 'A') ; i++)
{
fscanf(obj_f, " %d ", &tmp);
obj->affected[i].location = tmp;
fscanf(obj_f, " %d \n", &tmp);
obj->affected[i].modifier = tmp;
fscanf(obj_f, " %s \n", chk);
}
for (;(i < MAX_OBJ_AFFECT);i++)
{
obj->affected[i].location = APPLY_NONE;
obj->affected[i].modifier = 0;
}
if(ie_affbitvec)
{
if(*chk == 'B')
{
fscanf(obj_f," %lu \n", &tmp2);
obj->obj_flags.bitvector=tmp2;
fscanf(obj_f, " %s \n", chk);
}
}
obj->in_room = NOWHERE;
obj->item_number = nr;
object_list = obj;
return (obj);
}
/* release memory allocated for an obj struct */
void free_obj(struct obj_data *obj)
{
struct extra_descr_data *this, *next_one;
free(obj->name);
if(obj->description)
free(obj->description);
if(obj->short_description)
free(obj->short_description);
if(obj->action_description)
free(obj->action_description);
for( this = obj->ex_description ;
(this != 0);this = next_one )
{
next_one = this->next;
if(this->keyword)
free(this->keyword);
if(this->description)
free(this->description);
free(this);
}
free(obj);
}
/* Clear object */
void clear_object(struct obj_data *obj)
{
memset(obj, '\0', sizeof(struct obj_data));
obj->item_number = -1;
obj->in_room = NOWHERE;
}
/* returns the real number of the object with given virtual number */
int real_object(int virtual)
{
int bot, top, mid;
bot = 0;
top = top_of_objt;
/* perform binary search on obj-table */
for (;;)
{
mid = (bot + top) / 2;
if ((obj_index + mid)->virtual == virtual)
return(mid);
if (bot >= top)
return(-1);
if ((obj_index + mid)->virtual > virtual)
top = mid - 1;
else
bot = mid + 1;
}
}
/* Get Real Number for DikuCli */
int ie_GetRealNumber(int wint)
{
return(real_object(wint));
}
/* Save ie_tempfile with changed object and copy to ie_objfile */
int SaveToIETemp(int nr, int mode,struct obj_data *wobj)
{
struct obj_data *obj;
int tmp, i;
long tmp2, j,j2,j3,obj_i;
long store_pos,store_cpos;
char chk[50], buf[100];
struct extra_descr_data *new_descr;
struct extra_descr_data *wext;
char *temp_buff;
switch(mode)
{
case IE_SM_INSERT: {
printf("Do you really want to CREATE/CLONE the item (YES/no)? ");
if(AskYesNo("no"))
{
printf("Not Done.\n");
return(0);
}
break;
}
case IE_SM_SAVE: {
printf("Do you really want to SAVE the changes (YES/no)? ");
if(AskYesNo("no"))
{
printf("Not Done.\n");
return(0);
}
break;
}
case IE_SM_DELETE: {
printf("Do you really want to DELETE the item (yes/NO)? ");
if(!AskYesNo("yes"))
{
printf("Not Done.\n");
return(0);
}
break;
}
}
if(mode==IE_SM_INSERT)
{
if (!(obj_index =
(struct index_data*) realloc(obj_index,
(top_of_objt + 3) * sizeof(struct index_data))))
{
perror("load indices");
exit(0);
}
top_of_objt++;
for(i=top_of_objt+1;i>nr;i--)
{
obj_index[i].virtual=obj_index[i-1].virtual;
obj_index[i].pos=obj_index[i-1].pos;
obj_index[i].cpos=obj_index[i-1].cpos;
}
obj_index[nr].virtual=wobj->virt_number;
}
rewind(obj_f);
if (!(ie_temp = fopen(ie_tempfile, "w")))
{
printf("Can't open temporary file!!!\n");
exit(0);
/*** !!! ***/
}
else
{
if(obj_index[nr].pos!=0)
{
obj_i = obj_index[nr].cpos;
j = obj_i;
while(j>0)
{
temp_buff=malloc(j*sizeof(char));
if(temp_buff==NULL)
j = j / 2;
else
break;
}
if(j==0)
{
printf("** CANNOT ALLOCATE 1 SINGLE CHAR!!! HELP!!!\n");
exit(0);
}
j2=0;
while(j2!=obj_i)
{
if((j2+j)>obj_i)
j=obj_i-j2;
j3=fread(temp_buff,sizeof(char),j,obj_f);
fwrite(temp_buff,sizeof(char),j3,ie_temp);
j2+=j3;
}
free(temp_buff);
}
if((mode==IE_SM_SAVE)||(mode==IE_SM_INSERT))
{
fprintf(ie_temp,"#%d\n",wobj->virt_number);
fwrite_string(ie_temp,wobj->name);
fwrite_string(ie_temp,wobj->short_description);
fwrite_string(ie_temp,wobj->description);
fwrite_string(ie_temp,wobj->action_description);
fprintf(ie_temp,"%u %lu %lu\n",wobj->obj_flags.type_flag,wobj->obj_flags.extra_flags,wobj->obj_flags.wear_flags);
fprintf(ie_temp,"%d %d %d %d\n",wobj->obj_flags.value[0],wobj->obj_flags.value[1],wobj->obj_flags.value[2],wobj->obj_flags.value[3]);
fprintf(ie_temp,"%u %lu %lu\n",wobj->obj_flags.weight,wobj->obj_flags.cost,wobj->obj_flags.cost_per_day);
wext=wobj->ex_description;
while(wext!=NULL)
{
fprintf(ie_temp,"E\n");
fwrite_string(ie_temp,wext->keyword);
fwrite_string(ie_temp,wext->description);
wext=wext->next;
}
for( i = 0 ; (i < MAX_OBJ_AFFECT); i++)
{
if(wobj->affected[i].location!=0)
{
fprintf(ie_temp,"A\n");
fprintf(ie_temp,"%d %d\n",wobj->affected[i].location,wobj->affected[i].modifier);
}
}
if(ie_affbitvec)
{
if(wobj->obj_flags.bitvector!=0)
{
fprintf(ie_temp,"B\n");
fprintf(ie_temp,"%lu\n",wobj->obj_flags.bitvector);
}
}
store_pos=ftell(ie_temp)-obj_index[nr].pos;
}
fseek(obj_f, obj_index[nr+1].pos,0);
fseek(obj_f,0,2);
tmp2=ftell(obj_f);
fseek(obj_f, obj_index[nr+1].pos,0);
j = tmp2-obj_index[nr+1].pos;
if(j!=0)
{
while(j>0)
{
temp_buff=malloc(j*sizeof(char));
if(temp_buff==NULL)
j = j / 2;
else
break;
}
if(j==0)
{
printf("** CANNOT ALLOCATE 1 SINGLE CHAR!!! HELP!!!\n");
exit(0);
}
do
{
j2=fread(temp_buff,sizeof(char),j,obj_f);
if(j2!=0)
fwrite(temp_buff,sizeof(char),j2,ie_temp);
}
while(j2!=0);
free(temp_buff);
}
fclose(ie_temp);
}
switch(mode)
{
case IE_SM_DELETE :
{
j=obj_index[nr+1].pos-obj_index[nr].pos;
j2=obj_index[nr+1].cpos-obj_index[nr].cpos;
for(i=nr;i<top_of_objt+1;i++)
{
obj_index[i].virtual=obj_index[i+1].virtual;
obj_index[i].pos=obj_index[i+1].pos-j;
obj_index[i].cpos=obj_index[i+1].cpos-j2;
}
if (!(obj_index =
(struct index_data*) realloc(obj_index,
(top_of_objt+1) * sizeof(struct index_data))))
{
perror("load indices");
exit(0);
}
top_of_objt--;
break;
}
case IE_SM_INSERT :
{
if (!(ie_temp = fopen(ie_tempfile, "r")))
{
printf("Can't open temporary file!!!\n");
exit(0);
/*** !!! ***/
}
fseek(ie_temp,obj_index[nr].pos,0);
j3=0;
fgets(buf, 81, ie_temp);
j3+=strlen(buf);
for (;;)
{
if (fgets(buf, 81, ie_temp))
{
if (*buf == '#')
break;
else
j3+=strlen(buf);
}
}
fclose(ie_temp);
for(i=nr+1;i<=top_of_objt+1;i++)
{
obj_index[i].pos+=store_pos;
obj_index[i].cpos+=j3;
}
break;
}
case IE_SM_SAVE :
{
if (!(ie_temp = fopen(ie_tempfile, "r")))
{
printf("Can't open temporary file!!!\n");
exit(0);
/*** !!! ***/
}
fseek(ie_temp,obj_index[nr].pos,0);
j3=0;
fgets(buf, 81, ie_temp);
j3+=strlen(buf);
for (;;)
{
if (fgets(buf, 81, ie_temp))
{
if (*buf == '#')
break;
else
j3+=strlen(buf);
}
}
fclose(ie_temp);
store_cpos=obj_index[nr+1].cpos-obj_index[nr].cpos;
j2=obj_index[nr+1].pos-obj_index[nr].pos;
for(i=nr+1;i<=top_of_objt+1;i++)
{
obj_index[i].pos+=store_pos-j2;
obj_index[i].cpos+=j3-store_cpos;
}
break;
}
}
fclose(obj_f);
if (!(obj_f = fopen(ie_objfile, "w")))
{
printf("Can't reopen %s-file for saving!\n",ie_objfile);
exit(0);
}
if (!(ie_temp = fopen(ie_tempfile, "r")))
{
printf("Can't reopen temporary file for copying!");
exit(0);
}
fseek(ie_temp,0,2);
tmp2=ftell(ie_temp);
rewind(ie_temp);
j2=tmp2;
temp_buff=NULL;
while(j>0)
{
temp_buff=malloc(j2);
if(temp_buff==NULL)
{
j2=j2/2;
}
else
{
break;
}
}
j3=fread(temp_buff,sizeof(char),j2,ie_temp);
while(j3!=0)
{
fwrite(temp_buff,sizeof(char),j3,obj_f);
j3=fread(temp_buff,sizeof(char),j2,ie_temp);
}
if(temp_buff!=NULL)
free(temp_buff);
fclose(ie_temp);
fclose(obj_f);
if (!(obj_f = fopen(ie_objfile, "r")))
{
printf("Can't reopen %s-file for reading!\n",ie_objfile);
exit(0);
}
return(0);
}
/* Print Bitfield EXTRAS */
void PrintExtras(long wext)
{
int i,j;
long shext;
j=0;
shext=wext;
for(i=1;i<=iex_max;i++)
{
if((shext&1))
{
printf("%s ",iex_str[i]);
j=1;
}
shext=shext>>1;
}
if(!j)
printf("None\n");
else
printf("\n");
}
/* Print Bitfield WEARS */
void PrintWears(long wwear)
{
int i,j;
long shwear;
j=0;
shwear=wwear;
for(i=1;i<=iw_max;i++)
{
if((shwear&1))
{
printf("%s ",iw_str[i]);
j=1;
}
shwear=shwear>>1;
}
if(!j)
printf("None\n");
else
printf("\n");
}
/* Find a Item in Database */
int ie_FindNrRealItem(int nr,char *wstr)
{
int tmp;
char *tname1;
char *tname2;
char tname[IE_MAXSTRLEN];
int i,count;
char *name;
count=0;
for (i=0; i<=top_of_objt;i++)
{
fseek(obj_f, obj_index[i].pos, 0);
fscanf(obj_f, "#%d\n", &tmp);
name = fread_string(obj_f);
CREATE(tname1, char , strlen(name)+1);
strcpy(tname1,name);
tname2=strtok(tname1," ");
for(;;)
{
if(tname2==NULL)
{
free(name);
free(tname1);
break;
}
else
{
if(!strpcmp(wstr,tname2))
{
free(tname1);
free(name);
count++;
if(count==nr)
{
return(tmp);
}
}
tname2=strtok(NULL," ");
}
}
}
return(-1);
}
/* Find a Item in Database */
char *ie_FindItem(int nr,char *wstr)
{
int tmp;
char *name;
char *tname1;
char *tname2;
char tname[IE_MAXSTRLEN];
fseek(obj_f, obj_index[nr].pos, 0);
fscanf(obj_f, "#%d\n", &tmp);
name = fread_string(obj_f);
CREATE(tname1, char , strlen(name)+1);
strcpy(tname1,name);
tname2=strtok(tname1," ");
for(;;)
{
if(tname2==NULL)
{
free(name);
free(tname1);
return(NULL);
}
else
{
if(!strpcmp(wstr,tname2))
{
free(tname1);
return(name);
}
tname2=strtok(NULL," ");
}
}
}
void ie_FindItems(char *wstr)
{
int i;
char *name;
printf("Obj-Nr Name\n");
printf("-------------------------\n");
for (i=0; i<=top_of_objt;i++)
{
if((name=ie_FindItem(i,wstr))!=NULL)
{
printf("[%4.4d] %s\n",obj_index[i].virtual,name);
free(name);
}
}
}
int ie_FindNrItem(int nr, char *wstr)
{
int i,count;
char *name;
count=0;
for (i=0; i<=top_of_objt;i++)
{
if((name=ie_FindItem(i,wstr))!=NULL)
{
free(name);
count++;
if(count==nr)
{
return(i);
}
}
else
free(name);
}
return(-1);
}
/* Print Bitfield Container-Type */
void PrintContainer(int wcont)
{
int i,j;
int shcont;
j=0;
shcont=wcont;
for(i=1;i<=ict_max;i++)
{
if((shcont&1))
{
printf("%s ",ict_str[i]);
j=1;
}
shcont=shcont>>1;
}
if(!j)
printf("None");
}
/* Print Bitfield AFFECTS */
void PrintAffects(unsigned long waff)
{
unsigned long i,j;
unsigned long shaff;
j=0;
shaff=waff;
for(i=1;i<=ipa_max;i++)
{
if((shaff&1))
{
printf("%s ",ipa_str[i]);
j=1;
}
shaff=shaff>>1;
}
if(!j)
printf("None\n");
else
printf("\n");
}
void ie_doclone(struct obj_data *wobj,int wint)
{
int bot, top, mid, used, i;
struct obj_data *wobj2;
struct extra_descr_data *wext;
struct extra_descr_data *wext2;
struct extra_descr_data *wext3;
bot = 0;
top = top_of_objt;
/* perform binary search on obj-table */
for (;;)
{
mid = (bot + top) / 2;
if ((obj_index + mid)->virtual == wint)
{
printf("Given Item-Number is already used! Clone canceled.\n");
used=1;
break;
}
if (bot >= top)
{
if((obj_index + mid)->virtual <wint)
mid++;
used=0;
break;
}
if ((obj_index + mid)->virtual > wint)
top = mid - 1;
else
bot = mid + 1;
}
if(!used)
{
if(wobj == &ie_defaultitem)
printf("Creating Dummy-Item at [%d].\n",wint);
else
printf("Cloning Item from [%d] to [%d].\n",wobj->virt_number,wint);
CREATE(wobj2, struct obj_data, 1);
/* The following lines proof the great advantage of obj.o.programming */
/* and the disadvantage here! */
wobj2->virt_number=wint;
wobj2->item_number=mid;
wobj2->obj_flags.type_flag=wobj->obj_flags.type_flag;
wobj2->obj_flags.wear_flags=wobj->obj_flags.wear_flags;
wobj2->obj_flags.extra_flags=wobj->obj_flags.extra_flags;
wobj2->obj_flags.weight=wobj->obj_flags.weight;
wobj2->obj_flags.cost=wobj->obj_flags.cost;
wobj2->obj_flags.cost_per_day=wobj->obj_flags.cost_per_day;
wobj2->obj_flags.timer=wobj->obj_flags.timer;
wobj2->obj_flags.bitvector=wobj->obj_flags.bitvector;
for(i=0;i<4;i++)
wobj2->obj_flags.value[i]=wobj->obj_flags.value[i];
for(i=0;i<MAX_OBJ_AFFECT;i++)
{
wobj2->affected[i].location=wobj->affected[i].location;
wobj2->affected[i].modifier=wobj->affected[i].modifier;
}
CREATE(wobj2->name, char ,strlen(wobj->name)+1);
strcpy(wobj2->name,wobj->name);
CREATE(wobj2->description, char ,strlen(wobj->description)+1);
strcpy(wobj2->description,wobj->description);
CREATE(wobj2->short_description, char ,strlen(wobj->short_description)+1);
strcpy(wobj2->short_description,wobj->short_description);
if(wobj->action_description!=NULL)
{
CREATE(wobj2->action_description, char ,strlen(wobj->action_description)+1);
strcpy(wobj2->action_description,wobj->action_description);
}
else
wobj2->action_description=NULL;
wobj2->ex_description=NULL;
wext=wobj->ex_description;
wext3=NULL;
while(wext!=NULL)
{
CREATE(wext2, struct extra_descr_data, 1);
if(wobj2->ex_description==NULL)
wobj2->ex_description=wext2;
else
wext3->next=wext2;
wext3=wext2;
CREATE(wext2->keyword,char,strlen(wext->keyword)+1);
strcpy(wext2->keyword,wext->keyword);
CREATE(wext2->description,char,strlen(wext->description)+1);
strcpy(wext2->description,wext->description);
wext2->next=NULL;
wext=wext->next;
}
SaveToIETemp(mid,IE_SM_INSERT,wobj2);
free_obj(wobj2);
}
}
/* EDIT THE ITEM */
void ie_EditNr(struct obj_data *wobj)
{
char wstr[IE_MAXSTRLEN];
int wint;
printf("Current Item Number: #%d\n",wobj->virt_number);
printf("New Number (%d):",wobj->virt_number);
gets(wstr);
if(*wstr=='\0')
{
printf("Item-Nr Unchanged");
return;
}
wint = atoi(wstr);
if((wint==0)&&(*wstr!='0'))
{
printf("** Illegal input\n");
return;
}
if(wint==wobj->virt_number)
{
printf("Item-Nr Unchanged\n");
return;
}
ie_doclone(wobj,wint);
}
void ie_EditNameList(struct obj_data *wobj)
{
char wstr[IE_MAXSTRLEN];
printf("Old Name List: %s\n",wobj->name);
printf("Enter New List :");
gets(wstr);
if(*wstr=='\0')
{
printf("Description unchanged.\n");
}
else
{
free(wobj->name);
CREATE(wobj->name, char, strlen(wstr) + 1);
strcpy(wobj->name,wstr);
ie_changed=1;
}
}
void ie_EditShortDesc(struct obj_data *wobj)
{
char wstr[IE_MAXSTRLEN];
printf("Old ShortDesc: %s\n",wobj->short_description);
printf("Enter New ShortDesc :");
gets(wstr);
if(*wstr=='\0')
{
printf("Description unchanged.\n");
}
else
{
free(wobj->short_description);
CREATE(wobj->short_description, char, strlen(wstr) + 1);
strcpy(wobj->short_description,wstr);
ie_changed=1;
}
}
void ie_EditLongDesc(struct obj_data *wobj)
{
char wstr[IE_MAXSTRLEN];
printf("Old LongDesc: %s\n",wobj->description);
printf("Enter New LongDesc :");
gets(wstr);
if(*wstr=='\0')
{
printf("Description unchanged.\n");
}
else
{
free(wobj->description);
CREATE(wobj->description, char, strlen(wstr) + 1);
strcpy(wobj->description,wstr);
ie_changed=1;
}
}
void ie_EditActDesc(struct obj_data *wobj)
{
char *wstr;
if(wobj->action_description==NULL)
printf("Old ActionDesc: <NOT SET>\n");
else
printf("Old ActionDesc:\n%s\n",wobj->action_description);
ie_changed=1;
printf("Enter New ActionDesc (End with ~):\n");
wstr=read_multi_string();
if(wobj->action_description!=NULL)
free(wobj->action_description);
if(*wstr=='\0')
{
wobj->action_description=NULL;
printf("Description cleared.\n");
}
else
{
CREATE(wobj->action_description, char, strlen(wstr) + 1);
strcpy(wobj->action_description,wstr);
}
free(wstr);
}
void ie_EditType(struct obj_data *wobj)
{
int wint;
char wstr[IE_MAXSTRLEN];
printf("Old Type:");
if(wobj->obj_flags.type_flag>it_max)
printf("*UNKNOWN* - PLEASE REPORT OR UPDATE -ITYPES.DEF-!!!\n");
else
printf("%s\n",it_str[wobj->obj_flags.type_flag]);
for(wint=1;wint<=it_max;wint=wint+2)
{
if(wint+1<=it_max)
printf("%.2d.) %-34.34s %.2d.) %-34.34s\n",wint,it_str[wint],wint+1,it_str[wint+1]);
else
printf("%.2d.) %s\n",wint,it_str[wint]);
}
wint=it_max;
printf("Please enter Number of type (%s):",it_str[wobj->obj_flags.type_flag]);
gets(wstr);
wint=atoi(wstr);
if((wint==0)||(wint<1)||(wint>it_max))
{
printf("Type unchanged.\n");
}
else
{
ie_changed=1;
wobj->obj_flags.type_flag=wint;
}
}
void ie_EditExtras(struct obj_data *wobj)
{
int wint,wint2;
unsigned long wlong;
char wstr[IE_MAXSTRLEN];
for(wint=1;wint<=iex_max;wint=wint+2)
{
if(wint+1<=iex_max)
printf("%.2d.) %-34.34s %.2d.) %-34.34s\n",wint,iex_str[wint],wint+1,iex_str[wint+1]);
else
printf("%.2d.) %s\n",wint,iex_str[wint]);
}
for(;;)
{
printf("\nOld Extras:");
PrintExtras(wobj->obj_flags.extra_flags);
printf("Enter 0 to quit or the Number to toggle :");
gets(wstr);
wint=atoi(wstr);
if((wint!=0)&&((wint<1)||(wint>iex_max)))
{
printf("Ilegal Input. Try again.\n");
}
else
if(wint==0) break;
else
{
wlong=1;
for(wint2=1;wint2<wint;wint2++)
{
wlong=wlong<<1;
}
ie_changed=1;
wobj->obj_flags.extra_flags=wobj->obj_flags.extra_flags^wlong;
}
}
}
void ie_EditWear(struct obj_data *wobj)
{
int wint,wint2;
unsigned long wsint;
char wstr[IE_MAXSTRLEN];
for(wint=1;wint<=iw_max;wint=wint+2)
{
if(wint+1<=iw_max)
printf("%.2d.) %-34.34s %.2d.) %-34.34s\n",wint,iw_str[wint],wint+1,iw_str[wint+1]);
else
printf("%.2d.) %s\n",wint,iw_str[wint]);
}
for(;;)
{
printf("\nOld Wears:");
PrintWears(wobj->obj_flags.wear_flags);
printf("Enter 0 to quit or the Number to toggle :");
gets(wstr);
wint=atoi(wstr);
if((wint!=0)&&((wint<1)||(wint>iw_max)))
{
printf("Ilegal Input. Try again.\n");
}
else
if(wint==0) break;
else
{
wsint=1;
for(wint2=1;wint2<wint;wint2++)
{
wsint=wsint<<1;
}
ie_changed=1;
wobj->obj_flags.wear_flags=wobj->obj_flags.wear_flags^wsint;
}
}
}
void ie_EditWeight(struct obj_data *wobj)
{
int wint;
char wstr[IE_MAXSTRLEN];
printf("Old weight: %d\n",wobj->obj_flags.weight);
printf("Enter new weight: ");
gets(wstr);
wint=atoi(wstr);
if((wint==0)&&(*wstr!='0'))
{
printf("Weight unchanged.");
return;
}
ie_changed=1;
wobj->obj_flags.weight=wint;
}
void ie_EditCost(struct obj_data *wobj)
{
int wint;
long wint2;
char wstr[IE_MAXSTRLEN];
printf("Old cost: %lu\n",wobj->obj_flags.cost);
printf("Enter new cost: ");
gets(wstr);
wint2=atol(wstr);
if((wint2==0)&&(*wstr!='0'))
{
printf("Cost unchanged.");
return;
}
ie_changed=1;
wobj->obj_flags.cost=wint2;
}
void ie_EditCPD(struct obj_data *wobj)
{
int wint;
long wint2;
char wstr[IE_MAXSTRLEN];
printf("Old cost per day: %lu\n",wobj->obj_flags.cost_per_day);
printf("Enter new cost per day: ");
gets(wstr);
wint2=atol(wstr);
if((wint2==0)&&(*wstr!='0'))
{
printf("Cost per day unchanged.");
return;
}
ie_changed=1;
wobj->obj_flags.cost_per_day=wint2;
}
void ie_EditTimer(struct obj_data *wobj)
{
int wint;
char wstr[IE_MAXSTRLEN];
printf("Old timer: %d\n",wobj->obj_flags.timer);
printf("Enter new timer: ");
gets(wstr);
wint=atoi(wstr);
if((wint==0)&&(*wstr!='0'))
{
printf("Timer unchanged.");
return;
}
ie_changed=1;
wobj->obj_flags.timer=wint;
}
void ie_EditValues(struct obj_data *wobj)
{
int wint,wint2,wint3;
unsigned int wsint;
int type;
char wstr[IE_MAXSTRLEN];
struct itw_entry *itw_e1;
struct is_entry *is_e1;
struct is_entry *is_e2;
type=wobj->obj_flags.type_flag;
for(wint=0;wint<=3;wint++)
{
if(itv_entries[type].str[wint]!=itv_notused)
{
if(itv_entries[type].special[wint]==0)
{
printf("%s (%d):",itv_entries[type].str[wint],wobj->obj_flags.value[wint]);
gets(wstr);
wint2=atoi(wstr);
if((wint2==0)&&(*wstr!='0'))
printf("Value unchanged.\n");
else
{
ie_changed=1;
wobj->obj_flags.value[wint]=wint2;
}
}
else
{
switch(itv_entries[type].special[wint])
{
case 1 : {
is_e1=is_first;
is_e2=NULL;
wint2=1;
while(is_e1!=NULL)
{
switch(type)
{
case 2: { wint3 =is_e1->scroll; break; }
case 3: { wint3 =is_e1->wand; break; }
case 4: { wint3 =is_e1->staff; break; }
case 10:{ wint3 =is_e1->potion; break; }
default:{
wint3=0;
printf("** ERROR IN -ITVALS.DEF-. PLEASE REPORT OR CORRECT!!!\n");
break;
}
}
if(wint3==1)
{
printf("%.2d.) %-34.34s",wint2,is_e1->str);
if((wint2%2)==0)
printf("\n");
else
printf(" ");
is_valid[wint2-1]=is_e1->nr;
if(is_e1->nr==wobj->obj_flags.value[wint])
is_e2=is_e1;
wint2++;
}
is_e1=is_e1->next;
}
if((wint2%2)==0)
printf("\n");
printf("%s ",itv_entries[type].str[wint]);
if(is_e2!=NULL)
printf("(%s) ",is_e2->str);
else
printf("(UNKNOWN OR ILLEGAL) ");
gets(wstr);
wint3=atoi(wstr);
if((wint3>0)&&(wint3<wint2))
{
ie_changed=1;
wobj->obj_flags.value[wint]=is_valid[wint3-1];
}
else
printf("Spell-Type unchanged.\n");
break;
}
case 2 : {
wint2=1;
itw_e1=itw_first;
while(itw_e1!=NULL)
{
printf("%.2d.) %s\n",wint2,itw_e1->str);
itw_e1=itw_e1->next;
wint2++;
}
printf("%s ",itv_entries[type].str[wint]);
itw_e1=itw_first;
while(itw_e1!=NULL)
{
if(itw_e1->nr==wobj->obj_flags.value[wint])
{
printf("(%s):",itw_e1->str);
break;
}
itw_e1=itw_e1->next;
}
if(itw_e1==NULL)
{
printf("(invalid):");
}
gets(wstr);
wint3=atoi(wstr);
if((wint3>0)&&(wint3<wint2))
{
itw_e1=itw_first;
for(wint2=1;wint2<wint3;wint2++)
itw_e1=itw_e1->next;
ie_changed=1;
wobj->obj_flags.value[wint]=itw_e1->nr;
}
else
printf("Weapon-Type unchanged.\n");
break;
}
case 3 : {
for(wint2=1;wint2<=ict_max;wint2=wint2+2)
{
if(wint2+1<=ict_max)
printf("%.2d.) %-34.34s %.2d.) %-34.34s\n",wint2,ict_str[wint2],wint2+1,ict_str[wint2+1]);
else
printf("%.2d.) %s\n",wint2,ict_str[wint2]);
}
for(;;)
{
printf("%s (",itv_entries[type].str[wint]);
PrintContainer(wobj->obj_flags.value[wint]);
printf(").\n");
printf("Enter 0 to quit or the Number to toggle :");
gets(wstr);
wint2=atoi(wstr);
if((wint2!=0)&&((wint2<1)||(wint2>ict_max)))
{
printf("Ilegal Input. Try again.\n");
}
else
if(wint2==0) break;
else
{
wsint=1;
for(wint3=1;wint3<wint2;wint3++)
{
wsint=wsint<<1;
}
ie_changed=1;
wobj->obj_flags.value[wint]=wobj->obj_flags.value[wint]^wsint;
}
}
break;
}
case 4 : {
for(wint2=1;wint2<=idl_max;wint2=wint2+2)
{
if(wint2+1<=idl_max)
printf("%.2d.) %-34.34s %.2d.) %-34.34s\n",wint2,idl_str[wint2],wint2+1,idl_str[wint2+1]);
else
printf("%.2d.) %s\n",wint2,idl_str[wint2]);
}
wint2=idl_max;
printf("%s (%s): ",itv_entries[type].str[wint],idl_str[wobj->obj_flags.value[wint]+1]);
gets(wstr);
wint2=atoi(wstr);
if((wint2==0)||(wint2<1)||(wint2>idl_max))
{
printf("Liquid-Type unchanged.\n");
}
else
{
ie_changed=1;
wobj->obj_flags.value[wint]=wint2-1;
}
break;
}
default: {
printf("** UNKNOWN VALUES-SPECIAL!! PLEASE REPORT OR CORRECT YOUR -ITVALS.DEF-!\n");
break;
}
}
}
}
}
}
void ie_EditApply(struct obj_data *wobj)
{
int wint,wint2;
char wstr[IE_MAXSTRLEN];
for(wint=1;wint<=ia_max;wint=wint+2)
{
if(wint+1<=ia_max)
printf("%.2d.) %-34.34s %.2d.) %-34.34s\n",wint,ia_str[wint],wint+1,ia_str[wint+1]);
else
printf("%.2d.) %s\n",wint,ia_str[wint]);
}
printf("0.) None\n");
for(wint2=0;wint2<MAX_OBJ_AFFECT;wint2++)
{
printf("Which %d. apply (%s): ",wint2+1,ia_str[wobj->affected[wint2].location]);
gets(wstr);
wint=atoi(wstr);
if((wint<0)||(wint>ia_max)||((wint==0)&&(*wstr!='0')))
{
printf("Apply unchanged.\n");
wint=wobj->affected[wint2].location;
}
if(wint==0)
{
ie_changed=1;
wobj->affected[wint2].location=0;
wobj->affected[wint2].modifier=0;
}
else
{
if(wint!=wobj->affected[wint2].location)
ie_changed=1;
wobj->affected[wint2].location=wint;
printf("Which modifier (%d): ",wobj->affected[wint2].modifier);
gets(wstr);
wint=atoi(wstr);
if(wint!=0)
{
ie_changed=1;
wobj->affected[wint2].modifier=wint;
}
else
printf("Modifier unchanged.\n");
}
}
}
void ie_EditAffects(struct obj_data *wobj)
{
int wint,wint2;
long wlong;
char wstr[IE_MAXSTRLEN];
for(wint=1;wint<=ipa_max;wint=wint+2)
{
if(wint+1<=ipa_max)
printf("%.2d.) %-34.34s %.2d.) %-34.34s\n",wint,ipa_str[wint],wint+1,ipa_str[wint+1]);
else
printf("%.2d.) %s\n",wint,ipa_str[wint]);
}
for(;;)
{
printf("\nOld Affects:");
PrintAffects(wobj->obj_flags.bitvector);
printf("Enter 0 to quit or the Number to toggle :");
gets(wstr);
wint=atoi(wstr);
if((wint!=0)&&((wint<1)||(wint>ipa_max)))
{
printf("Illegal Input. Try again.\n");
}
else
if(wint==0) break;
else
{
wlong=1;
for(wint2=1;wint2<wint;wint2++)
{
wlong=wlong<<1;
}
ie_changed=1;
wobj->obj_flags.bitvector=wobj->obj_flags.bitvector^wlong;
}
}
}
struct extra_descr_data *CreateExtraDesc(wobj,wext)
struct obj_data *wobj;
struct extra_descr_data *wext;
{
struct extra_descr_data *new_descr;
ie_changed=1;
CREATE(new_descr, struct extra_descr_data, 1);
CREATE(new_descr->keyword, char , 6);
CREATE(new_descr->description, char , 44);
strcpy(new_descr->keyword,"dummy");
strcpy(new_descr->description,"This is a Dummy, please make me valid!!");
new_descr->next = NULL;
if(wext==NULL)
wobj->ex_description=new_descr;
else
wext->next=new_descr;
return(new_descr);
}
void ie_EditExtraDesc(struct obj_data *wobj)
{
struct extra_descr_data *wext=NULL;
struct extra_descr_data *wext2=NULL;
struct extra_descr_data *wext3=NULL;
/* struct extra_descr_data *CreateExtraDesc(struct obj_data *,struct extra_descr_data *);*/
struct extra_descr_data *CreateExtraDesc();
char wstr[IE_MAXSTRLEN];
char *wstr2;
int wint;
int maxsel=3;
if(wobj->ex_description==NULL)
{
wext=CreateExtraDesc(wobj,wext);
}
{
wext=wobj->ex_description;
do
{
printf("1.) Keywords : %s\n",wext->keyword);
printf("2.) Description : %s\n",wext->description);
printf("3.) Next ");
if(wext->next==NULL)
printf(": <NOT SET>\n");
else
printf("-> Set (Not viewed)\n");
printf("5.) Delete this entry.\n");
printf("Enter: 1-2 to edit, 3 to goto/create next, 0 to quit and 5 to delete.\n",maxsel-1+'A');
gets(wstr);
wint=atoi(wstr);
switch(wint)
{
case 1: {
printf("Old keywords: %s\n",wext->keyword);
printf("Enter new keywords :");
gets(wstr);
if(*wstr=='\0')
{
printf("Keywords unchanged.\n");
}
else
{
free(wext->keyword);
CREATE(wext->keyword, char, strlen(wstr) + 1);
strcpy(wext->keyword,wstr);
ie_changed=1;
}
break;
}
case 2: {
printf("Old Description:\n%s\n",wext->description);
printf("Enter New Description (End with ~):\n");
wstr2=read_multi_string();
if(*wstr2=='\0')
{
printf("Description unchanged.\n");
}
else
{
free(wext->description);
CREATE(wext->description, char, strlen(wstr2) + 1);
strcpy(wext->description,wstr2);
ie_changed=1;
}
free(wstr2);
break;
}
case 3: {
wext2=wext;
if(wext->next!=NULL)
wext=wext->next;
else
wext=CreateExtraDesc(wobj,wext);
break;
}
case 5: {
printf("Are you sure (yes/NO)? ");
if(AskYesNo("yes"))
{
ie_changed=1;
if(wext2==NULL)
wobj->ex_description=wext->next;
else
wext2->next=wext->next;
wext3=wext->next;
free(wext);
if(wext3!=NULL)
wext=wext3;
else
return;
}
break;
}
case 0: break;
defaut: {
printf("Illegal input, try again.");
break;
}
}
}
while(wint!=0);
}
}
/* Print all item Datas */
void print_obj(struct obj_data *wobj)
{
int i;
printf("\n");
printf("Item-Values:\n");
printf("------------\n");
/* printf("INTERNAL Item-Nr : %d\n",wobj->item_number); */
printf("1.) Item-Nr : %d\n",wobj->virt_number);
printf("2.) Item-NameList : %s\n",wobj->name);
printf("3.) Item-ShortDesc: %s\n",wobj->short_description);
printf("4.) Item-LongDesc : %s\n",wobj->description);
printf("5.) Item-ActDesc ");
if(wobj->action_description==NULL)
printf(": <NOT SET>\n");
else
if(wobj->obj_flags.type_flag==ITEM_WEAPON)
printf(": %s\n",wobj->action_description);
else
printf("-> Set (Not viewed)\n");
printf("6.) Item-Type : ");
if(wobj->obj_flags.type_flag>it_max)
printf("*UNKNOWN* - PLEASE REPORT OR UPDATE -ITYPES.DEF-!!!\n");
else
printf("%s\n",it_str[wobj->obj_flags.type_flag]);
printf("7.) Item-Extras : ");
PrintExtras(wobj->obj_flags.extra_flags);
printf("8.) Item-Wear : ");
PrintWears(wobj->obj_flags.wear_flags);
printf("9.) Item-Weigth : %u\n",wobj->obj_flags.weight);
printf("10.) Item-Cost : %lu\n",wobj->obj_flags.cost);
printf("11.) Item-Cost/Day : %lu\n",wobj->obj_flags.cost_per_day);
printf("12.) Item-Timer : %d\n",wobj->obj_flags.timer);
printf("13.) Values[0..3] : %d %d %d %d\n",wobj->obj_flags.value[0],wobj->obj_flags.value[1],wobj->obj_flags.value[2],wobj->obj_flags.value[3]);
printf("14.) Item-Apply : ");
for(i=0;i<MAX_OBJ_AFFECT;i++)
{
printf("%s (%d)",ia_str[wobj->affected[i].location],wobj->affected[i].modifier);
if(i!=(MAX_OBJ_AFFECT-1))
printf(" - ");
else
printf("\n");
}
printf("15.) Item-Affects : ");
PrintAffects(wobj->obj_flags.bitvector);
printf("16.) Item-ExtraDesc");
if(wobj->ex_description==NULL)
printf(": <NOT SET>\n");
else
printf("-> Set (Not viewed)\n");
}
/* Show Item for DikuCli */
void ie_ShowItem(int nr)
{
struct obj_data *wobj;
wobj=read_object(nr,REAL);
print_obj(wobj);
free_obj(wobj);
}
/* Edit all Item Data */
int EditAllObj(struct obj_data *wobj)
{
int maxsel;
char wstr[IE_MAXSTRLEN];
int wint;
maxsel=IE_EDITMAX;
print_obj(wobj);
do
{
printf("Enter: 0 to quit, 1-%d to edit.\n",maxsel);
gets(wstr);
wint=atoi(wstr);
if((wint>0)&&(wint<=IE_EDITMAX))
{
(*ie_edit[wint-1])(wobj);
print_obj(wobj);
}
else
if(wint!=0)
printf("** Illegal input. Try again!\n");
}
while(wint!=0);
return(IE_SM_SAVE);
}
/* Edit a Item for DikuCli */
void ie_EditItem(int nr)
{
struct obj_data *wobj;
int ie_m;
ie_changed=0;
wobj=read_object(nr,REAL);
ie_m=EditAllObj(wobj);
if((ie_changed!=0)||(ie_m==IE_SM_DELETE))
SaveToIETemp(nr,ie_m,wobj);
free_obj(wobj);
}
/* Clone a Item (for DikuCli) */
void ie_CloneItem(int nr1, int nr2)
{
struct obj_data *wobj;
if(nr1<0)
wobj= &ie_defaultitem;
else
wobj=read_object(nr1,REAL);
ie_doclone(wobj,nr2);
if(nr1>=0)
free_obj(wobj);
}
/* Purge a Item for DikuCli */
void ie_PurgeItem(int nr)
{
SaveToIETemp(nr,IE_SM_DELETE,NULL);
}
/* Set FileName of *.obj file */
void ie_SetFile(char *wstr)
{
strcpy(ie_objfile,wstr);
}
/* Set TempFile */
void ie_SetTemp(char *wstr)
{
strcpy(ie_tempfile,wstr);
}
/* Set AffBitVec-flag */
void ie_SetAffBitVec(int wint)
{
ie_affbitvec=wint;
}
/* Set database path */
void ie_SetDBPath(char *wstr)
{
strcpy(ie_dbpath,wstr);
}
int GetITWDef(void)
{
int i;
struct itw_entry *itw_e1;
struct itw_entry *itw_e2;
char *wstr;
itw_first=NULL;
CREATE(wstr, char, strlen(ie_dbpath)+21);
strcpy(wstr,ie_dbpath);
strcat(wstr,IE_ITWFILE);
if(!(itw_file=fopen(wstr,"r")))
{
free(wstr);
return(IE_ERR_CANTOPEN);
}
free(wstr);
fscanf(itw_file,"%d\n",&i);
if(i==-1)
return(IE_ERR_NOERROR);
CREATE(itw_e1,struct itw_entry,1);
itw_e1->str=fread_string(itw_file);
itw_e1->nr=i;
itw_e1->next=NULL;
itw_first=itw_e1;
itw_e2=itw_e1;
fscanf(itw_file,"%d\n",&i);
while(i!=-1)
{
CREATE(itw_e1,struct itw_entry,1);
itw_e1->str=fread_string(itw_file);
itw_e1->nr=i;
itw_e1->next=NULL;
itw_e2->next=itw_e1;
itw_e2=itw_e1;
fscanf(itw_file,"%d\n",&i);
}
fclose(itw_file);
return(IE_ERR_NOERROR);
}
void FreeITWDef(void)
{
int i;
struct itw_entry *itw_e1;
struct itw_entry *itw_e2;
itw_e1=itw_first;
while(itw_e1!=NULL)
{
itw_e2=itw_e1->next;
free(itw_e1->str);
free(itw_e1);
itw_e1=itw_e2;
}
}
int GetITVDef(void)
{
int i,j;
int type,index,spec;
char *wstr;
CREATE(wstr, char, strlen(ie_dbpath)+21);
strcpy(wstr,ie_dbpath);
strcat(wstr,IE_ITVFILE);
if(!(itv_file=fopen(wstr,"r")))
{
free(wstr);
return(IE_ERR_CANTOPEN);
}
free(wstr);
itv_entries=malloc(sizeof(struct itv_entry)*(it_max+1));
for(i=0;i<it_max;i++)
{
for(j=0;j<=3;j++)
{
itv_entries[i].special[j]=0;
itv_entries[i].str[j]=itv_notused;
}
}
fscanf(itv_file,"%d ",&type);
while(type!=-1)
{
fscanf(itv_file,"%d ",&index);
fscanf(itv_file,"%d \n",&spec);
itv_entries[type].str[index]=fread_string(itv_file);
itv_entries[type].special[index]=spec;
fscanf(itv_file,"%d ",&type);
}
fclose(itv_file);
return(IE_ERR_NOERROR);
}
void FreeITVDef(void)
{
int i,j;
for(i=0;i<it_max;i++)
{
for(j=0;j<=3;j++)
{
if(itv_entries[i].str[j]!=itv_notused)
free(itv_entries[i].str[j]);
}
}
}
int GetISDef(void)
{
int i,j;
struct is_entry *is_e1;
struct is_entry *is_e2;
char *wstr;
is_first=NULL;
is_e2=NULL;
CREATE(wstr, char, strlen(ie_dbpath)+21);
strcpy(wstr,ie_dbpath);
strcat(wstr,IE_ISFILE);
if(!(is_file=fopen(wstr,"r")))
{
free(wstr);
return(IE_ERR_CANTOPEN);
}
free(wstr);
for(;;)
{
if(fscanf(is_file,"%d ",&i)!=1) break;
CREATE(is_e1,struct is_entry,1);
if(is_first==NULL)
is_first=is_e1;
else
is_e2->next=is_e1;
is_e1->nr=i;
fscanf(is_file,"%d ",&is_e1->potion);
fscanf(is_file,"%d ",&is_e1->scroll);
fscanf(is_file,"%d ",&is_e1->wand);
fscanf(is_file,"%d ",&is_e1->staff);
fscanf(is_file,"%d\n",&is_e1->minlevel);
is_e1->str=fread_string(is_file);
is_e2=is_e1;
}
fclose(is_file);
return(IE_ERR_NOERROR);
}
void FreeISDef(void)
{
int i,j;
struct is_entry *is_e1;
struct is_entry *is_e2;
is_e1=is_first;
while(is_e1!=NULL)
{
free(is_e1->str);
is_e2=is_e1->next;
free(is_e1);
is_e1=is_e2;
}
is_first=NULL;
}
/* Initialize the IEdit vars */
void ie_InitIEdit()
{
struct obj_data *obj;
ie_changed=0;
if(GetADef(it_file,IE_ITFILE,ie_dbpath,&it_str,&it_max))
printf("*** Can't open a *.def file!\n");
if(GetADef(iw_file,IE_IWFILE,ie_dbpath,&iw_str,&iw_max))
printf("*** Can't open a *.def file!\n");
if(GetADef(iex_file,IE_IEXFILE,ie_dbpath,&iex_str,&iex_max))
printf("*** Can't open a *.def file!\n");
if(GetADef(ipa_file,IE_IPAFILE,ie_dbpath,&ipa_str,&ipa_max))
printf("*** Can't open a *.def file!\n");
if(GetADef(ia_file,IE_IAFILE,ie_dbpath,&ia_str,&ia_max))
printf("*** Can't open a *.def file!\n");
if(GetADef(idl_file,IE_IDLFILE,ie_dbpath,&idl_str,&idl_max))
printf("*** Can't open a *.def file!\n");
if(GetADef(ict_file,IE_ICTFILE,ie_dbpath,&ict_str,&ict_max))
printf("*** Can't open a *.def file!\n");
if(GetITWDef())
printf("*** Can't open a *.def file!\n");
if(GetITVDef())
printf("*** Can't open a *.def file!\n");
if(GetISDef())
printf("*** Can't open a *.def file!\n");
if(OpenObjFile())
printf("***** IMPOSSIBLE ERROR *****");
}
void ie_CloseIEdit(void)
{
fclose(obj_f);
FreeADef(it_str,it_max);
FreeADef(iex_str,iex_max);
FreeADef(iw_str,iw_max);
FreeADef(ipa_str,ipa_max);
FreeADef(ia_str,ia_max);
FreeADef(idl_str,idl_max);
FreeADef(ict_str,ict_max);
FreeITWDef();
FreeITVDef();
FreeISDef();
}