Hazard Dokumentation

Dies ist die vollständige Entwicklerdokumentation des Hazardpacks.
Zahlreiche Objekte des Hazardpacks verfügen über weitreichende Scriptfunktionen, die in dieser Dokumentation gesammelt und beschrieben sind.

Nutzungsbedingungen

Zur Nutzung der erweiterten Entwicklerfunktionen muss man die Nutzungsbedingungen der Clonk Entwicklerdokumentation gelesen und akzeptiert haben.
Diese findet man im offiziellen Entwicklerpack, das auf http://www.clonk.de heruntergeladen werden kann.
Clonkonaut, 2006


Objekte

Sammlung aller Objekte, die gesonderte Erklärung benötigen. Die entsprechenden Scriptfunktionen sind im Einzelnen behandelt.
Clonkonaut, 2006


Ausrüstung

Der Hazardclonk kann diverse Ausrüstung mit sich herumschleppen. Damit meine ich nicht Waffen, Medipacks oder so ein Zeug. Sondern soetwas wie Rüstungen, Schildgeneratoren und so weiter. Die Benutzung ist ähnlich wie bei der Rüstung des Ritterclonks. Im Gegensatz zu dieser kann der Ausrüstungsgegenstand in Hazard aber frei festlegen, was für eine Wirkung er haben soll. Zudem hat man nicht nur die Wahl zwischen Schildgeneratoren und Rüstung - man kann komplett eigene Ausrüstungstypen wie zum Beispiel Stiefel oder Helme festlegen. Der Hazardclonk kann einmal angelegte Ausrüstung per Kontextmenü wieder ablegen.
Man kann letztlich drei Dinge mit Ausrüstung tun: Erstens können sie als Schutz dienen und Schaden reduzieren. Zweitens können sie solange sie angelegt sind, einen dauernden Effekt haben, zum Beispiel ständig den Clonk heilen, ihn schneller machen oder einfach nur einen grafischen Effekt haben. Drittens kann der Hazardclonk die Ausrüstung per Kontextmenü benutzen, wie es zum Beispiel beim Nachtsichtgerät der Rüstung der Fall ist.
Um einen eigenen Ausrüstungsgegenstand zu definieren, muss zunächst einmal
#include GEAR
im Script stehen. Dann muss festgelegt werden, von welchem Typ dieser Ausrüstungsgegenstand sein soll. Dies legt man mit dem Rückgabewert des Callbacks GetGearType fest (siehe Callbacks). Von jedem Typ kann ein Hazardclonk nur ein Gegenstand tragen. Er kann also nur eine Rüstung, ein Schild usw. tragen.
Es empfiehlt sich übrigens, auch IsEquipment zu definieren (und true zurückzugeben). Dieser Callback zeigt an, dass es sich allgemein um eine (kaufbare) Ausrüstung handelt. Der Callback wird unter Anderem von dem Waffenautomaten verwendet und markiert.

Callbacks

Diese Callbacks werden an ein anlegbaren Ausrüstungsgegenstand getätigt. Mit diesen Callbacks wird also die eigentliche Funktionalität festgelegt. GetGearType ist Pflicht, alles andere ist optional. Wenn nur GetGearType definiert ist, hat man einen Ausrüstungsgegenstand den man an- und ablegen kann, aber sonst nichts tut.
Callback | Parameter | Beschreibung
IsHazardGear |  | Gibt immer true zurück.
GetGearType |  | Muss den Ausrüstungstyp dieses Ausrüstungsgegenstandes zurückgeben. (siehe Ausrüstungstypen)
GearEffect | object pHazard | Wird aufgerufen, wenn der Hazardclonk den Ausrüstungsgegenstand anlegt. Optional.
GearEffectReset | object pHazard | Wird aufgerufen, wenn der Hazardclonk den Ausrüstungsgegenstand wieder ablegt. Optional.
OnClonkDmg | int iDmg, int iType, object pHazard | Das Ergebnis dieses Callbacks (wie OnDmg) wird zur Schadensreduktion des Hazardclonks pHazard hinzuaddiert. Optional.
ConUseable |  | Soll true zurückgeben, wenn die angelegte Ausrüstung per Kontextmenü benutzbar ist. Optional
ConDesc |  | Wenn diese benutzbar ist, soll dieser Callback den Beschreibungstext für den Kontextmenüeintrag zurückgeben.
ConUse | object pUser | Wird aufgerufen, wenn der Hazardclonk diese Ausrüstung per Kontextmenü benutzt.
Wenn mindestens ein Ausrüstungsgegenstand angelegt ist, der bei ContextUseable true zurückgibt, erscheint im Kontextmenü des Hazardclonks ein Eintrag "Ausrüstung benutzen". Wählt man diesen Punkt aus, werden alle Ausrüstungsgegenstände aufgelistet, die per Kontextmenü benutzbar sind. Wählt man eines aus, wird in diesem ContextUse aufgerufen.

Ausrüstungstypen

Es sind einige Ausrüstungstypen vordefiniert, es können aber frei weitere definiert werden.
Name | Wert | Beschreibung
GEAR_Armor | 1 | eine Rüstung
GEAR_Shield | 2 | ein Schildgenerator
GEAR_Light | 3 | eine Lampe
GEAR_Backpack | 4 | ein Rucksack
GEAR_Boots | 5 | Stiefel
GEAR_Helmet | 6 | ein Helm

Funktionen des Hazardclonks

Der Hazardclonk stellt drei Funktionen zur Verfügung, um Ausrüstung per Script an- und abzulegen sowie zu überprüfen, ob er (bestimmte) Ausrüstung trägt.
Funktion | Beschreibung
EquipGear | Legt dem Hazard einen Ausrüstungsgegenstand an.
TakeOffGear | Wenn iGearType angegeben, legt es dem Hazard ein Ausrüstungsgegenstand vom Typ iGearType ab. Ansonsten legt es pGear ab. Sollte TakeOffGear komplett ohne Parameter aufgerufen werden, wird alles abgelegt. true wenn erfolgreich.
HasGear | true falls pObj einen Ausrüstungsgegenstand vom Typ iGearType trägt.

Ausrüstungssystem für andere Clonks benutzen

Seit Hazard 2.0 wurde das Ausrüstungssystem aus dem Hazardclonk ausgelagert. Es kann nun auch von anderen Clonks durch
#include L_GE
verwendet werden.
Hierzu muss noch am Ende folgender Funktionen im Script des Clonks _inherited(); aufgerufen werden:
  • in Construction()
  • in Death() falls der Clonk bei Tod die Ausrüstung fallenlassen soll
Und falls Du das Hazard Schadensystem verwenden willst:
  • in OnHit einmal _inherited(iDamage, iType, pFrom); aufrufen.
  • in OnDmg den Rückgabewert von _inherited(iDamage, iType); zum eigenen Rückgabewert addieren. Dies ermöglicht der Ausrüstung, den erlittenen Schaden zu modifizieren. Beispiel:
public func OnDmg(int iDamage, int iType) {
  // anfällig gegen Energieschaden...
  var mod = 0;
  if(iType == DMG_Energy) mod = -25;

  return(mod+_inherited(iDamage, iType));
}
Newton, März 2007


EquipGear

Ab Version: 1.0

Beschreibung

Legt dem Hazard einen Ausrüstungsgegenstand an. Gibt bei erfolgreichem Anlegen true zurück, ansonsten false. Fehlschlagen kann das Anlegen wenn entweder das angegebene Objekt kein Ausrüstungsgegenstand ist (geprüft mit IsHazardGear) oder der Hazard schon ein Ausrüstungsgegenstand gleichen Typs trägt.

Syntax

bool EquipGear (object pGear);

Parameter

pGear:
Anzulegender Ausrüstungsgegenstand.
Siehe auch: Ausrüstung, HasGear, TakeOffGear
Newton, März 2007


HasGear

Beschreibung

Gibt den Ausrüstungsgegenstand zurück, falls der Hazardclonk einen Ausrüstungsgegenstand vom Typ iGearType trägt. Falls stattdessen idGear angegeben ist, wird nach einem Ausrüstungsgegenstand mit bestimmter ID gesucht. Werden beide Parameter weggelassen, gibt die Funktion true zurück, wenn der Hazardclonk irgendeine Ausrüstung trägt.

Syntax

bool/object HasGear (int iGearType, id idGear);

Parameter

iGearType:
[opt] Ausrüstungstyp der abgeprüft wird.
idGear:
[opt] Ausrüstungs-ID nach der gesucht wird.
Siehe auch: Ausrüstung, EquipGear, TakeOffGear
Newton, April 2007


TakeOffGear

Beschreibung

Lässt den Hazardclonk seine Ausrüstung wieder ablegen. Wenn iGearType angegeben ist, wird der Ausrüstungsgegenstand dieses Typs abgelegt. Ansonsten wird pGear abgelegt. Wenn keiner der beiden Parameter angegeben ist, wird alle Ausrüstung abgelegt.
Die Funktion gibt bei Erfolg true zurück. Fehlschlagen kann die Funktion, wenn pGear nicht angelegt ist oder nicht existiert bzw. wenn kein Ausrüstungsgegenstand vom Typ iGearType angelegt ist.

Syntax

bool TakeOffGear (object pGear, int iGearType);

Parameter

pGear:
[opt] Abzulegender Ausrüstungsgegenstand
iGearType:
[opt] Abzulegender Ausrüstungstyp
Siehe auch: Ausrüstung, EquipGear, HasGear
Newton, März 2007


Dunkelheit

Das Umweltobjekt Dunkelheit macht per SetGamma generell erstmal alles dunkler. Je mehr Dunkelheit am Anfang der Runde eingestellt wird, desto dunkler wird es, klar. Zu beachten ist, dass Dunkelheit wenn sie denn aktiviert werden soll, schon gleich am Anfang der Runde vorhanden sein muss. Sie kann nicht mitten in der Runde erstellt werden.
Um den Grad der Dunkelheit abzufragen und anzupassen, gibt es folgende globale Funktionen:
Funktion | Parameter | Beschreibung
SetDarkness | int iValue | Setzt den Grad der Dunkelheit. Zulässig sind Werte von 0 bis 10.
FadeDarkness | int iValue, int iSpeed | Wie SetDarkness, nur dass mit iSpeed/1000 Dunkelheitsstufen pro Frame fadet.
GetDarkness | int iPrecision | Fragt den Grad der Dunkelheit ab. Default ist iPrecision gleich 10.
IsDark |  | Gibt das Dunkelheitsobjekt zurück, falls Dunkelheit aktiviert ist (auch wenn der Grad auf 0 eingestellt ist), ansonsten false.
Soweit so uninteressant. Nichts was man nicht auch mit einem simplen SetGamma tun könnte.
Allerdings bietet Dunkelheit mehr, denn alle Lichter (und alles andere was leuchtet) beziehen von der Dunkelheit, wie hell sie sein sollen. Je dunkler, desto heller werden die Lichter. Dadurch ist gewährleistet, dass auch wenn es sehr dunkel ist, man neben einer Lampe was sieht und gleichzeitig wenn es sehr hell ist, nicht geblendet wird. Dazu rufen sie die globale Funktion CalcLight(&alphamod, &sizemod) auf, die in alphamod und sizemod die dunkelheitsbedingte Alpha- und Größenmodulation speichern. Dies sieht normalerweise so oder so ähnlich aus:
/* In einem Lichtscript */
// Originalgröße und Alpha: 60 Alpha, Größe 100%
var alpha = 60, size = 100;

// Größen- und Alphamodulation von Dunkelheit abfragen
var alphamod, sizemod;
CalcLight(alphamod, sizemod);

// Größe & Alpha des grünen Lichts modulieren
SetCon(size*sizemod/100);
SetClrModulation(RGBa(64,255,64,alpha+alphamod));
Wenn der Grad der Dunkelheit per SetDarkness geändert wird, ruft die Dunkelheit in allen Lichtern (IsLight) Update auf, damit jedes Licht seine Größen- und Alphamodulation anpassen kann.
Um für die Dunkelheit einigermaßen ausgerüstet zu sein, kriegt jeder Clonk bei aktivierter Dunkelheit eine Taschenlampe und ein Hintergrundlicht (siehe AddLightAmbience).
Newton, März 2007


EMP

Die Partikelkanone und der Granatenwerfer mit Laserupgrade können mit EMP schießen statt Schaden zu machen. Diese rufen in allen Objekten die auf den Callback IsMachine true zurück geben, die Funktion EMPShock() auf.
Das betroffene Objekt kann dann explodieren, Fehlfunktionen aufweisen etc. Dazu gibt es einen vordefinierten Effekt der auf das Objekt angewendet werden kann. Er kann mit EMPShockEffect(iTime) gestartet werden und bleibt iTime Frames. Dieser Effekt ist ein rein grafischer Effekt. Ob er noch auf dem Objekt liegt, kann mit EMPShocked abgefragt werden, wenn der Effekt vorbei ist, wird im aufrufenden Objekt noch einmal EMPShockEnd aufgerufen.
Newton, August 2007


Geländer

Geländer sind reine Dekoobjekte, die Plattformen o.ä. ansprechender und ein Stück realistischer aussehen lassen sollen.

Platzierung

Zur Platzierung dienen folgende Funktionen:
Funktion | Beschreibung
Set | Erstellt ein Geländer mit der angegeben Zahl Mittelstücke.
SetRail | Baut ein Geländer aus den angegebenen Indizes und den dazu passenden Stücken zusammen.
AdjustPart | Verändert das Aussehen des angegebenen Teilstücks.
In SetRail und AdjustPart muss man als Indizes angeben, welche Elemente man denn hinzufügen/ändern will. Welche Indizes die Elemente in einem Geländer haben, wird in folgenden Funktionen festgelegt

Funktion | Beschreibung
Left | Gibt den Index des linken Endstücks (Pfeilers) zurück.
Right | Gibt den Index des rechten Endstücks (Pfeilers) zurück.
Linkage | Gibt den Index eines Mittelstücks zurück.
Backing | Gibt den Index eines Pfeilers zurück.
Newton, März 2007


AdjustPart

Beschreibung

Verändert das Aussehen eines einzelnen Geländerteils.

Syntax

bool AdjustPart (int iPart, int iNewElement);

Parameter

iPart:
Nummer des zu ändernden Teils (Teile werden von links nach rechts gezählt, beginnend bei 0).
iNewElement:
Element, dass an dieser Stelle stehen soll. Siehe Geländer.

Beispiel

var pRail = CreateObject(RAI1, 100, 100, -1);
var b = pRail->Backing();
var m = pRail->Linkage();
var l = pRail->Left();
var r = pRail->Right();
pRail->SetRail([l,m,m,m,r],true);
pRail->AdjustPart(2,p);
Erstellt ein Geländer mit links und rechts einem Pfosten, in der Mitte drei Mittelstücke. Mit AdjustPart wird dann das mittlere Element durch einen Pfosten ersetzt.
Siehe auch: Geländer, Set, SetRail
Clonkonaut, März 2007


Set

Beschreibung

Baut ein Geländer der Länge iLength (etwa 20px pro Element) mit der Modulation iMod zusammen.

Syntax

void Set (int iLength, int iMod);

Parameter

iLength:
Anzahl einzufügender Mittelstücke.
iMod:
Modulation des Aussehens. Folgende Angaben sind gültig:

Konstante | Beschreibung
RAIL_Supported | Das Geländer hat in regelmäßigen Abständen Stützen.
RAIL_AltLinkage | Alternative Darstellung des Geländers (wenn vorhanden).
RAIL_LeftOpen | Links ist keine Stütze. Das Geländer steht wohl an der Wand.
RAIL_RightOpen | Rechts ist keine Stütze.
Die Angaben können mit | verknüpft werden.

Beispiel

var pRail = CreateObject(RAI1, 100, 100, -1);
pRail->Set(5, RAIL_LeftOpen | RAIL_Supported);
Ein Geländer dass ungefähr 100 Pixel lang ist, ganz links keine Stütze hat aber ansonsten in kurzen Abständen welche.
Siehe auch: Geländer, SetRail
Clonkonaut, März 2007


SetRail

Beschreibung

Baut ein Geländer aus den Teilen (in der angegebenen Reihenfolge) zusammen, deren Indizes in einer Liste übergeben werden.

Syntax

void SetRail (array aParts, bool bNoRailEnds);

Parameter

aParts:
Liste der einzelnen Indizes der Elemente, aus denen das Geländer zusammengesetzt werden soll. Siehe Geländer
bNoRailEnds:
[opt] Wenn true, werden keine Endstücke hinzugefügt. Ansonsten wird zu den angegebenen Elementen vorne und hinten noch ein Pfosten hinzugefügt.

Beispiel

var pRail = CreateObject(RAI1, 100, 100, -1);
var b = pRail->Backing();
var m = pRail->Linkage();
pRail->SetRail([m,m,m,b,m,m,m,b,m,m,m]);
Erstellt ein Geländer dass etwa 9 * 20px lang ist (Pfosten sind nicht so breit) und dass alle 60px einen Pfosten hat sowie ganz am Anfang und am Ende.
Siehe auch: AdjustPart, Geländer, Set
Clonkonaut, März 2007


Hazardclonk

Der Hazardclonk übernimmt einige Aufgaben der KI, im wesentlichen die Wegfindung, Angriff auf Feinde und Einsatz von Gegenständen. Der Hazardclonk bietet einige Funktionen an, mit dem man den Hazardclonk fernsteuern kann: Ähnlich wie mit SetCommand und Konsorten nur zusätzlich mit mehr Funktionalität. Außerdem lässt sich einstellen, wie aggressiv und ob er überhaupt auf Gegner automatisch schießt.

Makrobefehle

Makrobefehle sind Bewegungskommandos, die die Wegfindung benutzen, d.h. sich am Wegpunkt-Netz orientieren. Wie normale Kommandos, die mit SetCommand o.ä. hinzugefügt wurden, lassen sich Makrobefehle stapeln und werden nacheinander ausgeführt. Wenn in einem Szenario kein Wegpunktnetz definiert ist, schlägt jeder Makrobefehl fehl und kein Bot bewegt sich von der Stelle.
Der Hazardclonk beherrscht folgende Makrokommandos:
Befehl | Erwartet
MoveTo | Zielobjekt oder Zielkoordinaten
Follow | Zielobjekt
Wait | Wartedauer
None |
Verwaltet werden die Befehle mit folgenden Funktionen:
Funktion | Parameter | Beschreibung
SetMacroCommand | object pCallback, string szCommand, object pTarget, int iX, int iY, int iDelay, int iAggro | Löscht die Befehlsliste und fügt den neuen Befehl ein. Analog zu SetCommand.
AddMacroCommand | object pCallback, string szCommand, object pTarget, int iX, int iY, int iDelay, int iAggro | Fügt einen Befehl an den Anfang der Befehlskette ein. Analog zu AddCommand.
AppendMacroCommand | object pCallback, string szCommand, object pTarget, int iX, int iY, int iDelay, int iAggro | Fügt einen Befehl ans Ende der Befehlskette ein. Analog zu AppendCommand.
GetMacroCommand | int iCommandNum, int iElement | Fragt Daten über einen Befehl ab. Analog zu GetCommand.
FinishMacroCommand | int iCommandNum, bool fNoCallback, bool fNoSuccess | Beendet einen Befehl. Analog zu FinishCommand.
ClearMacroCommands |  | Löscht die Befehlskette.
Das Objekt, welches als pCallback angegeben wurde, erhält Informationen darüber, ob der Befehl erfolgreich war oder fehlgeschlagen ist.
Dazu dienen zwei Aufrufe (Achtung: der Befehl, der diesen Aufruf auslöst, muss nicht unbedingt der erste sein, sondern kann irgendwo in der Liste gewesen sein):
  • OnMacroCommandSuccess bei Erfolg, Parameter ist der Clonk
  • OnMacroCommandSuccessFailed bei Fehlschlag, Parameter ist der Clonk und ein Fehlercode:
Fehlercode (Konstante) | Bedeutung
Macro_NoPath | Es konnte kein Weg gefunden werden.
Macro_PathImpossible | Der Weg konnte nicht abgelaufen werden, weil der Clonk irgendwo feststeckt oder abgeschossen wurde o.Ä. Das passiert zum Beispiel wenn der Clonk wegen einer Explosion irgendwo rumfliegt.
Macro_PathBroken | Beim Ablaufen wurde der Pfad zerstört (Wegpunkt / Pfad fehlt)
Macro_FollowTargetLost | Das Verfolgungsziel ist verschwunden
Hinweis: Ein Tastendruck oder Mauskommando löscht alle Makrobefehle.

Angriff

Der Angriff von Feinden wird im Hazardclonk durch das sog. "Aggro-Level" geregelt. Je nachdem, wie aggressiv der Clonk sich verhalten soll, ist ein entsprechender Level zu setzen. Der Clonk greift natürlich nur verfeindete Clonks an.
Dafür stehen ingesamt vier Funktionen zur Verfügung:
Funktion | Parameter | Beschreibung
SetAggroLevel | int iLevel, int iDist, int iX, int iY | Setzt den Aggro-Level. iDist, iX und iY sind je nach Level mit anzugeben.
GetAggroLevel |  | Liefert den Aggro-Level.
SetAggroTarget | object pTarget | Setzt das Angriffsziel manuell (wirkt nur bei Aggro > Aggro_Nothing, s.u.).
GetAggroTarget |  | Liefert das Angriffsziel.
Für SetAggroLevel stehen folgende Konstanten zur Verfügung:
Konstante | Auswirkung
Aggro_Nothing | Kein selbstständiger Angriff.
Aggro_Shoot | Auf Feinde wird geschossen, ohne dabei das aktuelle Kommando zu unterbrechen. Der Clonk hält nicht zum Zielen an.
Aggro_Follow | Kommt ein Feind in Sicht, wird dieser verfolgt, bei Bedarf wird gezielt. Die Verfolgung wird abgebrochen, wenn der Feind weiter als iDist entfernt ist (wenn PathFree FALSE ist, wird iDist halbiert).
Aggro_Guard | Die Position (iX, iY) wird bewacht und Feinde bis auf eine Entferung von iDist von der Position aus verfolgt. Makrokommandos werden abgebrochen.
Beim Schießen auf Feinde sucht sich der Clonk eine Waffe mit einem Schadenstyp, der beim Feind den meisten Schaden verursacht. Dafür braucht der Clonk einige zusätzliche Informationen über die Waffe. Siehe Waffen.
Hinweis: Ein Tastendruck oder Mauskommando löscht den Aggro-Level (Aggro_Nothing).

Inventarbehandlung

Der Hazardclonk kann sein Inventar selbstständig verwalten, dazu muss nur die Funktion CheckInventory aufgerufen werden.
Hier werden für viele Objekte Standardbehandlungen bereitgestellt. Ebenso ist es möglich, Objekte gesondert zu behandeln.
Folgende Callbacks erzeugen folgende Reaktionen:
Callback | Behandlung
IsWeapon | Nichts, Objekt wird nicht fallen gelassen.
IsHazardGear | Wird eingesetzt (Activate), wenn nicht GEAR_Light und der Slot nicht belegt ist. Sonst wird es fallen gelassen.
IsMine | Wird platziert (Activate).
IsUpgrade | Wird an eine Waffe angebaut (UpgradeObject), wenn eine entsprechende vorhanden, ansonsten aufbewahrt.
IsAmmo | Wird aktiviert (Activate).
Außerdem gibt es bereits 5 Sonderbehandlungen. :
ID | Objekt | Behandlung
MEDI | Medipack | Einsetzen (Activate), wenn weniger als 2/3 Leben.
NVDN | Novodekan | Einsetzen (Activate), wenn weniger als 2/3 Leben.
AIRS | Luftschlag | Einsetzen (Activate).
DRSU | Unterstützungsdrohne | Fallen lassen, wenn schon eine aktiviert, ansonsten einsetzen (ArmToClonk), wenn mehr als eine Waffe ohne FM_Aim im Inventar.
GBRB | Bombing Run - Bombe | Experimentell. Wird nicht benutzt. Steht im Hazardscript
Um selber Sonderbehandlungen einzufügen, muss eine Funktion "AI_Inventory" in das entsprechende Objektscript geschrieben werden. Wenn diese Funktion TRUE liefert, nimmt der Clonk an, dass das Objekt seine Aktionen selbst durchführt.
Alle übrigen Objekte werden fallen gelassen.
Clonkonaut, Mai 2008


AddMacroCommand

Ab Version: 1.5

Beschreibung

Fügt ein Bewegungskommando an den Anfang der Kommandoliste des Clonks hinzu (war vorher kein Kommando definiert, entspricht AddMacroCommand SetMacroCommand).
Für eine Kommando-Beschreibung siehe SetMacroCommand.

Syntax

bool AddMacroCommand (object pCallback, string szCommand, object pTarget, int iX, int iY, int iDelay, int iAggro);

Parameter

pCallback:
Objekt, dass Aufrufe bei Fehlschlag oder Erfolg des Kommandos erhält.
szCommand:
Name des neuen Kommandos (siehe unten Tabelle).
pTarget:
[opt] Zielobjekt.
iX:
[opt] X-Zielkoordinate.
iY:
[opt] Y-Zielkoordinate.
iDelay:
[opt] Wartezeit.
iAggro:
[opt] Aggrolevel, der analog zu diesem Kommando gesetzt werden soll.
Siehe auch: AppendMacroCommand, ClearMacroCommands, FinishMacroCommand, GetMacroCommand, Hazardclonk, SetAggroLevel, SetMacroCommand
Clonkonaut, Juni 2007


AppendMacroCommand

Ab Version: 1.5

Beschreibung

Fügt ein Bewegungskommando ans Ende der Kommandoliste des Clonks hinzu (war vorher kein Kommando definiert, entspricht AddMacroCommand SetMacroCommand).
Für eine Kommando-Beschreibung siehe SetMacroCommand.

Syntax

bool AppendMacroCommand (object pCallback, string szCommand, object pTarget, int iX, int iY, int iDelay, int iAggro);

Parameter

pCallback:
Objekt, dass Aufrufe bei Fehlschlag oder Erfolg des Kommandos erhält.
szCommand:
Name des neuen Kommandos (siehe unten Tabelle).
pTarget:
[opt] Zielobjekt.
iX:
[opt] X-Zielkoordinate.
iY:
[opt] Y-Zielkoordinate.
iDelay:
[opt] Wartezeit.
iAggro:
[opt] Aggrolevel, der analog zu diesem Kommando gesetzt werden soll.
Siehe auch: AddMacroCommand, ClearMacroCommands, FinishMacroCommand, GetMacroCommand, Hazardclonk, SetAggroLevel, SetMacroCommand
Clonkonaut, Juni 2007


CheckInventory

Ab Version: 1.5

Beschreibung

Führt die KI-Inventarbehandlung aus.

Syntax

void CheckInventory ();

Parameter

Anmerkung

Für eine ausführliche Beschreibung siehe Hazardclonk
Siehe auch: Hazardclonk
Clonkonaut, Juni 2007


ClearMacroCommands

Ab Version: 1.5

Beschreibung

Löscht die Kommandoliste eines Clonks vollständig und beendet die aktuelle Bewegung. Der Unterschied zu SetMacroCommand(0,"None",target) ist ein ganz wichtiger: ClearMacroCommands löscht alle Makrokommandos aus der Befehlswarteschlange, während SetMacroCommand(0,"None",target) danach wieder einen Befehl hinzufügt - nämlich "None". Das Aggrolevel kann mit Hilfe dieses Makrokommandos temporär umgestellt werden.

Syntax

void ClearMacroCommands ();

Parameter

Siehe auch: AddMacroCommand, AppendMacroCommand, FinishMacroCommand, GetMacroCommand, Hazardclonk, SetAggroLevel, SetMacroCommand
Clonkonaut, Juni 2007


FinishMacroCommand

Ab Version: 1.5

Beschreibung

Beendet ein Bewegungskommando.

Syntax

bool FinishMacroCommand (bool fNoCallback, bool fNoSuccess, int iCommandNum);

Parameter

fNoCallback:
Wenn TRUE werden keine Aufrufe an das Objekt pCallback getätigt.
fNoSuccess:
Wenn TRUE wird das Kommando als fehlgeschlagen gewertet und MacroCommandSuccessFailed beim Objekt pCallback aufgerufen (ansonsten ist das Kommando immer erfolgreich).
iCommandNum:
[opt] Index des Kommandos. 0 für das aktuelle, 1 für das als nächstes auszuführende usw.
Siehe auch: AddMacroCommand, AppendMacroCommand, ClearMacroCommands, GetMacroCommand, Hazardclonk, SetAggroLevel, SetMacroCommand
Clonkonaut, Juni 2007


GetAggroLevel

Ab Version: 1.5

Beschreibung

Liefert den Aggrolevel eines Clonks.

Syntax

int GetAggroLevel ();

Parameter

Siehe auch: GetAggroTarget, Hazardclonk, SetAggroLevel, SetAggroTarget
Clonkonaut, Juni 2007


GetAggroTarget

Ab Version: 1.5

Beschreibung

Liefert das Angriffsziel eines Clonks.

Syntax

object GetAggroTarget ();

Parameter

Siehe auch: GetAggroLevel, Hazardclonk, SetAggroLevel, SetAggroTarget
Clonkonaut, Juni 2007


GetMacroCommand

Ab Version: 1.5

Beschreibung

Liefert Informationen zu einem Bewegungskommando.

Syntax

any GetMacroCommand (int iCommandNum, int iElement);

Parameter

iCommandNum:
[opt] Nummer des Kommandos. 0 steht für das momentan aktive, 1 für das danach auszuführende usw.
iElement:
[opt] Information, die zurückgegeben werden soll. 0 oder kA: Name, 1: Target, 2: TargetX, 3: TargetY, 4: Delay, 5: Callbackobjekt, 6: Aggrolevel
Siehe auch: AddMacroCommand, AppendMacroCommand, ClearMacroCommands, FinishMacroCommand, Hazardclonk, SetAggroLevel, SetMacroCommand
Clonkonaut, Juni 2007


SetAggroLevel

Ab Version: 1.5

Beschreibung

Setzt den Aggrolevel eines Clonk. Dadurch kann dieser selbstständig Feinde bekämpfen.

Syntax

bool SetAggroLevel (int iLevel, int iDist, int iX, int iY);

Parameter

iLevel:
Neuer Aggrolevel.
iDist:
[opt] Maximaler Zielabstand (für Aggro_Follow und Aggro_Guard).
iX:
[opt] Ziel-X (für Aggro_Guard).
iY:
[opt] Ziel-Y (für Aggro_Guard).

Anmerkung

Für eine ausführliche Beschreibung siehe Hazardclonk
Siehe auch: GetAggroLevel, GetAggroTarget, Hazardclonk, SetAggroTarget
Clonkonaut, Juni 2007


SetAggroTarget

Ab Version: 1.5

Beschreibung

Verändert das Angriffsziel eines Clonks.

Syntax

bool SetAggroTarget (object pTarget);

Parameter

pTarget:
Neues Angriffsziel.

Anmerkung

Nur wirksam, wenn der Aggrolevel != Aggro_Nothing.
Siehe auch: GetAggroLevel, GetAggroTarget, Hazardclonk, SetAggroLevel
Clonkonaut, Juni 2007


SetMacroCommand

Ab Version: 1.5

Beschreibung

Gibt dem Clonk ein Bewegungskommando, welches das Wegpunktnetz zur Wegfindung nutzt.

Syntax

bool SetMacroCommand (object pCallback, string szCommand, object pTarget, int iX, int iY, int iDelay, int iAggro);

Parameter

pCallback:
Objekt, dass Aufrufe bei Fehlschlag oder Erfolg des Kommandos erhält.
szCommand:
Name des neuen Kommandos (siehe unten Tabelle).
pTarget:
[opt] Zielobjekt.
iX:
[opt] X-Zielkoordinate.
iY:
[opt] Y-Zielkoordinate.
iDelay:
[opt] Wartezeit.
iAggro:
[opt] Aggrolevel, der analog zu diesem Kommando gesetzt werden soll. Wenn das Kommando abgeschlossen ist, wird das Aggrolevel zurückgesetzt.

Anmerkungen

Folgende Kommandos sind definiert:
szCommand | pTarget | iX,iY | iDelay | Beschreibung
Follow | Zielobjekt |  |  | Dem Zielobjekt folgen (dauerhaft).
MoveTo | Zielobjekt |  |  | Zur Position des Zielobjekts bewegen.
MoveTo | Null | Zielposition |  | Zur Zielposition bewegen.
None |  |  |  | Aktuelle Befehle löschen. Sollte benutzt werden, um ein Aggrolevel zu setzen.
Wait | Null | 0,0 | Frames | Anzahl Frames/Ticks warten.
Das Objekt, welches in pCallback definiert ist, erhält folgende Aufrufe:
  • OnMacroCommandSuccess(pClonk) bei Erfolg (pClonk ist der Clonk selbst)
  • OnMacroCommandSuccessFailed(pClonk, iReason) bei Fehlschlag (pClonk ist der Clonk, iReason der Fehlercode)
Siehe auch: AddMacroCommand, AppendMacroCommand, ClearMacroCommands, FinishMacroCommand, GetMacroCommand, Hazardclonk, SetAggroLevel
Clonkonaut, Juni 2007


KI

Künstliche Intelligenz

Die künstliche Intelligenz in Hazard basiert auf den Script-Spieler der Engine. Die KI verhält sich daher im Script genauso wie ein echter Spieler. Zur Steuerung der Crew ist jedem Script-Spieler ein Steuerungsobjekt (__AI) zugeordnet.
Es gibt keine einzelnen KI-gesteuerten Clonks (nachfolgend Bots) sondern immer nur Hazardclonks, die von einem KI-Spieler gesteuert werden. Diese sind tatsächlich auch nur normale Hazardclonks - bestimmte KI-Funktionalität steht daher auch den Hazardclonks zur Verfügung, die von einem Spieler gesteuert werden.
Die Aufgabe eines KI-Spielers ist lediglich, seine Bots durch die Landschaft zu schicken. Schießen kann der Bot selbst. Dafür berücksichtigt der KI-Spieler zunächst nur das Spielziel. Für jedes Spielziel ist eine Taktik definiert, die festlegt, wann welcher Bot wohin geschickt wird.
Mehr zu Bots, siehe Hazardclonk.

Teams

In einem Teamspiel übernimmt ein KI-Spieler die Kontrolle über alle Bots, die in diesem Team spielen sollen. In diesem Falle wird der KI-Spieler als "KI-Team" bezeichnet.
Ohne Teams (Engineteam 0) sollte jeder KI-Spieler nur über einen Clonk verfügen.

Script

Zur Verwaltung der KI-Spieler gibt es zusätzliche Funktionen:
Funktion | Parameter | Beschreibung
AddAI | int iTeam | Fügt ein neues KI-Team ein.
RemoveAI | int iTeam | Entfernt ein KI-Team.
AddBot | int iTeam | Fügt einen neuen Bot in ein KI-Team ein.
RemoveBot | int iTeam | Entfernt einen Bot aus einem KI-Team.
GetPlrID |  | Liefert eine ID zur Indentifizierung des Scriptspielers in InitializePlayer.

Taktiken

KI-Spieler verwenden für verschiedenen Spielziele verschiedenen Taktiken.
Für ein Spielziel wird die Funktion AITactic im aktuellen Spielziel aufgerufen. Als erster Parameter wird das KI-Spielerobjekt übergeben. Diese Funktion kann dann allen Clonks im Team Kommandos geben. Bisher gibt es nur Taktiken für Deathmatch, Last Man Standing und Capture the Flag (die anderen Taktinen sind nur experimentell und nicht fertig). Ist für das aktuelle Spielziel keine Taktik definiert oder gibt AITactic false zurück, wird eine einfache Deathmatch-Taktik ausgeführt. Diese lässt die Clonks einfach zufällig herumlaufen um Gegner zu finden.
Clonkonaut, Dezember 2007


GetPlrID

Ab Version: 1.5

Beschreibung

Liefert eine ID, die aus der Spielernummer des Scriptspielers und Nullen zusammengesetzt ist. Diese ID wird an InitializePlayer in idExtra übergeben. Damit kann der Scriptspieler zu diesem Steuerungsobjekt identifiziert werden (nach der Initialisierung reicht GetOwner im Steuerungsobjekt).

Syntax

id GetPlrID ();

Parameter

Siehe auch: Künstliche Intelligenz
Clonkonaut, Mai 2008


Konsole

Konsolen dienen dazu, um verschiedene andere Objekte zu bedienen. Eine Konsole wird einfach mit dem Befehl "Set" auf ein Zielobjekt ausgerichtet und dieses kann seine ganze speziellen Funktionen an die Konsole übermitteln.
CreateObject(CONS, 100, 100, -1)->Set(FindObject(TELE));
Hiermit würde eine Konsole erstellt und an den ersten gefundenen Teleporter gekoppelt werden.

Das Zielobjekt

Das Zielobjekt einer Konsole benötigt nur zwei Funktionen: "ConsoleControl" und "ConsoleControlled".
"ConsoleControl" wird von der Konsole aufgerufen, um die Menüpunkte des Steuerungsmenüs abzufragen. Par(0) ist dabei der Index des Eintrags (beginnend bei 1)
public func ConsoleControl(int i)
{
  if(i == 1) return("Explodieren");
  if(i == 2) return("Verschwinden");
}
Damit würde das Konsolenmenü zwei Menüeinträge enthalten: "Explodieren" und "Verschwinden"
Wird vom bedienenden Clonk ein Punkt ausgewählt, erhält das Zielobjekt den Aufruf "ConsoleControlled" und als ersten Parameter den Index des ausgewählten Eintrags:
public func ConsoleControlled(int i)
{
  if(i == 1) return(Explode(10));
  if(i == 2) return(RemoveObject());
}

Funktionen

Funktion | Beschreibung
Set | Richtet die Konsole auf ein Zielobjekt aus.

Von der Konsole unterstützte Objekte

Kran
Pumpe
Selbstschussanlage
Teleporter
Selbstschussanlage
Türen
Hangartor
Clonkonaut, September 2006


Set

Beschreibung

Aufruf an eine Konsole. Setzt das Zielobjekt der Konsole.

Syntax

void Set (object pTarget);

Parameter

pTarget:
Zielobjekt
Siehe auch: Konsole
Clonkonaut, August 2006


Kran

Zum Kran gibt es nicht viel zu sagen. Wenn man einen Kran erzeugt, kann die Länge der Laufschiene verändern:
var pCrane = CreateObject(CRN1, 100, 100, -1);
pCrane->Set(20);
Erzeugt einen Kran und gibt ihm die Länge von 20 Schienenstücken.
Um den Kran bedienen zu können, muss man eine Konsole mit ihm verbinden.
Der Kran kann grundsätzlich nur Objekte bewegen, die dafür ausgelegt sind. Soll ein Objekt mit dem Kran bewegt werden können, muss man ihm den Callback "IsCraneGrabable" verpassen:
// Ich darf bewegt werden
public func IsCraneGrabable() { return(1); }
Clonkonaut, März 2007


Set

Beschreibung

Setzt die Länge eines Krans in iLength Teilstücken

Syntax

void Set (int iLength);

Parameter

iLength:
Anzahl Teilstücke, die die Kranschiene lang sein soll.
Siehe auch: Kran
Clonkonaut, 2007


Laser

Der Laser ist ein Strahl, der ohne Verzögerung vom Startpunkt zum Endpunkt eine Linie zieht und dort eventuell Schaden macht. Im Gegensatz zum Projektil, welcher noch eine Weile fliegt, ist der Laserstrahl sofort am Ziel. Der Laser wird von der Lasermine, der Partikelkanone und anderen Energiewaffen benutzt. Wie das Projektil ist der Laser dafür gedacht, nicht nur von einer Waffe benutzt zu werden sondern für verschiedenste Zwecke. Auch kann der Laser (LASR) leicht von anderen Lasertypen inkludiert werden.
Der Laser wird normal per CreateObject erzeugt, seine Eigenschaften werden dann per Set() festgelegt.

Treffer & Callback

Es können alle Objekte vom Laser getroffen werden, die auf den Callback IsBulletTarget(LASR) true zurückgeben. Mit der Einschränkung, dass wenn die "Kein Friendly Fire"-Regel aktiviert ist, nur Feinde oder leblose Objekte getroffen werden.
Wenn der Laser also ein Objekt pVictim trifft, wird im Callback-Objekt (normalerweise die Waffe) LaserStrike(pVictim, iTime) aufgerufen. iTime ist hierbei die Zeit, die der Laser schon existiert. Dort kann dem Zielobjekt schlicht per DoDmg Schaden gemacht werden, man kann dort aber auch etwas explodieren lassen (siehe Lasermine) oder andere Dinge auslösen. Insofern kann der Laser auch als Bewegungsmelder genutzt werden.
Gibt LaserStrike false zurück, endet der Laserstrahl nicht in pVictim, sondern geht hinter diesem noch weiter. Kann also weitere Objekte treffen. Der Strahl der Partikelkanone funktioniert beispielsweise so.

Funktionen

Der Laser stellt folgende Funktionen zur Verfügung:
Funktion | Parameter | Beschreibung
Set | int iAngle, int iWidth, int iDist, int iT, object pDmg, object pAtt | Setzt alle Eigenschaften des Lasers gleichzeitig fest: Winkel, Breite, Reichweite, wie schnell der Laserstrahl ausfadet, das Objekt an den der Schadenscallback geht und das Objekt, an dem der Laserstrahl dranhängt.
SetAngle | int iAngle | Setzt den Winkel in den der Lasertrahl gehen soll.
SetWidth | int iWidth | Legt fest, wie breit der Lasertrahl in Pixeln sein soll.
SetMaxDistance | int iMaxDist | Legt fest, wie weit der Lasertrahl maximal reicht (Reichweite).
SetContinuous | int iDelay | Der Laserstrahl führt alle iDelay Frames erneut eine Treffer-Prüfung aus. Default für iDelay ist 1.
GetAngle |  | Gibt den Winkel in den der Lasertrahl geht, zurück.
GetWidth |  | Gibt die Breite des Laserstrahls zurück.
GetLength |  | Gibt die aktuelle Länge des Laserstrahls zurück. Wenn der Laserstrahl irgendwo gegen eine Wand geht, ist er natürlich kürzer.
GetMaxDistance |  | Gibt die maximale Länge des Laserstrahls zurück.
LaserEnd | &x, &y | Speichert in x und y den Endpunkt des Laserstrahls. Also da, wo der Laserstrahl auftrifft.
Newton, August 2007


Set

Beschreibung

Setzt initial die Eigenschaften des Laserstrahls fest.

Syntax

void Set (int iAngle, int iWidth, int iDist, int iTime, object pCallback, object pAttach);

Parameter

iAngle:
Winkel in den der Laserstrahl gehen soll.
iWidth:
[opt] Breite des Laserstrahls in Pixeln. Da der Laserstrahl animiert ist, wirkt eine Angabe von 1 Pixeln fast wie ein halber Pixel. Default 3.
iDist:
[opt] Maximale Länge des Laserstrahls (Reichweite) in Pixeln. Default 300.
iTime:
[opt] Zeit in Frames bis der Laserstrahl ausgefadet ist. Wenn der Laserstrahl komplett ausgefadet ist, wird er gelöscht. Ansonsten ist dies ein rein grafischer Effekt und hat keine weiteren Auswirkungen. 0 für kein Ausfaden, default ist 0.
pCallback:
[opt] Objekt in dem bei Treffer der Callback LaserStrike(pVictim) ausgeführt werden soll. Gibt dieser false zurück, endet der Laserstrahl nicht bei pVictim sondern geht noch weiter. Wird kein Objekt als pCallback angegeben, führt der Laserstrahl keine Trefferüberprüfungen aus und beschränkt sich darauf, ein rein grafischer Effekt zu sein.
pAttach:
[opt] Gibt an, an welches Objekt der Laser rangeklebt werden soll. 0 für keines, default ist 0.

Anmerkung

Der Laserstrahl wird standardmäßig bei Erstellung komplett rot (RGB(255,0,0)) eingefärbt.

Beispiele

#strict

public func Initialize() {
  var laser = CreateObject(LASR);
  laser -> Set(45, 5, 2000, 0, this());
  laser -> SetContinuous(3);
}

public func LaserStrike(object pObj) {
  Log(Format("%s wurde von dem Log-Laser getroffen", GetName(pObj)));
  return(1);
}
Angenommen dies sei der Script eines Objektes: Das Objekt erstellt bei Initialisierung einen Laser an seiner Position. Das Callback-Objekt ist es selber. Wenn der Laser trifft, dann wird das geloggt.
Das besondere hier ist aber, dass durch SetContinuous nicht nur einmal auf Treffer überprüft wird, sondern alle 3 Frames. Und das, bis der Laser ausgefadet ist. Da der Laser wie mit Set festgelegt nicht ausfaden soll, bleibt er für immer da und loggt fleißig vorbeilaufende Objekte :)
  var radius = 40;
  var target = GetCursor();

  // 6 Laserstrahlen...
  for(var angle = 0; angle < 360; angle +=60) {

    // Startpunkte berechnen
    var startx = Sin(angle,radius);
    var starty = -Cos(angle,radius);

    var endx = Sin(angle+120,radius);
    var endy = -Cos(angle+120,radius);

    // Entfernung berechnen
    var dist = Distance(startx,starty,endx,endy);

    // Laserobjekt erstellen
    var laser = CreateObject(LASR,GetX(target)+startx,GetY(target)+starty,-1);
    laser -> Set(angle+150, 6, dist, 90, 0, target);
  }
Lässt um den Clonk des ersten Spielers ein Pentagramm erscheinen. ;)
Die einzelnen "Linien" sind 6 Pixel breit und faden innerhalb von 90 Frames (etwa 3 Sekunden) aus. In der Zeit klebt das Pentagramm am Clonk. Da kein Objekt für den Callback angegeben ist, ist dies hier ein rein grafischer Effekt: Sollten die Laserstrahlen irgendjemanden treffen, gehen sie einfach durch ihn hindurch.
Die Laserstrahlen gehen allerdings nicht durch wände. Wenn sie eine Wand treffen, werden sie so verkürzt, dass sie nur bis zur wand gehen. Wenn sie kein Ziel treffen und ihre maximale Länge also auch der tatsächlichen Länge entspricht, wird der Strahl zum Ende hin dünner dargestellt.
Siehe auch: Laser
Newton, März 2007


Leitern

In Hazardszenarien ist es oft nötig Vorsprünge oder Plattformen und ähnliches zu erreichen. Mit normalem An-der-Wand-Hochklettern wären diese schwer zu erreichen, und ein Aufzug ist oft unhandlich und träge. Deshalb gibt es in Hazard ein revolutionäres, noch nie dagewesenes Objekt! Und trägt den Namen: Leiter.

Steuerung

Um an einer Leiter zu klettern, muss man einfach nur dagegenspringen.
Mit Rauf/Runter klettert man nach oben/unten. Um stehenzubleiben muss man in die Richtung zur Leiter drücken.
Um von der Leiter abzuspringen muss man von der Leiter weg drücken. Es gibt 3 Arten, wie man von der Leiter abspringen kann:
  • Im Raufklettern
    • Hierbei springt der Clonk etwas nach oben weg.
  • Im Stillstand
    • Dies ist wohl die interessanteste Methode. Der Clonk stößt sich mit den Füßen von der Leiter ab, und vollführt einen Backflip.
  • Im Runterklettern
    • Hier stößt sich der Clonk einfach nur etwas ab, und fällt nach unten.

Scripting

Leitern sind im Prinzip sehr einfach zu scripten, und bieten auch viele Möglichkeiten der Manipulation. Vom Hazardclonk aus, lässt sich jedes Objekt, bei dem IsClimbable() true zurückgibt beklettern. Für das schlichte Platzieren der Leitern ohne besondere Grafiken kann die Funktion Set benutzt werden.

Aussehen

Zuerst ein bisschen Grundlegenes. Der Aufbau der Leiter. Eine Leiter besteht aus einzelnen Elementen, diese können im Prinzip jegliche Grafik annehmen. Man gibt der Leiter mehrere Grafiken an, und wenn man sie länger macht bekommen die neuen Elemente eine dieser Grafiken. Um eine Grafik hinzuzufügen verwendet man AddGraphics. Standardmäßig wird nur eine gerade Leitergrafik verwendet.
Funktion | Beschreibung
AddGraphics | Fügt eine Grafik also möglichen Leiterteil hinzu.
ClearGraphics | Entfernt alle Grafiken.
Redraw | Gibt allen Elementen neue Grafiken.

Größe/Länge

Die Leiter hat im Prinzip 3 Größenparameter: Breite eines Elements, Höhe eines Elements, und Länge(=Anzahl Elemente).
Breite und Höhe werden über SetSize bestimmt. Die Breite gibt an, ab wann der Clonk an der Leiter klettert. Die Höhe dient als Abstand zwischen den Elementen. Die Werte werden von der Mitte weg angegeben, sprich, wenn die Leiter 10 Pixel breit ist, wird als Breite 5 angegeben. Als Standard wird Definitionsbreite/2 und Definitionshöhe/2 verwendet.
Funktion | Beschreibung
SetSize | Definiert die Maße eines Elementes.
Set | Setzt die Länge der Leiter.

Anderen Clonks das Letterkleitern beibringen

Seit Hazard 2.0 wurde das Leiterklettern aus dem Hazardclonk ausgelagert. Nun können auch andere Clonks an Leitern klettern. Dazu muss #include L_LA inkludiert werden welches die Grundfunktionalität zur Verfügung stellt. Außerdem brauchen wir eine neue Aktion in der ActMap.txt des Clonkes:
[Action]
Name=ScaleLadder
Procedure=NONE
Directions=2
FlipDir=1
Length=16
Facet=0,20,16,20,0,0
NextAction=ScaleLadder
(Das Facet ist dasselbe wie beim Klettern). Außerdem muss zu allen Sprung-Aktionen
StartCall=JumpStart
hinzugefügt werden.

Um nun das Klettern auf der Leiter kontrollieren zu können, muss zu allen Control*-Funktionen im Clonk an der gewünschten Stelle eine Zeile hinzugefügt werden. Im Beispiel von ControlUp:
if(ControlLadder("ControlUp")) return(1);
Die relevanten Control*-Funktionen sind -Up, -Down, -Left, -Right, -Throw, -Dig und -Command (bei "MoveTo").
Boni, März 2007


AddGraphics

Beschreibung

Fügt eine Grafik zu den möglichen Grafiken der Leiterelemente hinzu.

Syntax

void AddGraphics (string szGraphic, id idDefinition);

Parameter

szGraphic:
[opt] Grafik die verwendet werden soll. Verhaltien wie bei SetGraphics().
idDefinition:
[opt] Definition von der die Grafik genommen werden soll.

Beispiel

AddGraphics("Part2",LADR);
AddGraphics("Part3",LADR);
Redraw();
Macht aus einer Leiter, die nur aus geraden Elementen besteht, eine Leiter mit schiefen und geraden Sprossen.
Siehe auch: ClearGraphics, Leitern
Boni, March 2007


ClearGraphics

Beschreibung

Entfernt alle möglichen Grafiken der Leiterelemente.

Syntax

void ClearGraphics ();

Beispiel

ClearGraphics();
AddGraphics(0,FLNT);
Redraw();
Eine Flintleiter!
Siehe auch: AddGraphics, Leitern
Boni, March 2007


Redraw

Beschreibung

Alle Elemente bekommen eine neue, zufällige Grafik aus den Möglichen Grafiken der Leiterelemente.

Syntax

void Redraw ();
Siehe auch: AddGraphics, Leitern
Boni, March 2007


Set

Beschreibung

Setzt die Länge einer Leiter.

Syntax

void Set (int iLength, int iOrientation);

Parameter

iLength:
Neue Länge der Leiter. Anzahl der Elemente.
iOrientation:
[opt] Ausrichtung der Leiter. Folgende Werte sind Zulässig:

Konstante | Beschreibung
LADR_Left | Leiter zeigt nach links
LADR_Right | Leiter zeigt nach rechts
LADR_Front | Leiter zeigt nach vorne
Die Angaben sind mit | kombinierbar. Wenn nicht angegeben, wird die vorherige Ausrichtung benutzt.
Siehe auch: Leitern
Boni, March 2007


SetSize

Beschreibung

Bestimmt die Höhe und Breite eines Leiterelements.

Syntax

void SetSize (int iWidth, int iHeight);

Parameter

iWidth:
Halbe Breite eines Elements.
iHeight:
Halbe Höhe eines Elements.

Anmerkung

Die Werte werden von der Mitte weg angegeben. Deswegen wir nur die Hälfte angegeben.

Beispiel

Set(10);
ClearGraphics();
AddGraphics(0,FLNT);
AddGraphics(0,EFLN);
Redraw();
SetSize(3,5);
Macht aus einer Leiter eine tolle Flintleiter, und ändert die Breite und den Abstand der Elemente entsprechend.
Siehe auch: Leitern, Set
Boni, March 2007


Lichter

Eines der einzigartigen Features von Hazard ist Dunkelheit. Und was braucht man, wenn es finster ist? Richtig, Licht! Deswegen gibt es in Hazard mehrere Lichter.
Generell kann man Lichter in 2 Arten unterteilen:
  • Effektlichter
  • Hintergrundlichter
Ersteres dient für Lichteffekte, wie z.B. das Licht eines Bildschirms. Hintergrundlichter dienen zum Aufhellen der Umgebung wenn Dunkelheit herrscht. Ansonsten werden sie nicht erstellt. Natürlich hellen auch Effektlichter die Umgebung auf, sie sind jedoch nur für kurzzeitige Lichtblitze und ähnliches gedacht.
Es gibt auch verschiedene Formen von Lichtern. Eine Taschenlampe etwa wirft einen Lichtkegel, eine Deckenlampe ein halbrundes Licht.
Jedes Licht ist ein Objekt, und weil es recht umständlich wäre, für jedes Licht ein Objekt zu erzeugen, und die ganzen Parameter zuzuweisen, gibt es für jeden Lichttypen eine Hilfsfunktion:
Funktion | Beschreibung
AddLight | Erzeugt ein rundes Licht.
AddLightHalf | Erzeugt ein halbrundes Licht.
AddLightCone | Erzeugt einen Lichtkegel.
AddLightAmbience | Erzeugt ein rundes Hintergrundlicht.
AddLightFlash | Erzeugt einen kurzen Lichtblitz. Erzeugt kein Objekt.
Das Licht was per AddLightAmbience erzeugt wird, ist also das einzige Licht, welches nur bei Dunkelheit existiert. Alle anderen Lichter werden auch erstellt, wenn keine Dunkelheit aktiviert ist. Wenn zwar Dunkelheit aktiviert ist, aber GetDarkness 0 zurückliefert, werden Hintergrundlichter allerdings trotzdem erstellt.

