/*
    Minitextovka "DUUM" v jazyce "C"
    Naprogramovano na pocitaci AMIGA
        pro pocitace ATARI XL/XE
       specialne pro casopis FLOP

          (c)1994 Jiri Svoboda
                FREEWARE
*/

/*
    Revidovano 20.4.2001
*/


#include <stdio.h>

#define EOL     '\n'

#define SEVER     1
#define JIH       2
#define VYCHOD    4
#define ZAPAD     8

#define PREDMETU 20

#define NEJDEVZIT 0
#define JDEVZIT   1

#define TYP_NIC   0
#define TYP_MIST  1
#define TYP_PRED  2

char tedmistnost= 0;
char konmistnost=12;
char konec      = 0;
char prikaz[30];
char sloveso[4];
char podstjm[4];

struct mistnost 
    char *popis0;
    char uroven;
    char *popis1;
    char vychody1;
    char *popis2;
    char vychody2;
;

struct predmet 
    char *jmeno;
    char pozice;
    char typ;
    char *zkoumej;
    char mistpouziti;
    char prikpouziti;
    char datapouziti;
    char *pouzij;
;

struct mistnost datam[16]= 
   "Jsi v zatuchle kamenne kobce. Zeme je pokryta tlejici slamou. Jedine dvere vedou na vychod. ",
    0,
    0,
    VYCHOD,
    0,
    0
   ,
   "Stojis ve vstupni chodbe teto budovy. Steny jsou bile naliceny. Na severu jsou uzamcena vrata ven. ",
    0,
    0,
    JIH+VYCHOD+ZAPAD,
    0,
    0
   ,
   "Prvni mistnost postraniho kridla budovy. Oknem na severu vidis cestu pryc. ",
    0,
    0,
    JIH+VYCHOD+ZAPAD,
    0,
    0
   ,
   "Nachazis se ve stare kuchyni. Urcite se tu uz mnoho desitek let nevarilo. ",
    0,
    0,
    ZAPAD,
    0,
    0
   ,
   "Stojis v rohove chodbe. Mramorova podlaha je pokryta prachem. ",
    0,
    0,
    JIH+VYCHOD,
    0,
    0
   ,
   "Dlouha chodba sever-jih. Na zapade je pruchod do jine chodby. ",
    0,
    0,
    SEVER+JIH+ZAPAD,
    0,
    0
   ,
   "Blize neidentifikovatelna mistnost. ",
    1,
    "Pro samou tmu vsak nevidis zadny jiny vychod. ",
    SEVER,
    "Na vychode jsou otevrene dvere. ",
    SEVER+VYCHOD
   ,
   "Jsi pravdepodobne v byvalem pokoji sluzebnictva. Jsou tu dve postele a dubovy stul. Na jihu jsou uzamcene dvere. ",
    0,
    0,
    ZAPAD,
    0,
    0
   ,
   "Nachazis se v loznici pana domu. Vsechen nabytek je odvezen, pouze postel zustala. ",
    0,
    0,
    SEVER,
    0,
    0
   ,
   "Stred dlouhe chodby sever-jih. Na vychode jsou dvere. ",
    0,
    0,
    SEVER+JIH+VYCHOD,
    0,
    0
   ,
   "Prijimaci salonek. Zbyla tu jen zidle a obraz. ",
    0,
    0,
    JIH+VYCHOD+ZAPAD,
    0,
    0
   ,
   "Dlouhy stul bez zidli prozrazuje, ze se jedna o jidelnu. Na sever jsou uzamcene dvere. ",
    0,
    0,
    ZAPAD,
    0,
    0
   ,
   "Jsi VENKU a tim jsi uspesne zakoncil tuto demonstracni hru. ",
    0,
    0,
    0,
    0,
    0
   ,
   "Konec chodby sever-jih. Chodba drive pravdepodobne pokracovala na zapad. Ted je tam vsak ",
    1,
    "drevena stena, jejimiz sparami prosvita denni svetlo. ",
    SEVER,
    "prohorela drevena stena, za niz vidis denni svetlo. ",
    SEVER+ZAPAD
   ,
   "Kamenna chodba, kterou se chodilo do staji ke konim. Steny jsou vlhke. ",
    1,
    "Na vychode jsou uzamcene dvere. ",
    SEVER,
    "Dvere na vychode jsou odemceny. ",
    SEVER+VYCHOD
   ,
   "Stojis ve stajich. Je tu obrovske mnozstvi slamy. ",
    0,
    0,
    ZAPAD,
    0,
    0
   
;

