Brueggi hat geschrieben:Statt einer KI bietet sich auch eine Art von "Script-Engine" aus. So funktioniert das auch bei vielen moderen Games (meistens natürlich noch zusammen mit einer Basis-KI). Da wird zum Beispiel ein Rechteck gezogen auf der Map - betritt der Spieler das erste mal diesen Bereich, dann setzt das Script z. B. bestimmte Flags, die dann wiederum bestimmte Blöcke auslösen.
So kenne ich es auch, mit einem Script kann man auf Objekte und auch auf die KI zugreifen. Jedes Object, die KI und auch alle Mitspieler haben/bekommen eine Nummer. Mit bestimmten Abfragebefehlen kann überprüft werden ob die KI sich im Radius von einem anderen Objekt, oder KI, oder Mitspieler befindet, oder ob ein Objekt benutzt, oder betreten wurde. Es können Variable verwendet werden.
Hier ist so eine Script welches ich für eine Coop-Map für den Egoshooter Joint Operrations, bzw. für den AW-Mod den es dafür gibt, geschrieben habe:
Code: Alles auswählen
if elapse(15) then
if ssnnearssn(67312,199282,60) then // Train1
ssnhp(67312,32000)
endif
if ssnnearssn(67720,199281,60) then // Train1a
ssnhp(67720,32000)
endif
if ssnnearssn(67313,199283,60) then // Train2
ssnhp(67313,32000)
endif
if ssnnearssn(67724,199284,60) then // Train2a
ssnhp(67724,32000)
endif
endif
if elapse(9) then
ssnwave(133097,"Station.wav",200)
endif
if ssnnearssn(67720,198793,10) then // Train1 go
ssntowp(67312,1)
ssnwave(67720,"Lok.wav",300)
endif
if ssnnearssn(67312,198793,10) then // Train1a go
ssntowp(67720,1)
ssnwave(67312,"Lok.wav",300)
endif
if ssnnearssn(67724,198794,10) then // Train2 go
ssntowp(67313,2)
ssnwave(67724,"Lok.wav",300)
endif
if ssnnearssn(67313,198794,10) then // Train2a go
ssntowp(67724,2)
ssnwave(67313,"Lok.wav",300)
endif
if ssnnearssn(67312,198730,50) then // Kill Train1
ssntowp(67312,0)
killssn(1978)
killssn(67312)
endif
if ssnnearssn(67720,198730,50) then // Kill Train1a
ssntowp(67720,0)
killssn(2183)
killssn(67720)
endif
if ssnnearssn(67313,198731,50) then // Kill Train2
ssntowp(67313,0)
killssn(1979)
killssn(67313)
endif
if ssnnearssn(67724,198731,50) then // Kill Train2a
ssntowp(67724,0)
killssn(2187)
killssn(67724)
endif
if ssnnearssn(67312,199282,60) and ssnnearssn(67720,199281,60) then // Train1 go (first match)
ssntowp(67312,1)
endif
if ssnnearssn(67313,199283,60) and ssnnearssn(67724,199284,60) then // Train2 go (first match)
ssntowp(67313,2)
endif
if ssnride(132874) or ssnride(132876) or ssnride(133015) or ssnride(133017) then // Bot fall down on railroad track
GLOOP Civilian
if ssnonssn(item,132874) or ssnonssn(item,132876) or ssnonssn(item,133015) or ssnonssn(item,133017) then
killssn(item)
endif
END
endif
if ontick(5) then
ssn2ssn(1978,67312) // Train1
ssn2ssn(1979,67313) // Train2
ssn2ssn(2183,67720) // Train1a
ssn2ssn(2187,67724) // Train2a
ssn2ssn(2750,68257) // Stryker1
ssntowp(2750,124)
ssn2ssn(2751,68256) // Tank1
ssntowp(2751,124)
ssn2ssn(2761,68256)
ssntowp(2761,124)
ssn2ssn(2752,68261) // 30cal1
ssn2ssn(2753,68262) // 30cal2
ssn2ssn(2855,68427) // 50cal1
ssn2ssn(2923,68458) // 50cal2
ssn2ssn(3006,68541) // 50cal3
ssn2ssn(3008,68543) // 50cal4
ssn2ssn(3010,68545) // 50cal5
ssn2ssn(3017,68552) // 50cal6
ssn2ssn(3019,68554) // 50cal7
ssn2ssn(2928,68462) // Flak1
ssn2ssn(2929,68463) // Flak2
GLOOP Hide
hidessn(item)
END
GLOOP WalkA
ssntowp(item,3)
END
GLOOP WalkB
ssntowp(item,4)
END
GLOOP WalkC
ssntowp(item,5)
END
GLOOP WalkD
ssntowp(item,6)
END
GLOOP WalkE
ssntowp(item,7)
END
GLOOP WalkF
ssntowp(item,8)
END
endif
if never and ssndead(68295) then // Crate1
removessn(133949) // Fence Gate1
endif
if never and ssndead(68296) then // Crate2
removessn(133952) // Fence Gate2
endif
if never and (ssndead(133543) or ssndead(133544) or ssndead(133545) or ssndead(133546)) then // Garage Doos
GLOOP WalkC
ssntowp(item,9)
END
GLOOP WalkD
ssntowp(item,10)
END
endif
if never and (ssndead(2928) or ssndead(2929)) then // Flak Soldier
GLOOP WalkC
ssntowp(item,11)
END
GLOOP WalkD
ssntowp(item,12)
END
endif
if never and ssndead(2855) then // 50cal1 Soldier
GLOOP WalkG
unhidessn(item)
ssntowp(item,13)
END
unhidessn(68631) // Jet1
v99 = 1
endif
if v99 == 1 and ssnnearssn(2855,68427,3) then // 50cal1 Soldier
if !ssndead(2855) and !ssndead(68631) then
ssnrelease(2855)
ssn2ssn(2855,68631)
ssnuse(2855)
ssntowp(68631,15)
endif
endif
if never and ssndead(68256) then // Tank1
GLOOP WalkH
unhidessn(item)
ssntowp(item,14)
END
endif
if never and ssndead(68298) and ssndead(68299) then // Crate3 + Crate4
removessn(134128) // Fence Gate
removessn(134129) // Fence Gate
removessn(133161) // Rebel Base Flag
endif
if never and ssndead(68295) and ssndead(68296) and ssndead(68298) and ssndead(68299) and ssndead(68300) and ssndead(68301) and ssndead(68302) and ssndead(68303) and ssndead(68304) and ssndead(68405) and ssndead(68406) and ssndead(68407) and ssndead(68408) and ssndead(68409) then
win(1)
endif
if (V78 != humans) then
if (humans < 3) then
if (V78 > 1) then
if (humans < V78) then
consol("accuracy down")
else
consol("accuracy up")
endif
endif
V78 = (humans * 2)
accuracyspread = 32 - V78
else
accuracyspread = 1
consol("accuracy up")
endif
V78 = humans
endif
Dort lasse ich die Ki in zwei Richtungen mehrer Züge fahren (zwei Züge je Richtung, bis zum Spielende wiederholt sich der Vorgang). Am Bahnhof stehen viele Reisende und es wird ein Bahnhofsgeräusch abgespielt vom dortigen Cola-Automat den ich da plaziert habe. (Das Geräusch habe ich im Internet gefunden und dann entsprechend gewandelt und zurecht geschnitten. Leider werden solche selber zugefügten wav.files nicht per Netzwerk übertragen und jeder Mitspieler braucht sie selber in seinen Spieleordner. Alle anderen Daten der Map werden vom Host übertragen und nur der Host braucht die Map-Daten als Dateien.)
Andere Gruppen von KI sollen vordefinierte Wege mit festen Wegpunkten zu Fuss ablaufen, oder stationäre Waffen benutzen. Wenn eine bestimmte Ki an an einer solchen stationären Waffe von uns erschossen wird und dann ein zweites Mal spawnen darf, dann wird diese KI zu einen Flugzeug teleportiert und fliegt dann eine bestimmte Flugroute. Von uns gesetzte Wegpunkte werden zu durchnummerierten Wegpunktlisten zusammengefasst in der Map gespeichert.
Zur Basis-KI:
Wenn ein Mitspieler sich in einer festgelgten Entfernung zu der KI befindet und die KI sieht den Spieler, dann bleibt die KI stehen und die KI fängt an den Spieler zu bechiessen. Dabei kann die KI auch selbständig in Deckung gehen und die ursprünglichen Weg verlassen. Wenn der Spieler nicht mehr da ist, dann versucht die KI wieder ihren Weg zu folgen. Manchmal klapt das nicht so ganz, wenn die KI festhängt und nicht wirklich den Weg zurück zur alten Route findet. Dann versucht die Ki immer den naheliegensten Wegpunkt zu erreichen und dann die Liste der Wegpunkte abzulaufen.
Das Bild zu der Map mit den Namen "Town AW2":
Dirk