Kampfregeln (Spezialfälle): Unterschied zwischen den Versionen

Aus Eressea
Zur Navigation springenZur Suche springen
KKeine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
Zeile 214: Zeile 214:
   c |-| d
   c |-| d
   ==> enemy(a,c) && enemy (b,c) && enemy(b,d) && !enemy(a,d) && friend(a,b) && friend (b,d)
   ==> enemy(a,c) && enemy (b,c) && enemy(b,d) && !enemy(a,d) && friend(a,b) && friend (b,d)
  ??? Edit: Das ist möglicherweise nicht das derzeitige Verhalten ...???
* a greift c an
* a greift c an
* b greift c und d an
* b greift c und d an
Zeile 219: Zeile 221:


a verteidigt b nicht gegen die Attacken von d. Falls a nur vergessen hat zu attackieren oder d gar nicht sieht, ist das schlecht.
a verteidigt b nicht gegen die Attacken von d. Falls a nur vergessen hat zu attackieren oder d gar nicht sieht, ist das schlecht.


=== Fall 13 - Versehen ===
=== Fall 13 - Versehen ===

Aktuelle Version vom 23. März 2024, 12:21 Uhr

Solthars Notizen zu den Kampfregeln. Diskussion im Discord - Solthar versteht so langsam, warum die Kampfregeln so sind, wie sie sind (und was die Schwachpunkte sind)

Gegenwärtiger Zustand (März 2024)

Beim Kampf wird eine Freund-Feind-Matrix erstellt. Zwei Heere können entweder Feinde, Freunde oder gar nix sein. Wenn Einheit a angreifen will, sucht sie sich eine Einheit x aus ihren Feinden in einer Kampfreihe, die sie erreichen kann. Feinde sind nicht nur Einheiten, die das Heer von a angegriffen hat, sondern alle Heere, die Feind von a sind.

Alle Freunde von x sind auch für das Überrennen maßgeblich (??). ...

Die Frage ist nun, wie ermittelt wird, wer Freund und wer Feind ist. In den Kampfregeln sind einige Grundsätze. Diese führen irgendwann fast zwangsläufig zu Widersprüchen. Aktuell ist es etwa so:

  • Die Gruppe einer Einheit entscheidet, in welchem Heer sie ist.
  • Für alle Einheiten u werden Befehle ATTACKIERE x angeschaut. Wenn die Attacke legal ist, nehmen u und x an der Schlacht teil. Das Heer von u wird als Angreifer markiert. Die Heere werden gegenseitig zu Feinden.
  • Für alle anderen Einheiten u in der Region wird geschaut, ob sie an der Schlacht teilnehmen ("Feinde meiner Freunde"):
    • Einheiten mit KÄMPFE NICHT oder FLIEHE nehmen nicht teil.
    • Es werden alliierte Heere A gesucht mit
      • mindestens eine Einheit (ohne HELFE KÄMPFE NICHT) in der Partei von A wurde und entweder
      • die Partei von A dieselbe wie von u oder
      • u hat HELFE KÄMPFE zu A und A ist nicht Angreifer
    • Es werden Heere E gesucht, die Feinde von A sind (und nicht in der Partei von u sind)
    • Wenn u nicht HELFE KÄMPFE zu E hat oder E Angreifer ist, wird das Heer von u zum Feind von E. (???)
  • Für alle Heere H:
    • Für alle Feinde E von H:
      • Für alle Feinde A von E:
        • Wenn A nicht Feind von H ist, werden A und H Freunde.

Beispiele

Im Folgenden bedeutet

 a -> b

soviel wie a hat ATTACKIERE b.

 a |- c

heißt hingegen a hat HELFE KÄMPFE c.

 enemy(a,c) und friendly(a,c)

ist das, was join_allies in battle.c ausspuckt.

Fall 1 - einfacher geht's nicht

 a -> b  ==>  enemies(a,b)
  • a greift b an
  • dann sind A und B Feinde

Fall 2 - unbeteiligter Beobachter

 a -> b
 c
 ==> enemies(a,b)
  • a attackiert b
  • c hilft niemandem
  • ==> c ist weder Feind noch Freund von irgendjemandem

Fall 3 - klassischer Bündnisfall

 a -> b
 c |- b
 ==> enemies(a,b) && enemies(a, c) && friends(b,c)
  • a attackiert b
  • c hilft b
  • ==> b und c sind Freunde und beide Feinde von a

Fall 3b - klassischer Nicht-Bündnisfall

 a -> b
 c |- a
 ==> enemies(a,b) && !enemies(b, c)
  • a attackiert b
  • c hilft a
  • ==> c greift nicht ein, weil a Angreifer ist. Das grundsätzlich der Fall, dass, wenn eine meiner Einheiten attackiert, nicht meine anderen Einheiten attackieren. Andererseits wird so auch nicht unser ganzer Heerhaufen durch einen Kamikazeangriff von a in einen Kampf gezwungen.


Fall 4 - meine Freunde streiten

 x -> b
 a |- b
 a |- x
 ==> enemies(x,b) && enemies(x,a) && friends(b, a)
  • x attackiert b
  • a hilft b und x
  • ==> x und b sind Feinde, a beteiligt sich nicht

Das ist ein Fall von "Verrat". Die Reaktion, dem Angegriffenen zu helfen ist eine naheliegende Designentscheidung.

Fall 5 - unvollständige Attacken

 a -> b
 -    -
 |    |
 -    -
 c -> d
 ==> enemies(a,b) && enemies(a,d) && enemies(c,b) && enemies(c,d) && friends(a,c) && friends (b,d)
  • a attackiert b
  • c attackiert d
  • a hilft c, c hilft a
  • b hilft d, d hilft b
  • ==> es gibt trotzdem zwei feindliche Seiten ac und bd, die untereinander Freunde sind.

Frage: Welches von den HELFEs ist hier absolut notwendig fürs gleiche Ergebnis? Teilantwort: Wenn es kein Helfe gibt, hilft auch wirklich niemand, sondern es gibt zwei parallele Kämpfe.

Fall 6 - Chaos

 a -> b
 c -> a
 c -> b
 ==> enemies(a,b), enemies(b,c), enemies(a,c)
  • a attackiert b
  • c attackiert a
  • c attackiert b
  • ==> ???

c könnte zum Beispiel Monster sein. Hilft hier irgendjemand irgendjemandem?

Fall 7 - Dreier

 a -> b
 b -> c
 c -> a
 ==> enemies(a,b), enemies(b,c), enemies(a,c)
  • a attackiert b
  • b attackiert c
  • c attackiert a
  • ==> alle sind gegenseitig Feinde

Ein Dreierzyklus. Wegen der Attacken müssen alle Feinde zueinander sein. Also kann niemand Freund sein(?). Was ändert sich, wenn die Attacken jeweils gegenseitig sind?

Fall 8 - Vierer

  • a attackiert b
  • b attackiert c
  • c attackiert d
  • d attackiert a
  • ==> ???

Ein Viererzyklus. Ist der grundsätzlich anders als der Dreierzyklus? a,c und b,d könnten sich gegenseitig helfen. Gegenwärtig tun sie das nicht, weil sie Angreifer sind.

Fall 9 - Falsches Helfe?

 x <-> b
 a |-| b
 a |-  x
 ==> enemies(x,b)
  • x attackiert b
  • b attackiert x
  • a hilft b und x
  • b hilft a
  • ==> ???

Ähnlich wie 4, nur dass a jetzt angreift. A hält sich raus?

Fall 10 - Bug #3014

 a -> b
 e -> b
 c -> d
 c |-| b
 ==> enemies (a,b) && enemies(b,e) && enemies(c,d) && enemies(c,a) && enemies(c,e) && friends(b,c) && friends (a,e) && friends (a,d) && friends (d,e)
  • a attackiert b
  • e attackiert b
  • c attackiert d
  • c hilft b
  • ==> Bug bewirkte, dass c und ae keine Feinde wurden, deshalb half c nicht b