struct predmet datap[PREDMETU]= 
   "reklamu",
    16,JDEVZIT,
    "Programujte v Cecku!",
    17,TYP_NIC,0,
    0
   ,
   "baterku",
    1,JDEVZIT,
    "Ve tme by se mohla hodit.",
    6,TYP_MIST,0,
    "Baterka se rozsvitila."
   ,
   "sirky",
    7,JDEVZIT,
    "Neco s nimi tak zapalit!",
    15,TYP_PRED,4,
    "Zapalil jsi jeden z baliku slamy."
   ,
   "klic",
    8,JDEVZIT,
    "Klic od nejakych dveri.",
    14,TYP_MIST,0,
    "Odemkl a otevrel jsi dvere."
   ,
   "horici balik slamy",
    17,JDEVZIT,
    "Je to balik slamy, ktery je zapaleny. :-)",
    13,TYP_MIST,0,
    "Polozil jsi slamu ke drevene stene, ta po chvili prohorela."
   ,

   "sla",
    0,NEJDEVZIT,
    "Fuj! Radeji na ni ani nesahej.",
    17,TYP_NIC,0,
    0
   ,
   "ste",
    1,NEJDEVZIT,
    "Ta bila je uz spise cerna.",
    17,TYP_NIC,0,
    0
   ,
   "vra",
    1,NEJDEVZIT,
    "Nemas sanci je otevrit nasilim.",
    17,TYP_NIC,0,
    0
   ,
   "okn",
    2,NEJDEVZIT,
    "Velmi male okenko. Nemas sanci prolezt.",
    17,TYP_NIC,0,
    0
   ,
   "pos",
    7,NEJDEVZIT,
    "Zbyl jen mosazny ram.",
    17,TYP_NIC,0,
    0
   ,
   "stu",
    7,NEJDEVZIT,
    "Ma tri nohy.",
    17,TYP_NIC,0,
    0
   ,
   "dve",
    7,NEJDEVZIT,
    "Tezke vyrezavane dvere.",
    17,TYP_NIC,0,
    0
   ,
   "pos",
    8,NEJDEVZIT,
    "Stara bukova postel. Matrace chybi.",
    17,TYP_NIC,0,
    0
   ,
   "zid",
    10,NEJDEVZIT,
    "Ma jednu nohu.",
    17,TYP_NIC,0,
    0
   ,
   "obr",
    10,NEJDEVZIT,
    "Kouka na tebe ksicht nejakyho strejdy.",
    17,TYP_NIC,0,
    0
   ,
   "stu",
    11,NEJDEVZIT,
    "Neni na nem nic zvlastniho. Az na to, ze nema ani jednu nohu.",
    17,TYP_NIC,0,
    0
   ,
   "dve",
    11,NEJDEVZIT,
    "Tezke vyrezavane dvere bez kliky.",
    17,TYP_NIC,0,
    0
   ,
   "ste",
    13,NEJDEVZIT,
    "Velmi suche drevo.",
    17,TYP_NIC,0,
    0
   ,
   "dve",
    14,NEJDEVZIT,
    "Dirka pro klic laka...",
    17,TYP_NIC,0,
    0
   ,
   "sla",
    15,NEJDEVZIT,
    "Pekne proschla a vonava(!?).",
    17,TYP_NIC,0,
    0
   
;


void Tiskniuvod() 
    printf("\n          Minitextovka  DUUM\n      jako demonstrace jazyka  C\n   Naprogramovano na pocitaci AMIGA\n       pro pocitace ATARI XL/XE\n       Napsano pro casopis FLOP\n         (c)1994 Jiri Svoboda\n               FREEWARE\n\n");
    printf("Prikazy: sever, jih, vychod, zapad,\n         zkoumej, vezmi, pouzij,\n         inventar, situace, konec\n");
    printf("\n29.12.1997: Opraveno nekolik chyb a\nzkompilovano pod MS Visual C++ 5.0.\n06.07.1999: Zkompilovano GCC pod Linux.\n08.01.2001: KONECNE zkompilovano pro\nATARI diky 'cc65' pod Linuxem!\n");
    printf("20.04.2001: Posledni revize.\n");


void Situace() 
    char i;
    printf("\n%s",datam[tedmistnost].popis0);
    switch (datam[tedmistnost].uroven) 
        case 1: printf("%s",datam[tedmistnost].popis1);
                break;
        case 2: printf("%s",datam[tedmistnost].popis2);
    
    for (i=0;i<PREDMETU;i++)
        if ((datap[i].typ==JDEVZIT) && (datap[i].pozice==tedmistnost)) 
            printf("Vidis tady lezet %s.\n",datap[i].jmeno);
            return;
        
    printf("\n");



void Ctiprikaz() 
    char i,znak;
    for (i=0;;i++) 
        if (i>29) i=29;
        znak=getchar();
        if (znak==EOL) break;
        if ((znak>64) && (znak<91)) znak+=32;
        prikaz[i]=znak;
    
    prikaz[i]=0;



