Neue Zauber

Aus Sternenschweif Wiki
Wechseln zu: Navigation, Suche

Zauber, die bisher keinen "effect"-Bereich in der skills.xml haben, können durch ein Skript modifiziert werden. Dies funktioniert ausschließlich für die "freie Anwendung" des Zaubers durch den Spieler, also:

  1. Klick in die Welt
  2. "Zaubern"
  3. Zauber wählen
  4. ggf. Ziel wählen

Solche Zauber können außerdem ausschließlich außerhalb des Kampfes angewendet werden, für Kampfzauber funktioniert dies ebenso nicht.

Um die Kontrolle über die Ausführung zu übernehmen, darf der Zauber KEIN "effect"-Member haben, sondern muss stattdessen ein "script"-Member aufweisen, in dem das Javascript enthalten ist. Dieses script kann beliebige Funktionen enthalten, es muss jedoch entweder eine "function OnPrepare" oder eine "function OnCast" besitzen. Erstere stellt das "Modding Flexibel" dar, letztere das "Modding Light".

Soll ein neuer Zauber bereits bei Spielbeginn verfügbar sein, so muss er auch in der classdefinition.xml bei startspell der entsprechenden Klassen definiert werden, ansonsten startet die entsprechende Klasse mit -19.

Wird ein Spielstand geladen, dessen Charaktere noch keine Definition des Zaubers kennen, so werden diese mit dem Initialwert der entsprechenden Klasse (entweder startspell-Wert oder eben -19) initialisiert.

Light Modding

<spell intname="hartesschmelze" langid="spell_hartesschmelze" attr1="IN" attr2="CH" attr3="KK" origin="M" group="192" difficulty="0" usebattle="0" usenobattle="1" range="1">
	<school orig="A">192</school>
	<cost>10</cost>
	<script>
		<![CDATA[
function OnCast( caster, target, result ) {
	if( caster == target ) {
		showMessage( "Kann nicht sich selbst Bezaubern" );
	}
	else if( result.ok ) {
		showMessage( getName( caster ) + " bringt " + getName( target ) + " zum Zerfließen!" );
	} else {
		showMessage( "Da tut sich nix bei " + getName( caster ) );
	}
}]]></script>
</spell>

In obigem Beispiel wird ein Spruch "hartesschmelze" mit IN/CH/KK definiert, Gruppe "Antimagie" (siehe Loca text_192", nur außerhalb des Kampfes zu definieren, und er benötigt ein Ziel (range="1"), muss also auf jemand anderen als den Zaubernden angewendet werden.

Die Funktion "OnCast" wird mit drei Parametern aufgerufen, ID des Zaubernden (caster), ID des Ziels (target) sowie Ergebnis des Würfelwurfs.

function OnCast( caster, target, result ) {
	if( caster == target ) {
		showMessage( "Kann nicht sich selbst Bezaubern" );
	}
	else if( result.ok) {
		showMessage( getName( caster ) + " bringt " + getName( target ) + " zum Zerfließen!" );
	} else {
		showMessage( "Da tut sich nix bei " + getName( caster ) );
	}
}

Dieses einfache Beispiel zeigt die Reaktion auf eine Probe, die nach einer Zauberausführung des neuen Zaubers "hartesschmelze" aufgerufen wird. caster und target enthalten die Char-IDs von Zauberndem und Bezaubertem. In Result wird das Würfelwurf-Ergebnis-Objekt übergeben. Zauberkosten sind beim Aufruf bereits korrekt abgezogen.

flexibles Modding

<spell intname="weiches" langid="spell_weichescustom" attr1="IN" attr2="IN" attr3="IN" origin="M" group="192" difficulty="0" usebattle="0" usenobattle="1" range="0">
	<school orig="A">192</school>
	<cost>1</cost>
	<script><![CDATA[
function OnPrepare( caster, target ) {
	debugLog( "Do Weiches" );
	var res = rollCheck( { "who": caster, "which": "weiches", "type": "spell" } );
	if( res.ok ) {
		showMessage( getName( caster ) + " ist so gar nicht weich!" );
	} else {
		showMessage( getName( caster ) + " ist ein Weichei!" );
	}
}]]>
	</script>
</spell>

Beim flexiblen Modding wird OnPrepare bereits in der Vorbereitungsphase des Zaubers aufgerufen, sämtliche die Probe betreffenden Tätigkeiten inklusive Zauberkostenabzug je nach Erfolg müssen also vom Skript geprüft, behandelt und ausgeführt werden. In diesem Fall mit "range=0" benötigt der Zauber kein Ziel, hier sind caster und target identisch.

Wichtig: Das flexible Modding "sticht" das Light-Modding, d.h. befinden sich sowohl eine "OnCast" als auch eine "OnPrepare"-Funktion in einem Zauberscript, so wird NUR die OnPrepare-Funktion aufgerufen!