1.0 Einführung 

2.0 Die Anfänge

3.0 Der Hauptscript

4.0 Move-Script

5.0 Kamera

6.0DorfbewohnerKI

7.0 Erste Waffen

8.0 Panels

9.0 Der erste Quest

10.0 Partikel

11.0 Menü

12.0 Abschließung

13.0 Downloads

14.0 Codesammlung

15.0 Frei Belegbare

Steuerung

6.0Dorfbewohner KI

Der Ki ist grundsätzlich etwas sehr schweres! Eigentlich sogar einer der schwersten Sachen die es im WDL gibt! Nun hier versuche ich ein paar Sachen über einen schönen einfachen KI zu klären!

Als erstes: Ich denke das für die Dorfbewohner ein einfach Path reicht! Vor allem für z.B. Wachen die eigentlich eh immer den gleichen Weg gehen! Auch in Echt; Für die normalen Dorfbewohner werden wir hier am Anfang auch nur einen Path machen! Wie bei vielen Morrowind werden wir es so machen das ein paar Leute in ihren Häusern stehen und dort auf den Spieler warten! Die Bewohner die draußen sind werden sich natürlich bewegen können!

Nun muss man natürlich auch noch Geld ausgeben können! Daher werden wir einen Händler machen mit dem man sich unterhalten und noch Massen an Geld ausgeben kann!

6.1 Das Pathfinding!

6.2 Dialogsystem

Ein Dialogsystem ist ja eigentlich für jeden "echtes" Rpg Pflicht! Oder können sie sich "Morrowind" ohne Dialoge vorstellen? Nun als erstes sollte man sich Gedanken machen was das Dialogsystem alles unterstützen soll.

Hier ein paar Anregungen:

  • 1.Multi Choice Antworten.
  • 2.Anerkennung der Npcs.
  • 3.Bei mehr Anerkennung verraten Npcs mehr.
  • 4.Bestechungen
  • 5.Einfach ein Text der von oben nach unten in einem Dialogkasten nach unten läuft ( "Diablo 2" ).
  • 6.Bei mehrmaligen anklicken der Person verschiedene Antworten.

In diesen Dialogsystem wollen wir die Nummern 2,5 und 6 umsetzten.

Jetzt werden wir mit den Variablen anfangen die wir alle brauchen:

var text_da; //Ist der Angezeigte Text da oder nicht.
var reden = 0; //Redet man schon mit dem npc oder nicht
define string1,skill10; //die verschiedenen Strings des Npc
define string2,skill11;
define string3,skill12;
define string4,skill13;
define string5,skill14;
define dialog_state,skill7 // Der Dialog state eben ;)
define anerkennung,skill8;


entity* introducer;

string intro_str " 






Hallo! 
Dies ist die Demo von UNAMEND!
Sie werden in der Demo einige Sachen vermissen
wie zum Beispiel ein Kampfsystem!
Diese Demo ist auch nur dazu da 
ihnen zu zeigen wie leistungsfahig dieses 
Dialogsystem ist!
Viel Spaß noch
Tripple-x
";
string nerv1 "


Was wollen sie denn jetzt noch????
";
string nerv2 "


Wenn sie noch fragen haben stellen sie die 
gefalligst den Programmierer!!";


string nerv3"


HAUEN SIE AB ODER ES 
GIBT GROSSEN ARGER!!!
";

string hoeflich "



Haben sie noch wuensche?";



panel anzeige
{
pos_x = 0; pos_y = 25;
digits = 50,100,3,arial,1,player._leben;
digits = 200,100,3,arial,1,gegner_1._leben;
flags = refresh,visible;
}


panel textpan
{
pos_x = 192;
pos_y = 60;
layer = 25;
button 608,168,exitbutt,exitbutt,exitbutt,hide_text,null,null;
flags refresh;
bmap = textmap;
}



panel pan_anerkennung
{
pos_x = 700;
pos_y = 75;
layer = 50;
digits 0,0,3,font_str,1,introducer.anerkennung;
flags refresh;
}


text text_anerkennung
{
pos_x 217;
pos_y 75;
font font_str;
layer 26;
string anerkennung_str;
size_y = 150;
}

text text_dia
{
pos_x 217;
pos_y 100;
font font_str;
layer 26;
string textstr;
size_y = 130;
}

Also,nach den Variablen fangen wir erst mal mit der Grund-Action an:

action NPC
{
introducer = my; //Der Pointer intorducer wird auf das My entity geweisen
my.enable_click = on; //Das Entity ist sensitiv auf maus klicks
my.enable_touch = on; // Das Entity ist sensitiv auf Mausberührungen
my.enable_release = on; // Das Entity ist sensitiv darauf das die Maus das entity verlässt
my.event = npc_event; // Das event des entitys ist npc_event
/* Beim ersten Klick auf das entity soll der string
intro_str dargestellt werden, beim zweiten der string
nerv1 etc*/
my.string1 = intro_str; 
my.string2 = nerv1;
my.string3 = nerv2;
my.string4 = nerv3;
my.string5 =hoeflich;
                                                                                                                                                              
my.dialog_state = 0; //Der Dialog status ist 0 (noch nicht angeredet)
my.anerkennung = 100; //Die anerkennung zum Spieler ist am Anfang 100
while(1)
{
/*Die Anerkennung kann nicht höher als 100 und nicht
niedriger als 0! Erklärungen unten. */
my.anerkennung = min(100,max(my.anerkennung,0));
wait(1);
}
}

