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
|