Nur weil c attackiert, sollte er sich trotzdem vor b stellen.

Fall 10b - Erweiterung

 a -> b
 e -> b
 c -> d
 b -> f
 c |-| b
 ==> enemies (a,b) && enemies(b,e) && enemies(c,d) && enemies(b,f) && !enemies(c,a) && !enemies(c,e) && friends(b,c) && friends (a,e,f) && friends (a,d) && friends (d,e)
  • a attackiert b
  • e attackiert b
  • c attackiert d
  • b attackiert f
  • c hilft b
  • ==> ???

Jetzt attackiert b noch eine ansonsten unbeteiligte Partei f. Dadurch hilft c nicht mehr b, weil b Angreifer ist. Ein Designfehler?

Fall 11 - Verrat

Jetzt wird es interessant. Astreiner Verrat!

Zwei Seiten a+b und c+d. X läuft von ab zu cd über.

 a |-| b
 c |-| d
 x |-| cd
  • a hilft c und x
  • b hilft a und x
  • c hilft d und x
  • d hilft c und x
  • x hilft c und d

x versucht möglichst viel Schaden anzurichten.

 cdx -> ab
1. c, d, x attackieren je a und b
Hier helfen a und b sich, auch gegen x
2. Kann x die Situation irgendwie zu seinem Vorteil ausnutzen, damit c und d entweder gegeneinander kämpfen oder sich nicht helfen?
???

Fall 12 - unsichtbarer Gegner

 a -> c
 b -> c,d
 a |-| b
 c |-| d
 ==> enemy(a,c) && enemy (b,c) && enemy(b,d) && !enemy(a,d) && friend(a,b) && friend (b,d)
 ??? Edit: Das ist möglicherweise nicht das derzeitige Verhalten ...???
  • a greift c an
  • b greift c und d an
  • ?? ==>

a verteidigt b nicht gegen die Attacken von d. Falls a nur vergessen hat zu attackieren oder d gar nicht sieht, ist das schlecht.


Fall 13 - Versehen

...

Fall 14 - Lähmungsangriff

  • a greift e,f,g an (um sie am langen Befehl zu hindern)
  • e greift a,b,c an (aus demselben Grund)
  • ...
  • Profit oder Katastrophe

Geht hier alles gut? Auch wenn a früh stirbt? Dann stellen sich f und g zwar noch vor e, haben aber kein Ziel mehr zum Attackieren! Falls e nur angriff, um abc am langen Befehl zu hindern, vielleicht erwünscht. Falls abc aber für f und g unsichtbar waren ein Problem. Oder ein Feature?

Fall 0 - Wie alles begann

 A -> C
 X |- C
 D |- X
 ==> enemy(a,c), enemy(a,x), !enemy(a,d)

Dies führt jetzt nicht mehr dazu, dass a und d Feinde werden.

Fall 16 - Solthar versteht die Kampfregeln nicht?

 A -> B
 A -> X
 B -> X
 C |- B
 C -> X
 ==> e(a,b,x) && e(c,x) && !e(a,c) && friend(a,c) && friend(b,c)

Für die Attacken und wer sich vor wen stellt, gilt nun anscheinend

  • A greift B und X jeweils alleine an.
  • B greift A und X jeweils alleine an.
  • X greift A an und C hilft. X greift B an und C hilft. Aber a hilft nicht gegen C und umgekehrt.
  • X greift C an und A und B helfen.
  • C greift X alleine an.

Überraschend ist hier, dass A, B und C gegen X kämpfen und dass CA und BA (aber nicht AB) sich unterstützen, wenn X angreift, aber A und B quasi nebenher auch noch gegeneinander kämpfen.


Alte Diskussion

Diese Diskussion gab es mal auf Kampfregeln. Die Bilder sind leider verschollen. Es ging wohl ursprünglich um diesen Bug.

 A -> C
 X |- C
 D |- X

Früher folge daraus wohl, dass C nicht nur von X geholfen wurde (jemand mit irrtümlichen Helfe zu C), sondern auch von D, die nur indirekt HELFE hatten. Dadurch wurde dann A ausgelöscht. Daraufhin wurde die Regel oben (Alternative 3 unten) eingeführt.

Schritte bei der Erzeugung der Freund/Feind Matrix

Die folgende Erklärung ignoriert Belagerung, Parteitarnung und KÄMPFE HELFE NICHT, weil das sonst noch unübersichtlicher wird.

  1. Wenn eine Einheit X eine Einheit Y attackiert, so nehmen beide am Kampf teil und X ist Feind von Y. Das Heer von X wird als Angreifer markiert.
  2. Alle Einheiten X in der Region, die einer schon im Kampf befindlichen Einheit Y ein HELFE KÄMPFE gewähren, nehmen ebenfalls am Kampf teil, wenn die Einheit Y nicht in einem Angreifer-Heer ist. Alle Feinde von Y werden zu Feinden von X erklärt.
  3. Je zwei Heere X und Y, die nicht Feinde sind, und einen gemeinsamen Feind Z haben, werden als Freund markiert.
  4. Je zwei Heere X und Y, die bisher weder Freund noch Feind sind, aber sich beidseitig HELFE KÄMPFE gewähren, werden als Freund markiert.
  5. In jeder Runde wählt ein Kämpfer (Angreifer) aus der Menge seiner Feinde einen (Verteidiger) aus, den er schlagen kann.
  6. Die Kampfreihe eines Verteidigers ergibt sich aus der Menge der Einheiten, die gleichzeitig Feind des Angreifers und Freund des Verteidigers sind.

Alternative 1 (klappt nicht)

Datei:Clipboard02.png
Illustration zu Alternative 1
  1. Wenn eine Einheit X eine Einheit Y attackiert, nehmen beide am Kampf teil und X ist Feind von Y.
  2. Wenn eine Einheit X noch nicht am Kampf teilnimmt, aber mit einer Einheit Y aus dem vorangegangen Schritt ein gegenseitiges HELFE hat, welche a) attackiert wurde, und b) niemand attackiert, zu dem X ein gegenseitiges HELFE hat, dann nimmt X am Kampf teil und alle Feinde von Y sind Feinde von X.
  3. Einheiten X und Y, die sich gegenseitig HELFE gesetzt haben, wobei kein Feind von X ein gegenseitiges HELFE zu Y hat, sind Freunde.

Alternative 2 (von Iri)

Datei:Help.png
Illustration zu Alternative 2

Hi Enno,

Ich habe mir mal Gedanken gemacht. Das Problem ist so in der Tat nicht lösbar. D hat 3 Möglichkeiten:

  1. er hilft A gegen B -> A kann das ausnutzen, um B mit D zu plätten
  2. er hält sich raus -> A kann das nutzen, um B alleine zu plätten
  3. er kämpft mit B gegen A -> kann B gegen A ausnutzen

Abhilfe schafft nur ein vom Spieler situationsabhängig setzbarer Status: BEKÄMPFE Aggressor: Für die Magierregion, zieht die Einheit in den Kampf gegen A, an Seite von B. BEKÄMPFE NICHT: bleibt neutral BEKÄMPFE falschen Freund: zieht die Einheit in den Kampf gegen B, für die Front, wenn einer falsche Helfe-Stati zum Ausnutzen setzt. Dem übergeordnet sind natürlich Attackiere und direkte Helfe Stati. Die Frage ist ja nur, was D macht, wenn D C nicht hilft. Hat D ein Helfe zu C, hilft er C, fertig. Hat er das nicht, braucht er ne Anweisung, was zu tun ist, und dann greift das, was mittels BEKÄMPFE eingestellt wurde.

Das führt dazu, dass in der Magierregion jeder, der irgendwas attackiert, von allen niedergemacht wird. Das ist natürlich im Einzelfall dann schwierig, wenn ein Feind in die Magierregion läuft und man den raushaben will, dann sollte man sehr aufpassen, dass keiner dem Feind hilft. In diesem Fall wird die Magierregion allerdings zur Front, und man stellt BEKÄMPFE falschen Freund ein. An der Front führt das dazu, dass (normalerweise hat ja keiner helfe auf die Feinde) der Verräter (oder der es vergessen hat), der noch den falschen Helfe Status hat, und dem Feind (C) hilft, von allen geplättet wird. Und wenn man sich nicht sicher ist, kann man auch neutral einstellen. Damit macht man nichts gegen den Agressor in der Magierregion und auch nichts gegen falsche Freunde, sondern bleibt aus der Schlacht raus. Ist nicht gerade das loyalste, aber könnte manchmal Sinn machen, vielleicht als Grundeinstellung für die auszubildenden Truppen zu Hause.

Ich weiß nicht, ob das exploitierbar ist. BEKÄMPFE falschen Freund sollte recht sicher sein, an der Front, denn da hat ja eigentlich jeder Helfe auf seine Verbündeten, so dass, wenn einer der Bündnispartner verrückt spielt und einen anderen angreift, automatisch sowieso alle dem Opfer helfen. Nur wer kein Helfe gesetzt hat, kommt auch in Probleme (oder macht welche), aber das ist doch recht unwahrscheinlich, und selbst dann wäre es eben ein Verrat von 2 Leuten und gegen beide würde gekämpft. Sollte man in der Magierregion vermeiden, zumal wenn neutrale anwesend sind, da man sonst schnell den eigenen Bündnispartner kickt. BEKÄMPFE NICHT kann ausgenutzt werden gegen die Bogenschützen oder auch die Magier, sollte man also an Truppenversammlungen / wichtigen Regionen vermeiden. BEKÄMPFE Aggressor wiederum ist sehr riskant an der Front, weil ein falscher Helfe-Status (absichtlich oder nicht) den Aggressor plätten kann, weil auf einmal alle gegen ihn kämpfen.

Alternative 3

Datei:Clipboard03.png
Illustration zu Alternative 3

Nochmal ganz anders angesehen, was wuerde denn wirklich Sinn machen? In Illustration 1 denke ich, A sollte auf B,D schlagen, B auf A,C schlagen, C nur auf B und D nur auf A. Das waere so gegeben, wenn jeder nur diejenigen als Feinde betrachtet, die ihn selbst attackiert haben, oder einen Freund attackiert haben, mit dem gegenseitig HELFE besteht. Alle anderen Verbindungen werden ignoriert. Zwei Parteien die sich gegenseitig HELFE gesetzt haben, sind ausserdem niemals Feinde.

  • A->B,D
  • B->A,C
  • C->A
  • D->B

Illustration 3 wirft dann die Frage auf, was bei Verrat passiert. Angenommen, A attackiert B, aber nicht umgekehrt. In diesem Fall darf C nicht unbeteiligt an der Seite stehen - das wuerde Verrat zu stark machen, und im Erstschlag wuerde A gezielt die Taktiker oder andere wichtige einheiten der Allianz vernichten. Fuer C gilt also das eigene HELFE gegenueber A nicht mehr, weil A einen direkten Verbuendeten (B) attackiert hat, und wegene des direkten Angriffs auf B kaempfen A und B gegeneinander. D hingegen greift garnicht ein, da seine Verbuendeten von neimand attackiert wurden.

  • A->B,C
  • B->A
  • C->A
  • D kaempft nicht.

Wenn allerdings in Illustration 3 auch B eine Attacke gegen A macht, gilt nach dem eben beschriebenen Prinzip, dass D in den Kampf eingreift, da sein Verbuendeter A von einer dritten Partei B attackiert wurde. C hingegen wird weder gegen A noch B kaempfen: Beide haben einen Verbuendeten von C attackiert (sich selbst untereinander), was das HELFE von C unwirksam macht. C hat somit keine Verbuendeten, die attackiert wurden.

  • A->B
  • B->A,D
  • C kaempft nicht
  • D->B


Relevante Infos sind relevant