Ok durch die Erklärungen sollte alles verstanden werden, außer vieleicht die letzte Anweisung! (my.anerkennung = min(100,max(my.anerkennung,0))!

 

MAX UND MIN

Die Anweisung Min berechnet das Minimum von x und y (syntax = min(x,y) ).

Einige Beispiele: 

temp1 = 2;
temp2 = 3;

temp3 = min(temp1,temp2); //Temp3 = 2
////////////////////////////////////////////////////

temp = min(2,1); //Temp = 1

///////////////////////////////////////////////////

temp = min(50,100); //Temp = 50
Das sollte alles erklären.

temp1 = 2;
temp2 = 3;

temp3 = min(temp1,temp2); //Temp3 = 2
////////////////////////////////////////////////////

temp = min(2,1); //Temp = 1

///////////////////////////////////////////////////

temp = min(50,100); //Temp = 50

 

 Das sollte alles Erklären.

Nun zu max: Max berechnet (wie sie sich denken können) das Maximum von x und y ( syntax = max(x,y) )

Einige Beispiele:

temp1 = 2;
temp2 = 3;

temp3 = max(temp1,temp2); //Temp3 = 3
////////////////////////////////////////////////////

temp = max(2,1); //Temp = 2

///////////////////////////////////////////////////

temp = max(50,100); //Temp = 100

Ok nun diese Anweisung: min(100,max(my.anerkennung,0))

Wir lösen von innen auf. Es wird das Maximum zwischen 0 und der Anerkennung des Npcs berechnet! Dadurch ist es schon mal unmöglich das eine Zahl unter null herauskommt. Danach wird das Minimum zwischen den Ergebniss der oberen Rechnung und 100 genommen. Das verhindert das Die Anerkenung über 100 kommen kann.

 

Event des Npcs

Gut jetzt kommen wir zu den Event des Npcs. 

Hier erst mal der Code wie immer:

function npc_event
{
if(event_type == event_touch)
{
//Wenn das Entity mit der Maus berührt wird
my.red = 255;
my.lightrange = 30;
/*Färbe das entity leicht rot */
return; //Springe zurück zum Aufruf der Funktion
}
if(event_type == event_release)
{
my.lightrange = 0;
return; //Springe zurück zum aufruf der Funktion
}
if(event_type == event_click)
{
reden = 1; //Man redet 
if(my.dialog_state == 0) 

show_text(my.string1); /* Wenn dialog_state 0 ist, soll er einen text darstellen
und zwar den string der der in den Skill my.string1 gespeichert ist. */
my.dialog_state = 1; //Der Dialogstate ist nun eins
text_anerkennung.visible = on; //Der Text für die Anerkennung wird sichtbar gemacht
pan_anerkennung.visible = on; //Das Panel wird sichtbar gemacht
return; //Springe zurück zum aufruf der Funktion
}
//Hier genau das gleiche wie oben nur mit anderen dialogstates
if(my.dialog_state == 1) { show_text(my.string2); my.dialog_state = 2; text_anerkennung.visible = on; pan_anerkennung.visible = on; my.anerkennung -= 5; return; }
if(my.dialog_state == 2) { show_text(my.string3); my.dialog_state = 3; text_anerkennung.visible = on; pan_anerkennung.visible = on; my.anerkennung -= 10; return; }
if(my.dialog_state == 3) { show_text(my.string4); my.dialog_state = 3; text_anerkennung.visible = on; pan_anerkennung.visible = on; my.anerkennung -= 15; return; }

}
}

Dieser Code ist nicht wirklich schwer deshalb springe ich gleich zu der Funktion show_text(skill); Wie schon gesagt soll diese Funktion einen Text auf den Entity darstellen. Hier der Code:

function show_text(string)

text_da = 1; //Der Text ist da
str_cpy(textstr,string); //Unten erklärt
textpan.visible=on; //Die Dialogbox wird visible gemacht
text_dia.visible=on; //der text auch
text_dia.offset_y = 0; //Die offseteigenschaft von text_dia wird auf 0 gesetzt

while(text_dia.visible==on)
{
//solange der text sichtbar ist
text_dia.offset_y += 0.5; //verschiebe die offset_y eigenschaft nach oben
waitt(1); 
}
text_da = 0; //text ist nicht mehr da!
}

Wie schon gesagt gehe ich jetzt an dieser Stelle mal auf die wichtigsten String befehle ein. 

STRINGANWEISUNGEN

str_cpy(str1,str2)

Str_cpy ist einer der einfachsten Befehle! Er kopiert den Inhalt von str2 in str1. Wenn str1 eine feste Länge hat und str2 länger ist als diese Länge wird str2 abgeschnitten.

str_clip(str,zahl)

Trennt von dem String die angegebene Zahl von dem Anfang des strings ab.  Beispiel:

string aa "Hallo was geht ab";
......

str_trunc(aa,7) // str aa = "as geht ab";

str_for_num(string,zahl); var = str_to_num(string)

Str_for_num kopiert die Zahl in den String; Str_to_num kopiert die Zahl in die Variable davor. Wenn der String keine Zahl hat ist die Variable Null.

var = str_len(string)

Str_len gibt die Länge des Strings an die Variable zurück!

str_trunc(string,zahl)

Str_trunc trennt  die angegebene Zahl von dem Ende des strings ab. Beispiel:

string aa "Hallo was geht ab";
......

str_trunc(aa,7) // str aa = "Hallo was";

Für die restlichen Befehle am besten im Handbuch nachschauen!

 

zurück           weiter