Steuerfunktionen

Steuerfunktionen dienen dazu, die Eigenschaften eines Lichts zu ändern. Es gibt ein paar Grundfunktionen, die jedes Licht kann. Der Lichtkegel hat noch 3 zusätzliche Funktionen.
Funktion | Beschreibung
ChangeColor | Ändert die Farbe des Lichts.
ChangeSize | Ändert die Größe des Lichts.
ChangeGraphics | Ändert das Aussehen.
TurnOn | Schaltet das Licht ein/macht es sichtbar.
TurnOff | Schaltet das Licht aus/macht es unsichtbar.
Lichtkegel: |
ChangeSizeXY | Ändert die Breite und Höhe unabhängig voneinander.
ChangeOffset | Ändert den Punkt, andem das Licht ans Ziel gehängt wird.
ChangeR | Ändert den Winkel, in dem das Licht abgestrahlt wird.
Boni, März 2007


ChangeColor

Beschreibung

Setzt die Farbe eines Lichts, und berücksichtigt automatisch, ob Dunkelheit herrscht. So werden Hintergrundlichter ausgeblendet, wenn keine Dunkelheit herrscht, und alle Lichter aufgehellt, wenn sie herrscht. Der Rückgabewert entspricht dem tatsächlich gesetztem Farbwert.

Syntax

DWORD ChangeColor (DWORD dwColor);

Parameter

dwColor:
Farbe, die das Licht annehmen soll.

Anmerkung

Wenn für dwColor -1 angegeben wird, wird die Farbe des Zielobjekts, an dem das Licht hängt genommen. Wenn dwColor -2 ist, wird die ursurünglich übergebene Farbe upgedatet. Dies ist z.b. nötig, wenn sich der Dunkelheitszustand geändert hat, geschieht aber automatisch.

Beispiele

var light = AddLight(100, 0, FindObject(CLVM));
light->ChangeColor(RGB(0,255,0));
Verpasst einem Colaautomaten ein ungesundes grünes Licht.
AddLightAmbience(1000, -1, GetHiRank(0));
Der höchstrangigste Clonk des ersten Spielers bekommt ein Hintergrundlicht in seiner Farbe.
Siehe auch: Lichter
boni, Oktober 2006


ChangeGraphics

Beschreibung

Setzt die Grafik des Lichts neu. Entspricht SetGraphics(szGfxName).

Syntax

void ChangeGraphics (string szGfxName);

Parameter

szGfxName:
Name der zu setzenden Grafik

Anmerkung

Es gibt folgende Lichtgrafiken im Lichtobjekt:
String | Beschreibung
"Cone" | Gerichtetes Licht, etwa das einer Taschenlampe.
"Half" | Ungerichtetes Licht an einer Wand, z.B. von einer Lampe an der Decke.
"" | Normales Licht, etwa von einer Lampe im Hintergrund.

Beispiel

var light = AddLight(100, 0, GetCursor(0));
light->ChangeGraphics("Half");
Der ausgewählte Clonk des ersten Spielers bekommt ein halbrundes Licht!
Siehe auch: Lichter
boni, März 2007


ChangeSize

Beschreibung

Setzt die Größe eines Lichts relativ zu seiner Originalgröße.

Syntax

void ChangeSize (int iSize);

Parameter

iSize:
Größe, die das Licht annehmen soll. Die Größe ist relativ zu seiner Originalgröße. 100 entspricht 128x128 Pixel.

Beispiel

var light = AddLight(100, 0, GetCursor(0));
light->ChangeSize(5000);
Verpasst dem momentan angewählten Clonk von Spieler 1 ein großes Licht.
Siehe auch: Lichter
boni, Oktober 2006


Munition

Munition wird im Hazardpack von allen Waffen benötigt. Allerdings gibt es auch eine Regel, mit der man Munition beispielsweise für schnelle Deathmatch-Spiele abschalten kann. Die Munition wird nicht im Inventar des Clonks gelagert, sondern in einem unsichtbaren Hilfsobjekt, dem Munitionsgürtel. So kann der Hazardclonk viel unterschiedliche Munition mit sich herumschleppen, ohne umständlich im Inventar herumschalten zu müssen oder nicht genug Platz für Waffen zu haben.
Über einen Eintrag im Kontextmenü kann der Spieler jederzeit abrufen, wie viel Munition er noch mit sich trägt.

Munitionstypen

Im Hazardpack sind alle wichtigen Munitionstypen vorhanden. Damit die ewige Munitionssuche der Vergangenheit angehört, benutzen viele Waffen die gleiche Munition. So benutzen zum Beispiel alle Projektilwaffen die gleiche Munition und der Raketenwerfer benutzt die gleiche Munition für Raketen wie für Lenkraketen. Spezialmunition ist im Konzept des Hazardpacks nicht vorgesehen, für spezielle Feuermodi eignen sich jedoch Upgrades.
Wenn möglich sollten die bestehenden Munitionstypen für neue Waffen benutzt werden. Es gibt folgende Munitionstypen:
Munition | ID | Benutzt von...
Kugeln | STAM | Sturmpistole, Pumpgun, Minigun
Energie | ENAM | Partikelkanone, Energiegewehr, (Granatenwerfer, Sturmpistole)
Granaten | GRAM | Granatenwerfer, Sturmpistole(, Pumpgun)
Benzin | GSAM | Flammenwerfer(, Granatenwerfer)
Raketen | MIAM | Bazooka
Munition sind nur Symbolobjekte deren nullte nummerierte lokale Variable (Local(0)) reserviert ist. Munition wird intern als Inventar von Munitionsbehältern aufbewahrt. Es gehen zwei Callbacks an ein Munitionsobjekt:
Callback | Parameter | Beschreibung
IsAmmo |  | Muss immer true zurückgeben.
MaxAmmo |  | Gibt die maximal zulässige Anzahl dieses Munitionstyps in einem Objekt an. 0 oder nicht angegeben für beliebig viel.

Munitionspakete

Munitionspakete enthalten Munition ("krass!") und können per Doppelgraben automatisch in den Munitionsgürtel entpackt werden. Es gehen drei Callbacks an ein Munitionspaketobjekt:
Callback | Parameter | Beschreibung
IsAmmoPacket |  | Muss true zurückgeben.
AmmoID |  | ID der Munition in diesem Paket. Siehe Tabelle oben.
AmmoCount |  | Anzahl der Munition in diesem Paket.
Im Hazardpack gibt es zu jedem oben aufgeführten Munitionstyp ein Munitionspaket. Die IDs sind die gleichen wie bei der Munition, nur enden sie mit AP statt mit AM. Sie erben alle von STAP, dem Munitionspaket für Kugeln. Jedes von STAP erbende Munitionspack stellt folgende Funktionen zur Verfügung:
Funktion | Parameter | Beschreibung
TransferAmmo | object pTarget | Transferiert die Munition nach pTarget. Allerdings nur wenn pTarget nicht schon zuviel Munition hat (s. MaxAmmo).
MayTransfer | object pTarget | Prüft, ob pTarget nicht schon zu viel Munition hat (die Munition also nicht transferiert weren kann)
öffentliche Funktion zur Verfügung:

Munitionsgürtel

Der Munitionsgürtel ist ein Munitionsbehälter, also ein Objekt in dem Munition aufbewahrt werden kann. Ein Munitionsbehälter gibt auf den Callback IsAmmoStorage() immer true zurück.
Soll per DoAmmo in ein Objekt Munition aufbewahrt werden, wird zunächst AmmoStoring() darin aufgerufen. Sollte AmmoStoring() nun ein Objekt zurückliefern, dass ein Munitionsbehälter ist, wird die Munition stattdessen dort hinein getan (bzw. von dort genommen).
Der Munitionsgürtel ist der Munitionsbehälter des Hazardclonks, ein unsichtbares Hilfsobjekt.

"Keine Munition"-Regel

Es gibt eine "Keine Munition"-Regel. Wenn aktiviert, funktionieren Waffen nicht direkt ohne Munition: Die Waffe bekommt ganz einfach jede gewünschte Munition von ihrem Benutzer, der sie dann nach Bedarf erstellt. Bei aktivierter Regel erstellt der Benutzer die Munition also, statt eingesammelte zu verbrauchen. Einsammeln von Munition funktioniert dann nämlich nicht. Für den Spieler sieht es so aus, als würden die Waffen ohne Munition funktionieren, dabei sind es nur die Munitionsbehälter (Munitionsgürtel), die keine Munition benutzen. Genauere Informationen stehen in der Referenz von den unten aufgeführten globalen Funktionen.

Globale Funktionen

Funktion | Beschreibung
DoAmmo | Anzahl eines Munitionstypen in einem Objekt ändern.
GetAmmo | Gibt die Anzahl einer Munition zurück.
CheckAmmo | Überprüft ob genügend Munition vorhanden ist.
NoAmmo | Gibt true zurück falls die "Keine Munition"-Regel aktiviert ist.
Newton, August 2006


TransferAmmo

Beschreibung

Entpackt das Munitionspaket in das angegebene Zielobjekt und gibt true zurück. Sollte die "Keine Munition"-Regel aktiviert sein oder das angegebene Objekt kein Platz mehr für diesen Munitionstyp haben (wegen MaxAmmo) gibt diese Funktion einfach nur false zurück.
Nach dem Transfer wird AmmoTransferred() im Zielobjekt aufgerufen und das Munitionspaket selbst gelöscht.

Syntax

bool TransferAmmo (object pObj);

Parameter

pObj:
Das Objekt in dem das Pack entpackt werden soll.
Siehe auch: Munitionspakete
Newton, August 2006


Projektil

Das Projektil wird unter Anderem von der Sturmpistole, der Pumpgun und der Minigun verschossen und kann leicht für eigene Waffen benutzt werden. Es fliegt ohne Einflussnahme der Gravitation in eine Richtung, bis es irgendwo auftrifft. Das Projektil ist so konzipiert, dass es leicht von eigenen Projektilen inkludiert werden kann. Beispielsweise die Projektile die das Energiegewehr verschießt, erben von SHT1.
Nachdem das Projektil (SHT1) erstellt wurde, verschießt man es per Launch().
Es trifft alle Objekte, die auf den Callback IsBulletTarget(SHT1) true zurückgeben und natürlich alle Wände. Außerdem alle Lebewesen oder - falls die "Kein Friendly Fire"-Regel aktiviert ist - nur Lebewesen die mit dem Besitzer des Projektiles verfeindet sind (siehe CheckEnemy).
Newton, September 2006


IsBulletTarget

Beschreibung

IsBulletTarget ist ein Callback, den alle Objekte definiert haben, die von verschiedensten Geschossen getroffen werden sollen. Wenn dieser Callback true zurückgibt, kann das Objekt von einem Geschoss (Projektil, Rakete,...) getroffen werden.
Als erster Parameter wird die ID des Geschosses angegeben, als zweites das Geschoss selbst und als drittes derjenige, der das Geschoss abgefeuert hat (nicht die Waffe sondern der Benutzer der Waffe).

Beispiel

public func IsBulletTarget(id idBullet, object pBullet, object pShooter)
{
  if(idBullet == MISS) return(false);
  return(true);
}
Das Objekt wird von allen Geschossen außer Raketen getroffen.
Newton, August 2007


Launch

Beschreibung

Verschießt das Projektil.

Syntax

void Launch (int iAngle, int iSpeed, int iDist, int iSize, int iTrail, int iDmg, int iDmgPrecision, int iGlowSize, int iAPrec, int iReflections);

Parameter

iAngle:
Winkel, unter der das Projektil verschossen werden soll.
iSpeed:
Geschwindigkeit des Projektiles.
iDist:
Maximale Entfernung die das Projektil zurücklegt, bis es verpufft.
iSize:
[opt] Größe des Projektiles in Pixeln. Maximalgröße ist 8, Standardgröße 5.
iTrail:
[opt] Länge der Leuchtspur hinter dem Projektil in Pixeln. Standardlänge ist 300.
iDmg:
[opt] Schaden der bei Treffer per DoDmg zugefügt wird. Default 3. Die Schadensart ist DMG_Projectile.
iDmgPrecision:
[opt] Genauigkeit der Schadensangabe. Default 10
iGlowSize:
[opt] Größe des Leuchtens beim Projektil. Wenn nicht angegeben, wird kein Glow eingefügt
iAPrec:
[opt] Ab 2.0. Geschwindigkeitspräzision. Default ist 10.
iReflections:
[opt] Ab 2.0. Wie oft das Projektil an Wänden abprallt bevor es endgültig zerstört wird.

Beispiel

Siehe Beispiel bei Waffen
Siehe auch: Projektil
Newton, September 2006


Regelwähler

Der Regelwähler dient dazu, Spielregeln und -ziele individuell zu wählen, wenn man ein Szenario spielen will und dadurch das Spiel flexibler zu machen.

Spielregeln

Damit eine Spielregel im Regelwähler verfügbar wird, muss man nur einen entsprechenden Callback ins Script schreiben:
// Kann mittels des Spielzielauswählers ausgewählt werden
public func IsChooseable() { return(1); }

Spielziele

Mittels des Wählers lassen sich auch Spielziele konfigurieren. Zuerst einmal bietet der Wähler die Möglichkeit, zu Beginn der Runde ein Spielziel zu wählen. Diese Liste wird erstellt aus allen Spielzielobjekten, die zu Beginn der Runde existieren (die Objekte selbst werden daraufhin entfernt).
Der Regelwähler kann außerdem das Spielziel selbst beeinflussen. Wenn das Spielziel die Jagd nach Punkten beinhaltet (z.B. Deathmatch, Last Man Standing, Capture the Flag), kann die zu erreichende Siegpunktzahl eingestellt werden.
Dazu benötigt das Spielziel wiederum einen Callback im Script:
// Kann mittels des Spielzielauswählers konfiguriert werden
public func IsConfigurable() { return(1); }
Ist dieser Callback vorhanden, versucht der Regelwähler per SetWinScore(iWinScore,pGoal) und GetWinScore(iWinScore,pGoal) die Punktzahl zu setzen, die zum Sieg nötig ist sobald der Spieler seine Auswahl getroffen hat.
Hinweis: Wenn das Spielziel die Teamsteuerung (TEAM) als Grundgerüst benutzt, ist diese Variable bereits vorhanden.

Sonstiges

Sobald die Regelwahl abgeschlossen wurde, werden die ausgewählten Regeln vom Regelwähler erstellt und mittels GameCallEx wird ein Aufruf an das Szenarioscript, alle Regeln und Spielziele gesendet.
Die Funktion "ChooserFinished" wird, sofern im Script vorhanden, an all den o.g. Orten aufgerufen. Dort ist es möglich, Einstellungen zu treffen, die sonst zu Beginn der Runde hätten geschehen sollen (z.B. jedem Spieler eine Waffe geben).

Düsternis

Düsternis kann ebenfalls vom Regelwähler konfiguriert werden. Damit dies möglich ist, muss zu Beginn der Runde Düsternis im Szenario vorhanden sein (also am besten im Eigenschaften-Menü unter Umweltobjekte einstellen), weil Düsternis dies selbst erfordert. Nur dann erscheint ein entsprechender Menüpunkt im Regelwählermenü.
Clonkonaut, März 2007


Rohre

Rohre dienen meistens der optischen Gestaltung eines Szenarios. Sie können aber zu wesentlichen Strukturelementen gemacht werden, einerseits indem sie zu soliden Objekten macht und andererseits indem man sie zum Transport von Flüssigkeiten einsetzt.

Rohre erstellen

Das Erstellen von Rohren ist einfach gestaltet, in den meisten Fällen reicht "eine Zeile" aus.
Ein erstes Beispielscript:
CreateObject(PIPL, 100, 100, -1)->Right(2)->Down(2)->Right(2);
Hiermit wird eine einfach Rohrleitung mit zwei Richtungswechseln erstellt (wichtig: 2 Rohre pro Richtung!).
Wenn ein Rohr durch einen Callback angewiesen wird, ein weiteres als Anschluss zu erstellen, ist die Rückgabe immer ein Pointer auf das neu erstellte Rohr. Dadurch können Rohre durch Ketten von ObjectCalls erstellt werden.
Auch zusätzliche Rohrfunktionen lassen sich problemlos in die Kette einfügen, da ihr Rückgabewert auch jeweils ein Pointer auf das Rohr ist:
CreateObject(PIPL, 100, 100, -1)->Solid()->Right()->Solid()->Right()->Solid()->Down()->Solid()->Down()->Solid()->Right()->Solid()->Right()->Solid();
Dieses Script erstellt eine Rohrleitung ganz ähnlich der, die wir bereits oben erstellt haben. Der Unterschied ist, dass die Rohre diesmal solide sind, also zB Clonks auf ihnen laufen können. Alternativ kann man auch Right(2, true)->Down(2, true)... schreiben, um solide Rohre zu erstellen.
Damit lassen sich bereits optisch anspruchsvolle Dekorationen erstellen, um zB das örtliche Wasserwerk mit einem ausgeprägten Leitungssystem zu versehen.

Flüssigkeiten

Rohre ohne Funktion sind zwar nett anzusehen, aber mehr auch nicht. Deshalb wollen wir, dass sie wirklich das tun, wozu sie gedacht sind: Flüssigkeiten fließen lassen.
Generell besitzen alle erstellten Rohre die Fähigkeit, Flüssigkeit fließen zu lassen. Aber man wird feststellen, dass nichts kommt, wenn ein Wasserbecken mit einer Rohrleitung nach draußen ausstattet. Damit Rohre ihrer Tätigkeit frönen, muss man sich folgender Funktion bedienen: UpdatePipesystem (Hinweis: UpdatePipesystem funktioniert auf Grund des Aufbau nur einmal pro Frame).
CreateObject(PIPL, 100, 100, -1)->Right(2)->Down(2)->Right(2);
UpdatePipesystem();
Dieses Script würde die bereits bekannte Rohrleitung erstellen, sie aber darüber hinaus auch bereit machen, Flüssigkeit fließen zu lassen. Wenn man ein wenig Wasser am oberen Ende hinzeichnet, sollte bereits ein Strom aus dem unteren zu fließen beginnen. Übrigens unterliegen Flüssigkeiten in Rohren auch den Gesetzen der Schwerkraft, weshalb sie nur nach unten fließen.
Um den Durchfluss bei Rohren zu regeln gibt es nun die Möglichkeit, die Stärke einzustellen, mit der das Rohr Flüssigkeit befördern soll:
CreateObject(PIPL, 100, 100, -1)->Right(2,0,0,10)->Down(2)->Right(2);
UpdatePipesystem();
Ein so modifiziertes Rohr wäre wesentlich effektiver als ein normales (zu beachten: das ausführende Rohr ist immer ein Endstück, Flüssigkeit bewegen tun nur die Endstücke, die sich in der Flüssigkeit befinden).
Wenn Rohre nicht einfach dauerhaft tröpfeln sollen, kann man sie mit einem Ventil verschließen:
CreateObject(PIPL, 100, 100, -1)->Right(2,0,0,10)->Down(2)->Valve()->Right(2);
UpdatePipesystem();
So wäre die Rohrleitung erstmal mit einem Ventil verschlossen, dass ein Clonk aufdrehen muss (zu beachten: ein UpdatePipesystem-Aufruf ist hier nicht unbedingt nötig, da das Ventil dies selbst aufruft, sobald es bedient wird. Für evtl. weitere Rohrleitungen ohne Ventil sollte es trotzdem aufgerufen werden).
Ein weiteres Element der Kontrolle, ist der Einbau einer Pumpe:
CreateObject(PIPL, 100, 100, -1)->Right(2)->Down()->Down(0,0,0, PMP2)->Right(2);
UpdatePipesystem();
Die Steuerung des Durchflusses übernimmt jetzt die Pumpe, die zB mit einer Konsole bedient werden kann. Dazu wird vermutlich nötig sein, die Pumpe erst in einer Variable zu speichern und danach den Leitungsbau fortzusetzen.
Damit lassen sich jetzt umfangreiche Leitungen bauen, die Flüssigkeitsbecken leerpumpen können o.ä.
Übrigens sind Rohr- und Pumpensystem nicht auf Rohre mit einem Zu- und einem Abfluss beschränkt. Mehrere Zu- und Abflüsse sind durchaus möglich.

Funktionen

Funktion | Beschreibung
Left | Fügt ein Rohrstück nach links hinzu
Right | Fügt ein Rohrstück nach rechts hinzu
Down | Fügt ein Rohrstück nach unten hinzu
Up | Fügt ein Rohrstück nach oben hinzu
Valve | Erstellt am Rohr ein Ventil
Solid | Macht das Rohr solide
ChangePower | Ändert die Durchflussstärke des Rohres
Siehe auch: UpdatePipesystem

Pumpen

Pumpen funktionieren ähnlich wie Rohre und besitzen die gleichen Funktionen. Ihre Standard-Durchflussstärke ist höher als die eines Rohres. An einer Pumpe sollten grundsätzlich nur zwei weitere Anschlüsse erstellt werden. Dabei ist der erste Anschluss der Zufluß und der zweite der Abfluss.
Clonkonaut, August 2006


ChangePower

Beschreibung

Aufruf an ein Rohr. Ändert die Durchflussstärke. Rückgabewert ist das Rohr selbst.

Syntax

object ChangePower (int iNewPower);

Parameter

iNewPower:
[opt] Neue Stärke
Siehe auch: Rohre
Clonkonaut, August 2006


Down

Beschreibung

Aufruf an ein Rohr. Fügt unten ein neues Teil an. Rückgabewert ist das neue Teil.

Syntax

object Down (int iRepeat, bool solid, bool valve, id pipeId, int iPower, object pConnect);

Parameter

iRepeat:
[opt] Angegebene Anzahl Rohre nach unten erstellen
solid:
[opt] Wenn TRUE wird das neu erstellte Rohr solide
valve:
[opt] Wenn TRUE erzeugt das neu erstellte Rohr ein Ventil
pipeId:
[opt] ID des hinzuzufügenden Rohrteils. Null oder keine Angabe entspricht PIPL
iPower:
[opt] Durchflußstärke des neuen Rohrteils. Null oder keine Angabe entspricht 1 Pixel / Frame
pConnect:
[opt] Objekt an das das Rohr sich anschließen soll

Anmerkungen

Wenn mehrere Rohre mittels iRepeat erzeugt werden sollen, werden die weiteren Parameter (bis auf pConnect) weitergereicht.
Wird keine ID angegeben, wird PIPL als Standard genommen.
Siehe auch: Left, Right, Rohre, Up
Clonkonaut, September 2006


Left

Beschreibung

Aufruf an ein Rohr. Fügt ein neues Teil auf der linken Seite an. Rückgabewert ist das neue Teil.

Syntax

object Left (int iRepeat, bool solid, bool valve, id pipeId, int iPower, object pConnect);

Parameter

iRepeat:
[opt] Angegebene Anzahl Rohre nach links erstellen
solid:
[opt] Wenn TRUE wird das neu erstellte Rohr solide
valve:
[opt] Wenn TRUE erzeugt das neu erstellte Rohr ein Ventil
pipeId:
[opt] ID des hinzuzufügenden Rohrteils. Null oder keine Angabe entspricht PIPL
iPower:
[opt] Durchflußstärke des neuen Rohrteils. Null oder keine Angabe entspricht 1 Pixel / Frame
pConnect:
[opt] Objekt an das das Rohr sich anschließen soll

Anmerkungen

Wenn mehrere Rohre mittels iRepeat erzeugt werden sollen, werden die weiteren Parameter (bis auf pConnect) weitergereicht.
Wird keine ID angegeben, wird PIPL als Standard genommen.
Siehe auch: Down, Right, Rohre, Up
Clonkonaut, September 2006


Right

Beschreibung

Aufruf an ein Rohr. Fügt ein neues Teil auf der rechten Seite an. Rückgabewert ist das neue Teil.

Syntax

object Right (int iRepeat, bool solid, bool valve, id pipeId, int iPower, object pConnect);

Parameter

iRepeat:
[opt] Angegebene Anzahl Rohre nach rechts erstellen
solid:
[opt] Wenn TRUE wird das neu erstellte Rohr solide
valve:
[opt] Wenn TRUE erzeugt das neu erstellte Rohr ein Ventil
pipeId:
[opt] ID des hinzuzufügenden Rohrteils. Null oder keine Angabe entspricht PIPL
iPower:
[opt] Durchflußstärke des neuen Rohrteils. Null oder keine Angabe entspricht 1 Pixel / Frame
pConnect:
[opt] Objekt an das das Rohr sich anschließen soll

Anmerkungen

Wenn mehrere Rohre mittels iRepeat erzeugt werden sollen, werden die weiteren Parameter (bis auf pConnect) weitergereicht.
Wird keine ID angegeben, wird PIPL als Standard genommen.
Siehe auch: Down, Left, Rohre, Up
Clonkonaut, September 2006


Solid

Beschreibung

Aufruf an ein Rohr. Macht das Rohr solide. Rückgabewert ist das Rohr selbst.

Syntax

object Solid ();
Siehe auch: Rohre
Clonkonaut, August 2006


Up

Beschreibung

Aufruf an ein Rohr. Fügt oben ein neues Teil an. Rückgabewert ist das neue Teil.

Syntax

object Up (int iRepeat, bool solid, bool valve, id pipeId, int iPower, object pConnect);

Parameter

iRepeat:
[opt] Angegebene Anzahl Rohre nach oben erstellen
solid:
[opt] Wenn TRUE wird das neu erstellte Rohr solide
valve:
[opt] Wenn TRUE erzeugt das neu erstellte Rohr ein Ventil
pipeId:
[opt] ID des hinzuzufügenden Rohrteils. Null oder keine Angabe entspricht PIPL
iPower:
[opt] Durchflußstärke des neuen Rohrteils. Null oder keine Angabe entspricht 1 Pixel / Frame
pConnect:
[opt] Objekt an das das Rohr sich anschließen soll

Anmerkungen

Wenn mehrere Rohre mittels iRepeat erzeugt werden sollen, werden die weiteren Parameter (bis auf pConnect) weitergereicht.
Wird keine ID angegeben, wird PIPL als Standard genommen.
Siehe auch: Down, Left, Right, Rohre
Clonkonaut, September 2006


Valve

Beschreibung

Aufruf an ein Rohr. Erstellt am Rohr ein Ventil. Rückgabewert ist das Rohr selbst.

Syntax

object Valve (bool Open);

Parameter

Open:
[opt] Wenn TRUE wird ist das Ventil geöffnet.
Siehe auch: Rohre
Clonkonaut, August 2006


Schaden

Das Hazardpack verfügt über ein internes Schadenssystem, das mehrere Schadenstypen und individuelle Resistenzen gegen diese Typen unterstützt. So sind Aliens z.B. besonders anfällig gegen Feuer.
Generell gilt: Schaden wird mit DoDmg gemacht, und Schadensresistenzen werden über den OnDmg-Callback in den Objekten ausgewertet. Hat ein Objekt keinen OnDmg-Callback, wird der volle Schaden verursacht.
Speziell der Hazardclonk addiert außerdem noch die Ergebnisse der OnDmg-Callbacks seiner Rüstung und seiner Schilde - wenn angelegt - zu seiner Resistenz hinzu.
Effekte, die auftreten sollen, wenn ein Objekt tatsächlich Schaden erhält (z.B. Aufflackern des Schildes) können im OnHit-Callback definiert werden.

Schadenstypen

Im Hazardpack existieren mehrere, durch Konstanten festgelegte, Schadenstypen.
Name | Beschreibung
DMG_Melee | Schlag- und Nahkampfschaden.
DMG_Projectile | Schaden durch Projektile und Geschosse.
DMG_Fire | Feuerschaden.
DMG_Explosion | Schaden durch Explosionen und Druckwellen.
DMG_Energy | Schaden durch Energie, also Blitze und futuristische Energiewaffen.
DMG_Bio | Säureschaden oder andere giftige Substanzen.
boni, September 2006
Clonkonaut, Juni 2007


OnDmg

Beschreibung

Gibt die Resistenz eines Objekts gegen Schaden zurück. Die Resistenz wird in Prozent angegeben, wobei eine Angabe von 100 eine Schadensresistenz von 100% bedeutet (Objekt nimmt keinen Schaden). 0 bedeutet, der Schaden den das Objekt nimmt, wird nicht reduziert. Negative Rückgabewerte bedeuten verstärkten Schaden. Wenn der Callback in dem betroffenen Objekt nicht vorhanden ist, wird der Schaden nicht reduziert oder verstärkt.
OnDmg bekommt einen Parameter übergeben, den Schadenstyp. Der erste ist die Höhe des Schadens der hinzugefügt werden soll, der zweite ist der Schadenstyp.

Beispiele

public func OnDmg(int iDamage, int iType)
{
  // Säureschaden
  if(iType == DMG_Bio)
    return(100);
}
Dieses Objekt wäre gegen Säureschaden hundertprozentig resistent, gegen alles andere weder resistent noch anfällig.
public func OnDmg(int iDamage, int iType)
{
  // Explosionsschaden
  if(iType == DMG_Explosion)
    return(-50);
  // Energieschaden
  if(iType == DMG_Energy) {
    // Schaden "absorbieren"
    DoEnergy(iDamage, this(), true);
    return(100);
  }
  // sonstige Schadenstypen: sehr resistent
  return(80);
}
So könnte der OnDmg-Aufruf eines fiesen Gegners aussehen. Kaum eine Waffe kann diesem Gegner Schaden wirklich zufügen, 80% des Schadens werden ignoriert. Nur Explosionen machen ihm anderthalbfachen Schaden. Außerdem absorbiert er Energieschaden, das heißt er hat eine Resistenz von 100% gegen Energie, und bekommt den Schaden der gemacht werden würde dazu, anstatt dass er abgezogen wird.
Siehe auch: DoDmg, Schaden
boni, September 2006


OnHit

Ab Version: 1.5

Beschreibung

OnHit ermöglicht es, Effekte anzuzeigen oder andere Aktionen auszuführen, wenn ein Objekt Schaden erleidet. OnHit bekommt drei Parameter übergeben: die Höhe des Schadens (nach der Veränderung mittels OnDmg), den Schadenstyp und das Schaden verursachende Objekt.

Beispiel

public func OnHit(int iDamage, int iType, object pFrom)
{
  // Säureschaden
  if(iType == DMG_Bio)
    // Sehr nervig: der Clonk schreit
    return(Sound("Scream"));
}
Weichei.
Siehe auch: DoDmg, Schaden
Clonkonaut, Juni 2007


Sicherheitssysteme

Alle Sicherheitsysteme haben etwas gemeinsam: Sie rufen alle einfach nur Access in ihrem Zielobjekt auf wenn der Clonk sich durch was auch immer authentifiziert hat. Was dann geschieht, hängt davon ab, was das Zielobjekt in Access alles macht. Die Tür z.B. öffnet/schließt sich.
Außerdem hat ein Sicherheitsystem immer nur ein Ziel. Falls sich beispielsweise mehrere Türen öffnen sollen wenn man den richtigen Code eingegeben hat, muss man ein Hilfsobjekt schreiben, dass in Access eben diese öffnet.

Kartenleser

Jeder Kartenleser (LKEY) speichert eine Nummer, die mit Set(object pTarget, int iNumber) gesetzt wird. Diese Nummer muss eine Zweierpotenz sein, also 1,2,4 oder 8 und so weiter. Jede Schlüsselkarte speichert auch eine Nummer. Wenn die Schlüsselkarte nun in den Kartenleser geschoben wird und diese beiden Nummern übereinstimmen, wird im Zielobjekt die Callbackfunktion Access aufgerufen.

Beispiel

// Stahltür und Kartenleser links davon erstellen
var steeldoor = CreateObject(STDR,100,100);
var cardreader = CreateObject(LKEY,95,100);

// Tür zuschließen
steeldoor->Lock();
// und den Kartenleser der Stahltür zuweisen.
cardreader->Set(steeldoor,32);
// Stahltür erzeugen
var steeldoor =  CreateObject(STDR,100,100);
var cardreader = steeldoor->SetKeycardLock(32,0);
Beide Codeabschnitte tun das gleiche. Im ersten Beispiel machen wir es "zu Fuß", im zweiten nutzen wir eine Funktion die jede Tür anbietet, SetKeycardLock. Die Tür kann von einem Clonk nurnoch geöffnet werden, wenn er eine Schlüsselkarte hat, dessen Nummer mit 32 übereinstimmt.
Diese Übereinstimmung wird nicht per = getestet, sondern per &.

Schlüsselkarten

Eine Schlüsselkarte speichert nur eine Nummer. Sie ist setz- und abrufbar über die Funktionen SetKeyNumber(int iNumber) und GetKeyNumber(). Eine Schlüsselkarte gibt bei dem Aufruf IsKeycard immer true zurück. Man kann auch Schlüsselkarten erstellen, die für mehrere verschiedene Kartenleser Zugriff geben: Die Nummer die man per SetKeyNumber setzt, kann man als Bitmaske verstehen. Für alle Türen die damit geöffnet werden dürfen, steht dort eine 1 mehr.

Beispiel

// Stahltüren mit Kartenlesern erzeugen
CreateObject(STDR,100,100)->SetKeycardLock(32,0); // 1
CreateObject(STDR,200,100)->SetKeycardLock(16,0); // 2
CreateObject(STDR,300,100)->SetKeycardLock(8,0);  // 3
CreateObject(STDR,400,100)->SetKeycardLock(4,0);  // 4

// Passende Schlüsselkarten erstellen
CreateObject(KCRD,10,10)->SetKeyNumber(16); // A
CreateObject(KCRD,10,10)->SetKeyNumber(40); // B
CreateObject(KCRD,10,10)->SetKeyNumber(60); // C
Dieses Script erstellt ein paar Stahltüren mit Kartenleser (1-4) und ein paar Schlüsselkarten (A-C). Mit Schlüsselkarte A kann man nur die Stahltür 2 öffnen; mit B die Stahltüren 1 und 3; und mit Schlüsselkarte C alle Stahltüren 1-4.

Nummerncode

Wenn der Clonk den richtigen Nummerncode am Nummernpad (PKEY) eintippt, ruft es Access im Zielobjekt auf. Den Nummerncode und das Zielobjekt legt man mit Set(object pTarget, int iCode) fest. Die Länge von iCode sollte dabei nicht länger als 9 Ziffern lang sein, ist aber ansonsten variabel. Führende Nullen werden ignoriert. Wenn für iCode also 15 angegeben wird, muss der Clonk zuerst 1, dann 5 eintippen. Wenn für iCode 01 angegeben wird, muss der Clonk nur 1 ins Nummernpad eintippen.

Beispiel

// Laboratoriumstür mit Nummernpad erstellen
var labdoor = CreateObject(LBDR,100,100);
var numpad = CreateObject(PKEY,105,100);

labdoor->Lock();
// Numpad der Tür zuweisen.
numpad->Set(labdoor,105331256);
Der Clonk muss am Nummernpad 1,0,5,3,3,1,2,5 und 6 eingeben, um die Tür zu öffnen. Siehe auch SetPasscodeLock, eine Funktion der Tür.

Schalter

Den Schalter (SWTH) kann jeder Clonk bedienen, der denn da rankommt und ruft im Zielobjekt direkt Access auf. Setzen kann man das Zielobjekt per Set(object pTarget).
Newton, März 2007


Spawnpunkt

Der Spawnpunkt dient dazu, Waffen, Munition und Ausrüstung für Spieler bereit zu stellen. Um einen Spawnpunkt zu Erstellen benutzt man einfach PlaceSpawnpoint();.
PlaceSpawnpoint(PIWP, 100, 100, 2000);
Erstellt einen Spawnpunkt an der Stelle 100,100 und bestückt ihn mit einer Pistole. Die Zeit, bis wieder eine Pistole zur Verfügung steht (also nachdem die vorherige von jemandem eingesammelt wurde), wird auf 2000 Frames hochgesetzt (Standard sind 1000).

Bonus-Spawnpunkt

Der Bonus-Spawnpunkt funktioniert fast genauso wie der normale Spawnpunkt. Allerdings wird hier statt einer ID eine ganze Liste von IDs angegeben, von denen zufällig eine ausgesucht wird und das entsprechende Objekt erzeugt. Die Standardverzögerungszeit liegt bei 2500 Frames.
Auf Grund dieser Funktion ist der Bonus-Spawnpunkt vor allem für die speziellen Arena-Boni gedacht.
Zum Erstellen von Bonus-Spawnpunkten dient PlaceBonusSpawnpoint();.
PlaceBonusSpawnpoint([BSKB,HSTB,INVB], 100, 100, 2000);
Erstellt einen Bonus-Spawnpunkt an der Stelle 100,100 der die Boni Berserker, Hast und Unsichtbarkeit erzeugen kann und diese alle 2000 Frames (statt 2500) nacherzeugt.
Hinweis: Der Bonusspawnpunkt erzeugt, im Gegensatz zum normalen Spawnpunkt, kein Objekt im Inventar des Clonks, sondern er führt nur einen DefinitionCall "Activate" mit dem Clonk als Parameter in der Bonus-Definition aus.
Clonkonaut, März 2007


Spielziel: Assault

Bei Assault gibt es generell nur 2 Teams: Ein Angreifer-Team und ein Verteidiger-Team. Ersteres muss verschiedene Ziele erfüllen (im Normalfall etwas zerstören), während das andere dies verhindern muss. Wenn nicht alle Ziele erfüllt/zerstört sind, bevor die Zeit abläuft, gewinnt das Verteidiger-Team.
Um ein Objekt als Ziel zu definieren verwendet man AddTarget. Bei der Zerstörung eines Ziels wird ein Callback im Szenarienscript aufgerufen.

Funktionen

globale Funktionen | Parameter | Beschreibung
AddTarget | object pTarget, int iOptional, int iMaxDmg, bool fNoBar | Definiert das Objekt als Ziel und fügt gegebenfalls einen Lebensbalken hinzu.
SetTargetStatus | int iIndex, bool iStatus | Setzt ob ein ziel bereits erfüllt/zerstört wurde.
GetTargetStatus | int iIndex | Fragt ab, ob ein Ziel bereits erfüllt/zerstört wurde.
Szenario-Callbacks | Parameter | Beschreibung
OnTargetXDestruction |  | Wird aufgerufen, wenn ein Ziel zerstört wurde. X ist der Index des Ziels.
AttackTeam | int iTeam | Gibt das Team, das Angreift zurück. Standardmäßig 1
DefenseTeam | int iTeam | Gibt das Team, das Verteidigt zurück. Standardmäßig 2
boni, August 2007


AddTarget

Ab Version: 1.5

Beschreibung

Definiert ein Objekt als Ziel, und verpasst ihm, falls nicht anders angegeben, einen Lebensbalken. Der Lebensbalken ist bei primären Zielen rot, und bei optionalen gelb-grünlich. Zurückgegeben wird der Index des Ziels. Dieser beginnt mit 1 und wird einfach immer erhöht(Sprich, das als erstes hinzugefügte Ziel hat 1, das Zweite 2 usw.). Der Index wird für die Szenariencallbacks OnTargetXDestruction und SetTargetStatus benötigt.

Syntax

int AddTarget (object pTarget, int iOptional, int iMaxDmg, bool fNoBar);

Parameter

pTarget:
Objekt, dass zu einem Ziel gemacht werden soll.
iOptional:
[opt] Ob das Ziel optional ist. Wenn 1, muss es nicht zerstört werden um die Runde zu gewinnen. Wenn 2, ist es garkein Ziel, sondern nur ein Zerstörbares Objekt. (z.B. Geschützstellungen)
iMaxDmg:
[opt] Wieviel Schaden das Objekt aushält, bis das Ziel erfüllt ist. Wird nichts angegeben, muss das Objekt ganz zerstört werden.
fNoBar:
[opt] Wenn wahr, wird kein Lebensbalken über dem Objekt angezeigt.

Anmerkung

Wird das Objekt zerstört, bevor iMaxDmg erreicht ist, gilt das Ziel auch als erfüllt/zerstört.

Beispiel

AddTarget(GetCursor(1));
Der momentan angewählte Clonk von Spieler 2 muss getötet werden!
Siehe auch: Assault
boni, August 2007


SetTargetStatus

Ab Version: 1.5

Beschreibung

Setzt den Status eines Ziels auf erfüllt/nicht erfüllt.

Syntax

int SetTargetStatus (int iIndex, bool fStatus);

Parameter

iIndex:
Index des Ziels, dessen Status geändert werden soll.
fStatus:
Status, auf den gesetzt werden soll. true entspricht nicht erfüllt, false erfüllt.

Anmerkung

Wenn ein Ziel erst später hinzugefügt werden soll, ist es besser einfach erst später im Spiel AddTarget aufzurufen, anstatt es zuerst zu einem Ziel zu machen, zu deaktivieren, und später wieder zu aktivieren.
Siehe auch: Assault
boni, August 2007


Spielziel: Bombing Run

Analog zum Spielziel Capture the Flag, platziert man die Tore per CreateBombGate.Die Bombe selbst per CreateBomb.
Im Spiel werden außerdem folgende GameCalls aufgerufen:
GameCall | Parameter | Beschreibung
BombCaptured | int iBomberTeam, object pBomber | Wird aufgerufen, wenn pBomber vom Team iBomberTeam die Bombe an sich genommen hat.
BombScored | int iBombedTeam, int iScoreTeam, object pBomber, int iScore | Wird aufgerufen, wenn pBomber (vom Team iScoreTeam) die Bombe in das Team iBombedTeam wirft und damit iScore Punkte errungen hat.
BombReturned |  | Wird aufgerufen, wenn die Bombe wieder zurück ist. Dies passiert, wenn die Bombe zu lange herumliegt, aus dem Spielfeld fällt oder durch ein Tor geflogen ist.
Newton, August 2007


Spielziel: Domination

Bei Domination gilt es, zweierlei Dinge einzustellen.
Zuerst einmal müssen die zu erobernden Station erstellt werden. Dazu dient CreateDominationPoint. Jede Station bekommt ihre eigene ID. Die ID ist auch gleichzeitig der Name der Grafik des Wappens.
Die Namen der Grafik sind also entsprechend:
  • Graphics1.png
  • Graphics2.png
  • ...
Die Wappengrafiken werden aus der angegeben Quelldefinition genommen. Wird keine extra Definition angegeben, dient DBAS (Marker) als Standard.
Anmerkung: Damit Domination die Spieler wieder an die richtigen Startposition versetzen kann, muss die Funktion "RelaunchPosition2" vorhanden und global sein. Diese Funktion sollte die Funktion von RelaunchPosition übernehmen:
/* Szenarioscript */

public func RelaunchPosition(& iX, & iY, int iTeam)
{
    var x,y;
    RelaunchPosition2(x,y, iTeam);
    iX = x;
    iY = y;
}

global func RelaunchPosition2(& iX, & iY, int iTeam)
{
    ...
}
Clonkonaut, April 2007


Spielziel: Erobere die Flagge

Dieses Spielziel unterscheidet sich von sonstigen Spielzielen nur in dem Punkt, dass man die Flaggen, die als Zielobjekte dienen, selber per Script platzieren muss.
Dazu dient die globale Funktion CreateFlag.
Im Spiel werden außerdem folgende GameCalls aufgerufen:
GameCall | Parameter | Beschreibung
FlagCaptured | int iFlagTeam, int iCaptureTeam, object pFlagger | Wird aufgerufen, wenn pFlagger (vom Team iCaptureTeam) die Flagge von iFlagTeam gestohlen hat.
FlagScored | int iFlagTeam, int iScoreTeam, object pFlagger | Wird aufgerufen, wenn pFlagger (vom Team iScoreTeam) die Flagge von iFlagTeam zur eigenen Flagge gebracht und damit einen Punkt errungen hat.
FlagReturned | int iFlagTeam, object pReturner | Wird aufgerufen, wenn pReturner die Flagge von iFlagTeam zurückgebracht hat. Sollte die Flagge dadurch zurückkommen, weil sie verloren gegangen ist oder weil das gegnerische Team einen Punkt gemacht hat, ist pReturner null.
Clonkonaut, August 2006
Newton, März 2007


Teamsteuerung

Die Teamsteuerung dient als Basisobjekt für alle teambasierten Spielziele. Sie stellt die Grundfunktionen, wie zB Punkteverwaltung, zur Verfügung, dient selbst aber nicht als eigenständiges Spielziel.
Die Teams müssen in jeden Fall mittels Teams.txt erstellt werden. Danach übernimmt die Teamsteuerung die Aufgabe, das Scoreboard einzurichten und mit Einträgen für jedes Team zu versehen. Außerdem werden Verfeindungen zwischen Teams automatisch gesetzt und das Spiel wird beendet, wenn ein Team die zu erreichende Punktzahl hat.
/* -- Teamspielziel -- */
#include TEAM

protected func Initialize()
{
  SetWinScore(3,this());
  _inherited();
}
Dies wäre zB ein normales Teamspielziel, bei dem es gilt, 3 Siegpunkte zu ergattern. Die Punkte müssen hierbei von Objekten im Szenario vergeben werden.
Die Punkte werden mittels der globalen Funktion DoTeamScore vergeben.
Funktionen zur Verwaltung der Siegpunktzahl sind SetWinScore und GetWinScore.
Clonkonaut, September 2006


Teleporter

Der Teleporter verhilft dem Spieler, sich schnell von A nach B zu bewegen, ohne dass dieser einen Finger krümmen muss. Ein Teleporter braucht immer ein Ziel, damit er den Clonk zu diesem beamen kann. Jedoch muss Teleporter B nicht automatisch Teleporter A als Ziel haben, nur weil Teleporter A Teleporter B als Ziel hat.

Ziel setzen

Wie schon gesagt, kann jeder Teleporter jeden anderen Teleporter im Level als Ziel haben. Das Zielsetzen geht wie folgt:
          var pTele1 = CreateObject(TELE, 100, 100, -1);
          var pBeamTarget;

          for(pBeamTarget in FindObjects( Find_ID(TELE), Find_Action("Activated"), Find_Distance(900), Find_Exclude(pTele1) ))
          {
        pTele1->SetTarget(pBeamTarget);
            }
Dieses Script erstellt einen Teleporter und sucht einen aktivierten Teleporter in einer Entfernung von 900 Pixeln und weist diesen dem erstellten per SetTarget() als Ziel zu

Globale Funktion

Objekte können mit einer Funktion teleportiert werden. Dies macht mehr als SetPosition, es kommen noch nette Effekte hinzu. Zum Beispiel beamt sich auch die Unterstützungsdrone mit dieser Funktion zum Clonk zurück:
var pClonk = GetHiRank(0);
Beam(pClonk, GetHiRank(1));
Mit diesem Codeabschnitt wird der beste Clonk von Spieler 1 an die Position von dem besten Clonk des zweiten Spielers gebeamt. Zu beachten ist, dass der Effekt prüft, ob das Zielobjekt ein Gebäude ist oder ein Objekt. Bei einem Gebäude wird das zu beamende Objekt in das Gebäude versetzt, bei einem Objekt jedoch direkt an die Position.

Konsolensteuerung

Der Teleporter kann normal mit einer Konsole verbunden und bedient werden. Dadurch kann von der Konsole aus der Beamvorgang aktiviert werden und der Teleporter aktiviert bzw. deaktiviert werden. Zu einem deaktiviertem Teleporter kann nicht gebeamt werden.

Funktionen

Funktion | Beschreibung
SetTarget | Weist dem Teleporter ein Ziel zu.
Beam | Ruft den Beam-Effekt auf
Raven, März 2007


SetTarget

Beschreibung

Weist dem aufrufendem Teleporter einen Zielteleporter zu.

Syntax

bool SetTarget (object pTargetTeleporter, object pSecTele);

Parameter

pTargetTeleporter:
Zielteleporter, zu dem der aufgerufene Teleporter beamen soll.
pSecTele:
[opt] Interner Parameter für das Teleportermenü. Wird genutzt, falls SetTarget() von einem Menü aufgerufen wird.

Anmerkung

Sollte das Ziel kein Teleporter oder kein Ziel angegeben sein, wird false zurückgegeben. Bei neu gesetztem Ziel dementsprechend true.

Beispiel

Siehe Objektbeschreibung Teleporter
Siehe auch: Teleporter
Raven, August 2006


Türen

Ja, im Hazardpack gibt es auch eine Türsteuerung. Wieso wenn es schon eine im Originalpack gibt? Ganz einfach. Diese Türsteuerung ist für andere Türen. Die Türsteuerung im Originalpack (DOOR) ist für Türen die "nach hinten" führen. Unsere Türsteuerung ist für Türen, die seitlich stehen. Mit denen man also von einem Raum in den nächsten kommt.

Zerstören

Man kann eine Tür zerstören. Diese Funktionen hat jede Tür, die von GBDR erbt:
Funktion | Parameter | Beschreibung
SetMaxDamage | int iDamage | Setzt die Stabilität der Tür. iDamage gleich -1 für unzerstörbar. Wenn der Schaden iDamage übersteigt, ist die Tür kaputt.
GetMaxDamage |  | Gibt die Stabilität der Tür zurück.
IsDestroyable |  | Gibt zurück, ob die Tür unzerstörbar ist.
IsBulletTarget |  | Gibt true zurück, wenn die Tür zu ist. Ansonsten false. Geschosse rufen diese Funktion auf, um festzustellen, ob dieses Objekt von ihnen getroffen werden kann.
Normalerweise hat jede Tür eine Tür eine Default-Stabilität die typischerweise in Initialize festgelegt wird. Wenn die Tür zerstört wurde, wird in ihr OnDestroyed aufgerufen. Hier kann man dann eine Kaputt-Grafik auswählen oder die Tür explodieren lassen usw.

Öffnen und Schließen

Türen öffnen sich automatisch für sich nähernde Clonks. Wenn der Clonk durchgelaufen ist, schließt sich die Tür wieder. Diese Funktionen stellt die Tür zur Verfügung.
Funktion | Parameter | Beschreibung
Lock | bool autoClose | Verhindert, dass die Tür sich automatisch öffnet oder schließt. Bei autoClose gleich true geht die geöffnete Tür automatisch wieder zu.
Unlock |  | Schaltet das automatische Öffnen und Schließen wieder an.
Open |  | Öffnet die Tür. Wenn kein Lock aktiviert ist, wird sie sich aber nach kurzer Zeit wieder schließen. Ansonsten bleibt sie natürlich offen.
Close |  | Schließt die Tür. Das ändert nichts daran, dass sich die Tür wieder öffnen wird wenn der nächste Clonk vorbeikommt. Um dies zu verhindern, siehe Lock.
Beim Öffnen wird in der Tür OnOpen und beim Schließen OnClose aufgerufen.

Zugangskontrolle

Für die Tür existieren mehrere Sicherheitssysteme, mit denen man kontrollieren kann, dass nur ganz bestimmte Leute dort eintreten können. Für Arenen ist das wohl eher uninteressant, aber für Adventures kann man das sehr gut gebrauchen. Es gibt:
  • Kartenleser: Das Schließen und Öffnen einer Sicherheitstür geschieht durch das benutzen der zugehörigen Schlüsselkarte.
  • Nummerncode: Jeder der den richtigen Nummerncode kennt, kann die Tür per Eingabe desselben öffnen und schließen.
  • Schalter: Banales Sicherheitssystem, aber solange dieser Schalter auf der richtigen Seite der Tür ist, vielleicht das sicherste Sicherheitssystem.
Der Parameter iDir (DIR_Left oder DIR_Right) gibt bei allen drei Funktionen an, auf welcher Seite die Kontrolle erscheinen soll. All diese Funktionen deaktivieren zuerst das automatische Öffnen und Schließen der Tür per Lock. Je nach Authentifikation über das Sicherheitssystem, wird in der Tür auch mal Open und Close aufgerufen.
Funktion | Parameter | Beschreibung
SetKeycardLock | int iID, int iDir | Setzt einen Kartenleser als Schloss. iID ist die Identifikationsnummer der Karte.
SetPasscodeLock | int iPass, int iDir | Setzt eine PIN-Eingabe als Schloss. iPass ist die Nummerfolge die eingetippt werden muss.
SetSwitchLock | int iDir | Setzt ein Schloss durch einen Schalter.
Es ist übrigens auch möglich, beliebig viele dieser Schlösser für eine Tür festzulegen. Vorstellbar wäre auf der einen Seite einen Schalter zu haben und auf der anderen Seite einen Kartenleser.
Newton, März 2007


Upgrades

Upgrades bieten ein Interface, Objekte aufzurüsten. Für Waffen sollen sie im Hazardpack als Ersatz für spezielle Munition dienen. Statt dass der Spieler also spezielle Lenkraketen-Munition in abgelegenen Teilen der Karte findet, findet er ein Laser-Upgrade womit er seinen Raketenwerfer dauerhaft mit Lenkraketen schießen lassen kann.
Im Hazardpack gibt es nur drei Upgrades, aber es können weitere definiert werden. Zum Beispiel wäre ein "Hochleistungsreaktor" vorstellbar, mit dem man die Partikelkanone aufrüsten kann so dass sich der Strahl selbst durch Metall schmilzt.
Um ein Objekt als Upgrade zu deklarieren, genügt es, es von KLAS erben zu lassen:
#include KLAS
Upgrades erstellen auf Doppelgraben (Activate()) ein Menü, in denen alle diejenigen Objekte im Inventar des Clonks aufgelistet werden, die mit diesem Upgrade aufgerüstet werden können. Im Menü kann dann ein Objekt ausgewählt werden, welches mit diesem Upgrade aufgerüstet werden soll.
Jedes Upgrade hat auch die Funktion UpgradeObject(object pObj), mit dem ein Objekt pObj per Script aufgerüstet werden kann.

Aufrüstbare Objekte

Ein Objekt gilt als aufrüstbar mit einem Upgrade, wenn es auf einen IsUpgradeable(id idUpgrade)-Callback nicht false zurückgibt. Das Objekt soll allerdings nicht schlicht true zurückgeben, sondern den Beschreibungstext für das Aufrüsten.
Soll das Objekt dann also aufgerüstet werden, wird OnUpgrade(id idUpgrade) im Objekt aufgerufen. Die Speicherung der Upgrades erfolgt intern. Das Aufrüsten selber, welcher Art es auch immer sein möge, findet also im Objekt und nicht durch das Upgrade statt. Das Upgrade löst es nur aus. Upgrades sind über das Kontextmenü wieder entfernbar.
Es gibt 3 Callbacks, die beim Upgraden bzw. Downgraden aufgerufen werden:
Callback | Parameter | Beschreibung
IsUpgradeable | id UpgradeID | Wird benötigt. Muss eine Upgradebeschreibung liefern, wenn das Objekt mit einem Objekt dieser ID upgradebar ist.
OnUpgrade | id UpgradeID | Die Waffe wurde mit UpgradeID geupgradet.
OnDowngrade | id UpgradeID | Das Upgrade UpgradeID wurde entfernt.
Beispiel:
public func IsUpgradeable(id idUpgrade) {
  // Wir haben das Upgrade schon
  if(GetUpgrade(idUpgrade))
      // nicht upgraden
      return(false);
  // Aufrüstbar mit einem Laser
  if(idUpgrade == KLAS) return("Wertet die Energiewaffe zur Partikelkanone auf.");
}

public func OnUpgrade(id idUpgrade) {
  // Aufrüsten mit einem Laser
  if(idUpgrade == KLAS) {
    ChangeDef(GGWP);
    return(true);
  }
}
Dies könnte ein Teil des Scriptes einer billigen Energiewaffe sein. Wenn aufgerüstet mit einem neuen Laser, bekommt man eine Partikelkanone (GGWP).
Bei Upgrades sollte darauf zu geachtet werden, dass das gleiche Upgrade nicht mehrere Male an einem Objekt angewendet werden kann.
Meist werden Upgrades zum Freischalten bestimmter Feuermodi verwendet. Dafür kann die Feuermodus-Eigenschaft FM_Condition verwendet werden:
public func FMData2(int data)
{
  if(data == FM_Name)      return("Laser");
  if(data == FM_AmmoID)    return(ENAM);

  if(data == FM_Condition) return(GetUpgrade(KLAS));

  return(Default(data));
}

public func IsUpgradeable(id idUpgrade) {
  // Wir haben das Upgrade schon
  if(GetUpgrade(idUpgrade))
      // nicht upgraden
      return(false);

  // Aufrüstbar mit einem Laser (nur wenn nicht schon aufgerüstet)
  if(idUpgrade == KLAS)
    return("Ermöglicht den sekundären Feuermodus 'Laser'");
}

public func OnUpgrade(id idUpgrade) {
  // Aufrüsten mit einem Laser
  if(idUpgrade == KLAS) {
      // Setzen wir gleich unseren neu upgegradeten Feuermodi!
    SetFireMode(2);
    return(true);
  }
}
Der zweite Feuermodus dieser Waffe (Laser) ist nur auswählbar, wenn die Waffe vorher mit einem Laser aufgerüstet wurde.
Newton, boni, September 2006, Oktober 2007


Waffen

Die Waffensteuerung des Hazardpacks bietet ein bequemes und mächtiges Interface, mit dem der Entwickler leicht neue Waffen entwerfen kann. Im Prinzip muss man nur die Eigenschaften der Waffe angeben, der Rest wird dann von der Waffensteuerung erledigt.
Um die Waffensteuerung für eine Waffe zu verwenden, schreibt man lediglich am Anfang des Waffenscripts:
#include WEPN

Waffeneigenschaften & Feuermodi

Die Waffensteuerung ermöglicht für jede Waffe, beliebig viele Feuermodi zu haben. Die Sturmpistole beispielsweise hat standardmäßig zwei Feuermodi: Der normale Einzelschuss und einen kleinen Granatenwerfer. Die einstellbaren Eigenschaften für die Waffe gelten alle pro Feuermodus. Jeder Feuermodus kann also komplett anders feuern, andere Munition verbrauchen, unterschiedlich lange dauern zum Nachladen usw.
Die Eigenschaften eines Feuermodus werden in einer einzigen Callbackfunktion festgelegt: "FMData*". Beispiel:
public func FMData1(int data)
{
  if(data == FM_Name)      return("Einzelschuss");
  if(data == FM_AmmoID)    return(STAM);
  if(data == FM_AmmoLoad)  return(6);

  if(data == FM_Reload)    return(100);
  if(data == FM_Recharge)  return(10);

  if(data == FM_Damage)    return(3);

  return(Default(data));
}
So sollte diese Callbackfunktion aufgebaut sein: Es wird abgefragt welche Eigenschaft gefragt ist und dann das dementsprechende zurückgegeben. Es gibt noch mehr Eigenschaften die angegeben werden können, diese sind aber optional, wenn man nicht vergisst, am Ende return(Default(data)); zu schreiben. Für genaue Beschreibungen der Eigenschaften siehe FMData*.
Beginnend mit FMData1, sind beliebig viele weitere Feuermodi definierbar (FMData2, FMData3, ...). FMData1 beschreibt dabei den primären Feuermodus, derjenige der am Anfang ausgewählt ist. Der Feuermodus der Waffe im Beispiel soll einen Revolver darstellen: Er benötigt Patronen als Munition (STAM) und kann 6 Schüsse nachladen. Man benötigt 100 Frames um die Waffe nachzuladen und zwischen jedem Schuss ist eine Verzögerung von 10 Frames. In Fire1 (siehe unten) sollte festgelegt sein, dass die Waffe 3 Schaden macht.
Die Feuermodi kann der Spieler per [Doppelgraben] wechseln, sofern genug Munition vorhanden ist.

Waffeninfos für die KI

Damit die KI die Waffe benutzen kann, braucht diese noch ein paar Informationen von dem Waffenmodus. Dieser BotData*-Infoblock ist genauso aufgebaut wie der FMData-Block.
public func BOTData1(int data)
{
  if(data == BOT_Range)    return(480);
  if(data == BOT_DmgType)  return(DMG_Projectile);

  return(Default(data));
}

Upgrades

Waffen können mit Upgrades erweitert werden. Für nähere Details siehe Upgrades.Die Waffe stellt dazu 3 Steuerfunktionen bereit:
Callback | Parameter | Beschreibung
Upgrade | id UpgradeID | Upgradet die Waffe mit UpgradeID, wenn möglich.
Downgrade | id UpgradeID | Entfernt das Upgrade UpgradeID wieder, wenn vorhanden.
GetUpgrade | id UpgradeID | Überprüft ob die Waffe mit UpgradeID upgegradet wurde.

Feuern

In der Callbackfunktion Fire* wird dann festgelegt, was passiert, wenn in demjenigen Feuermodus gefeuert wird.
Bleiben wir beim Beispiel des Revolvers. Hier ist weiterhin nur der erste Feuermodus in Verwendung:
public func Fire1()
{
  // und Richtung, in die es schaut
  var dir = GetDir(GetUser())*2-1;
  // Winkel herausfinden in den geschossen werden soll
  var angle = GetUser()->AimAngle();
  // Position der Mündung der Waffe
  var x,y;
  GetUser()->WeaponEnd(x,y);
  // Schuss dort erstellen und verschießen
  var ammo = CreateObject(SHT1,x,y,GetController(user));
  ammo->Launch(angle,250,600,5,15,GetFMData(FM_Damage));

  // Effekte
  MuzzleFlash(35,user,x,y,angle);
  BulletCasing(dir*6,3,-dir*5,-20,5);

  // Sound
  Sound("Pistol");
}
Letztlich könnte in Fire1 natürlich alles Mögliche stehen. Dieses Beispiel soll einen typischen Fire*-Callback zeigen, wie er ähnlich auch bei anderen Waffen des Hazardpacks aussieht.
Wie man hier sieht, setzt die Waffe voraus, dass ihr Benutzer die Funktionen "AimAngle" und "WeaponEnd" zur Verfügung stellt. "AimAngle" gibt den Winkel in dem tatsächlich geschossen werden soll zurück, schon einkalkulierend in welche Richtung der Clonk schaut und ob er in eine bestimmte Richtung zielt.
"WeaponEnd" liefert die Position der Mündung der Waffe - unabhängig von ihrer Drehung. Dadurch erübrigen sich komplizierte Kalkulationen im Waffenscript.
Der Schuss, der hier erstellt und per "Launch" auf seine Reise geschickt wird, ist der normale Schuss wie er auch von der Sturmpistole oder der Minigun verschossen wird.

Anzeige in der Hand

Waffen werden automatisch in der Hand des Hazardclonks angezeigt. Hierfür wird die normale Ingame-Grafik benutzt. Wichtig hierbei ist, dass die Ingame-Grafik der Waffe nach links zeigt! Die Position an der die Waffe angezeigt wird, wird mit den Callbacks "HandX" und "HandY" festgelegt. Diese beiden Callbacks geben an, wo sich der Griff der Waffe von der Objektmitte aus befindet. Die Größe wird mit dem Callback "HandSize" angegeben und ist relativ zur Ingame-Grafik. Beispiel:
public func HandSize()	{ return(500); }
public func HandX()	{ return(1500); }
public func HandY()	{ return(-5000); }
Eine Waffe mit diesen Callbacks wird in der Hand eines Hazardclonks halb so groß wie ihre Ingame-Grafik angezeigt. Der Griff der Waffe (dort wo der Hazardclonk seine Hand hat), befindet sich fünf Pixel unterhalb und anderthalb Pixel rechts von der Objektmitte.
Andere Objekte als Waffen können auch am Hazardclonk angezeigt werden. Hierzu muss der Callback "IsDrawable" in demjenigen Objekt true zurückgeben.

Callbacks an die Waffe

Außer "Fire1" und "FMData1" sind alle Callbacks optional und können, müssen aber nicht verwendet werden.

Callback | Parameter | Beschreibung
Fire* |  | Die Waffe feuert mit Feuermodus *.
FMData* | int iData | Eigenschaften des Feuermodus *.
HandX |  | X-Position des Griffes der Waffe von der Objektmitte aus.
HandY |  | Y-Position des Griffes der Waffe von der Objektmitte aus.
HandR |  | Rotation der Waffe. Wird der Richtung, in die der Clonk schaut, angepasst.
HandSize |  | Größe der Waffe relativ zur Ingame-Grafik.
BarrelXOffset |  | X-Position des Ende des Waffenlaufs der Waffe vom Ende des Objekt aus.(Ganz links in der Graphics.png)
BarrelYOffset |  | Y-Position des Ende des Waffenlaufs der Waffe vom Ende des Objekt aus.(Ganz links in der Graphics.png)
OnEmpty | int iFireMode | Wird aufgerufen, wenn die Waffe keine Munition mehr hat.
OnSelect | int iFireMode | Wird bei Anwahl der Waffe im Inventar aufgerufen.
OnDeselect | int iFireMode | Wird bei Abwahl der Waffe im Inventar aufgerufen.
OnReload | int iFireMode | Wird beim Start des Nachladens aufgerufen.
OnReloaded | int iFireMode | Wird nach erfolgreichem Nachladen aufgerufen.
OnAutoStart | int iFireMode | Wird beim Starten einer automatischen Waffe aufgerufen.
OnAutoStop | int iFireMode | Wird beim Stoppen einer automatischen Waffe aufgerufen.
OnAimStart | int iFireMode | Wird aufgerufen, sobald angefangen wird zu zielen.
OnAimStop | int iFireMode | Wird aufgerufen, sobald aufgehört wird zu zielen.

Funktionen der Waffe

Funktion | Beschreibung
Fire | Feuern.
Reload | Lädt die Waffe nach.
Empty | Nimmt die Munition wieder aus der Waffe.
StopAutoFire | Stoppt das automatische Feuern. Siehe FM_Auto.
IsReloading | Gibt true zurück wenn die Waffe gerade nachlädt.
CancelReload | Nachladen abbrechen.
PauseReload | Nachladen pausieren.
ResumeReload | Nachladen fortsetzen.
SetFireMode | Setzt den aktuellen Feuermodus.
GetFireMode | Gibt den aktuellen Feuermodus zurück.
SetUser | Setzt den Benutzer der Waffe.
GetUser | Gibt den Benutzer der Waffe zurück.
GetCharge | Gibt den Ladestand in Prozent zurück.
GetFMData | Gibt die gewünschten Feuermodus-Daten zurück.
GetBotData | Gibt die gewünschten KI-Info-Daten zurück.
Default | Gibt die Default-Werte von Feuermodus-Daten zurück. Siehe FMData*.
IsWeapon | Gibt immer true zurück.

Callbacks an den Benutzer der Waffe

Dieser Abschnitt ist für das Erstellen von Waffen nur insofern relevant, als dass hier aufgelistet ist, welche Funktionen die Waffe in seinem Benutzer aufrufen darf. Hier wird hauptsächlich beschrieben, welche Callbacks ein Objekt haben muss, um die Waffen des Hazardpacks benutzen zu können.
Neben den Callbacks wird davon ausgegangen, dass sich die Waffe im Inventar des Benutzers befindet.
Notwendig sind folgende Callbacks, ansonsten gibt es Fehlermeldungen:
Callback | Parameter | Rückgabetyp | Beschreibung
ReadyToFire |  | bool | Soll zurückgeben, ob der Benutzer bereit zum Feuern ist.
AimAngle | int iAim, int iRange | int | Soll den Winkel in dem geschossen wird, zurückgeben. Die beiden Parameter sind optional und geben an, ob ein Ziel automatisch anvisiert werden soll. iAim gibt den maximalen Winkel an, in dem ein Ziel anvisiert werden kann (10 bedeutet 10° nach unten und nach oben von der normalen Schussrichtung aus). iRange gibt die maximale Entfernung in Pixeln an, in der anvisiert wird.
WeaponEnd | int &x, int &y | void | Soll die Position der Mündung der Waffe in &x und &y speichern. Dabei zu berücksichtigen ist auch die Drehung der Waffe.
WeaponBegin | int &x, int &y | void | Soll die Position des anderen Endes der Waffe in &x und &y speichern. Auch hier ist die Drehung der Waffe zu berücksichtigen.
Mehr darf die Waffe von dem Benutzer nicht erwarten, auf bestimmte Benutzer zugeschnitte Aufrufe wie etwa if(GetAction(Contained()) eq "Jump") müssen unbedingt vermieden werden, wenn die Waffe für alle Benutzer benutzbar bleiben soll.
Die folgenden Callbacks sind optional und müssen nur definiert sein, wenn der Benutzer mit Waffen schießen können soll, mit denen man zielen muss:
Callback | Parameter | Rückgabetyp | Beschreibung
ReadyToAim |  | bool | Soll zurückgeben, ob der Benutzer bereit ist, eine Waffe zu benutzen, mit der man zielen muss.
IsAiming |  | bool | Soll zurückgeben, ob der Benutzer gerade mit einer Waffe zielt.
StartAiming |  | void | Callback an den Benutzer, wenn mit dem Zielen angefangen werden soll. StartAiming sollte AimStart() in der Waffe aufrufen. Sobald der Benutzer nicht mehr zielt, sollte außerdem AimStop() in der Waffe aufgerufen werden.
AimOverride |  | bool | True falls der Benutzer eine Waffe mit der eigentlich nur gezielt geschossen werden kann (z.B. Raketenwerfer) trotzdem benutzen darf. Ab Version 1.5
Immer wenn sich der Munitionsstand ändert, wird der Benutzer außerdem durch den Callback "UpdateCharge" benachrichtigt. Der Hazardclonk zum Beispiel aktualisiert damit den Munitionsbalken.
Newton, April 2007


BarrelXOffset

Beschreibung

Dieser Callback soll die X-Position des Ende des Waffenlaufs relativ zur Objektmitte angeben, also die Stelle, an der der Lauf aus ist, und die Projektile rauskommen. Zurückgegeben wird die Verschiebung in Pixeln mal tausend. So kann man die Waffe auch um halbe Pixel verschieben. Positive Rückgabewerte bedeuten, dass das Laufende weiter hinten ist und negative, dass es weiter vorne ist.

Anmerkung

Die Position ist vom linken Rand und dem Mittelpunkt der Höhe (Height) in der Graphics.png aus.

Beispiel

public func BarrelXOffset()
{
  return( 5000 );
}
Der Lauf ist in Wirklichkeit erst 5 Pixel vor der Grafik aus.
Siehe auch: BarrelYOffset, Waffen
Boni, April 2007


BarrelYOffset

Beschreibung

Dieser Callback soll die Y-Position des Ende des Waffenlaufs relativ zur Objektmitte angeben, also die Stelle, an der der Lauf aus ist, und die Projektile rauskommen. Zurückgegeben wird die Verschiebung in Pixeln mal tausend. So kann man die Waffe auch um halbe Pixel verschieben. Positive Rückgabewerte bedeuten, dass das Laufende weiter unten ist und negative, dass es weiter oben ist.

Anmerkung

Die Position ist vom linken Rand und dem Mittelpunkt der Höhe (Height) in der Graphics.png aus.

Beispiel

public func BarrelXOffset()
{
  return( 2000 );
}
Der Lauf ist in Wirklichkeit 2 Pixel über dem vertikalen Mittelpunkt der Grafik. Zum Beispiel weil die Grafik einen langen Griff nach unten enthält.
Siehe auch: BarrelXOffset, Waffen
Boni, April 2007


BotData*

Ab Version: 1.5

Beschreibung

Mit BotData* legt man die KI-relevanten Eigenschaften des *ten Feuermodus einer Waffe fest. Die Syntax ist die selbe wie bei FMData*.
Eine BotData-Callbackfunktion bekommt als ersten Parameter übergeben, welche Daten des Feuermodus abgefragt werden. Mögliche Daten sind:

Name | Typ | Default | Beschreibung
BOT_Range | int | 100 | Optimale Reichweite für diesen Schussmodus (bei der man gut Schaden macht) in Pixeln.
BOT_DmgType | int | DMG_Projectile | Schadenstyp, den der Modus (hauptsächlich) anrichtet.
BOT_Ballistic | int | 0 | Wenn dieser Schussmodus ballistisch (z.B. Granatenwerfer) statt direkt (z.B. Projektil, Laser, Rakete) schießt, gibt man hier die Anfangsgeschwindigkeit des Geschosses an.

Beispiel

public func BotData1(int data)
{
  // Schussmodus ist bis zu einer Reichweite von etwa 500 Pixeln effektiv
  if(data == BOT_Range)      return(500);

  // Schussmodus macht Feuerschaden
  if(data == BOT_DmgType)    return(DMG_Fire);

  // ansonsten Standardwerte
  return(Default(data));
}
So sollte diese Callbackfunktion aufgebaut sein: Es wird abgefragt welche Eigenschaft gefragt ist und dann das dementsprechende zurückgegeben. Nicht berücksichtigte Eigenschaften bekommen den Defaultwert (siehe Tabelle oben).
Siehe auch: GetBotData, Waffen
Newton, Mai 2007


CancelReload

Beschreibung

Bricht das Nachladen ab. Wenn tatsächlich gerade nachgeladen wurde, wird true zurückgegeben. Ansonsten false.

Syntax

bool CancelReload ();
Siehe auch: IsReloading, PauseReload, Reload, ResumeReload, Waffen
Newton, August 2006


Default

Beschreibung

Default gibt für die in der Tabelle in FMData* aufgeführten möglichen Parameterwerte die dort unter "Default" angegebenen Werte zurück.

Syntax

value Default (int dwFM);

Parameter

dwFM:
Gibt an welche Daten abgefragt werden.
Siehe auch: FMData*, Waffen
Newton, August 2006


Downgrade

Beschreibung

Entfernt ein Upgrade wieder, sofern es vorhanden ist. Gibt true zurück, wenn erfolgreich entfernt wurde.

Syntax

bool Downgrade (id UpgradeID);

Parameter

UpgradeID:
ID des Objekts, dessen Upgrade entfernt werden soll.
Siehe auch: GetUpgrade, Upgrade, Waffen
boni, Oktober 2007


Empty

Beschreibung

Nimmt sämtliche Munition die der aktuelle Feuermodus benutzt wieder aus der Waffe und gibt sie ihrem Benutzer zurück.

Syntax

void Empty ();
Siehe auch: Waffen
Newton, August 2006


Fire*

Beschreibung

Fire* wird aufgerufen, wenn im *te Feuermodus gefeuert wird. Zu diesem Zeitpunkt wurde schon überprüft, ob genug Munition vorhanden ist, dieselbe abgezogen, überprüft ob es momentan möglich ist zu feuern und so weiter. In der Callback-Funktion Fire* muss man sich also nurnoch um das Feuern selbst kümmern.

Beispiel

Siehe Waffen
Siehe auch: FMData*, Waffen
Newton, August 2006


Fire

Beschreibung

Waffe abfeuern. Die Waffe feuert nur, wenn der Benutzer der Waffe bereit zum Feuern (ReadyToFire()) ist und die Waffe weder keine Munition mehr hat, noch gerade nachgeladen wird. Wenn erfolgreich im aktuellen Feuermodus gefeuert wird, wird true zurückgegeben.
Sollte die Waffe automatisch schießen (FM_Auto), wird es hiermit gestartet.

Syntax

bool Fire ();

Beispiel

var clonk = GetCursor(0);
var pistol = CreateContents(PIWP,clonk);
pistol->SetUser(clonk);
if(!(pistol->Fire())) RemoveObject(pistol);
Erstellt eine Pistole im ausgewählten Clonk des ersten Spielers und feuert sie sofort ab. Falls er die Pistole aus welchen Gründen auch immer gerade nicht abfeuern kann, ist sie für den Clonk wohl wertlos und wird wieder gelöscht %).
Siehe auch: Waffen
Newton, September 2006


FMData*

Beschreibung

Mit FMData* legt man die Eigenschaften des *ten Feuermodus einer Waffe fest. Der mit der Callbackfunktion FMData1 definierte Feuermodus, ist der primäre Feuermodus der Waffe, der am Anfang ausgewählt ist. Der zweite Feuermodus ist durch den Callbackfunktion FMData2 definiert, der dritte durch FMData3 usw.
Eine FMData-Callbackfunktion bekommt als ersten Parameter übergeben, welche Daten des Feuermodus abgefragt werden. Mögliche Daten sind:

Name | Typ | Default | Beschreibung
FM_Name | string | "Standard" | Name des Feuermodus. Der Name wird im Feuermodus-Wechseln Menü angezeigt.
FM_AmmoID | id | STAM | ID der verwendeten Munition.
FM_AmmoLoad | int | 5 | Menge der nachladbaren Munition. Sinnvollerweise sollte dieser Wert ein Vielfaches von AmmoUsage sein.
FM_AmmoUsage | int | 1 | Munitionsverbrauch pro AmmoRate Schüsse.
FM_AmmoRate | int | 1 | Anzahl Schüsse bis AmmoUsage Munition verbraucht wird.
FM_Reload | int | 100 | Nachladezeit der Waffe in Frames.
FM_Damage | int | 0 | Schaden den ein Schuss anrichtet. Dieser Callback ist allerdings nur informell für Objekte, die den Schaden eines Schusses dieser Waffe einstufen wollen. Welchen Schaden er tatsächlich anrichtet, legt man erst in Fire* fest, also dort wo der Schuss erstellt wird.
FM_Recharge | int | 10 | Zeitabstand zwischen zwei Schüssen in Frames.
FM_Auto | bool | false | Wenn true schießt die Waffe automatisch - solange, bis man nochmals [Werfen] drückt (z.B. Flammenwerfer).
FM_Aim | int | 0 | Wenn 1 oder 2, muss man zielen bevor man schießen kann (z.B. Raketenwerfer). Bei 2 hält der Hazardclonk die Waffe außerdem anders (siehe Minigun).
FM_Condition | bool | true | Der Feuermodus wird im Menü nur angezeigt (ist benutzbar), wenn hier true zurückgegeben wird.
FM_Icon | id | eigene ID | ID des im Feuermodus-Wechseln Menü angezeigten Icons für diesen Feuermodus.
Die FMData*-Callbackfunktion soll dann die Einstellung zu derjenigen Eigenschaft zurückgeben.
Wichtig: return(Default(Par(0))); muss am Ende dieser Funktion stehen, um nicht definierten Feuermodus-Eigenschaften ihren Default-Wert zuzuweisen. Da es sein kann, dass bei späteren Hazardversionen noch Eigenschaften hinzukommen, sollte dies in jedem Falle getan werden.

Beispiele

public func FMData1(int data)
{
  if(data == FM_Name)      return("Einzelschuss");

  // Informationen zur Munition
  if(data == FM_AmmoID)    return(STAM);
  if(data == FM_AmmoLoad)  return(8);

  // Nachladen und Verzögerung zwischen Schüssen
  if(data == FM_Reload)    return(100);
  if(data == FM_Recharge)  return(15);

  // Schaden
  if(data == FM_Damage)  return(15);

  // ansonsten Standardwerte
  return(Default(data));
}
So sollte diese Callbackfunktion aufgebaut sein: Es wird abgefragt welche Eigenschaft gefragt ist und dann das dementsprechende zurückgegeben. Nicht berücksichtigte Eigenschaften bekommen den Defaultwert (siehe Tabelle oben).
Noch einmal: return(Default(data)); muss am Ende dieser Funktion stehen!
public func FMData2(int data)
{

  if(data == FM_Name)      return("Dauerfeuer");

  // Pro 4 Schuss wird eine Patrone von den max. 10 verbraucht
  if(data == FM_AmmoLoad)  return(10);
  if(data == FM_AmmoRate)  return(4);

  if(data == FM_Recharge)  return(5);

  // automatisch schießen
  if(data == FM_Auto)      return(true);

  if(data == FM_Condition) return(ClonkHeisstRambo());

  // ansonsten wie der erste Feuermodus
  return(FMData1(data));
}

// gibt true zurück wenn der Clonk "Rambo" heißt
private func ClonkHeisstRambo()
{
    var user = Contained();
    return(user && (GetName(user) eq "Rambo"));
}
Der zweite Feuermodus kann 10 Patronen in die Waffe laden und die Verzögerung zwischen den einzelnen Schüssen beträgt nur 5 Frames. Außerdem schießt die Waffe in diesem Feuermodus so lange, bis entweder keine Munition mehr vorhanden ist oder nochmals [Werfen] gedrückt wird.
Wegen der FM_AmmoRate von 4 wird nur alle 4 Schüsse eine Patrone verbraucht.
Interessant ist hier FM_Condition. FMData2 gibt bei FM_Condition nur dann true zurück, wenn der benutzende Clonk Rambo heißt. Dieser Feuermodus ist daher nur von einem Clonk namens Rambo benutzbar.
Die letzte Zeile bedeutet, dass der Feuermodus ansonsten wie der erste Feuermodus ist. Das ist durchaus zulässig, solange FMData1 am Ende auch wieder Default(data) zurückgibt.
Siehe auch: Fire*, GetFMData, Waffen
Newton, April 2007


GetBotData

Beschreibung

Mit GetBotData können die durch die BotData*-Callbacks angegebenen Daten abgefragt werden.

Syntax

value GetBotData (int dwBOT, int iFireMode);

Parameter

dwBOT:
Gibt an welche Daten abgefragt werden sollen.
iFireMode:
[opt] Feuermodus dessen Daten abgefragt werden sollen. Null für aktueller Feuermodus.
Siehe auch: BotData*, Waffen
Newton, Mai 2007


GetCharge

Beschreibung

GetCharge gibt den Ladestand der Waffe in Prozent zurück. Sollte die Waffe gerade nachladen, so gibt diese Funktion zurück, wie weit sie mit dem Nachladen ist. Ein Rückgabewert von 1000 bedeutet hierbei 100%.

Syntax

int GetCharge ();

Anmerkung

Aus der Rückgabe kann man nicht auf die Anzahl der Munition in der Waffe schließen. Dafür gibt es die globale Funktion GetAmmo.
Siehe auch: Waffen
Newton, August 2006


GetFireMode

Beschreibung

Gibt den gerade aktuellen Feuermodus zurück.

Syntax

int GetFireMode ();
Siehe auch: SetFireMode, Waffen
Newton, August 2006


GetFMData

Beschreibung

Mit GetFMData können die durch die FMData*-Callbacks angegebenen Daten abgefragt werden.

Syntax

value GetFMData (int dwFM, int iFireMode);

Parameter

dwFM:
Gibt an welche Daten abgefragt werden sollen.
iFireMode:
[opt] Feuermodus dessen Daten abgefragt werden sollen. Null für aktueller Feuermodus.
Siehe auch: FMData*, Waffen
Newton, August 2006


GetUpgrade

Beschreibung

Gibt zurück, ob die Waffe mit UpgradeID upgegradet wurde.

Syntax

bool GetUpgrade (id UpgradeID);

Parameter

UpgradeID:
ID, die Überprüft werden soll.
Siehe auch: Downgrade, Upgrade, Waffen
boni, Oktober 2007


GetUser

Beschreibung

Gibt den Benutzer der Waffe zurück

Syntax

object GetUser ();
Siehe auch: SetUser, Waffen
Newton, August 2006


HandR

Beschreibung

Mit diesem Callback lässt sich die Rotation der Waffe beeinflussen. Der Wert wird der Richthung des Clonks angepasst (siehe Beispiel).

Beispiel

public func HandR()
{
  return( -90 );
}
Der Hazardclonk hält die Waffe Senkrecht nach oben.
Siehe auch: HandSize, HandX, HandY, Waffen
Newton, August 2006


HandSize

Beschreibung

Mit HandSize gibt man an, wie groß die Waffe in der Hand des Hazardclonks angezeigt werden soll. 1000 ist hierbei Standardwert und bedeutet 100% der Originalgröße, 2000 dementsprechend 200% usw.

Anmerkung

Sollte HandSize() in dem Objekt nicht definiert sein oder 0 zurückliefern, wird das Objekt in normaler Größe angezeigt (also wie Rückgabewert 1000).

Beispiel

public func HandSize()
{
  return( 667 );
}
Die Waffe wird in den Händen des Hazardclonks nur 2/3 mal so groß dargestellt wie als wenn sie normal in der Landschaft herumliegen würde.
Siehe auch: HandR, HandX, HandY, Waffen
Newton, August 2006


HandX

Beschreibung

Dieser Callback soll die X-Position des Griffes relativ zur Objektmitte angeben, also die Stelle, an der der Hazardclonk dieses Objekt hält. Zurückgegeben wird die Verschiebung in Pixeln mal tausend. So kann man die Waffe auch um halbe Pixel verschieben. Positive Rückgabewerte bedeuten, dass der Griff der Waffe weiter hinten ist. Andersrum bedeuten negative Rückgabewerte, dass der Griff weiter vorne ist.

Beispiel

public func HandX()
{
  return( 8500 );
}
Der Hazardclonk hält die Waffe - von der Objektmitte aus gesehen - achteinhalb Pixel weiter hinten.
Siehe auch: HandR, HandSize, HandY, Waffen
Newton, August 2006


HandY

Beschreibung

Dieser Callback soll die Y-Position des Griffes relativ zur Objektmitte angeben, also die Stelle, an der der Hazardclonk dieses Objekt hält. Zurückgegeben wird die Verschiebung in Pixeln mal tausend. So kann man die Waffe auch um halbe Pixel verschieben. Positive Rückgabewerte bedeuten, dass der Griff unterhalb der Objektmitte liegt, negative Rückgabewerte dass der Griff überhalb der Objektmitte liegt.

Beispiel

public func HandY()
{
  return( -1337 );
}
Der Hazardclonk hält die Waffe 1,337 Pixel unterhalb ihrer Objektmitte.
Siehe auch: HandR, HandSize, HandX, Waffen
Newton, August 2006


PauseReload

Beschreibung

Pausiert das Nachladen. Falls das Nachladen vorher schon pausiert war wird false zurückgegeben. Ansonsten true.
Das Nachladen kann jederzeit mit ResumeReload() fortgesetzt werden.

Syntax

bool PauseReload ();
Siehe auch: CancelReload, IsReloading, Reload, ResumeReload, Waffen
Newton, August 2006


Reload

Beschreibung

Lädt die Waffe nach. Wie lange das dauert, ist im aktuellen Feuermodus festgelegt. Sollte der Benutzer nicht genug Munition dabei haben, wird nicht nachgeladen und false zurückgegeben. Wird schon nachgeladen, wird nichts weiter gemacht und false zurückgegeben. Ansonsten true. Wenn bei Aufruf dieser Funktion noch Munition in der Waffe sein sollte, wird die Munition vorher aus der Waffe genommen (siehe "Empty").

Syntax

bool Reload ();
Siehe auch: Waffen
Newton, August 2006


ResumeReload

Beschreibung

Setzt das Nachladen der Waffe fort. Falls das Nachladen überhaupt pausiert war, wird true zurückgegeben. Ansonsten false.

Syntax

bool ResumeReload ();
Siehe auch: CancelReload, IsReloading, PauseReload, Reload, Waffen
Newton, August 2006


SetFireMode

Beschreibung

Wechselt den Feuermodus und gibt dem Benutzer die Munition aus der Waffe zurück. Die Waffe muss danach also nachgeladen werden bevor man damit schießen kann. Die Vorbedingung für den Feuermodus (FM_Condition) wird hierbei ignoriert.

Syntax

bool SetFireMode (int iMode);

Parameter

iMode:
Neuer Feuermodus.

Anmerkung

Sollte der neue Feuermodus der gleiche sein wie der alte, wird nur dann die Munition aus der Waffe genommen und true zurückgegeben, wenn die Waffe nicht mehr voll ist und auch nicht nachlädt.
Siehe auch: GetFireMode, Waffen
Newton, August 2006


SetUser

Beschreibung

Setzt den Benutzer der Waffe. Der Benutzer der Waffe muss bestimmte Funktionen zur Verfügung stellen und von ihm kriegt die Waffe normalerweise ihre Munition.

Syntax

void SetUser (object pUser);

Parameter

pUser:
Neuer Benutzer.
Siehe auch: Callbacks an den Benutzer der Waffe, GetUser, Waffen
Newton, August 2006


Upgrade

Beschreibung

Sofern möglich, upgradet die Waffe mit UpgradeID. Dabei wird OnUpgrade(id UpgradeID) aufgerufen. Gibt true zurück, wenn das Upgrade erfolgreich war.

Syntax

bool Upgrade (id UpgradeID);

Parameter

UpgradeID:
ID des Objekts, mit dem Upgegradet werden soll.
Siehe auch: Downgrade, GetUpgrade, Waffen
boni, Oktober 2007


Waffenautomat

Am Waffenautomaten kann man seine schwer erkämpften Clunker gegen Ausrüstung eintauschen. Der Automat hat ein gewisses Warenangebot, welches per Script konfiguriert wird.

Das Angebot

Der Waffenautomat bringt seine Funktionen zur Konfiguration des Angebots gleich mit. Prinzipiell kann der Automat jedes Objekt im Angebot haben.
Generell gibt es mehrere Funktionen, mit denen das Angebot manipuliert werden kann:
Funktionsliste
Wenn man jetzt also einen Automaten mit einem bestimmten Angebot in einem Szenario haben will, muss das Szenarienscript so aussehen:
// Der Waffenautomat
var machine = CreateObject(WPVM,100,100,-1);
// 2 Pistolen
machine->AddWare(PIWP,2);
// 1 Granatenwerfer
machine->AddWare(GLWP,1);
// unbegrenzt Kugel-Munition
machine->AddWare(STAP, -1);
// 5 Granatenpacks
machine->AddWare(GRAP,5);
// Und noch ein paar Medikits
machine->AddWare(MEDI,3);
// nun noch mal toll sortieren
machine->SortWare("IsWeapon","IsAmmoPacket","IsEquipment");
// fertig!
Der Automat hat nun ein Angebot von:
  • 2x Pistole
  • 1x Granatenwerfer
  • ∞x Kugeln
  • 5x Granaten
  • 3x Medikit
Und weils gerade so schön ist, noch ein Beispiel:
//Der Waffenautomat
var machine = CreateObject(WPVM,100,100,-1);
//Warenliste durchgehen
for(var ware in machine->GetWareList())
{
  //Wenn die letzten 2 Zeichen der ID "WP" sind
  if(WildCardMatch(Format("%i",ware),"??WP"))
    //aus der Warenliste schmeißen
    machine->RemoveWare(ware);
}
//alles auf unbegrenzt verfügbar setzen
machine->SetWare(0,-1);
// fertig!
Dieser Automat bietet alles feil, außer die Standardwaffen. Deren IDs enden alle auf WP, und werden von daher wieder aus der Warenliste geschmissen.

Including

Der Waffenautomat ist so konzipiert, dass man ihn leicht includieren kann, um seine Funktion zu nutzen. Dies nutzt z.b. die Waffenwahl-Regel aus.

Funktionen

Funktion | Beschreibung
AddWare | Fügt eine Ware zum Angebot hinzu.
AddWares | Fügt alle Objekte eines Typs zum Angebot hinzu.
SetWare | Setzt die Verfügbarkeit einer Ware.
RemoveWare | Löscht eine Ware aus dem Angebot.
SortWare | Sortiert die Warenliste.
GetWareList | Gibt das Warenangebot zurück.
GetWareCount | Gibt die Verfügbarkeit einer Ware zurück.

Waffenwahl

Die Waffenwahl-Regel includiert den Waffenautomaten. D.h. das, was am Anfang eines Szenarios bei aktiver Waffenwahl-Regel zur Auswahl steht, kann auf genau die selbe weise beeinflusst werden, wie ein Waffenautomat. Standardgemäß ist das Angebot mit allen Waffen, Ausrüstungen, Upgrades und evtl. Munition gefüllt.
Boni, August 2006, März 2007


AddWare

Beschreibung

Fügt iCount Objekte des Typs id zum Warenangebot eines Automaten hinzu. Hat der Automat diese Ware bereits im Angebot, passiert nichts.

Syntax

bool AddWare (id id, int iCount);

Parameter

id:
ID des Objekts, dass zum Warenangebot des Automaten hinzugefügt werden soll.
iCount:
[opt] Anzahl wieviele Objekte zum Angebot hinzugefügt werden sollen.

Anmerkung

Wenn für iCount eine negative Zahl angegeben wird, ist die Ware unendlich oft verfügbar.

Beispiele

AddWare(FTWP, 5);
Fügt 5 Flammenwerfer zum Angebot hinzu.
AddWare(PSWP,-1);
Fügt eine Pistole, die man unendlich oft kaufen kann, zum Angebot hinzu.
Siehe auch: AddWares, DoWare, RemoveWare, SetWare, Waffenautomat
boni, August 2006


AddWares

Beschreibung

Fügt alle Objekte, bei denen der Übergeben Callback true zurückgibt, zum Warenangebot hinzu.

Syntax

void AddWares (string szCallback, int iCount);

Parameter

szCallback:
Callback, den die Objekte haben müssen.
iCount:
[opt] Anzahl wieviele Objekte zum Angebot hinzugefügt werden sollen.

Beispiel

AddWares("IsWeapon", 2);
Fügt alle Waffen zum Angebot hinzu, und macht sie zweimal verfügbar.
Siehe auch: AddWare, RemoveWare, Waffenautomat
boni, August 2006


DoWare

Beschreibung

Ändert die Verfügbarkeit einer Ware um iChange.

Syntax

bool DoWare (id id, int iChange);

Parameter

id:
[opt] ID des Objekts, dessen Warenangebot geändert werden soll.
iChange:
Anzahl um die das Angebot geändert werden soll.

Anmerkung

Wenn keine id angegeben wird, wird das gesamte Angebot geändert.

Beispiele

DoWare(STAP, 123);
Erhöht den Warenbestand an Standardmunition um 123.
DoWare(MIWP,-1);
Verringert den Warenbestand der Miniguns um 1.
Siehe auch: AddWares, RemoveWare, SetWare, Waffenautomat
boni, August 2006


GetWareCount

Beschreibung

Gibt die verfügbare Anzahl eines Objekts im Angebot zurück.

Syntax

int GetWareCount (id id);

Parameter

id:
ID des Objekts, von dem das Angebot abgefragt werden soll.

Anmerkung

Wenn die Anzahl des Angebots unenlich ist, wird -1 zurückgegeben.
Siehe auch: AddWare, GetWareList, Waffenautomat
boni, August 2006


GetWareList

Beschreibung

Gibt die Warenliste als Array zurück.

Syntax

array GetWareList ();

Beispiel

for(var ware in GetWareList())
  DoWare(ware,1);
Erhöht das Angebot eines jeden Objektes in der Warenliste um eins.
Siehe auch: AddWare, GetWareCount, Waffenautomat
boni, August 2006


RemoveWare

Beschreibung

Entfernt ein Objekt komplett aus der Warenliste.

Syntax

void RemoveWare (id id);

Parameter

id:
[opt] ID des Objekts, dass aus dem Warenangebot entfernt werden soll. Wenn nicht angegeben, wird das komplette Warenangebot gelöscht.
Siehe auch: AddWare, Waffenautomat
boni, März 2007


SetWare

Beschreibung

Setzt die Anzahl eines Angebots. Das Objekt muss bereits in der Warenliste sein.

Syntax

void SetWare (id id, int iCount);

Parameter

id:
[opt] ID des Objekts, dass zum Warenangebot des Automaten hinzugefügt werden soll.
iCount:
Anzahl auf wieviel das Objekt im Angebot gesetzt werden sollen.

Anmerkung

Wenn keine id angegeben ist, werden alle Objekte auf einen bestimmten Wert gesetzt. Nur mit dieser Funktion lässt sich die Anzahl auf -1 setzen. Ist ein Objekt in der Warenliste -1 mal verfügbar, geht das Angebot nie aus. D.h. man kann es immer wieder kaufen.

Beispiel

AddWares("IsWeapon");
SetWare(0,-1);
Fügt dalle Waffen zum Angebot hinzu, und macht es unbegrenzt Verfügbar.
Siehe auch: AddWare, Waffenautomat
boni, August 2006


SortWare

Beschreibung

Sortiert das Warenangebot zuerst nach Kategorien und danach nach Preis. Wird das Angebot nicht sortiert, werden die Angebote im Kaufmenü so aufgelistet, wie sie hinzugefügt wurden.

Syntax

void SortWare (string ...);

Parameter

...:
Callbacks als Strings. Es wird entsprechend der Reihenfolge der übergebenen Callbacks sortiert. Für nähere Callbackinformationen siehe AddWares
Siehe auch: AddWare, Waffenautomat
boni, März 2007


Wegpunkt

Wegpunkte dienen der Bewegungs-KI (künstliche Intelligenz) als Markierungen in der Landschaft. Sie zeigen einem Clonk, wie genau er sich durch die Karte zu bewegen hat, damit er nicht im nächstbesten Loch sein Ende finden muss. In allen Hazardszenarien im Originalpaket sind diese schon definiert. Um ein Szenario KI-fähig zu machen, ist ein Wegpunktnetz unabdingbar.
Es gibt überhaupt Wegpunkte, weil Hazardlandschaften in der Regel komplexer sind als normale Clonklandschaften und man davon ausgehen kann, dass sich die Landschaft im Laufe des Spiels nicht sehr verändern wird. (Weil man bei normalen Clonklandschaften nicht davon ausgehen kann, macht es keinen Sinn, selbige zu definieren. Die engineinterne KI tut dies dynamisch im Spiel, aber mit begrenztem Erfolg.) Zudem reicht die engineinterne Wegfindung einfach nicht aus, wenn es darum geht, Bots durch die Landschaft zu schicken, die auch wirkliche Gegner darstellen sollen. Du wirst aber sehen, dass es nicht so schwer ist, so ein Wegpunktnetz für dein Hazardszenario zu erstellen. Wir haben sogar eine nette Visualisierung gebastelt damit Du sie im Spiel live platzieren kannst :).

Globale Funktionen

Zur besseren Handhabung der Wegpunkte, stehen einige globale Funktionen zur Verfügung. Die meisten sind dazu gedacht, direkt in die Eingabezeile des Enginefensters eingegeben zu werden.
Funktion | Parameter | Beschreibung
CreateWP | int x, int y | Erzeugt einen Wegpunkt an der angegebenen Position.
WaypointsVisible | bool fVisible | Blendet die Wegpunkt und Pfade ein und aus, Wegpunkte zeigen hierbei ihre Objektnummer an. Siehe Screenshot.
WaypointsTest |  | Testet die alle Pfade von jedem Wegpunkt.
LogWaypoints |  | Erzeugt ein Wegpunkt-Erstellungsscript aller im Szenario vorhandenen Wegpunkte und Pfade im Enginelog.

Aufrufe und Callbacks

Ein Wegpunkt alleine ist für die KI noch nicht viel. Erst wenn dieser durch Pfade mit anderen Wegpunkt vernetzt wird, kann ein Weg gefunden und abgelaufen werden.
Wegpunkte und Pfade verfügen über einige Konfigurationsmöglichkeiten, so dass alle Hindernisse, die eine normale Hazardkarte bietet, überwunden werden können.
Jedem Wegpunkt kann man beliebig viele Pfade zuordnen, die alle zu einem weiterem Wegpunkt führen (jeder Pfad hat eine Nummer als Identifikation, beginnend bei 0). Jedem dieser Pfade können Eigenschaften zugewiesen werden, die bestimmen, wie ein Clonk handelt, wenn er diesen Pfad entlang laufen will. Führt der Pfad beispielweise über ein Loch, so wird dem Pfad die Eigenschaft "Springen" zugewiesen, so dass ankommende Clonks über das Loch rüberspringen.
Mittels AddPath weist man einem Wegpunkt einen neuen Pfad zu:
  // Wegpunkt 1 und 2 verbinden
  waypoint1 -> AddPath (waypoint2, Path_MoveTo);
Dies würde einen normalen Pfad von einem Wegpunkt zum nächsten erzeugen, der mittels eines einfachen MoveTo-Kommandos abgelaufen werden würde.
Die einzelnen Eigenschaften eines Pfades können mit entsprechenden Funktionen abgefragt und manipuliert werden:
Funktion | Parameter | Beschreibung
SetPathTarget | int pathID, object pTarget | Setzt einen neuen Zielwegpunkt
SetPathFlag |  | Ändert das Pfad-Flag
SetPathDir | int pathID, int iDir | Ändert die Sprungrichtung
SetPathJetpack | int pathID, int iJetpDelay | Ändert die Jetpackverzögerung
SetPathJetpackFlag | int pathID, int iJetpFlag | Ändert die Zündungsrichtung für das Jetpack
GetPathCount |  | Gibt zurück, über wie viele Pfade vom Wegpunkt wegführen.
GetPathTarget | int pathID | Ermittelt das Pfadziel
GetPathFlag | int pathID | Ermittelt das Pfad-Flag
GetPathDir | int pathID | Ermittelt die Sprungrichtung
GetPathJetpack | int pathID | Ermittelt die Jetpackverzögerung
GetPathJetpackFlag | int pathID | Ermittelt die Jetpack-Zündungsrichtung
RemovePath | int pathID | Entfernt den entsprechenden Pfad

Weitere Kommandos

Manchmal kann es erforderlich sein, dass ein Clonk beim Ablaufen eines Pfades einige spezielle Kommandos behandeln soll (z.B. weil er eine Tür mit einem Schalter öffnen muss).
Dazu können einem Pfad beliebig viele Kommandos angehängt werden, die der Clonk selbstständig ausführt. Dazu dient die Funktion SetArriveCommand, deren Parameter ganz ähnlich denen von SetCommand sind. Die per SetArriveCommand angehängten Kommandos werden unmittelbar nach Erreichen desjenigen Wegpunktes ausgeführt.
  // switch muss ein Pointer auf einen Schalter sein
  // Schalter anfassen
  waypoint1 -> SetArriveCommand (0, 0, "Grab", switch);
  // Den Schalter bedienen
  waypoint1 -> SetArriveCommand (0, 1, "Call", switch, 0,0,0,0 "ControlDig");
  // Loslassen (danach läuft der Clonk selbstständig weiter
  waypoint1 -> SetArriveCommand (0, 2, "UnGrab");

Erstellung

Wegpunkte und Pfade lassen sich am einfachsten im laufenden Spiel erstellen. Mittels WaypointsVisible(true); werden Wegpunkte und Pfade zuerst sichtbar gemacht. Bei der verknüpfung hilft die Anzeige der Objektnummer über den Wegpunkten, die man mit Object(); wieder zu einem Objektpointer machen kann:
Hier muss einfach für den Wegpunkt mit der Nummer 17 folgendes aufgerufen werden...
AddPath(Object(18), Path_Jump);
...und daraus entsteht:
Hinweis: die Wegpunkte können durch einfaches Ziehen verschoben werden, die Pfadpfeile ändern ihre Position, Form und Farbe entsprechend, wenn man die Eigenschaften eines Pfades ändert.
Die Farben und Formen der Pfeile haben folgende Bedeutung:
Farbe, Form | Bedeutung
Grün, durchgezogen | Path_MoveTo
Gelb, durchgezogen | Path_Jump
Gelb, kleine Pfeile | Path_Backflip
Lila, gepunktet | Path_Lift
Rot, kleine Pfeile | Jetpackverzögerung angegeben
Weiß, gepunktet | Unbekannt, Fehler
Clonkonaut, Juni 2007


AddPath

Ab Version: 1.5

Beschreibung

Erzeugt einen neuen Pfad vom aktuellen Wegpunkt zum Zielwegpunkt. Rückgabewert ist die Nummer des Pfades (beginnend bei 0). Dies ist eine Komposition aus den Eigenschaften die einem Pfad zugewiesen werden können. Jede Eigenschaft ist auch einzeln setzbar.

Syntax

int AddPath (object pTarget, int iFlag, int iDir, int iJetpackDelay, int iJetpackFlag, bool fReconnect);

Parameter

pTarget:
Zielwegpunkt.
iFlag:
Bewegungs-Eigenschaft des Pfades:
Konstante | Beschreibung
Path_MoveTo | Schlicht zum Zielwegpunkt hingehen. Wird benutzt, wenn keine Hindernisse zwischen den beiden Wegpunkten liegen oder die engineinterne Wegfindung mit diesem fertig wird.
Path_Jump | Vom Startwegpunkt aus wird einmal in die Richtung iDir gesprungen. Danach wie Path_MoveTo.
Path_Backflip | Wie Path_Jump nur dass er statt einem Sprung einen Rückwärtssalto macht.
Path_Lift | Der Zielwegpunkt ist das Ende eines horizontalen Liftes (und der Startwegpunkt der Anfang desselben).
iDir:
[opt] Sprungrichtung (für Sprung und Jetpack benötigt), -1 für links oder 1 für rechts. 0, falls es automatisch aus der relativen Position des Zielwegpunktes zum aktuellen Wegpunkts ermittelt werden soll. Also: nur angeben, wenn abweichend. Wenn also z.B. nach links gesprungen werden soll, obwohl der Zielwegpunkt rechts von diesem Wegpunkt liegt.
iJetpackDelay:
[opt] Verzögerung bis zur Zündung des Jetpacks. 0 für keine Jetpackbenutzung. Wenn ein Jetpack benutzt wird, wird dieser entsprechend in der Wegfindung berücksichtig: Der Pfad kann natürlich nicht ohne Jetpack und genug Treibstoff abgewandert werden.
iJetpackFlag:
[opt] Zündungsrichtung des Jetpacks. Wenn nicht angegeben, wird es anhand des Winkels zum Zielwegpunkt ermittelt: Mit einem Jetpack kann man hochfliegen oder seitwärts fliegen.
Konstante | Beschreibung
Jetpack_Left | Nach links fliegen
Jetpack_UpLeft | Nach oben fliegen (links)
Jetpack_UpRight | Nach oben fliegen (rechts)
Jetpack_Right | Nach rechts fliegen
fReconnect:
[opt] Wenn TRUE wird ein Pfad vom Zielpunkt zurück angelegt, mit den gleichen Angaben (und iDir * -1). Erspart Arbeit.
Siehe auch: RemovePath, Wegpunkt
Clonkonaut, Juni 2007


GetPathArriveCommand

Ab Version: 1.5

Beschreibung

Gibt Informationen über ein selbst auszuführendes Kommando eines Pfades zurück. Analog zu GetCommand.

Syntax

any GetPathArriveCommand (int iPath, int iCommand, int iElement, bool NoLog);

Parameter

iPath:
Nummer des abzufragenden Pfades.
iCommand:
Nummer des abzufragenden Kommandos.
iElement:
[opt] Nummer des abzufragenden Elements. 0 oder kA: Name, 1: Target, 2: TargetX, 3: TargetY, 4: Target2, 5: Data.
NoLog:
[opt] Keine Fehlermeldung ausgeben, wenn der Pfad nicht vorhanden ist.
Siehe auch: GetPathCount, GetPathDir, GetPathFlag, GetPathJetpack, GetPathJetpackFlag, GetPathTarget, SetArriveCommand, SetPathDir, SetPathFlag, SetPathJetpack, SetPathJetpackFlag, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


GetPathCount

Ab Version: 1.5

Beschreibung

Ermittelt die Anzahl Pfade die von diesem Wegpunkt wegführen.

Syntax

int GetPathCount ();

Parameter

Siehe auch: GetArriveCommand, GetPathDir, GetPathFlag, GetPathJetpack, GetPathJetpackFlag, GetPathTarget, SetArriveCommand, SetPathDir, SetPathFlag, SetPathJetpack, SetPathJetpackFlag, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


GetPathDir

Ab Version: 1.5

Beschreibung

Ermittelt die Sprungrichtung eines Pfades (-1 für links, 1 für rechts).

Syntax

int GetPathDir (int iPath);

Parameter

iPath:
Nummer des abzufragenden Pfades.
Siehe auch: GetArriveCommand, GetPathCount, GetPathFlag, GetPathJetpack, GetPathJetpackFlag, GetPathTarget, SetArriveCommand, SetPathDir, SetPathFlag, SetPathJetpack, SetPathJetpackFlag, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


GetPathFlag

Ab Version: 1.5

Beschreibung

Ermittelt die Bewegungseigenschaft eines Pfades.

Syntax

int GetPathFlag (int iPath);

Parameter

iPath:
Nummer des abzufragenden Pfades.
Siehe auch: GetArriveCommand, GetPathCount, GetPathDir, GetPathJetpack, GetPathJetpackFlag, GetPathTarget, SetArriveCommand, SetPathDir, SetPathFlag, SetPathJetpack, SetPathJetpackFlag, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


GetPathJetpack

Ab Version: 1.5

Beschreibung

Ermittelt die Jetpack-Zündungsverzögerung eines Pfades.

Syntax

int GetPathJetpack (int iPath);

Parameter

iPath:
Nummer des abzufragenden Pfades.
Siehe auch: GetArriveCommand, GetPathCount, GetPathDir, GetPathFlag, GetPathJetpackFlag, GetPathTarget, SetArriveCommand, SetPathDir, SetPathFlag, SetPathJetpack, SetPathJetpackFlag, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


GetPathJetpackFlag

Ab Version: 1.5

Beschreibung

Ermittelt die Jetpack-Zündungsrichtung eines Pfades.

Syntax

int GetPathJetpackFlag (int iPath);

Parameter

iPath:
Nummer des abzufragenden Pfades.
Siehe auch: GetArriveCommand, GetPathCount, GetPathDir, GetPathFlag, GetPathJetpack, GetPathTarget, SetArriveCommand, SetPathDir, SetPathFlag, SetPathJetpack, SetPathJetpackFlag, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


GetPathTarget

Ab Version: 1.5

Beschreibung

Ermittelt den Zielwegpunkt eines Pfades.

Syntax

object GetPathTarget (int iPath);

Parameter

iPath:
Nummer des abzufragenden Pfades.
Siehe auch: GetArriveCommand, GetPathCount, GetPathDir, GetPathFlag, GetPathJetpack, GetPathJetpackFlag, SetArriveCommand, SetPathDir, SetPathFlag, SetPathJetpack, SetPathJetpackFlag, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


RemovePath

Ab Version: 1.5

Beschreibung

Entfernt den angegeben Pfad aus dem Wegpunkt.

Syntax

void RemovePath (int iPath);

Parameter

iPath:
Nummer des zu entfernenden Pfades.

Anmerkung

Beim Entfernen werden die Pfadnummern wieder lückenlos geschlossen, so dass sich Pfadnummern ändern können.
Siehe auch: AddPath, Wegpunkt
Clonkonaut, Juni 2007


SetArriveCommand

Ab Version: 1.5

Beschreibung

Fügt ein selbst auszuführendes Kommando in den Pfad ein.

Syntax

void SetArriveCommand (int iPath, int iCommand, string szCommand, object pTarget, int iX, int iY, object pTarget2, any Data);

Parameter

iPath:
Nummer des zu verändernden Pfades.
iCommand:
Nummer des neuen Kommandos (beginnend bei 0).
szCommand:
Kommandoname (analog zu SetCommand).
pTarget:
[opt] Zielobjekt (analog zu SetCommand).
iX:
[opt] X-Zielkoordinate (analog zu SetCommand).
iY:
[opt] Y-Zielkoordinate (analog zu SetCommand).
pTarget2:
[opt] zweites Zielobjekt (analog zu SetCommand).
Data:
[opt] zusätzliche Daten (analog zu SetCommand).

Anmerkung

Die Benutzung und Ausführung ist genauso wie bei SetCommand.
Siehe auch: GetArriveCommand, GetPathCount, GetPathDir, GetPathFlag, GetPathJetpack, GetPathJetpackFlag, GetPathTarget, SetPathDir, SetPathFlag, SetPathJetpack, SetPathJetpackFlag, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


SetPathDir

Ab Version: 1.5

Beschreibung

Ändert die Sprungrichtung eines Pfades.

Syntax

void SetPathDir (int iPath, int iDir);

Parameter

iPath:
Nummer des zu verändernden Pfades.
iDir:
Neue Sprungrichtung, -1 für links, 1 für rechts.
Siehe auch: GetArriveCommand, GetPathCount, GetPathDir, GetPathFlag, GetPathJetpack, GetPathJetpackFlag, GetPathTarget, SetArriveCommand, SetPathFlag, SetPathJetpack, SetPathJetpackFlag, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


SetPathFlag

Ab Version: 1.5

Beschreibung

Ändert die Bewegungseigenschaft eines Pfades.

Syntax

void SetPathFlag (int iPath, int iFlag);

Parameter

iPath:
Nummer des zu verändernden Pfades.
iFlag:
Neue Bewegungseigenschaft.

Anmerkung

Es können die Konstanten Path_MoveTo, Path_Jump, Path_Backlfip und Path_Lift benutzt werden.
Siehe auch: GetArriveCommand, GetPathCount, GetPathDir, GetPathFlag, GetPathJetpack, GetPathJetpackFlag, GetPathTarget, SetArriveCommand, SetPathDir, SetPathJetpack, SetPathJetpackFlag, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


SetPathJetpack

Ab Version: 1.5

Beschreibung

Ändert die Jetpack-Zündungsverzögerung eines Pfades.

Syntax

void SetPathJetpack (int iPath, int iJetpackDelay);

Parameter

iPath:
Nummer des zu verändernden Pfades.
iJetpackDelay:
Neue Zündungsverzögerung.
Siehe auch: GetArriveCommand, GetPathCount, GetPathDir, GetPathFlag, GetPathJetpack, GetPathJetpackFlag, GetPathTarget, SetArriveCommand, SetPathDir, SetPathFlag, SetPathJetpackFlag, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


SetPathJetpackFlag

Ab Version: 1.5

Beschreibung

Ändert die Jetpack-Zündungsrichtung eines Pfades.

Syntax

void SetPathJetpackFlag (int iPath, int iJetpackFlag);

Parameter

iPath:
Nummer des zu verändernden Pfades.
iJetpackFlag:
Neue Zündungsrichtung.

Anmerkung

Es können die Konstanten Jetpack_Left, Jetpack_UpLeft, Jetpack_UpRight und Jetpack_Right benutzt werden.
Siehe auch: GetArriveCommand, GetPathCount, GetPathDir, GetPathFlag, GetPathJetpack, GetPathJetpackFlag, GetPathTarget, SetArriveCommand, SetPathDir, SetPathFlag, SetPathJetpack, SetPathTarget, Wegpunkt
Clonkonaut, Juni 2007


SetPathTarget

Ab Version: 1.5

Beschreibung

Ändert das Ziel eines Pfades.

Syntax

void SetPathTarget (int iPath, object pTarget);

Parameter

iPath:
Nummer des zu verändernden Pfades.
pTarget:
Neues Ziel.
Siehe auch: GetArriveCommand, GetPathCount, GetPathDir, GetPathFlag, GetPathJetpack, GetPathJetpackFlag, GetPathTarget, SetArriveCommand, SetPathDir, SetPathFlag, SetPathJetpack, SetPathJetpackFlag, Wegpunkt
Clonkonaut, Juni 2007


Tutorials

Eine Sammlung von Tutorials, die die Einführung und das Programmieren mit dem Hazardpack einfacher machen sollen.
Boni, 2006


ChooserFinished

Tutorial: Für "ChooserFinished" im Szenarioscript

Hier wird kurz ein sinnvolles Beispielscript zu "ChooserFinished" vorgestellt. ChooserFinished ist die Funktion, die vom Regelwähler aufgerufen wird, wenn der wählende Spieler fertig mit Wählen ist.

ChooserFinished im Szenarioscript:

/* Regelwähler */

public func ChooserFinished()
{
  // Bei InstaGIB werden alle Spawnpunkte entfernt und die Waffen
  if(FindObject(IGIB))
  {
    for(var spwn in FindObjects(Find_ID(SPNP)))
      RemoveObject(spwn);
    for(var clonk in FindObjects(Find_OCF(OCF_CrewMember)))
      while(Contents(0, clonk))
        RemoveObject(Contents(0, clonk));
  }
  // Bei Keine-Munition werden Munispawns entfernt
  if(FindObject(NOAM))
  {
    for(var spwn in FindObjects(Find_ID(SPNP)))
      if(Contents(0, spwn)->~IsAmmoPacket())
        RemoveObject(spwn);
  }
}

Erläuterung

Die Kommentare sagen eigentlich schon alles, was es zu sagen gibt.
Wenn die Regel InstaGIB (IGIB) eingestellt wurde, werden alle Spawnpunkte und Waffen, die Spieler im Inventar haben entfernt:
    for(var spwn in FindObjects(Find_ID(SPNP)))
      RemoveObject(spwn);
    for(var clonk in FindObjects(Find_OCF(OCF_CrewMember)))
      while(Contents(0, clonk))
        RemoveObject(Contents(0, clonk));
Wenn die Regel Keine Munition (NOAM) eingestellt wurde, werden alle Spawnpunkte entfernt, die Munition enthalten.
    for(var spwn in FindObjects(Find_ID(SPNP)))
      if(Contents(0, spwn)->~IsAmmoPacket())
        RemoveObject(spwn);
Natürlich können noch jegliche andere Dinge in dieser Funktion geschehen (z.B. könnte das Szenarioscript mittels ScriptGo(1); gestartet werden). Dies sollte aber für das normale Hazardpack ausreichend sein.
Siehe auch: Regelwähler
Clonkonaut, März 2007


Relaunch

Tutorial: Relaunch

Achtung: Grundlegende Änderungen in Version 1.5
Dies ist ein kurzes Tutorial mit einem Standard-Relaunchscript für Hazardszenarien. Die Funktionsweise wird kurz erläutert und weiterhin, an welchen Stellen Modifikationen nötig sind.

Das Standard-Relaunchscript:

/*-- Relaunch --*/

#strict

protected func InitializePlayer(int iPlr, int iX, int iY, object pBase, int iTeam)
{
  for(var i=0, pCrew ; pCrew = GetCrew(iPlr, i) ; i++)
    RelaunchPlayer(iPlr, pCrew, 0, iTeam);
}

public func RelaunchPlayer(int iPlr, object pCrew, object pKiller, int iTeam)
{
  // Kein ordentlicher Spieler?
  if(GetOwner(pCrew) == NO_OWNER || iPlr == NO_OWNER || !GetPlayerName(iPlr))
    return();
  // Kein Team
  if(!iTeam) iTeam = GetPlayerTeam(iPlr);
  // Clonk tot?
  if(!GetAlive(pCrew))
    pCrew = RelaunchClonk(iPlr, pCrew);
  // Zufallsposition
  var iX, iY;
  RelaunchPosition(iX, iY, iTeam);

  // Lecker Waffen
  if(!FindObject(IGIB))
  {
    var wpn = CreateContents(PIWP, pCrew);
    wpn->DoAmmo(wpn->GetFMData(FM_AmmoID),wpn->GetFMData(FM_AmmoLoad));
    DoAmmo(STAM, pistol->GetFMData(FM_AmmoID), pistol->GetFMData(FM_AmmoLoad), pCrew);
    DoAmmo(GRAM, 2, pCrew);
  }

    if(Contained(pCrew))
      SetPosition(iX, iY, Contained(pCrew));
    else
      SetPosition(iX, iY, pCrew);
    }
  // Fertig gerelauncht
}

public func RelaunchClonk(int iPlr, object pCursor)
{
  var pClonk = CreateObject(HZCK, 10, 10, iPlr);
  if(pCursor)
    GrabObjectInfo(pCursor, pClonk);
  else
    MakeCrewMember(pClonk, iPlr);

  DoEnergy(+150, pClonk);
  SetCursor(iPlr, pClonk);
  SetPlrView(iPlr, pClonk);

  // Wegstecken
  var tim = CreateObject(TIM2, 10, 10, -1);
  pClonk->Enter(tim);
  PlayerMessage(iPlr, Format("@%s", GetName(pClonk)), tim);

  return(pClonk);
}

public func RelaunchPosition(& iX, & iY, int iTeam)
{
  // Anzahl Zufallpositionen, iTeam verwendet für spezielle Teamstartpositionen
  var rand = Random(2);
  if(!rand)
    { iX = 100; iY = 100; }
  if(!--rand)
    { iX = 200; iY = 100; }
}

Erläuterung

Das Script ist so modular, dass wir keine besondere Behandlung der Spieler bei InitializePlayer brauchen. RelaunchPlayer wird für jeden Clonk in der Crew des Spielers aufgerufen:
protected func InitializePlayer(int iPlr, int iX, int iY, object pBase, int iTeam)
{
  for(var i=0, pCrew ; pCrew = GetCrew(iPlr, i) ; i++)
    RelaunchPlayer(iPlr, pCrew, 0, iTeam);
}
Zuerst folgt die Überprüfung, ob der Spieler gültig ist:
  // Kein ordentlicher Spieler?
  if(GetOwner(pCrew) == NO_OWNER || iPlr == NO_OWNER || !GetPlayerName(iPlr))
    return();
Diese drei Abfragen reichen üblicherweise aus, um eindeutig festzustellen, ob der Spieler existiert (das bedeutet: besitzerlose Clonks erzeugen kein Relaunch)
Das Team des Spielers ist wichtig, wenn in einem Teamspiel jedes Team einen eigenen Spawnplatz hat:
  // Kein Team
  if(!iTeam) iTeam = GetPlayerTeam(iPlr);
Überleitung zu RelaunchClonk, falls der Clonk des Spielers tot ist (dies ist z.B. nicht der Fall, wenn das Spiel beginnt):
  // Clonk tot?
  if(!GetAlive(pCrew))
    pCrew = RelaunchClonk(iPlr, pCrew);
RelaunchClonk sollte trivial sein, zwei Abschnitte sollten nur kurz erläutert werden:
  // Wegstecken
  var tim = CreateObject(TIM2, 10, 10, -1);
  pClonk->Enter(tim);
  PlayerMessage(iPlr, Format("@%s", GetName(pClonk)), tim);
Der neue Clonk des Spielers wird in ein Hilfsobjekt ("TIM") verschoben und erst durch einen Tastendruck des Spielers steigt der Clonk wirklich wieder ins Spiel ein. Bei Bedarf sind natürlich auch hier Änderungen vorzunehmen.
Zurück zur Basisfunktion RelaunchPlayer, an der Stelle, wo wir abgebrochen sind.
...und dann auch gleich wieder weg. Es folgt der Anschluss zu RelaunchPosition, um dem Clonk eine anständige Position zu verpassen:
  // Zufallsposition
  var iX, iY;
  RelaunchPosition(iX, iY, iTeam);
RelaunchPosition ist frei variabel und kann im Prinzip alles enthalten. Die gezeigte Funktion (s.o.) ist nur eines von mehreren Beispielen.
Anmerkung: siehe Domination für eine Anmerkung zu RelaunchPosition.
Nachfolgend noch zwei weitere Beispiele, wie RelaunchPosition auch aussehen kann.
// Beispiel für Teamspiele
public func RelaunchPosition(& iX, & iY, int iTeam)
{
  // Team 1 startet links
  if(iTeam == 1)
  {
    iX = 100;
    iY = 50;
  }
  // Team 2 startet rechts
  if(iTeam == 2)
  {
    iX = 900;
    iY = 50;
  }
}
// Beispiel für "intelligenten Zufall"
public func RelaunchPosition(& iX, & iY, int iTeam)
{
  // Punkt A nur benutzen, wenn kein Clonk zum Spawnkillen in der Nähe ist
  if(!ObjectCount2(Find_InRect(50,50,100,100), Find_OCF(OCF_CrewMember), Find_OCF(OCF_Alive)))
  {
    iX = 75;
    iY = 75;
  }
  // Sonst Punkt B benutzen
  else
  {
    iX = 750;
    iY = 75;
  }
}
Wieder zurück zu RelaunchPlayer und damit zum letzten erklärenswerten Abschnitt:
  // Lecker Waffen
  if(!FindObject(IGIB))
  {
    var pistol = CreateContents(PIWP, pCrew);
    pistol->DoAmmo(pistol->GetFMData(FM_AmmoID),pistol->GetFMData(FM_AmmoLoad));
    DoAmmo(STAM, pistol->GetFMData(FM_AmmoID), pistol->GetFMData(FM_AmmoLoad), pCrew);
    DoAmmo(GRAM, 2, pCrew);
  }
Der Clonk wird hier mit Waffen und Munition für den Start versorgt. Als Waffe erhält er eine geladene Pistole, dazu noch eine volle Pistolenladung Kugeln und 2 Granaten. Hier kann natürlich auch wieder frei editiert werden, um die Spieler mit anderer Ausrüstung starten zu lassen.
Wichtig noch hierbei: Die Waffen werden nur erstellt, wenn die Regel InstaGIB nicht existiert, ist also perfekt genug, um im Zusammenhang mit dem Regelwähler zu funktionieren.
Zum letzten Punkt: der Clonk wird positioniert.
    if(Contained(pCrew))
      SetPosition(iX, iY, Contained(pCrew));
    else
      SetPosition(iX, iY, pCrew);
Auffällig: es wird entweder der Clonk oder das Objekt verschoben, das den Clonk enthält. Dies ist auch richtig so, denn ein neu erzeugter Clonk wurde bereits in ein extra Objekt verschoben. Auch der Regelwähler versetzt zu Beginn der Runde alle Clonks in Dummyobjekte.

Glückwunsch! Du bist nun in der Lage, einen Hazardclonk regelkonform respawnen zu lassen.

Clonkonaut, März 2007
Clonkonaut, Mai 2008


Szenarien

Tutorial: Szenarien

Dieses Tutorial soll eine Hilfe für all diejenigen sein, die gerne Hazardszenarien entwickeln möchten. Es ist keineswegs perfekt, aber zeigt einen relativ einfachen Weg auf.

Objects.txt

Auf den ersten Blick, scheint die einfachste Methode zu sein, das Szenario im Entwicklermodus (EM) zu erstellen, d.h. die Landschaft malen und Objekte einfügen und das ganze als Szenario zu speichern. Alle Objekte sind dann sauber in der Objects.txt gespeichert.
Jedoch ist diese Methode nicht aufwärtskompatibel und bereits nach wenigen neuen Paketversionen, könnte das Szenario nicht mehr richtig funktionieren.
Ein Beispiel dazu:
[Object]
id=LFTP
Number=398
Category=2
X=755
Y=360
Size=100000
Mass=1
FixX=F49479680
FixY=F23592960
Width=50
Height=37
Offset=-25,-18
Vertices=6
VertexX=0,0,-12,12,-24,24
VertexY=18,-25,14,14,8,8
VertexCNAT=72,4,8,8,1,2
VertexFriction=100,100,100,100
Picture=0,0,0,0
OCF=203423813
Action=Travel
LocalNamed=7;Mode=A0,UpperY=i90,LowerY=i525,WaitComDir=A0,WaitY=A0,rLight=O402,lLight=O401
Effects=LightEffects(2,1,0,5,398,LFTP),LightEffects(1,1,0,5,398,LFTP)

Hier sieht man so einen Eintrag aus der Objects.txt. Wie man sieht, sind alle wichtigen Daten zu dem Objekt gespeichert. Dazu gehören auch SolidMask, Aktionen, Lokale Variablen und Effekte. Wenn nun festgestellt wird, dass eine Variable einen ungünstigen Namen trägt (oder sonst etwas anderes verändert wird), ändert dies nichts an der Objects.txt und im Szenario würde das Objekt sich falsch verhalten oder Fehler auslösen.
Um dies zu umgehen, gibt es nur eine Lösung: man muss alle Objekt im Szenarioscript per CreateObject erstellen. Was so viel Aufwand? Nein, so viel ist es gar nicht.

Script.c

Man kann das Szenario im EM zusammenbauen, wie vorher und trotzdem später ein Script haben, das alle Objekte erstellt!
Dazu hier eine Funktion, die alle vorhandenen Objekte durchläuft und als CreateObject(...); in den Enginelog schreibt. Das muss man nur noch kopieren und ins Script einfügen.
#strict

global func GetObjects(id ID)
{
  var obj, exp = Find_And(Find_Not(Find_Func("IsHUD")), Find_Not(Find_Func("IsLight")),Find_Not(Find_Category(C4D_Goal)),Find_Not(Find_Category(C4D_Rule)),Find_Not(Find_Category(64)));
  if(ID)
    exp = Find_And(Find_ID(ID),Find_Not(Find_Func("IsLight")),Find_Not(Find_Func("IsHUD")));
  var extra, extray;
  for(obj in FindObjects(exp))
  {
    extra = "";
    extray = 0;
    if(obj->GetR() != 0) extra = Format("->SetR(%d)", obj->GetR());
    if(obj->GetCon() != 100)
    {
      extra = Format("->SetCon(%d)", obj->GetCon());
      extray = -GetDefCoreVal("Offset", "DefCore", GetID(obj), 1) * (100-obj->GetCon()) / 100;
    }
    if(obj->GetID() == LADR || obj->GetID() == CRN1)
    {
      extra = Format("->Set(%d)", obj->LocalN("length"));
      if(obj->GetID() == LADR)
        extray = - (obj->LocalN("length")-1) * obj->LocalN("sizeY");
    }
    if(obj->GetID() == JMPD)
    {
      extra = Format("->Set(%d, %d)", obj->LocalN("top")->LocalN("strength"), obj->LocalN("top")->GetR());
      if(obj->GetR() != 0)
        extra = Format("->Set(%d, %d, %d)", obj->LocalN("top")->LocalN("strength"), obj->LocalN("top")->GetR(), obj->GetR());
    }
    if(obj->GetID() == SPNP)
    {
      if(!(obj->Contents())) continue;
      Log ("  PlaceSpawnpoint(%i, %d, %d);",
         Contents(0, obj)->GetID(),
         GetX(obj),
         GetY(obj));
      continue;
    }
    if(obj->~LastIndex()) extra = Format("->SetRail(%s)", iArray2String(obj->LocalN("parttype")));
    Log ("  CreateObject (%i, %d, %d, %d)%s;",
       GetID (obj),
       GetX(obj),
       GetY (obj) - GetDefCoreVal("Offset", "DefCore", GetID(obj), 1) - extray,
       GetOwner (obj),
       extra);
  }
}

global func iArray2String(aArray)
{
  var str = "[", i;
  for(var a in aArray)
  {
    str = Format("%s%d", str, a);
    i++;
    if(i < GetLength(aArray)) str = Format("%s,", str);
  }
  str = Format("%s]", str);
  return(str);
}

Erläuterung

Zu diesem Script gibt es einiges zu sagen, denn es ist bei weitem nicht allmächtig.
Zum Ausgeben aller Objekte, reicht es GetObjects(); aufzurufen. Dabei wird berücksichtigt:
  • Licher, Spielregel, -ziele, Umweltobjekte und sonstige derartige Objekte werden nicht beachtet
  • Rotierte Objekte bekommen entsprechend "->SetR(...);" angehangen
  • In der Größe veränderte Objekte bekommen entsprechend "->SetCon(...);" angehangen
  • Leiter und Kräne bekommen "->Set(...);" angehangen
  • Jumppads bekommen die richtige Rotation und Sprungkraft per "->Set(...);"
  • Spawnpunkte werden mittels "PlaceSpawnpoint" erstellt
  • Geländer bekommen einen (hoffentlich) richtigen "->SetRail(...);" Aufruf angehangen

Nacharbeitung

Jetzt muss man sich weiter mit dem Script beschäftigen.
Folgendes ist zu tun (weshalb man das gespeicherte Szenario zu diesem Zeitpunkt keineswegs löschen darf! Lieber kopieren, um es ggf. starten zu können):
  • Alle lokalen Einstellungen der Objekte müssen wiederhergestellt werden. Dazu zählen u.a. Verbindungen von Konsolen mit Objekten, Türeinstellungen usw. - was man genau braucht, sollte man selber wissen
  • Alle Objekte, die von anderen Objekten in Initialize erstellt werden, dürfen nicht noch einmal gesondert existieren. Dazu zählen z.B. Schlitten und Greifer des Krans, Scheinwerferkopf des Flutscheinwerfers, Rahmen der Bildschirme uvm.
  • Speziell Objekte, die mittels SetCon verändert wurden, sollten noch einmal überprüft werden, ob sie an der richtigen Position sitzen
Weitere Nacharbeitungen sollte sich jeder selbst überlegen und sein Szenario dringend noch einmal durchtesten.
Damit erreicht man die maximal mögliche Aufwärtskompatiblität. Außerdem ist es leicht, kleinere Änderungen am Szenario durchzuführen.

Landschaft

Die Landschaft sollte eigentlich genauso im EM erschaffen und abgespeichert werden. Wichtig herbei ist natürlich, dass man nur Material-Textur-Kombinationen benutzt, die auch in der TexMap.txt verzeichnet sind (im Zeichenmodus leicht zu erkennen: alle Texturen die sich über "---" befinden).
Das Zeichnen mittels eines Grafikprogrammes ist eigentlich viel zu mühsam und im EM werden weitaus bessere Ergebnisse erzielt.
Clonkonaut, April 2007


Globale Funktionen

Enthält eine Sammlung globaler Funktionen, die im Hazardpack vorkommen.
Clonkonaut, 2006


CreateFlag

Beschreibung

Platziert eine Flagge für das Spielziel: Erobere die Flagge

Syntax

void CreateFlag (int iTeam, int iX, int iY, int iColor);

Parameter

iTeam:
Team, dessen Flagge platziert werden soll.
iX:
X-Koordinate der neuen Flagge.
iY:
Y-Koordinate der neuen Flagge.
iColor:
RGB-Wert für die Farbe der Flagge.
Clonkonaut, August 2006


AddAI

Ab Version: 1.5

Beschreibung

Erstellt ein neues KI-Team.

Syntax

object AddAI (int iTeam);

Parameter

iTeam:
Team des neuen KI-Teams.

Anmerkung

Der KI-Spieler wird mittels der Enginefunktion "CreateScriptPlayer" erstellt. Da dies zu einer Verzögerung führt, kann der Spieler nicht sofort manipuliert werden, nur das Steuerungsobjekt __AI (Rückgabewert von AddAI). Um Aktionen mit dem Spieler durchzuführen, sollte InitializePlayer benutzt werden. Der idExtra-Parameter wird mit einer ID, die aus der Spielernummer des neues Spielers und Nullen zusammengesetzt wird, belegt. Diese ID kann auch im Steuerungsobjekt per GetPlrID abgefragt werden.
Siehe auch: Künstliche Intelligenz
Clonkonaut, Mai 2008


AddBot

Ab Version: 1.5

Beschreibung

Fügt einen Bot in das angegebene Team ein. Rückgabewert ist entweder ein Pointer auf den Bot oder auf den KI-Spieler, wenn dieser neu erzeugt werden musste.

Syntax

object AddBot (int iTeam);

Parameter

iTeam:
Team des neuen Bots.
Siehe auch: Künstliche Intelligenz
Clonkonaut, 2007


AddLight

Beschreibung

Erstellt ein normales Licht.

Syntax

object AddLight (int iSize, DWORD dwColor, object pTarget);

Parameter

iSize:
Gibt die Größe des Lichtes an.
dwColor:
[opt] Farbe des Lichts. Siehe ChangeColor.
pTarget:
[opt] Objekt, an das das Licht geheftet werden soll.

Anmerkung

Rückgabewert ist das erstellte Licht.

Beispiel

AddLight(400,RGB(255,0,0),GetCursor(0));
Verpasst dem momentan ausgewählten Clonk des ersten Spielers ein kleines rotes Licht.
Siehe auch: Lichter
Boni, Dezember 2006


AddLightAmbience

Beschreibung

Erstellt ein atmosphärisches Hintergrundlicht.

Syntax

object AddLightAmbience (int iSize, object pTarget, string cGraphics);

Parameter

iSize:
Gibt die Größe des Lichtes an.
pTarget:
[opt] Zielobjekt. 0 für lokale Aufrufe.
cGraphics:
[opt] Grafik des Lichts.
Siehe auch: Lichter
Boni, März 2006


AddLightCone

Beschreibung

Erstellt einen Lichtkegel.

Syntax

object AddLightCone (int iSize, DWORD dwColor, object pTarget);

Parameter

iSize:
Gibt die Größe des Lichtes an.
dwColor:
[opt] Farbe des Lichts. Siehe ChangeColor.
pTarget:
[opt] Objekt, an das das Licht geheftet werden soll.

Anmerkung

Der Lichtkegel besitzt einige zusätzliche Funktionen gegenüber den anderen Lichtern. Siehe Lichter-Dokumentation.
Siehe auch: AddLight, Lichter
Boni, Dezember 2006


AddLightFlash

Beschreibung

Erzeugt einen Lichtblitz für Effekte.

Syntax

void AddLightFlash (int iSize, int iX, int iY, DWORD dwColor, object pTarget);

Parameter

iSize:
Gibt die Größe des Lichtes an.
iX:
X-Versatz des Lichts.
iY:
Y-Versatz des Lichts.
dwColor:
[opt] Farbe des Lichts. Siehe ChangeColor.
pTarget:
[opt] Objekt, an das das Licht geheftet werden soll.
Siehe auch: Lichter
boni, Juli 2007


AddLightHalf

Beschreibung

Erstellt ein halbrundes Licht.

Syntax

object AddLightHalf (int iSize, DWORD dwColor, object pTarget);

Parameter

iSize:
Gibt die Größe des Lichtes an.
dwColor:
[opt] Farbe des Lichts. Siehe ChangeColor.
pTarget:
[opt] Objekt, an das das Licht geheftet werden soll.
Siehe auch: AddLight, Lichter
Boni, Dezember 2006


AlienBlood

Ab Version: 2.0

Beschreibung

Diese Funktion erstellt einen Blutzspritzer eines Aliens. Meist wird dieser Effekt verwendet wenn ein Alien stirbt.

Syntax

void AlienBlood (int iSize, int iX, int iY, int iColor, object pAttach);

Parameter

iSize:
Größe des Blutspritzers des Aliens.
iX:
[opt] X-Position.
iY:
[opt] Y-Position.
iColor:
[opt] Farbmodulation des Blutspritzers.
pAttach:
[opt] Objekt an dem der Blutspritzer rangebappt werden soll.
Newton, August 2008


AlienHive

Ab Version: 2.0

Beschreibung

Lässt Alien-Nestfragment an der Wand erscheinen. Diese "Dekoration" bleibt permanent wenn pAttach nicht angegeben wird. Ansonsten verschwindet sie mit pAttach.

Syntax

void AlienHive (int iSize, int iX, int iY, int iColor, object pAttach, bool bForeground);

Parameter

iSize:
Größe des Aliennestes an der Wand
iX:
[opt] X-Position.
iY:
[opt] Y-Position.
iColor:
[opt] Farbmodulation des Aliennestes.
pAttach:
[opt] Objekt an das dieser Partikel rangehängt werden soll.
bForeground:
[opt] Ob es an der Wand oder im Vordergrund erzeugt werden soll.
Newton, August 2008


AlienSplatter

Ab Version: 2.0

Beschreibung

Lässt einen Blutspritzer eines Aliens an der Wand erscheinen. Wenn an dem angegebenen Punkt keine Wand oder Tunnel ist, wird dieser nicht erstellt. Blutspritzer sind immer an der Wand, also nicht auf Objekten.

Syntax

void AlienSplatter (int iSize, int iX, int iY, int iColor);

Parameter

iSize:
Größe des Blutspritzers des Alien
iX:
[opt] X-Position.
iY:
[opt] Y-Position.
iColor:
[opt] Farbmodulation des Blutspritzers.
Newton, August 2008


Beam

Beschreibung

Beamt ein Objekt an die Position eines anderen Objektes. Benutzt SetPosition, nur dass ein paar schöne Effekte kommen.

Syntax

void Beam (object pObj, object pTarget);

Parameter

pObj:
Zu beamendes Objekt.
pTarget:
Objekt zu dem gebeamt wird. Muss kein Teleporter sein.
Siehe auch: Teleporter
Newton, März 2007


BulletCasing

Beschreibung

Verschleudert eine Patronenhülse (Partikel).

Syntax

void BulletCasing (int iX, int iY, int iXDir, int iYDir, int iSize, DWORD dwColor);

Parameter

iX:
Relative X-Position
iY:
Relative Y-Position
iXDir:
X-Geschwindigkeit
iYDir:
Y-Geschwindigkeit
iSize:
Größe der Patrone in Pixeln
dwColor:
[opt] Farbe der Patrone. Standard ist gelb.
Siehe auch: MuzzleFlash
Newton, März 2007


CheckAmmo

Beschreibung

Überprüft, ob alle übergebenen Objekte gemeinsam mindestens iCount Munition haben.

Syntax

bool CheckAmmo (id idAmmo, int iCount, ...);

Parameter

idAmmo:
Munitionstyp, der überprüft werden soll.
iCount:
Wieviel Munition mindestens vorhanden sein muss.
...:
[opt] Hier können mehrere Objekte angegeben werden, in denen gesucht werden soll. Wird kein Objekt angegeben, wird das aufrufende Objekt genommen.

Anmerkung

Gibt bei aktivierter "Keine Munition"-Regel immer true zurück. Dies betrifft nur Munitionsbehälter (IsAmmoStorage()).

Beispiel

if(CheckAmmo(ENAM,1000,GetHiRank(0),GetHiRank(1),GetHiRank(2))
  GameOver();
Beendet das Szenario, wenn Spieler 1, 2 und 3 mit ihren höchstrangigsten Clonks insgesamt 1000 Energie aufgesammelt haben.
Siehe auch: DoAmmo, GetAmmo, Munition, NoAmmo
Boni, August 2006


CheckEnemy

Beschreibung

Wenn die "Kein Friendly Fire"-Regel nicht aktiviert ist, gibt die Funktion true zurück, ansonsten nur wenn die Besitzer der beiden Objekte verfeindet sind. Sollte keine der beiden Objekte am Leben sein, wird false zurückgegeben.
Für Treffer-Checks, Zielsuchroutinen und Ähnliches ist diese Funktion Hostile() vorzuziehen, da die Regel berücksichtigt wird und tote Objekte außen vor gelassen werden.

Syntax

bool CheckEnemy (object pObj, object pObj2);

Parameter

pObj:
Erstes Objekt.
pObj2:
[opt] Zweites Objekt. Wenn nicht angegeben, der Aufrufer.
Siehe auch: FriendlyFire, Projektil
Newton, September 2006


CreateBomb

Ab Version: 1.5

Beschreibung

Platziert eine Bombe für das Spielziel: Bombing Run. An dieser Stelle wird die Bombe gespawnt, wenn sie verschwindet oder Punkte macht.

Syntax

void CreateBomb (int iX, int iY);

Parameter

iX:
X-Koordinate der Bombe.
iY:
Y-Koordinate der Bombe.
Newton, August 2007


CreateBombGate

Ab Version: 1.5

Beschreibung

Platziert ein Tor für das Spielziel: Bombing Run. An dieser Stelle wird die Bombe gespawnt, wenn sie verschwindet oder Punkte macht.

Syntax

void CreateBombGate (int iTeam, int iX, int iY);

Parameter

iTeam:
Teamzughörigkeit des Tores.
iX:
X-Koordinate des Tores.
iY:
Y-Koordinate des Tores.
Newton, August 2007


CreateDominationPoint

Beschreibung

Platziert einen Marker für das Spielziel: Domination

Syntax

object CreateDominationPoint (int iX, int iY, int iID, id sourceDef);

Parameter

iX:
X-Koordinate des neuen Markers.
iY:
Y-Koordinate des neuen Markers.
iID:
ID des Markers (bestimmt das Wappen).
sourceDef:
[opt] Quelldefinition, die die Grafiken der Markerwappen enthält. Default ist DBAS (Marker).
Clonkonaut, April 2007


CreateWP

Ab Version: 1.5

Beschreibung

Erstellt einen Wegpunkt an der angegebenen Position. Rückgabewert ist ein Pointer auf den neuen wegpunkt.

Syntax

object CreateWP (int iX, int iY);

Parameter

iX:
X-Koordinate.
iY:
Y-Koordinate.
Siehe auch: Wegpunkt
Clonkonaut, 2007


DoAmmo

Beschreibung

Verändert den Munitionsbestand eines Munitionstyps in einem Objekt. Gibt zurück, um wieviel die Anzahl der Munition tatsächlich verändert wurde, unter Berücksichtigung dass nicht weniger als keine Munition und nicht mehr als durch den Callback MaxAmmo begrenzt vorhanden sein kann.

Syntax

int DoAmmo (id idAmmo, int iChange, object pTarget);

Parameter

idAmmo:
Munitionstyp, dessen Anzahl verändert werden soll.
iChange:
Wieviel Munition hinzugefügt/entfernt werden soll.
pTarget:
[opt] Objekt, in dem der Munitionsbestand geändert werden soll. Null bei lokalen Aufrufen.

Anmerkung

Gibt bei aktivierter "Keine Munition"-Regel immer 0 zurück und tut sonst nichts. Dies betrifft allerdings nur Munitionsbehälter (IsAmmoStorage()).

Beispiel

var clonk = GetCursor(0);
DoAmmo(STAM,100,clonk);
Gibt dem Clonk des ersten Spielers 100 Kugeln.
Siehe auch: CheckAmmo, GetAmmo, Munition, NoAmmo
Boni, August 2006


DoDmg

Beschreibung

DoDmg ersetzt im Hazardpack DoEnergy und DoDamage. Es fügt sowohl Objekten (DoDamage) als auch lebenden Wesen (DoEnergy) Schaden zu. Wenn man also Schaden hinzufügen (und nicht etwa heilen/reparieren) will, sollte DoDmg benutzt werden. Mit DoDmg wird zusätzlich der Schadenstyp angegeben. Die verschiedenen Objekte des Hazardpacks sind unterschiedlich immun bzw. anfällig für bestimmte Schadenstypen. Aliens sind beispielsweise besonders anfällig gegen Feuer, schwer gepanzerte Objekte nehmen weniger Schaden von Projektilen und Schlägen.

Syntax

int DoDmg (int iDamage, int iType, object pTarget, int iPrecision, int iByPlayer);

Parameter

iDamage:
Hinzuzufügender Schaden.
iType:
Schadenstyp. Siehe Schaden.
pTarget:
[opt] Objekt, das beschädigt wird. 0 bei lokalem Aufruf.
iPrecision:
[opt] Genauigkeit. Keine Angabe oder Null entspricht 10.
iByPlayer:
[opt] Welcher Spieler den Schaden verursacht. Achtung: Spielernummer muss um 1 erhöht werden! 0 entspricht keiner Angabe.

Anmerkung

Um festzustellen, wie resistent ein Objekt gegen einen bestimmten Schaden ist, wird OnDmg in dem betroffenen Objekt aufgerufen.

Beispiele

DoDmg(20,DMG_Fire,GetCursor(1));
Wir sind ganz böse und verbrennen den Clonk des 2. Spieler mit etwas Feuerschaden.
for(var alien in FindObjects(Find_Func("IsAlien")))
  DoDmg(3,DMG_Explosion,alien,1);
Fügt allen Aliens 0,3 Explosionsschaden zu. Da nur in ganzen Zahlen gerechnet wird, wird dies nur solchen Aliens Schaden machen, die ganz besonders anfällig für Explosionsschaden sind.
Siehe auch: Schaden
Newton, September 2006


DoTeamScore

Beschreibung

Verändert die Punktzahl eines Teams.

Syntax

void DoTeamScore (int iTeam, int iChange);

Parameter

iTeam:
Team dessen Punktestand geändert werden sollen.
iChange:
Wert um den die Punktzahl verändert werden soll.
Siehe auch: Teamsteuerung
Clonkonaut, August 2006


EMPShocked

Ab Version: 1.5

Beschreibung

Gibt zurück, ob der EMP-Schock-Effekt auf diesem Objekt liegt.

Syntax

bool EMPShocked ();
Siehe auch: EMPShockEffect
Newton, August 2007


EMPShockEffect

Ab Version: 1.5

Beschreibung

Startet einen grafischen Effekt auf dem aufrufenen Objekt. Dieser hält iTime Frames. Wenn der Effekt endet, wird in dem aufrufenden Objekt EMPShockEnd aufgerufen.

Syntax

void EMPShockEffect (int iTime);

Parameter

iTime:
Zeit, die der Effekt da bleiben soll.
Siehe auch: EMPShocked
Newton, August 2007


Explode

Beschreibung

Explode ist im Hazardpack überladen. Von der Wirkung her hat sich kaum etwas geändert, allerdings ist die Explosion nun effektreicher: Es entstehen Rauschschweife, das Sichtfenster wird mehr durchgeschüttelt und nach der Explosion sieht man noch Spuren davon an der Wand. Außerdem werden Fragmente verschleudert, siehe dritter Parameter.

Syntax

void Explode (int iLevel, object pObject, bool bNoShots);

Parameter

iLevel:
Explosionsstärke. Wie bei Explode() des Originalpacks.
pObject:
[opt] Objekt, das explodiert. 0 bei lokalem Aufruf.
bNoShots:
[opt] Falls angegeben, werden keine Fragmente in zufällige Richtungen geschleudert. Diese werden dargestellt durch Projektile und machen Schaden.
Newton, September 2006


FriendlyFire

Beschreibung

Gibt false zurück, falls die "Kein Friendly Fire"-Regel aktiviert ist. Ansonsten true.

Syntax

bool FriendlyFire ();
Siehe auch: CheckEnemy
Newton, September 2006


GetAI

Ab Version: 1.5

Beschreibung

Liefert einen Objektpointer auf den KI-Spieler mit der angebenen Spielernummer.

Syntax

object GetAI (int iAI);

Parameter

iAI:
Spielernummer des KI-Spielers.
Siehe auch: Künstliche Intelligenz
Clonkonaut, 2007


GetAICount

Ab Version: 1.5

Beschreibung

Liefert die Anzahl der KI-Spieler.

Syntax

int GetAICount ();

Parameter

Siehe auch: Künstliche Intelligenz
Clonkonaut, 2007


GetAmmo

Beschreibung

Liefert den aktuellen Munitionsbestand eines Munitionstyps in einem Objekt.

Syntax

int GetAmmo (id idAmmo, object pTarget);

Parameter

idAmmo:
Munitionstyp, der abgefragt werden soll.
pTarget:
[opt] Objekt, dessen Munitionsbestand abgefragt werden soll. Null bei lokalen Aufrufen.

Anmerkung

Gibt bei aktivierter "Keine Munition"-Regel immer 0 zurück. Dies betrifft nur Munitionsbehälter (IsAmmoStorage()).

Beispiel

var clonk = GetCursor(1);
DoAmmo(GRAM,GetAmmo(GRAM, clonk),clonk);
Verdoppelt die Anzahl der Granaten des angewählten Clonks des zweiten Spielers.
Siehe auch: CheckAmmo, DoAmmo, Munition, NoAmmo
Boni, August 2006


GetWinScore

Beschreibung

Ermittelt die Siegpunktzahl eines Teamspielziels

Syntax

void GetWinScore (object pGoal);

Parameter

pGoal:
Spielzielobjekt dessen Wert abgefragt werden soll
Siehe auch: Teamsteuerung
Clonkonaut, September 2006


HelpMessage

Beschreibung

Zeigt eine Hilfsnachricht für einen Spieler an. Die Nachricht wird nur angezeigt, wenn der Spieler die Hilfen angestellt hat. Wenn die Hilfen aus sind, wird false zurückgegeben.

Syntax

bool HelpMessage (int iPlr, string szMessage, object pObj, ...);

Parameter

iPlr:
Nummer des Spielers, bei dem die Nachricht ausgegeben wird
szMessage:
Nachricht, die ausgegeben wird
pObj:
[opt] Objekt, bei dem die Nachricht ausgegeben wird. Ohne angegebenes Objekt wird die Nachricht global ausgegeben.
...:
[opt] Zusatzparameter, die die Nachricht formatieren.

Beispiel

if(GetCursor()->GetComDir() & COMD_Right)
  HelpMessage(0, "Dein Clonk %s läuft nach rechts", GetCursor(), GetCursor()->GetName());
Eine eher nervige Hilfenachricht.
Clonkonaut, März 2007


LaserLight

Beschreibung

Erzeugt einen Laserfunken. Für Lasereffekte.

Syntax

void LaserLight (int iSize, int iColor, int iX, int iY, object pTarget);

Parameter

iSize:
Größe der Partikel in Pixel.
iColor:
[opt] Farbe.
iX:
[opt] X-Position.
iY:
[opt] Y-Position.
pTarget:
[opt] Zielobjekt.

Beispiel

Schedule("Sparks(13,RGB(Random(255)0,0,255))",1,15);
Erzeugt hintereinander 15 Laserfunken mit Farben von Blau bis Violett über 15 Frames.
Siehe auch: MuzzleFlash, Sparks
boni, September 2006


LogWaypoints

Ab Version: 1.5

Beschreibung

Erzeugt ein Erstellungsscript im Enginelog, dass alle im Szenario vorhandenen Wegpunkte und Pfade ausgibt. Dieses muss nur noch ins Szenarioscript kopiert werden.

Syntax

void LogWaypoints ();

Parameter

Siehe auch: Wegpunkt
Clonkonaut, 2007


MuzzleFlash

Beschreibung

Erzeugt ein Mündungsfeuer an der angegebenen Position. Normalerweise das Ende der Waffe. Die größe wird in Pixel angegeben.

Syntax

void MuzzleFlash (int iSize, object pTarget, int iX, int iY, int iAngle, int iColor);

Parameter

iSize:
Die Größe des Mündungsfeuers in Pixel.
pTarget:
[opt] Zielobjekt für das Mündungsfeuer.
iX:
[opt] X-Position (relativ zum Offset des Zielobjekts)
iY:
[opt] Y-Poition (relativ zum Offset des Zielobjekts)
iAngle:
[opt] Winkel des Mündungsfeuers.
iColor:
[opt] Farbe des Mündungsfeuers.

Anmerkung

Bei Dunkelheit erzeugt das Mündungsfeuer auch automatisch einen Lichtblitz.

Beispiel

//Waffenscript
var user = GetUser();
var angle = user->AimAngle(20) + RandomX(-1,+1);
var x,y; user->WeaponEnd(x,y);
MuzzleFlash(40,user,x,y,angle);
So würde der Script für ein Mündungsfeuer in einer Waffe aussehen.
Siehe auch: LaserLight, Sparks
Boni, September 2006


NoAmmo

Beschreibung

Gibt true zurück, wenn die "Keine Munition"-Regel aktiviert ist: Waffen brauchen keine Munition um nachzuladen.

Syntax

bool NoAmmo ();
Siehe auch: CheckAmmo, DoAmmo, GetAmmo, Munition
Newton, März 2007


PlaceBonusSpawnpoint

Beschreibung

Erstellt einen Bonus-Spawnpunkt an der angegeben Stelle, der eines der angegebenen Objekte im angegebenen Zeitraum erstellt.

Syntax

object PlaceBonusSpawnpoint (array aSpawnIDs, int iXOffset, int iYOffset, int iTimer);

Parameter

aSpawnIDs:
Liste aller Objekt-IDs, die der Spawnpunkt erstellen können soll.
iXOffset:
X-Koordinate
iYOffset:
Y-Koordinate
iTimer:
[opt] Zeit in Frames, die der Spawnpunkt braucht, bis wieder ein neues Objekt zur Verfügung steht. Default sind 2500 Frames.

Beispiel

PlaceBonusSpawnpoint([BSKB,HSTB,INVB], 100, 100, 2000);
Erstellt einen Bonus-Spawnpunkt an der Stelle 100,100 der die Boni Berserker, Hast und Unsichtbarkeit erzeugen kann und diese alle 2000 Frames nacherzeugt.
Siehe auch: Spawnpunkt
Clonkonaut, März 2007


PlaceSpawnpoint

Beschreibung

Erstellt einen Spawnpunkt an der angegeben Stelle, der das angegebene Objekt im angegebenen Zeitraum erstellt.

Syntax

object PlaceSpawnpoint (id idToSpawn, int iXOffset, int iYOffset, int iTimer);

Parameter

idToSpawn:
ID des Objekts, das der Spawnpunkt erzeugen soll.
iXOffset:
X-Koordinate
iYOffset:
Y-Koordinate
iTimer:
[opt] Zeit in Frames, die der Spawnpunkt braucht, bis wieder ein neues Objekt zur Verfügung steht. Default sind 1000 Frames.

Beispiel

PlaceSpawnpoint(PIWP, 100,100, 2000);
Erstellt eine Pistole am Punkt 100,100, der alle 2000 Frames eine Pistole nachproduziert.
Siehe auch: Spawnpunkt
Clonkonaut, März 2007


RemoveAI

Ab Version: 1.5

Beschreibung

Entfernt ein KI-Team.

Syntax

bool RemoveAI (int iTeam);

Parameter

iTeam:
Team des zu entfernenden KI-Teams.
Siehe auch: Künstliche Intelligenz
Clonkonaut, 2007


RemoveBot

Ab Version: 1.5

Beschreibung

Entfernt einen Bot aus dem angegebenen KI-Team.

Syntax

void RemoveBot (int iTeam);

Parameter

iTeam:
Team des zu entfernenden Bots.
Siehe auch: Künstliche Intelligenz
Clonkonaut, 2007


SetWinScore

Beschreibung

Setzt die zu erreichende Siegpunktzahl für Teamspielziele auf einen neuen Wert.

Syntax

void SetWinScore (int iNewScore, object pGoal);

Parameter

iNewScore:
Neue Siegpunktzahl
pGoal:
[opt] Wenn angegeben wird der neue Wert nur in diesem Spielziel gesetzt, ansonsten in allen vorhandenen
Siehe auch: Teamsteuerung
Clonkonaut, September 2006


Sparks

Beschreibung

Verschleudert eine Anzahl Funken. Z.b. um Funken stoben zu lassen, wenn ein Projektil einschlägt.

Syntax

void Sparks (int iAmount, int iColor, int iX, int iY);

Parameter

iAmount:
Anzahl wieviele Funken verschleudert werden sollen.
iColor:
[opt] Farbe der Funken.
iX:
[opt] X-Position.
iY:
[opt] Y-Position.

Beispiel

Sparks(25,RGB(0,0,255));
Verschleudert 25 blaue Funken.
Siehe auch: LaserLight, MuzzleFlash
boni, September 2006


UpdatePipesystem

Beschreibung

Führt eine Überprüfung des Rohrsystem durch, wobei Zu- und Abflüsse gefunden werden. Erst danach fangen Flüssigkeiten an durch Rohre zu fließen.

Syntax

void UpdatePipesystem ();

Anmerkung

Diese Funktion kann nur einmal pro Frame sinnvoll eingesetzt werden.
Siehe auch: Rohre
Clonkonaut, August 2006


WaypointsTest

Ab Version: 1.5

Beschreibung

Testet alle im Szenario vorhandenen Pfade (dazu werden Clonks erstellt). Im Log werden Fehler in den Pfaden entsprechend vermerkt.

Syntax

void WaypointsTest ();

Parameter

Siehe auch: Wegpunkt
Clonkonaut, 2007


WaypointsVisible

Ab Version: 1.5

Beschreibung

Blendet die Wegpunkte und Pfadpfeile ein und aus.

Syntax

void WaypointsVisible (bool fVisible);

Parameter

fVisible:
Bei TRUE werden die Wegpunkte eingeblendet, bei FALSE ausgeblendet.
Siehe auch: Wegpunkt
Clonkonaut, 2007


Allgemeine Callbacks

Hier eine Liste aller allgemeine Callbacks zur Klassifikation oder zur Beschreibung von speziellen Eigenschaften:
Callback | Beschreibung
AmmoStoring | Gibt das Objekt zurück, in dem statt in diesem Munition gelagert werden soll. Siehe Munitionsgürtel.
CanAim | Der Hazardclonk und andere zielende Objekte können mit diesem Objekt zielen. Waffen haben alle CanAim.
CanCollectFromSpawnpoints | Das Objekt kann Dinge aus Spawnpunkten aufnehmen, auch wenn es nicht OCF_CrewMember ist.
IgnoreFriendlyFire | Falls true: Auch wenn Friendly fire an ist, wird dieses Objekt nicht von freundlichen Geschossen getroffen und seine Geschosse können keine freundlichen Objekte treffen. Dieser Callback ist vorgesehen für herumballernde Objekte über die die Spieler selbst keine Kontrolle haben wie etwa die Drone oder Aliens.
IsAlien | Ist ein Alien.
IsAmmo | Objekt ist ein Munitionstyp.
IsAmmoPacket | Zeichnet ein Objekt als Munitionspaket aus.
IsBonus | Ist ein Bonus. Siehe Spawnpunkte
IsBullet | Ist ein Schuss.
IsBulletTarget | Kann von einem Geschoss getroffen werden. Siehe IsBulletTarget
IsChooseable | Regel ist durch den Regelwähler auswählbar.
IsClimbable | Der Hazard kann dieses Objekt besteigen. (Höchstwarscheinlich ist es also eine Leiter ;))
IsConfigureable | Spielziel ist durch den Regelwähler konfigurierbar.
IsCraneGrabable | Ist vom Kran anhebbar.
IsDrawable | Objekt kann vom Waffenanzeigeeffekt des Hazards angezeigt werden. Waffen werden automatisch am Hazard angezeigt.
IsDrone | Ist eine Drone. Im Kampf kann der Hazard von genau einer Drone unterstützt werden.
IsEquipment | Objekt ist ein allgemeiner Ausrüstungsgegenstand.
IsBouncy | Neben Lebewesen werden auch Objekte vom Jumppad weggeschleudert, die IsBouncy definiert haben :).
IsHazardGear | Objekt ist Ausrüstung für den Hazardclonk.
IsKeycard | Objekt ist eine Schlüsselkarte und passt in einen Kartenleser.
IsLamp | Objekt ist eine Lampe.
IsLight | Ist ein Licht.
IsMachine | Objekt ist eine Maschine. Diese kann durch EMP außer Kraft gesetzt werden.
IsMine | Minen werden im Gegensatz zu Waffen und Ausrüstung bei der Regel "Arena" nicht gelöscht, wenn sie herumliegen.
IsSideDoor | Ist ein seitliche Tür, also eine durch die man durchgehen kann.
IsTeamGoal | Ist ein Team-Spielziel.
IsThreat | Objekt wird von Feind-Checks auch als Feind erkannt wenn es keinen Besitzer hat. Andersrum erkennt es Objekte mit Besitzer als Feind. Das Objekt wird also direkt anvisiert statt nur getroffen werden zu können.
IsUpgrade | Objekt ist ein Upgrade.
IsUpgradeable | Objekt ist mit einem Upgrade aufrüstbar.
IsWeapon | Objekt ist eine Waffe.
NoDecoDamage | Geschoss soll nicht an kleineren Einrichtungsgegenständen explodieren. Diesen Callback zu berücksichtigen, liegt an den Einrichtungsgegenständen.
NoWarp | Der Warp warpt alle Lebewesen, Fahrzeuge und kleinen Objekte bis auf die, die NoWarp definiert haben.
NoWeaponChoice | Waffe ist nicht von der Waffenwahl (oder dem Waffenautomaten) auswählbar.
Newton, März 2007