void Rozeberprikaz() 
    char i=0;
    char j;
    sloveso[0]=podstjm[0]=0;
    
    while (prikaz[i]==' ') i++;
    if (prikaz[i]==0) return;
    j=0;
    while ((prikaz[i]!=0) && (prikaz[i]!=' ') && (j<3)) 
        sloveso[j]=prikaz[i];
        i++;
        j++;
    
    sloveso[j]=0;
    while ((prikaz[i]!=0) && (prikaz[i]!=' ')) i++;
    
    while (prikaz[i]==' ') i++;
    if (prikaz[i]==0) return;
    j=0;
    while ((prikaz[i]!=0) && (prikaz[i]!=' ') && (j<3)) 
        podstjm[j]=prikaz[i];
        i++;
        j++;
    
    podstjm[j]=0;



char Porovnej(string1,string2)
char string1[4],string2[4];

    char i;
    for (i=0;i<3;i++)
        if (string1[i]!=string2[i]) return 0;
    return 1;



char Jdi(smer)
char smer;

    char vychody;
    
    if (datam[tedmistnost].uroven==2)
        vychody=datam[tedmistnost].vychody2;
    else
        vychody=datam[tedmistnost].vychody1;
    
    if (vychody&smer) 
        switch(smer) 
            case SEVER:  tedmistnost-=4;
                         break;
            case JIH:    tedmistnost+=4;
                         break;
            case VYCHOD: tedmistnost+=1;
                         break;
            case ZAPAD:  tedmistnost-=1;
        
        Situace();
    
    else
        printf("Nemuzes jit tim smerem.\n");

    if (tedmistnost==konmistnost) 
        printf("Gratuluji!!! Jsi venku a tudiz jsi vyhral!\n");
        return 1;
    
    return 0;



void Zkoumej() 
    char i;
    for (i=0;i<PREDMETU;i++)
        if (((datap[i].pozice==tedmistnost) || (datap[i].pozice==16)) && (Porovnej(podstjm,datap[i].jmeno))) 
            printf("%s\n",datap[i].zkoumej);
            return;
        
    printf("Nemohu to zkoumat.\n");



void Vezmi() 
    char i;
    for (i=0;i<PREDMETU;i++)
        if ((datap[i].pozice==tedmistnost) && (datap[i].typ==JDEVZIT) && (Porovnej(podstjm,datap[i].jmeno))) 
            datap[i].pozice=16;
            printf("Vzal jsi %s.\n",datap[i].jmeno);
            return;
        
    printf("Nemohu to vzit.\n");



void Pouzij() 
    char i;
    for (i=0;i<PREDMETU;i++)
        if ((datap[i].pozice==16) && (datap[i].mistpouziti==tedmistnost) && (Porovnej(podstjm,datap[i].jmeno))) 
            datap[i].pozice=17;
            printf("%s\n",datap[i].pouzij);
            switch (datap[i].prikpouziti) 
                case TYP_MIST: datam[tedmistnost].uroven=2;
                               break;
                case TYP_PRED: datap[datap[i].datapouziti].pozice=tedmistnost;
            
            return;
        
    printf("Zadny uspech.\n");



void Inventar() 
    char i;
    printf("\nNeses sebou ");
    for (i=0;i<PREDMETU;i++)
        if (datap[i].pozice==16) 
            if (i>0) printf(", ");
            printf("%s",datap[i].jmeno);
        
    printf(".\n");



char Vykonejprikaz() 
    if (Porovnej(sloveso,"kon")) return 1;

    if (Porovnej(sloveso,"sev")) return Jdi(SEVER);
    if (Porovnej(sloveso,"jih")) return Jdi(JIH);
    if (Porovnej(sloveso,"vyc")) return Jdi(VYCHOD);
    if (Porovnej(sloveso,"zap")) return Jdi(ZAPAD);

    if (Porovnej(sloveso,"zko")) 
        Zkoumej();
        return 0;
    
    if (Porovnej(sloveso,"vez")) 
        Vezmi();
        return 0;
    
    if (Porovnej(sloveso,"pou")) 
        Pouzij();
        return 0;
    

    if (Porovnej(sloveso,"inv")) 
        Inventar();
        return 0;
    
    if (Porovnej(sloveso,"sit")) 
        Situace();
        return 0;
    
    printf("Nerozumim slovesu.\n");
    return 0;



void main() 
    Tiskniuvod();
    Situace();
    do 
        printf("\nTvuj prikaz: ");
        Ctiprikaz();
        Rozeberprikaz();
     while (Vykonejprikaz()==0);
    printf("\nEnter...\n");
    getchar();

