Dungeons
Home Nach oben

 

Nach oben
Dungeons
Detailmap
Einführung
Multitexture Terrain
Plantbox
Aussenlevel (Block)
Tag & Nachtwechsel
KI
Waving Grass
Framerate

Dungeons

Wichtig für jedes Fantasy Rollenspiel sind Dungeons um ausreichend Erfahrungspunkte für das Leveln zu erhalten. Da ich das Spiel primär für mich selbst entwickle scheiden vorgefertigte Dungeons weitgehend aus und eine besondere Herausforderung ist die automatische Generierung der Spielewelt.

Erstellung eines automatisch gefüllten Raum im Dungeon

Markierung des Raumes mit der Positionsflagge

Jeder Raum wird mit einer Positionsflagge markiert, die genau in der Mitte platziert wird. In den Skills ist die ID der Flagge, die Breite des Raumes, die Länge des Raumes und der Drehwinkel hinterlegt. Dadurch kann der Raum angesprochen werden und das Einsetzscript weiß über die entsprechenden Ausdehnungen bescheid.

 

Bild: Standardraum des Dungeons mit Positionsflagge in der Mitte

SKILL1 = ID, SKILL2= Breite, SKILL3 = Länge, SKILL4 = 90 Grad Drehung

Der Raum ist jetzt markiert und das Markierungsflag wird jetzt mit der Action ITEM_LOCATION verbunden. Diese Aktion enthält die Steuerschleife des Raumes.

 

Der Aktionsstack

Innerhalb des Spieles ist ein Stack hinterlegt in dem Aktionen für die Markierungsflaggen abgelegt werden können. Diese Markierungsflaggen prüfen periodisch über die verbundene Aktion ITEM_LOCATION ob für Ihre ID eine Aktion auf dem Stack vorhanden ist.

var locstack_id[1000];                // Ablage der Flaggenid für die Aktion auf dem Stack
var locstack_action[1000];        // Beschreibung der Aktion (z.B. 100 Setze Monster ein, 250 Erzeuge Raum)
var locstack_info1[1000];          // Zusatzinformationen:
var locstack_info2[1000];          // z.B. ID des Raumtypes oder ID des Monsters
var locstack_info3[1000];          // z.B. Anzahl der einzsetzenden Monster
var locstack_info4[1000];

 

Der Aktionsstack kann jetzt aus jedem Bereich des Programmes beliebig gefüllt werden und mit der eingestellten Verzögerung (abhängig von der Wartezeit in der Aktion ITEM_LOCATION) wird die Aktion vom Stack gelesen und ausgeführt.

Beispiel: Füge Gegenstand bei der Positionsflagge ein

slot=locstack_init(502,125);                                   // Aktion 125 Füge Gegenstand ein für Flagge ID 502
locstack_setinfo1(slot,9100,"ring001.mdl");         // Fülle info1 und info2 mit der ID des Gegenstandes und 
                                                                                   // dem Modell   
locstack_setinfo2(slot,0.25,0);                               // Fülle info3 und info4 mit Skalierungsfaktor und NULL

Die Aktion ITEM_LOCATION wird jetzt automatisch den Gegenstand einsetzen.

 

Raum automatisch befüllen

Umfangreicher als das Einsetzen von Monstern und Gegenständen ist das automatische Befüllen eines Raumes mit Möbeln. Die Befüllung wird über den Aktionsstack gesteuert und kann wieder zu jedem Zeitpunkt des Spieles angestossen werden.

Beispiel: Starte automatischen Raumaufbau an der Positionsflagge 502

slot=locstack_init(502,250);
locstack_setinfo1(slot,1,0);        // info1 enthält den Raumtyp

 

Der Raumtyp gibt die als eigene Scripten vorgefertigten Räume an. Mit dieser Information kann dann die Erstellung um die Positionsflagge angestossen werden. Die Abmessungen der Gegenstände im Raum sind bekannt und auch die Abmessungen des Raumes sind in der Positionsflagge gespeichert.

Diese Informationen werden dem Erstellungsscript zugeführt und der Raum danach möbliert.

Beispiel: Script zum automatischen Füllen eines rechteckigen Raumes

function create_room1(roomx,roomy,rotate) {
    var pos;
    var rot;

    rot.pan=rotate;

    // Setze Regal ein
    pos.x=-72;                                // Setze Position des Regals mit den bekannten Abmessungen
    pos.y=((roomx/2*16)-20);
    pos.z=0;
    vec_rotate(pos,rot);                // Drehe Regal um die Raumrotation
    vec_add(pos,my.x);                // Verschiebe das Regal mit den Koordinaten der Positionsflagge
    nent=ent_create("regal.mdl",pos, null);
    nent.pan=rotate;                      // Drehe Regal dass es auf die Raumwand ausgerichtet ist

    // Setze Bett ein
    pos.x=((roomy/2*16)-96);
    pos.y=((roomx/2*16)-44);
    pos.z=0;
    vec_rotate(pos,rot);
    vec_add(pos,my.x);
    nent=ent_create("bett.mdl",pos, item_bett);
    nent.pan=rotate;
    wait(1);

    // Setze Tisch ein
    pos.x=0;
    pos.y=-((roomx/2*16)-40);
    pos.z=0;
    vec_rotate(pos,rot);
    vec_add(pos,my.x);
    nent=ent_create("tisch.mdl",pos, null);
    nent.pan=rotate;
    wait(1);

    // Setze Truhe ein
    pos.x=((roomy/2*16)-24);
    pos.y=0;
    pos.z=0;
    vec_rotate(pos,rot);
    vec_add(pos,my.x);
    nent=ent_create("truhe001.mdl",pos, panel_item);
    nent.pan=90+rotate;

    // Truhe ist verschlossen
    nent.skill19=1;

    // Fülle Truhe automatisch
    var h;
    h=handle(nent);
    create_fill_truhe(h); 
}

Für das befüllen von Truhen und Regalen sind weitere vorgefertigte Scripten vorhanden, die dann Gegenstände abhängig vom Level des Spielers und der Schwierigkeit des Dungeons erzeugen.

Bild: Das Ergebnis ist ein Raum gefüllt mit Bett, Tisch, Truhe und Regal