mirror of
https://github.com/ondra-novak/gates_of_skeldal.git
synced 2025-07-12 17:32:30 -04:00
game folder "just" compiles (not link)
This commit is contained in:
parent
13d3908273
commit
1b0f7fe0c2
135 changed files with 2161 additions and 2336 deletions
270
game/dlglib.c
Normal file
270
game/dlglib.c
Normal file
|
@ -0,0 +1,270 @@
|
|||
/*
|
||||
|
||||
definice formatu-
|
||||
|
||||
:num - odstavec
|
||||
#text
|
||||
|
||||
# asterix = muze obsahovat tyto znaky
|
||||
. = normal text (vypisuje se)
|
||||
_ = popis (zapisuje se do LOGu)
|
||||
" = dialog (vypisuje se do LOGu a tiskne se)
|
||||
? = vyber.. Nasleduje . nebo _ nebo '
|
||||
* = prikaz
|
||||
; = komentar
|
||||
*/
|
||||
|
||||
|
||||
#include <types.h>
|
||||
#include <ctype.h>
|
||||
#include <malloc.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <strlite.h>
|
||||
#include <memman.h>
|
||||
#include <bgraph.h>
|
||||
|
||||
FILE *dlg;
|
||||
long *odstavce=NULL;
|
||||
int pocet;
|
||||
|
||||
int selptr=0;
|
||||
|
||||
char get_article()
|
||||
{
|
||||
int c;
|
||||
|
||||
while ((c=fgetc(dlg))==32);
|
||||
return (char)c;
|
||||
}
|
||||
|
||||
#define new_line() while (fgetc(dlg)!='\n');
|
||||
|
||||
|
||||
int count_pargh()
|
||||
{
|
||||
char c;
|
||||
int i=0;
|
||||
|
||||
fseek(dlg,0,SEEK_SET);
|
||||
c=get_article();
|
||||
while (c!=0xff)
|
||||
{
|
||||
if (c==':') i++;
|
||||
if (c!='\n') new_line();
|
||||
c=get_article();
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
void read_pargh()
|
||||
{
|
||||
int s,i;
|
||||
long *d;
|
||||
char c;
|
||||
if (odstavce!=NULL) free(odstavce);
|
||||
odstavce=NULL;
|
||||
s=(pocet=i=count_pargh())*sizeof(long)*2;
|
||||
if (s==0) return;
|
||||
odstavce=getmem(s);
|
||||
d=odstavce;
|
||||
fseek(dlg,0,SEEK_SET);
|
||||
c=get_article();
|
||||
while (c!=0xff && i)
|
||||
{
|
||||
if (c==':')
|
||||
{
|
||||
fscanf(dlg,"%d",&s);
|
||||
*d++=s;
|
||||
*d++=ftell(dlg);
|
||||
i--;
|
||||
}
|
||||
if (c!='\n') new_line();
|
||||
c=get_article();
|
||||
}
|
||||
}
|
||||
|
||||
void dlg_error(char *chyba)
|
||||
{
|
||||
closemode();
|
||||
printf("Error in dialoge: %s\n",chyba);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
long *najdi_odstavec(int odstavec)
|
||||
{
|
||||
long *d;
|
||||
int i;
|
||||
|
||||
|
||||
d=odstavce;
|
||||
for(i=0;i<pocet && *d!=odstavec;i++) d+=2;
|
||||
if (i==pocet)
|
||||
{
|
||||
char s[50];
|
||||
sprintf(s,"Can't find paragraph num %d",odstavec);
|
||||
dlg_error(s);
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
char jdi_na_odstavec(int odstavec)
|
||||
{
|
||||
long *l,m;
|
||||
char c;
|
||||
|
||||
l=najdi_odstavec(odstavec);
|
||||
m=l[1] & 0xffffff;
|
||||
c=l[1]>>24;
|
||||
fseek(dlg,m,SEEK_SET);
|
||||
return c;
|
||||
}
|
||||
|
||||
void set_flags(int n,long maskand,long maskor)
|
||||
{
|
||||
long *l;
|
||||
l=najdi_odstavec(n);
|
||||
l[1]&=(maskand<<24)+0xffffff;
|
||||
l[1]|=maskor<<24;
|
||||
}
|
||||
|
||||
int param(char *c)
|
||||
{
|
||||
int i;
|
||||
sscanf(c,"%d",&i);
|
||||
return i;
|
||||
}
|
||||
|
||||
int nparam(int n,char *c)
|
||||
{
|
||||
char *d;
|
||||
|
||||
if (n)
|
||||
{
|
||||
d=c;
|
||||
while (n--) d=(char *)strchr(d+1,',');
|
||||
}
|
||||
else d=c-1;
|
||||
if (d==NULL) return -1;else return param(d+1);
|
||||
}
|
||||
|
||||
void proved_goto(int num)
|
||||
{
|
||||
char c;
|
||||
long l;
|
||||
l=ftell(dlg);
|
||||
c=jdi_na_odstavec(num);
|
||||
while (c & 1)
|
||||
{
|
||||
int i,j;
|
||||
|
||||
j=fscanf(dlg,"%d",&i);
|
||||
if (j) c=jdi_na_odstavec(i); else
|
||||
{
|
||||
c=0;
|
||||
fseek(dlg,l,SEEK_SET);
|
||||
}
|
||||
}
|
||||
}
|
||||
void proved_d(char *code,char *text)
|
||||
{
|
||||
static int mode=0;
|
||||
static char *save_text;
|
||||
|
||||
do
|
||||
{
|
||||
if (mode==0)
|
||||
{
|
||||
*code=get_article();
|
||||
switch (*code)
|
||||
{
|
||||
case ';':
|
||||
case ':':*code=0xff;new_line();break;
|
||||
case '.':*code=1;break;
|
||||
case '_':*code=2;break;
|
||||
case '"':*code=3;break;
|
||||
case '?':*code=4;selptr++;break;
|
||||
case '*':*code=0;break;
|
||||
default :*code=0xff;break;
|
||||
}
|
||||
if (*code!=0xff)fscanf(dlg,"%[^\n]",text);
|
||||
if (*code==0)
|
||||
{
|
||||
strupr(text);
|
||||
if (!strncmp(text,"GOTO",4))
|
||||
{
|
||||
int n;
|
||||
sscanf(text+4,"%d",&n);
|
||||
proved_goto(n);
|
||||
}
|
||||
if (!strncmp(text,"JUMP",4))
|
||||
{
|
||||
int n;
|
||||
sscanf(text+4,"%d",&n);
|
||||
jdi_na_odstavec(n);
|
||||
}
|
||||
else if (!strncmp(text,"DISABLE",7)) set_flags(param(text+7),0xff,1);
|
||||
else if (!strncmp(text,"ENABLE",6)) set_flags(param(text+7),0xfe,0);
|
||||
else if (!strncmp(text,"CHOICE",6))
|
||||
{
|
||||
*text=selptr;
|
||||
selptr=0;
|
||||
*code=5;
|
||||
mode=1;
|
||||
save_text=getmem(strlen(text)-6+1);
|
||||
strcpy(save_text,text+6);
|
||||
}
|
||||
else if (!strncmp(text,"STOP",4)) *code=7;
|
||||
else if (!strncmp(text,"MENU",4)) selptr=param(text+4);
|
||||
}
|
||||
else if (*code==4)
|
||||
{
|
||||
long *l=najdi_odstavec(param(text));
|
||||
char c,*d;
|
||||
|
||||
c=l[1]>>24;
|
||||
if (c & 1) *code=6;
|
||||
d=text;while (*d>='0' && *d<='9') d++;
|
||||
strcpy(text,d);
|
||||
}
|
||||
}
|
||||
else if (mode==1)
|
||||
{
|
||||
int i=text[1],j;
|
||||
|
||||
*code=5;
|
||||
j=nparam(i,save_text);
|
||||
if (j==-1) return;
|
||||
free(save_text);
|
||||
proved_goto(j);
|
||||
set_flags(j,0xff,0x1);
|
||||
mode=0;
|
||||
*code=0;
|
||||
}
|
||||
}
|
||||
while (*code==0);
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
char code,text[300];
|
||||
dlg=fopen("test.txt","r");
|
||||
read_pargh();
|
||||
proved_goto(1);
|
||||
proved_d(&code,text);
|
||||
while (code!=7)
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case 1:printf("%s\n",text);break;
|
||||
case 2:
|
||||
case 3:printf("%s\n",text);break;
|
||||
case 4:printf(" %c.%s\n",selptr+64,text);break;
|
||||
case 5:text[1]=toupper(getche())-65;putchar('\n');break;
|
||||
}
|
||||
proved_d(&code,text);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue