[Gelöst] Hazardwaffe soll pro Treffer weniger als 1 Schaden

Ich habe in die Hazardwaffen noch weitere Modi eingebaut. Der Sinn dahinter soll sein, dass auch normale Gebäude z.b mit einer Minigun zusammengeschossen werden können. Ich konnte sie nicht einfach als BulletTarget markieren, weil das natürlich stören würde, wenn man feindliche Clonks im Basisbereich töten will, weil dann nur die eigenen Gebäude getroffen werden. Deswegen kann man nun aktiv umschalten zwischen dem normalen Modus und einem "nur Gebäude"-Modus.
Allerdings ist der Schaden, den die Waffen machen, für die standardgebäude zu groß, soll heißen sie sind viel zu schnell mit zu wenig Schüssen zerstört.

Deswegen sehe ich 2 Möglichkeiten:
1. Den Schaden der Waffen in meinen neuen Feuermodi reduzieren.
2. Die Lebenspunkte der Gebäude drastisch erhöhen, was allerdings zur Folge hätte, dass Meteoriten oder Flints usw wieder zu wenig Schaden machen würden, d.h. es müssten alle diese Gegenstände ebenfalls angepasst werden.

Seht ihr noch weitere Möglichkeiten?

Nun ist es bei der Minigun so, dass ein Treffer standardmäßig 3 Schaden macht. Ich habe das nun schon auf 1 runtergesetzt, aber es ist immernoch zuviel. Weniger als 1 geht ja leider nicht und auch mit Resistenzen geht der Wert offensichtlich nicht unter 1, bzw. wird 0.99 auf 0 abgerundet, und das bringt natürlich nichts.
Also wie könnte ich diese Problematik nun lösen?

Ich hab es jetzt so gelöst, dass ich FM_Recharge (Wert im Original 3), also die Zeit zwischen 2 Schüssen, auf 6 verdoppelt habe, aber dafür bei einem Schuss doppelt soviele Kugeln rausfliegen, wovon die Hälfte Null schaden macht. Damit die 2 Kugeln die gleichzeitig abgeschossen werden nicht übereinander fliegen, habe ich dafür einen anderen Winkel definiert.
Effektv ist das nun ein Schaden von 0,5 pro Treffer.
Fällt euch vllt noch eine elegantere Lösung ein, bei der FM_Recharge beim Wert 3 bleiben könnte?

>Fällt euch vllt noch eine elegantere Lösung ein, bei der FM_Recharge beim Wert 3 bleiben könnte?


Du könntest die Kugeln mit einer bestimmten Wahrscheinlichkeit null Schaden machen lassen so dass du dann im Durchschnitt bei deinem Wunschwert bist oder so

das ist eine gute Idee, danke =)
das werd ich mal austesten :slight_smile:

Hmm… wie mache ich das denn?
Anhand des Beispiels hier http://www.clonk.de/docs/de/sdk/script/fn/Random.html
hätte ich jetzt:

  var schaden;
    schaden = if(!Random(3)) 1;
    DoDmg(schaden, DMG_Melee, i);

Soll bewirken, dass mit einer Chance von 1 zu 3 der Schaden 1 beträgt.
aber so kommt der Fehler, dass if nicht in einem Parameter enthalten sein darf…  Und wie würde ich nun noch einen else Befehl dranhängen, oder wäre es automaitsch in allen anderen Fällen 0 ?

>aber so kommt der Fehler, dass if nicht in einem Parameter enthalten sein darf...


Du musst das if vor die Zuweisung schalten, ein if gibt an sich keinen Wert zurück, wodurch die variablenzuweisung eines ifs natürlich nicht geht.
var schaden;
if(!Random(3)) schaden = 1;
DoDmg(schaden,DMG_Melee,i);

ist das, was du willst.

Das ganze kann man natürlich auch kurz fassen, indem man zB folgendes tut:
DoDmg(Random(3)>1,DMG_Melee,i);
Denn der Vergleichsoperator gibt true/false zurück, was man direkt als Wert 0/1 wieder verwenden kann. Mit solchen Tricks kann man desöfteren ifs umgehen und den code kürzer machen. :)

super danke, das klappt =)

Habe mich für die erstere Variante entschieden, weil ich da jede beliebige Wahrscheinlichkeit und Schadenswert angeben kann.
bei deiner zweiten Möglichkeit heißt ja Random(3)>1 glaube ich soviel wie: "es wird eine Zahl zwischen 1 und 3 generiert. Wenn diese > als 1 ist, dann wird 1 als Zahl ausgegeben und wenn sie nicht größer ist, dann wird 0 ausgegeben.   Daraus folgt, dass erstens nur 0 oder 1 als Ergebnis rauskommen kann und zweitens man die Wahrscheinlichkeit nicht niedriger als 50% machen kann. 
Das ist dir sicherlich bewusst, ich wollte es nur nochmal so zusammenfassen, wie ich es verstanden habe :slight_smile:

Bei der Bazooka habe ich aktuell Schwierigkeiten, dafür zu sorgen, dass die Raketen explodieren, wenn sie auf ein Gebäude treffen (habe den Gebäuden die Eigenschaft "IsBulletExtraTarget" gegeben). Denn bei den Raketen gibt es nichts was sagt "trifft nur BulletTarget", wo ich dann einfach ein "Extra" einfüge, so wie ich es bei den anderen Waffen machen konnte…

Ich habe im Script der Raketen gesehen, dass dort ein Effekt steht, der vermutlich dafür sorgt, dass Projektile die Raketen zum Explodieren bringen können, er sieht so aus:
  AddEffect("HitCheck", this(), 1,1, 0, SHT1,shooter,true);
