-
Notifications
You must be signed in to change notification settings - Fork 0
Söldner & Räuber System
In diesem Artikel möchte ich das Konzept und die Funktionsweise des Räuber & Söldner Systems erläutern, damit sich andere Entwickler schnell zurecht finden, möchten sie Änderungen oder Erweiterungen vornehmen. Diese Seite befindet sich noch im Aufbau und unterliegt einem stetigen Verbesserungsprozess meinersets.
Stützpunkt: Überbegriff für die Söldnerburgen und die Räuberlager
Einheit: Ein Soldat oder Räuber
Aktion: Bezeichnet die Aufgabe eines Stützpunktes, wie z.B. plündern oder beschützen
Folgt.
Alle Fenster, die zum Söldner & Räuber System gehören, befinden sich im Namespace Kampf
. Derzeit gibt es folgende Fenster:
Dieses Fenster stellt die Übersichtskarte der Militär-Stützpunkte im gesamten Reich dar. Hier kann der Spieler alle 8 Stützpunkte anklicken und sie sich anschauen. Besitzt er einen Stützpunkt, so gelangt er in die Verwaltungsansicht (frmStuetzpunktVerwalten
). Besitzt er den Stützpunkt nicht, so wird ihm ein Info-Fenster (frmStuetzpunktKaufen
) angezeigt, in dem er ein Kaufangebot machen kann (jeweils nur ein Angebot pro Jahr/Runde).
Dieses Fenster stellt die wichtigsten Informationen eines Stützpunktes dar, aus Sicht eines Spielers, dem der Stützpunkt nicht gehört. Es wird der Besitzer, die Sicherheit/Tarnung sowie der Zustand angezeigt. Der Spieler hat hier außerdem die Möglichkeit, dem Besitzer ein Kaufangebot zu unterbreiten.
In diesem Fenster kann ein Besitzer eines Stützpunktes diesen verwalten. Er kann Truppen anheuern, ein Manöver durchführen, die Sicherheit/Tarnung und den Zustand verbessern sowie den Stützpunkt ausbauen, um die Kapazität für Truppen zu erhöhen. Außerdem hat der Spieler hier die Möglichkeit, bis zu zwei Aktionen für seine Truppen festzulegen.
Folgende Werte besitzt eine Einheit:
- Maximale Lebenspunkte
- Lebenspunkte
- Angriffswert
- Verteidigungswert
- Agilität (derzeit keine Auswirkung)
- Basiskosten
Söldner ist der Überbegriff für alle Einheiten, welche in einer Zollburg stationiert werden können. Es gibt folgende Typen von Söldnern:
Räuber ist der Überbegriff für alle Einheiten, die in einem Räuberlager stationiert sein können. Es gibt folgende Typen von Räubern:
In Anlehnung an die Beschreibung der Kämpfe in diesem Issue (https://github.com/DerEinzehnte/Conspiratio-Programm/issues/44) habe ich mir einen Abflauf der Kämpfe überlegt, den ich im folgenden beschreiben werde.
Die Kampfberechnung findet in der Funktion BerechneKampfErgebnis
der Klasse Kampf
statt und liefert ein Objekt der Klasse KampfErgebnis
mit den entsprechenden Werten zurück, die ausgewertet und dargestellt werden können. Wichtig: Diese Funktion berechnet nur ein Ergebnis, verändert aber noch nichts an der Moral oder der Truppen in den Stützpunkten. Damit wäre also auch beispielsweilse eine Simulation eines Kampfes möglich, ohne direkte Auswirkungen.
Ein Kampf besteht normalerweise aus mehreren Runden, ausser der Kampf endet schon nach der ersten Runde.
Pro Runde werden alle lebenen Einheiten beider Spieler einen Angriff ausführen, bis alle Einheiten einen Angriff durchgeführt haben.
Die erste Einheit des Spielers, der beginnt, fängt an, danach abwechselnd. Die Einheiten werden gemischt, sind also nicht sortiert. Ursprünglich hatte ich vor, Einheiten mit einem höheren Agilitätswert eher angreifen zu lassen als Einheiten mit einem niedrigeren Wert, allerdings würde dies die Kämpfe weniger dynamisch gestalten und die einzelnen Schwächen und Stärken hätten weniger Auswirkung bzw. einseitige Truppen hätten deutlich größere Vor- oder Nachteile. So fühlt es sich jedenfalls fairer und ausgeglichener an aber das ist derzeit nur mein erster Entwurf, der sicher noch reifen muss.
Die Angriffe der jeweiligen Einheiten konzentrieren sich immer auf die nächste Einheit, bis diese tot ist.
Stirbt eine Einheit, dann sinkt die Moral der zugehörigen Truppe zu einer Wahrscheinlichkeit von 50 % um 1 %.
Wird eine Einheit getötet, steigt die Moral der angreifenden Truppe zu einer Wahrscheinlichkeit von 50 % um 1 %.
Nach einer kompletten Angriffsrunde wird folgendes geprüft:
- Ist die Moral einer Truppe 0 %? Dann flieht diese und der Kampf ist beendet und für diese Truppe verloren
- Ist die Moral einer Truppe unter 20 %, besteht eine Chance von 50 %, dass die Truppen aufgeben und fliehen. Der Kampf ist damit verloren und beendet.
- Hat eine Truppe mehr als die Hälfte ihrer ursprünglichen Einheiten verloren? Dann flieht diese und der Kampf ist beendet und für diese Truppe verloren
- Wenn eine Truppe in der ersten Runde komplett ausgelöscht wurde, ist der Kampf natürlich ebenfalls vorbei
Sind diese Prüfungen alle erfolglos, dann geht es in die nächste Kampfrunde.
Die Angriffsstärke einer Einheit wird wie folgt berechnet:
Angriffsstärke = Angriffswert + Moralfaktor + StarkGegenFaktor
Die Verteidigungsstärke einer Einheit wird wie folgt berechnet:
Verteidigungsstärke = Verteidigungswert + Moralfaktor - SchwachGegenFaktor
Den Lebenspunkten wird bei einem Angriff folgendes Ergebnis abgezogen:
Abzug Lebenspunkte = Angriffswert - Verteidigungswert
Ist dieser Wert 0 oder kleiner als 0 so wird der Einheit immer 1 abgezogen (damit Kämpfe nicht unendlich lange dauern bzw. in die Länge gezogen werden).
Um das Balancing anzupassen, sind folgende Klassen und Funktionen relevant bzw. interessant:
- Einheitenwerte: Sind im Konstruktor angegeben, die Klassen liegen im Namespace
Conspiration.Kampf
(z.B. ZollSoeldner) - Stützpunktwerte: In der Funktion
NeuInitialisieren
in der KlasseVW
werden die Stützpunkte mit Standardwerten zur Kapazität und zum Preis erstellt - KI-Stärke: Die Stärke und Aktivität der KI-Spieler wird in der Funktion
RundenendeKIAktionenDurchfuehren
in den KlassenZollburg
undRaeuberlager
angegeben. In der Funktion gibt einen Aktivitätsfaktor, der erlaubt, die relative Häufigkeit von Aktionen im Stützpunkt durch die KI von 1% bis zu 100% festzulegen (Standard ist 50%). - Wahrscheinlichkeit von Kämpfen und Überfällen: In der Klasse
Kampfberechnung
gibt es die FunktionErmittleStattfindendeKaempfe
, welche die am Rundenende stattfindenen Kämpfe ermittelt. Dabei stützt sie sich auf ein ObjektLandsicherheit
, welche die Wahrscheinlichkeiten und Sicherheiten eines Landes abbildet. Das Objekt wird durch die FunktionVW.LandsicherheitenInitialisieren
bei Rundenende erzeugt. - Auswahl von Überfallsopfern: Dafür gibt es die Funktion
VW.getUeberfallOpferInLand