gates_of_skeldal/UTILS/ITEMLIST.C
2025-01-24 18:27:22 +01:00

328 lines
7.6 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <types.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <ctype.h>
#define SV_ITLIST 0x8001
#define SV_SNDLIST 0x8002
#define SV_END 0x8000
typedef struct titem
{
char jmeno[32]; //32 Jmeno predmetu
char popis[32]; //64
short zmeny[24]; //112 Tabulka, jakych zmen ma na hracovy vlastnosti
short podminky[4];//120 Tabulka, jake vlastnosti musi mit hrac k pouziti predmetu
short hmotnost,nosnost,druh; //126 druh = Typ predmetu
short umisteni; //128 Kam se predmet umisti?
word flags; //130 ruzne vlajky
short spell,magie,sound_handle;//136 specialni kouzla / rukojet zvuku
short use_event; //140 specialni udalost
unsigned short ikona,vzhled; //144 ikony a vzhled
short user_value; //146 uzivatelska hodnota
short keynum; //148 cislo klice
short polohy[2][2]; //156 souradnice poloh pro zobrazeni v inv
char typ_zbrane; //160 Typ zbrane
char unused;
short sound; //cislo zvuku
short v_letu[16]; //192
int cena;
char weapon_attack; //relativni handle k souboru s animaci utok
char hitpos; //pozice zasahu animace
short rezerva[13]; //224 rezervovane
}TITEM;
#define isweapon(p) ((p)>=1 && (p)<=3)
char sekceid[]="<BLOCK>";
TITEM *itlist;
int item_count;
char *sound;
char listsize;
int pagelen;
char pr_name=0,pr_type=0,pr_sound=0,pr_umist=0,pr_zbran=0,pr_hmotn=0,pr_popis=0;
char grp_sort=0,pr_number=0,pr_cena=0;
char _typy_zbrani[]=
"Me‡\0"
"Sekera\0"
"Kladivo\0"
"Hl\0"
"D<EFBFBD>ka\0"
"St©eln \0"
"Ostatnˇ\0";
char _typy_veci[]=
"Nespecifikov no\0"
"Zbra¤ tv ©ˇ v tv ©\0"
"Vrhacˇ zbra¤\0"
"St©eln  zbra¤\0"
"Zbroj\0"
"Svitek / Hlka\0"
"Lektvar\0"
"Voda\0"
"Jˇdlo\0"
"Speci lnˇ\0"
"Runa\0"
"Penˇze\0"
"Svitek s textem\0"
"Prach\0"
"Ostatnˇ\0";
char _umisteni_veci[]=
"Nikam\0"
"Zavazadlo\0"
"Na t<>lo (naho©e)\0"
"Na t<>lo (dole)\0"
"Na hlavu\0"
"Na nohy\0"
"Kutna\0"
"Na krk\0"
"Do ruky\0"
"Obouru‡\0"
"Prsten\0"
"ˇp\0";
long load_section(FILE *f,void **section, int *sct_type,long *sect_size)
//
{
long s;
char c[20];
*section=NULL;
fread(c,1,sizeof(sekceid),f);
if (strcmp(c,sekceid)) return -1;
fread(sct_type,1,sizeof(*sct_type),f);
fread(sect_size,1,sizeof(*sect_size),f);
fread(&s,1,sizeof(s),f);
*section=malloc(*sect_size);
s=fread(*section,1,*sect_size,f);
return s;
}
void load_items_dat(char *name)
{
FILE *f;
void *temp;
int type;
long size;
f=fopen(name,"rb");
if (f==NULL)
{
printf("Nemohu otevrit soubor %s\n",name);
exit(1);
}
do
{
load_section(f,&temp,&type,&size);
switch (type)
{
case SV_ITLIST:itlist=temp;item_count=size/sizeof(TITEM);break;
case SV_SNDLIST:sound=temp;listsize=size;break;
case SV_END:
default: free(temp);break;
}
}
while (type!=SV_END);
fclose(f);
}
char *find_str(char *sound,int number,long listsize)
{
char *c;
static char none[]="<nic>";
static char unknown[]="<ref.error>";
c=sound;
if (!number) return none;
number--;
while (c-sound<listsize && number--) c+=strlen(c)+1;
if (c-sound<listsize) return c;
return &unknown;
}
void print_polozka(int num,TITEM *t)
{
if (pr_number) printf("%3dł",num);
if (pr_name) printf("%-32sł",t->jmeno);
if (pr_type) printf("%-20sł",find_str(_typy_veci,t->druh+1,sizeof(_typy_veci)));
if (pr_umist) printf("%-20sł",find_str(_umisteni_veci,t->umisteni+1,sizeof(_umisteni_veci)));
if (pr_zbran) printf("%-10sł",isweapon(t->druh)?find_str(_typy_zbrani,t->typ_zbrane+1,sizeof(_typy_zbrani)):" ");
if (pr_hmotn) printf("%6dł",t->hmotnost);
if (pr_cena) printf("%6dł",t->cena);
if (pr_sound) printf("%-12sł",find_str(sound,t->sound,listsize));
if (pr_popis) printf("%s",t->popis);
puts("");
}
void print_head()
{
int lines=0;
if (pr_number) printf("ID "),lines+=4;
if (pr_name) printf("%-32s ","Jmeno veci"),lines+=33;
if (pr_type) printf("%-20s ","Typ veci"),lines+=21;
if (pr_umist) printf("%-20s ","Umisteni"),lines+=21;
if (pr_zbran) printf("%-10s ","Zbran"),lines+=11;
if (pr_hmotn) printf("%-6s ","Vaha"),lines+=7;
if (pr_cena) printf("%-6s ","Cena"),lines+=7;
if (pr_sound) printf("%-12s ","Zvuk"),lines+=13;
if (pr_popis) printf("%s","Popis"),lines+=6;
puts("");
if (lines) while (lines--) putc(196,stdout);
puts("");
}
void endpage(int i)
{
if (pagelen && i%pagelen==0)
{
if (i) putc(12,stdout);
print_head();
}
}
void counting_sort(TITEM *sr,TITEM *tg,int count,int *idnums)
{
int tridy[30][20];
int i,j,c;
TITEM *s;
memset(tridy,0,sizeof(tridy));
for(i=0,s=sr;i<count;i++,s++) tridy[s->druh][isweapon(s->druh)?s->typ_zbrane:0]++;
c=0;
for(i=0;i<30;i++)
for(j=0;j<20;j++)
{
register int d;
d=tridy[i][j];
tridy[i][j]=c;
c+=d;
}
for(i=0,s=sr;i<count;i++,s++)
{
int c=tridy[s->druh][isweapon(s->druh)?s->typ_zbrane:0]++;
tg[c]=*s;
idnums[c]=i;
}
}
void print_list()
{
int i;
TITEM *t;
if (!pagelen) print_head();
if (!grp_sort)
{
for(i=0,t=itlist;i<item_count;i++,t++)
{
endpage(i);
print_polozka(i,t);
}
}
else
{
TITEM *list;
int *nums;
list=(TITEM *)malloc(sizeof(TITEM)*item_count);
nums=(int *)malloc(sizeof(int)*item_count);
counting_sort(itlist,list,item_count,nums);
for(i=0,t=list;i<item_count;i++,t++)
{
endpage(i);
print_polozka(nums[i],t);
}
free(list);
free(nums);
}
}
#pragma aux setmode modify [eax]=\
"mov eax,55h"\
"int 10h"
void setmode();
void help()
{
puts("\nUsage: ITEMLIST ATSUZPHGNMC* [pagelen]\n"
"\n"
"A - jmeno veci\n"
"C - cena\n"
"H - hmotnost\n"
"N - ID cislo\n"
"P - popis\n"
"S - prirazeni zvuku\n"
"T - typ veci\n"
"U - umisteni\n"
"Z - typ zbrane\n"
"* - Vsechny udaje, odpovida zapisu: ACHNPSTUZ\n"
"\n"
"G - Setridi vypis do trid\n"
"M - Nastavi rezim 132x25zn pro vypis\n"
"\n"
"Pagelen - Delka stranky v radkach (min 3), default 0\n"
"\n"
"Zapis bez parametru je ekvivaletni zapisu NATS");
exit(0);
}
void arguments(char *arg)
{
if (!*arg)
{
pr_number=1;
pr_name=1;
pr_type=1;
pr_sound=1;
puts("Parametry: NATS");
puts("Pouzij ITEMLIST ? pro napovedu\n");
}
else
while (*arg)
switch(toupper(*arg++))
{
case 'A': pr_name=1;break;
case 'T': pr_type=1;break;
case 'S': pr_sound=1;break;
case 'U': pr_umist=1;break;
case 'Z': pr_zbran=1;break;
case 'P': pr_popis=1;break;
case 'H': pr_hmotn=1;break;
case 'G': grp_sort=1;break;
case 'N': pr_number=1;break;
case 'M': setmode();break;
case 'C': pr_cena=1;break;
case '*': pr_name=pr_type=pr_sound=pr_umist=pr_zbran=pr_popis=pr_hmotn=pr_number=pr_cena=1;break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':arg--;
sscanf(arg,"%d",&pagelen);
pagelen-=2;
if (pagelen<1) pagelen=0;
return;
default: help();
}
}
main(int argc,char **argv)
{
int i;
if (argc<2)arguments("");
else
for(i=1;i<argc;i++) arguments(argv[i]);
load_items_dat("items.dat");
print_list();
}