AWKenture

Vor längerem habe ich ein wenig AWK Know-How aufgebaut und es in ein kleines Text-Adventure fliessen lassen.
Viel Spaß dabei....

#!/usr/bin/gawk -f
#Aufruf von der Kommandozeile mit “./prog.awk prog.dat”
#11-07-2007

BEGIN{
   printf("\f\n-- Herzlich Wilkommen zum AKWenture.\n Benutze: look - look bag - get - nosw - help\n\n")

   bag[0]=2                # bag-Array beschreibt Gegenstaende im Inventar
   bag[1]=“Wuerfel”        # bag[0]=Anzahl der Gegenstaende im Inventar
   bag[2]=“Muenze”         # bag[x]=[Objekt]

   items[1,0]=4            # items-Array beschreibt Gegenstaende pro Raum items[<raumnr.>,“<itemnr.>”]=item
   items[1,1]=“Kaugummi”   # an Position items[x,0] steht immer die Anzahl der Gegenstaende im Raum x.
   items[1,2]=“Schraube”
   items[1,3]=“Feder”
   items[1,4]="rostiger Schluessel"
   items[2,0]=2
   items[2,1]=“Visier”
   items[2,2]=“Vogel”
   items[3,0]=1
   items[3,1]=“Klavier”

       


       
   # getlimit-Array
       
   getlimit[“klavier”]=1
       
   # Description Array - Beschreibt die Objekte
   descr[“kaugummi”]=sprintf("Die ist ein bereits gekauter Kaugummi. Himbeer-Geschmack.\n)
   descr[”schraube“]=sprintf(”Dies ist eine gew????iche Schraube aus Metall.\n)
   descr[”feder“]=sprintf(”Dies ist eine Feder aus einem Kugelschreiber. \n)
   descr[”visier“]=sprintf(”Ein kleines Visier, passend zu einem Schnabel von einem Vogel. \n")
   descr[“vogel”]=sprintf(“Ein kleiner Spatz. Er piept! \n)
   descr[“klavier”]=sprintf(“Ein alter Steinway - Unbezahlbar!\n)  

   keys[“rostiger schluessel”]=9

   door[1,“s”]=2        # door-Array beschreibt Tueren pro Raum: door[<raumnr.>,“<richtung>”]=<zielraum>
   door[2,“s”]=3
   door[2,“n”]=1
   door[3,“n”]=2
   door[3,“e”]=0        # secret or hidden door
   door[3,“w”]=255      # exit

   keylock[1,“s”]=0     # keylock-Array definiert welche Tuer mit welchem Schluessel geoeffnet wird
   keylock[2,“n”]=0     # Muster: keylock[<raumnr.>,“<richtung>”]=<keynr.>
   keylock[2,“s”]=0
   keylock[3,“n”]=0
   keylock[3,“e”]=0
   keylock[3,“w”]=9

   lock[1,“s”]=0        # lock-Array: Speichert den Zustand jeder Tuer. 0-offen, 1-geschlossen
   lock[2,“s”]=0        # lock[<raumnr.>,“<richtung>”]=zustand
   lock[2,“n”]=0
   lock[3,“n”]=0
   lock[3,“e”]=1
   lock[3,“w”]=1

   # action-Array: Beschreibt Informationen die in einem Raum angezeigt werden, wenn Kommando ‘look’ benutzt wird.
   # action[<raumnr.>,“<kommando>”]=sprintf(“<Info-Text>”)

   action[1,“look”]=sprintf("Es befindet sich eine Tuer im Sueden.\n)
   action[2,”look“]=sprintf(”Es befindet sich eine Tuer im Sueden und eine im Norden.\n)
   action[3,”look“]=sprintf(”Es befindet sich eine Tuer im Norden und im Westen\n")
   
   # text-Array: Beschreibt Informationen die angezeigt werden, wenn ein bestimmtes Ereignis auftritt.
   # text[<raumnr.>,“<EREIGNIS>”]=sprintf(“<Info-Text>”)
 
   text[1,“ENTER”]=sprintf("Sie befinden sich in Raum 1\n)
   text[2,”ENTER“]=sprintf(”Sie befinden sich in Raum 2\n)
   text[3,”ENTER“]=sprintf(”Sie befinden sich in Raum 3\n)
   text[255,”ENTER“]=sprintf(\nPRIMA! Sie haben es geschafft!\nENDE\n")

   # combi-Array: Beschreibt welches Objekt mit einem anderen interagieren kann.
   # combi[<item1>,<item2>]=action
   combi[items[2,1],items[2,2]]=“newobject#MotoVogel”
   combi[items[2,2],items[2,1]]=“newobject#MotoVogel”
   
   combi[items[1,1],items[3,1]]="changedescr#Ein ekelhafter Steinway mit Kaugummi dran! Pfui!“
   combi[items[3,1],items[1,1]]=”changedescr#Ein ekelhafter Steinway mit Kaugummi dran! Pfui!"
   
   startrom=1
   actualrom=1
   state=idle
}

### NAVIGATION ###
tolower($0)~/^[nesw]$/{
        if($0==“n”){ print “Du gehst nach Norden.”}
        if($0==“o”){ print “Du gehst nach Osten.”}
        if($0==“s”){ print “Du gehst nach Sueden.”}
        if($0==“w”){ print “Du gehst nach Westen.”}
        if(door[actualrom,$1]>0){
                if(lock[actualrom,$1]){
                        printf("Die Tuer ist verschlossen!\n")
                }else{
                        pass(actualrom,door[actualrom,$1])
                }
        }else{
                printf("...es geht aber nicht weiter nach %s\n",$1)
        }
}

#/^[Ll][Oo][Oo][Kk]$/{printf(“There is nothing to look at.\n”)}
### LOOK ###
tolower($0)~/^look$/{
        printf(action[actualrom,“look”])
        if(items[actualrom,0]>0)print(\nFolgende Gegenstaende befinden sich in diesem Raum:”)
        for(j=1;j<items[actualrom,0]+1;j++){
                if(length(items[actualrom,j])>0)printf(“ %s\n,items[actualrom,j])

        }
                printf \n
               
}
### LOOK BAG ###
tolower($0)~/^look bag$/{
        if(countelem(bag)>0){
                printf("Sie haben %d Gegenstaende in der Tasche:\n",bag[0])
                for(j=1;j<bag[0]+1;j++){
                        printf(“%d. %s\n,j,bag[j])
                }
        }
}
### LOOK OBJECT ###
tolower($0)~/^look .*$/{
                if(tolower($2)!=“bag”){
                        retcode=1
                        if(items[actualrom,0]>0){
                                for(j=1;j<items[actualrom,0]+1;j++){
                                        if(tolower($2)==tolower(items[actualrom,j])){
                                                print descr[tolower($2)]
                                        }
                                }                              
                        }              
                       
                        #if(countelem(bag)>0){
                        #               printf("Sie haben %d Gegenstaende in der Tasche:\n",bag[0])
                #                       for(j=1;j<bag[0]+1;j++){
                #                                       printf(“%d. %s\n”,j,bag[j])
                #                       }
                #       }
                        for(j=1;j<bag[0]+1;j++){
                                if(tolower($2)==tolower(bag[j])){
                                        print descr[tolower($2)]
                                }
                        }
                }
}
### GET OBJECT ###
tolower($0)~/^get .*$/{
                if(tolower($3)!=“schluessel”){
                        retcode=1                      
                        if(getlimit[tolower($2)]==0){
                                for(j=1;j<items[actualrom,0]+1;j++){                                   
                                                if(tolower($2)==tolower(items[actualrom,j])){
                                                                bag[bag[0]+1]=items[actualrom,j]
                                                                bag[0]++
                                                                items[actualrom,j]=items[actualrom,items[actualrom,0]]
                                                                items[actualrom,0]--
                                                                printf("Sie haben den Gegenstand genommen. %s\n",bag[bag[0]])
                                                                retcode=0
                                                                break
                                                }
                                }
                        }else{
                                printf("Der Gegenstand %s kann nicht genommen werden.\n",$2)
                                retcode=0
                        }
                        if(retcode)printf("Ich kann das Objekt nicht finden!\n")
                }
}

### GET KEY ###
tolower($0)~/^get .<strong> schluessel$/{
        retcode=1
        for(j=1;j<items[actualrom,0]+1;j++){
                if(tolower($2 " " $3)==tolower(items[actualrom,j])){
                        bag[bag[0]+1]=items[actualrom,j]
                        bag[0]++
                        items[actualrom,j]=items[actualrom,items[actualrom,0]]
                        items[actualrom,0]--
                        printf("Du hast den %s genommen.\n",bag[bag[0]])
                        retcode=0
                        break
                }
        }
        if(retcode)printf("Konnte den Schluessel nicht finden!\n")
}

### PUT OBJECT ###
tolower($0)~/^put .*$/{
        retcode=1
        for(j=1;j<bag[0]+1;j++){
                if(tolower($2)==tolower(bag[j])){
                        items[actualrom,items[actualrom,0]+1]=bag[j]
                        items[actualrom,0]++
                        bag[j]=bag[bag[0]]
                        bag[0]--
                        printf("Du hast den Gegenstand abgelegt: %s\n",items[actualrom,items[actualrom,0]])
                        retcode=0
                        break
                }
        }
        if(retcode)printf("In Deiner Tasche befindet sich dieser Gegenstand nicht!\n)
}
### PUT <qual> SCHLUESSEL ###
tolower($0)~/^put .</strong> schluessel$/{
        retcode=1
        for(j=1;j<bag[0]+1;j++){
                if(tolower($2 ” " $3)==tolower(bag[j])){
                        items[actualrom,items[actualrom,0]+1]=bag[j]
                        items[actualrom,0]++
                        bag[j]=bag[bag[0]]
                        bag[0]--
                        printf("Du hast den Schluessel abgelegt: %s\n",items[actualrom,items[actualrom,0]])
                        retcode=0
                        break
                }
        }
        if(retcode)printf("In Deiner Tasche befindet sich dieser Gegenstand nicht!\n")
}

### USE KEY WITH DOOR ###
###tolower($0)~/^use .<strong> .</strong> with door [nosw]$/{
tolower($0)~/^use .<strong> .</strong> with door [nosw]$/{
        # Identify Object
        retcode=1
        for(j=1;j<bag[0]+1;j++){
                if(tolower($2 “ ” $3)==tolower(bag[j])){
                        if(door[actualrom,$6]>0){   # Tuer existiert auch
                                if(keylock[actualrom,$6]==keys[tolower($2 “ ” $3)]){
                                        unlock(actualrom,$6)
                                        retcode=0
                                        break
                                }else{
                                        printf("%s %s passt nicht zur Tuer %s in Raum %d.\n",$2,$3,$6,actualrom)
                                        retcode=0
                                        break
                                }
                        }else{
                                printf("Tuer %s in Raum %d gibt es nicht.\n",$6,actualrom)
                                retcode=0
                                break
                        }
                }
        }
        if(retcode)printf("Du besitzt diesen Schl0ssel nicht!\n")
}

### USE OBJ1 WITH OBJ2 ###
tolower($0)~/^use .* with .*$/{
        if(tolower($3)!=“schluessel”){
                printf("Du versuchst %s mit %s zu benutzen!\n",$2,$4)
                obj1=0;obj2=0;combinated=0
                for(j=1;j<bag[0]+1;j++){
                        if(tolower($2)==tolower(bag[j])){
                                obj1=1
                                geg1=bag[j]
                        }
                        if(tolower($4)==tolower(bag[j])){
                                                        obj2=1
                                geg2=bag[j]
                                        }
                }
                if(obj1==0){
                        printf("Du besitzt das Objekt %s nicht!\n",$2)
                }
                if(obj2==0){
                                        printf("Du besitzt das Objekt %s nicht!\n",$4)
                        }
                if(obj1==1&&obj2==1){
                        split(combi[geg1,geg2],v,“#”)
                        if(v[1]==“newobject”){
                                ret=newObject(v[2])
                                combinated=1
                        }
                        if (!combinated){ printf(“Du kannst die Gegenstaende nicht miteinander benutzen!\n)}
                }else{
                         printf("Das geht nicht!\n")
                }
        }
}

### ABORT GAME ###
tolower($0)~/^quit|exit|bye|by|end$/{
        printf(\f)
        exit 0

}

### SHOW HELP ###
tolower($0)~/^info|help|?$/{
        printf(“Kommandos:\nlook\nlook bag\nn|e|s|w\nget [object]\nget [quali] schluessel\nput [object]\nput [quali] schluessel\n)
        printf("use [quali] schluessel with door [n|e|s|w]\n)
        printf(”quit|exit|bye|by|end\n\n)
}

#/^[^[Ll][Oo][Oo][Kk]$]/{print ”Du befindest dich in Raum“ actualrom }

######## FUNCTION BLOCK #########

function unlock(rom,dir){
        if(lock[rom,dir]>0){
                lock[rom,dir]=0
                printf(”Raum %d Tuer in Richtung %s wurde aufgeschlossen.\n",rom,dir)
        }else{
                lock[rom,dir]=1
                printf("Raum %d Tuer in Richtung %s wurde abgeschlossen.\n",rom,dir)
        }
}

function pass(old,new){
   actualrom=new
   printf(text[actualrom,“ENTER”])
   if(new==255) exit
}

function countelem(arr){
    x=0
    for(i in bag){
        if(length(i)>0){ x+=1}
    }
    return x
}

function newObject(obj){
        a=items[actualrom,0]
        items[actualrom,a+1]=obj
        items[actualrom,0]=a+1
        printf("Es erscheint ein %s in dem Raum!\n",obj)
        return 0
}
function changedescr(){
       
        }

 

Trackbacks

    Keine Trackbacks

Kommentare

Ansicht der Kommentare: (Linear | Verschachtelt)

    Noch keine Kommentare


Die Kommentarfunktion wurde vom Besitzer dieses Blogs in diesem Eintrag deaktiviert.