Die Funktion zum Effekt konnte ich bisher nicht finden.
Wenn ich dieses AddEffect entferne, kann man allerdings weiterhin Rakteten mit Projektilen abschießen, was vermutlich daran liegt, dass die Raketen ein BulletTarget sind.

Also wofür ist dieser Effekt gut? Ich habe dort auch schon IDs von Gebäuden angegeben, aber sie können dadurch nicht getroffen werden, also scheint der Effekt einen anderen Sinn zu haben?
Und angenommen der Effekt ist für mein Ziel nicht verwendbar,  wie kann ich stattdessen dafür sorgen, dass Raketen an Objekten die "IsBulletExtraTarget" sind, explodieren?

Dafür wichtige Funktionen könnten sein:
/* Treffer */

private func Hit() {
  HitObject();
}
private func HitObject(object pObject) {
  exploding = true;
  BlastObjects(GetX(), GetY(), iDamage/2);
  BlastObjects(GetX(), GetY(), iDamage/2);
  Explode(iDamage,0,0,0,1);
}

Wenn a > b, dann ist Random(a)<b mit einer Wahrscheinlichkeit von b/a true, ansonsten false. So gesehen lässt sich das schon recht einfach den eigenen Bedürfnissen anpassen.
Ob es genau a/b ist, weiß ich gerade nicht. Die Formel ist grob im Kopf formuliert, sie könnte passen. Aber ich bin gerade zu müde, um mir bei der Aussage sicher zu sein. Ich denke, du verstehst die Grundidee. Wenn man Random(100)<60 nimmt, hat man eine Wahrscheinlichkeit von 60%

Für größere Schadenswerte müsstest du das Ergebnis einfach mit etwas multiplizieren: bool*x Somit hast du manchmal 0, manchmal X Schadenspunkte. Und wenn du mit der Wahrscheinlichkeit zwischen den Werten X und Y wechseln willst, kannst du auch x+bool*(y-x) benutzen.
Natürlich kannst du die Variante nehmen, die dir am besten gefällt, aber ich habe den Post verfasst, um ein wenig mehr über die Variante aufzuklären. :P

>es wird eine Zahl zwischen 1 und 3 generiert.


Nicht ganz. Random(x) spuckt eine Zahl zwischen 0 und x-1 aus. In dem Fall also eine Zahl zwischen 0 und 2 (Wenn man einen zufälligen Boolschen Wert haben will, kann man also auch direkt Random(2) benutzen). :)
Dass sich die Zahl in [0,x-1] bewegt, liegt daran, dass Random() die Zahl zum Schluss mit Modulo auf die von uns durch den Parameter angegebene, handliche Größe runtergerechnet wird. Die wahre engineinterne Zufallszahl bewegt sich im kompletten Bereich, den ein (ich glaube) 32-Bit Integer annehmen kann. Diese wird dann auch weiterverwendet, um die nächste Zufallszahl zu errechnen. Nur das Endergebnis, welches wir nutzen, wird moduliert. Letztendlich ist es ganz praktisch so, denn es erlaubt uns zum Beispiel ein zufälliges Arrayitem über data[Random(GetLength(data))] zu bekommen.

>AddEffect("HitCheck", this(), 1,1, 0, SHT1,shooter,true);


Der Parameter idCmdTarget (in dem Fall also SHT1) zeigt an, aus welcher Definition der Effekt geladen wird, ergo musst du nur im Script von SHT1 nach dem HitCheck suchen.

>Ich habe im Script der Raketen gesehen, dass dort ein Effekt steht, der vermutlich dafür sorgt, dass Projektile die Raketen zum Explodieren bringen können


Das stimmt so nicht ganz. Der Effekt ist dafür verantwortlich, in jedem Frame zu überprüfen, ob das jeweilige Objekt in der Bewegung vom letzten zum neuem Frame etwas auf dem Weg getroffen hat oder nicht, insofern werden hier also die Objekttreffer ausgewertet.
Für das, was du erreichen willst, sollte das also der richtige Effekt sein - allerdings solltest du auch daran denken, dass der gleiche Effekt von allen Projektilen genutzt wird - also zusätzlich zu den Raketen auch von Granaten und den normalen Kugeln.

Danke =)
Es klappt :)  Ich habe ja ohnehin für die Projektile, die nur Gebäude treffen sollen, das Objekt SHT1 dupliziert und umbenannt. Das heißt ich brauchte nun bei den "nur Gebäude" Raketen, in den effekt einfach nur die ID der "nur Gebäude" Projektile eingeben und schon klappts :slight_smile:

Thema "Explode"

kann man irgendwie beim Explode Befehl zwischen Explosionsgröße und dem Schaden unterscheiden? 
Ich möchte z.b. jetzt, dass meine “nur Gebäude” Raketen weniger Schaden anrichten. Aber der Explosionseffekt soll dabei natürlich derselbe sein, nur der Schaden soll etwas geringer sein.
http://www.clonk.de/docs/de/sdk/script/fn/Explode.html
aber offensichtlich ist der Explode Befehl dafür nicht geeignet, oder?

Gibts noch einen anderen Weg?

Explode ist in der System.c4g definiert. Du kannst den Befehl einfach mit deiner eigenen Version ueberladen, wenn alle Explosionen anders sein sollen.

Alternativ kopieren und in eine neue Funktion Explode66 umbenennen, die das tut, was du willst.

Ich glaube Keepers hat eine FakeExplode Funktion, die einfach nur den Explosionseffekt abspielt. Dann könntest du den Schaden per Hand machen oder nochmal Explode mit kleinerem Radius aufrufen

ah wunderbar, danke. das funktioniert einwandfrei :slight_smile:
und das szenario selbst werd ich demnächst auch mal spielen :wink:
und auch danke an Sven2 :slight_smile: