Plantbox
Home Nach oben

 

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

Plantbox

Das Problem bei großen Außenlandschaften ist die einfache Befüllung mit Bepflanzung. Dies wird in dem Projekt
Darkmountain mit Hilfe der "Plantbox" gelöst.

Für die Plantbox wird eine einheitliche Fläche in einem eigenständigen Projekt mit Pflanzen befüllt. Die Daten
der Modelle (Modellname, Position und Skalierung) werden anschließend in die INI-Datei der Plantbox ge-
schrieben.

Bild: Bepflanzung der Grundfläche der Plantbox

Generierte INI-Datei der Plantbox mit den Daten Modellname, X-Position, Y-Position, Z-Position und
Skalierungsfaktor 

CD15_TREE03.MDL,384,224,-8,0.500,CD15_TREE13.MDL,208,96,0,0.500,PINETR2.MDL,696,136,-8,5,SHRUB3.MDL,
208,464,0,1,SHRUB3.MDL,512,432,0,1,SHRUB3.MDL,448,664,0,1,SHRUB3.MDL,608,640,0,1,SHRUB3.MDL,
280,64,0,1,SHRUB2.MDL,112,600,0,1,SHRUB2.MDL,520,616,0,1,SHRUB2.MDL,432,392,0,1,SHRUB2.MDL,
352,72,0,1,SHRUB2.MDL,624,144,0,1,SHRUB2.MDL,128,176,0,1,FERN1.MDL,64,648,0,1,FERN1.MDL,
136,112,0,1,FERN1.MDL,296,544,0,1,FERN1.MDL,560,672,0,1,FERN1.MDL,120,328,0,1,FERN1.MDL,
320,248,0,1,FERN1.MDL,456,440,0,1,FERN1.MDL,632,264,0,1,FERN1.MDL,344,696,0,1,FERN1.MDL,
648,520,0,1,FERN1.MDL,592,88,0,1,CD15_TREE03.MDL,608,368,-8,0.600,CD15_TREE13.MDL,
88,424,8,0.550,PINETR1.MDL,376,520,0,5,CD15_TREE13.MDL,656,704,8,0.500,CD15_TREE03.MDL,
120,648,8,0.699,

Für die Plazierung der Plantbox muss ein Modell mit den Exakten Ausmaßen der bepflanzten Fläche erstellt
werden. Dieses Modell kann jetzt beliebig innerhalb des Levels platziert werden.

Bild: Platzierung der Plantbox im Level

Der Block wird nach der Generierung der Pflanzen automatisch wieder gelöscht. Innerhalb der Block-
Ausmaße wird die vorher erstellte Bepflanzung erstellt.  

Bild: Plantbox im Level

 

Source zur Erstellung der Plantbox:

Nachfolgender Source muss innerhalb des Projektes eingefügt werden in den die Pflanzen
für die Plantbox erstellt werden.

// Die Funktion INIT_TREEBOX liest alle Entities des aktuellen Levels zur
// Verarbeitung in der Plantbox


init_treebox_buffer();

// Die Funktion WRITE_BUFF schreibt die Daten der Entities in eine
// INI-Datei


write_buff("pb_seegras.ini");

Source zum Einfügen der Plantbox in das Projekt:

Nachfolgende Aktion muss dem Platzhalter der Plantbox zugewiesen werden. Dadurch wird an
der Stelle der Box die Bepflanzung erstellt.

ACTION plantbox {

    // Die Routine READ_BUF liest die Daten aus der INI-Datei und erstellt die Entities
    // an der Stelle des Plantbox-Modells

    read_buff(my.x,my.y,my.z,0);
    sleep(10);

    // Lösche den Platzhalter der Plantbox
    ent_remove(my);

}

 

Sourcelisting Plantbox:

// Buffer der Entities im Projekt
var treeboxhandle[10000];
var treeboxcount=0;

String treebox_dtxt1[256];
String treebox_dtxt2[256];
String wbuf[255];

entity* treeboxbufferent;

//
// Lese alle Entities in den Buffer
//
function init_treebox_buffer() {
    treeboxbufferent = ent_next (NULL); 
    while (treeboxbufferent != NULL) { 
        str_for_entname (treebox_dtxt1, treeboxbufferent); 
        treeboxhandle[treeboxcount]=handle(treeboxbufferent);
        treeboxcount+=1;
        treeboxbufferent = ent_next (treeboxbufferent);
    }
}


//
// Schreibe die Entitieinformationen in die übergebene Datei
//
function write_buff(filename) {
    var filehandle;

    filehandle = file_open_write (filename);

    var i=0;
    while(i<treeboxcount) {
        treeboxbufferent=ptr_for_handle(treeboxhandle[i]);
        str_for_entfile(wbuf,treeboxbufferent); 
        str_cat(wbuf,",");
        file_str_write(filehandle,wbuf);
        str_for_num(wbuf,treeboxbufferent.x);
        str_cat(wbuf,",");
        file_str_write(filehandle,wbuf);
        str_for_num(wbuf,treeboxbufferent.y);
        str_cat(wbuf,",");
        file_str_write(filehandle,wbuf);
        str_for_num(wbuf,treeboxbufferent.z);
        str_cat(wbuf,",");
        file_str_write(filehandle,wbuf); 
        str_for_num(wbuf,treeboxbufferent.scale_x);
        str_cat(wbuf,",");
        file_str_write(filehandle,wbuf);
        i=i+1;
    }
    file_close(filehandle);
}

//
// Lese die übergebene INI-Datei und erzeuge an den übergebenen Koordinaten
// die in der Datei enthaltenen Pflanzen
//
String tb_nbuf[255];
entity* tb_hent;

function read_buff(xoff,yoff,zoff,filename) {
    var filehandle;

    filehandle = file_open_read(filename);

    var counter=0;
    var hpos;
    var scale;

    while(file_str_read(filehandle,wbuf)!=-1) {
        if(counter==0) {
            str_cpy(tb_nbuf,wbuf);
        }
        if(counter==1) {
            hpos.x=str_to_num(wbuf);
        }
        if(counter==2) {
            hpos.y=str_to_num(wbuf);
        }
        if(counter==3) {
            hpos.z=str_to_num(wbuf);
        }
        if(counter==4) {
            scale=str_to_num(wbuf);

            hpos.x=hpos.x+xoff;
            hpos.y=hpos.y+yoff;
            hpos.z=hpos.z+zoff;
            // Der erzeugten Pflanze wird ein Script zugewiesen, dass die Pflanze
            // automatisch auf dem Boden platziert
            tb_hent=ent_create(tb_nbuf,hpos,script_plant_on_terrain); 
            tb_hent.scale_x=scale;
            tb_hent.scale_y=scale;
            tb_hent.scale_z=scale;
            counter=-1;
        }
        counter+=1; 
    }
}