Skip to content

Commit

Permalink
Merge pull request #35 from Conspiratio/feature/testament-ausgelagert…
Browse files Browse the repository at this point in the history
…-balancing-kerkerstrafe

Feature/testament ausgelagert balancing kerkerstrafe
  • Loading branch information
SirTobyB committed Dec 6, 2022
2 parents 45a3e24 + fd72440 commit f52b02d
Show file tree
Hide file tree
Showing 9 changed files with 247 additions and 86 deletions.
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# Changelog Conspiratio.Lib

## 2.2.0

_06.12.2022_

**[DE]**
- Die Strafe "Einen Monat Kerker" hat nun eine variable Länge, abhängig von der Schwere der Schuld. Die Auswirkung auf die Gesundheit des verurteilten Spielers ist dann entsprechend höher.
- Methode "TestamentVollstrecken" hinzugefügt (ausgelagert aus WinForms Client)
- Rohstoffrechte (Handelszertifikate) werden nun bei jeder Amtsverleihung sowie Kauf einer Zollburg oder eines Räuberlagers gewährt und sind nicht mehr abhängig von Talergrenzen sowie nicht mehr beschränbkt auf maximal 5.
- Bei Spielen mit nur einem aktiven Spieler erhöhen Warenverkäufe des Spielers an die Stadt am Ende der Runde nun korrekt den Lagerstand der Stadt
- Feste benötigen die Waren nun im Lager der Stadt anstelle im Lager der Niederlassung des Spielers. Somit ist es nun überhaupt erst möglich, alle Waren für die größeren Feste zu beschaffen (sofern die Handelszertifikat dafür vorhanden sind).
- Die von den Einwohnern einer Stadt verbrauchten Waren am Rundenende wurden reduziert
- Kleinere Optimierungen

## 2.1.1

_30.10.2022_
Expand Down
29 changes: 26 additions & 3 deletions Conspiratio.Lib/Gameplay/Justiz/StrafeKerker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,36 @@ public StrafeKerker() : base("Kerker")

public override string StrafeExecute(int opferID, int deliktpunkte)
{
double faktor = 10d;
double deliktMultiplikator = (Convert.ToDouble(deliktpunkte) / 100d) + 1d;
// Beispiel mit 2 Deliktpunkten (niederige Schwere der Schuld):
// deliktMultiplikator: 2 / 100 * 10 + 1 = 1,2
// gesundheitsaenderung = 15 * 1,2 = 18 * -1 = -18
// laengeStrafeInMonaten = 18 / 10 = 1 (abgerundet)

// Beispiel mit 5 Deliktpunkten (mittlere Schwere der Schuld):
// deliktMultiplikator: 5 / 100 * 10 + 1 = 1,5
// gesundheitsaenderung = 15 * 1,5 = 23 * -1 = -23
// laengeStrafeInMonaten = 23 / 10 = 2 (abgerundet)

// Beispiel mit 10 Deliktpunkten (hohe Schwere der Schuld):
// deliktMultiplikator: 10 / 100 * 10 + 1 = 2,0
// gesundheitsaenderung = 15 * 2,0 = 30 * -1 = -30
// laengeStrafeInMonaten = 30 / 10 = 3 (abgerundet)

double faktor = 15d;
double deliktMultiplikator = (Convert.ToDouble(deliktpunkte) / 100d * 10d) + 1d;
int gesundheitsaenderung = Convert.ToInt32(Math.Abs(Math.Round(faktor * deliktMultiplikator, 0))) * -1;

SW.Dynamisch.GetSpWithID(opferID).ErhoeheGesundheit(gesundheitsaenderung);

return SW.Dynamisch.GetSpWithID(opferID).GetName() + " muss einen Monat im Kerker verbringen.\nDie Gesundheit von " + SW.Dynamisch.GetSpWithID(opferID).GetName() + " hat gelitten.";
int laengeStrafeInMonaten = Convert.ToInt32(Math.Abs(Math.Floor(gesundheitsaenderung / 10d)));
if (laengeStrafeInMonaten < 1)
laengeStrafeInMonaten = 1;
if (laengeStrafeInMonaten > 11)
laengeStrafeInMonaten = 11;

string laengeStrafe = laengeStrafeInMonaten.ToString() + (laengeStrafeInMonaten == 1 ? " Monat" : " Monate");

return $"{SW.Dynamisch.GetSpWithID(opferID).GetName()} muss {laengeStrafe} im Kerker verbringen.\nDie Gesundheit von {SW.Dynamisch.GetSpWithID(opferID).GetName()} hat entsprechend gelitten.";
}
}
}
2 changes: 1 addition & 1 deletion Conspiratio.Lib/Gameplay/Justiz/StrafePranger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public override string StrafeExecute(int opferID, int deliktpunkte)
SW.Dynamisch.GetSpWithID(opferID).ErhoeheAnsehen(ansehensaenderung);
}

return SW.Dynamisch.GetSpWithID(opferID).GetName() + " muss einen Tag am Pranger verbringen.\nDas Ansehen von " + SW.Dynamisch.GetSpWithID(opferID).GetName() + " hat deutlich gelitten";
return SW.Dynamisch.GetSpWithID(opferID).GetName() + " muss einen Tag am Pranger verbringen.\nDas Ansehen von " + SW.Dynamisch.GetSpWithID(opferID).GetName() + " hat deutlich gelitten.";
}
}
}
1 change: 1 addition & 0 deletions Conspiratio.Lib/Gameplay/Kampf/Stuetzpunkt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,7 @@ public bool KaufangebotAbgeben(int Preis)
SW.Dynamisch.GetHumWithID(SW.Dynamisch.GetAktiverSpieler()).ErhoeheTaler(-Preis);
SW.Dynamisch.GetKIwithID(Besitzer).SetTaler(SW.Dynamisch.GetKIwithID(Besitzer).GetTaler() + Preis);
Besitzer = SW.Dynamisch.GetAktiverSpieler();
SW.Dynamisch.GetHumWithID(SW.Dynamisch.GetAktiverSpieler()).NeuesHandelszertifikatVerleihen(3); // Es gibt immer ein Handelszertifikat der Stufe 3 beim Kauf eines Stützpunktes
SW.Dynamisch.BelTextAnzeigen($"Euer Angebot wurde angenommen, Ihr seid nun stolzer Besitzer von {Name}.");
return true;
}
Expand Down
96 changes: 45 additions & 51 deletions Conspiratio.Lib/Gameplay/Personen/HumSpieler.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;

using Conspiratio.Lib.Gameplay.Ereignisse;
using Conspiratio.Lib.Gameplay.Hinterzimmer;
Expand Down Expand Up @@ -612,70 +614,62 @@ public int GetNextStadtIDMitWohnsitz(int aktuelleStadtID)
}
#endregion

#region VersuchHandelszertifikatVerleihen
public void VersuchHandelszertifikatVerleihen()
#region NeuesHandelszertifikatVerleihen
public void NeuesHandelszertifikatVerleihen(int tierStufeRohstoff)
{
// Falls nicht schon eines diese Runde verliehen wird
if (GetBekamHandeslzertifikatX() == 0)
if (GetBekamHandeslzertifikatX() != 0) // Pro Runde kann immer nur ein Handelszertifikat verliehen werden, der erste Aufruf gewinnt daher immer
return;

List<int> rohstoffOhneRecht = new List<int>();

// Liste aller RohstoffIDs zur Tier-Stufe ermitteln, für die der Spieler noch kein Rohstoff Recht besitzt.
while (tierStufeRohstoff > 0)
{
int handzert = 0;
rohstoffOhneRecht = ErmittleRohstoffeOhneRohstoffrecht(tierStufeRohstoff);

// Handelszertifikate zählen
for (int i = 1; i < SW.Statisch.GetMaxRohID(); i++)
{
if (GetRohstoffrechteX(i))
{
handzert++;
}
}
if (rohstoffOhneRecht.Any())
break; // Es gibt auf der aktuellen Tier-Stufe Rohstoffe ohne Recht

// Falls er bereits 2 Rohstoffe besaß
if (handzert >= 2)
{
if (GetTaler() >= 1000000)
{
HandelszertifikatVerleihen(5, 15, SW.Statisch.GetMaxRohID());
}
else if (GetTaler() >= 500000)
{
HandelszertifikatVerleihen(4, 8, 19);
}
else if (GetTaler() >= 100000)
{
HandelszertifikatVerleihen(3, 8, 15);
}
}
if (tierStufeRohstoff == 1)
break; // Der Spieler bereits alle möglichen Rohstoffrechte auf dieser oder kleineren Tier-Stufen

// Der Spieler hat alle Rohstoffrechte der aktuellen Tier-Stufe bereits und es handelt sich nicht um Tier-Stufe 1.
// Dann ermitteln wir Liste aller RohstoffIDs zur nächst niedrigeren Tier-Stufe, für die der Spieler noch kein Rohstoff Recht besitzt.
tierStufeRohstoff--;
}

if (!rohstoffOhneRecht.Any()) // Hat der Spieler bereits alle möglichen Rohstoffrechte?
return;

int neueRohstoffID;
if (rohstoffOhneRecht.Count() > 1)
{
// Zufälligen Rohstoff aus der Liste wählen
neueRohstoffID = rohstoffOhneRecht[SW.Statisch.Rnd.Next(0, rohstoffOhneRecht.Count())];
}
else
neueRohstoffID = rohstoffOhneRecht.First();

SetRohstoffrechteXZuY(neueRohstoffID, true);
SetBekamHandelszertifikatX(neueRohstoffID);
}
#endregion

#region HandelszertifikatVerleihen
public void HandelszertifikatVerleihen(int anzahlRohstoffrechte, int minRohID, int maxRohID)
#region ErmittleRohstoffeOhneRohstoffrecht
public List<int> ErmittleRohstoffeOhneRohstoffrecht(int tierStufeRohstoff)
{
int aktuelleAnzahlRohstoffrechte = 0;
// Rohstoffrecht verleihen
for (int i = 1; i < SW.Statisch.GetMaxRohID(); i++)
{
if (GetRohstoffrechteX(i))
{
aktuelleAnzahlRohstoffrechte++;
}
}
List<int> rohstoffeOhneRecht = new List<int>();

// Wenn der Spieler weniger als x Rechte besitzt, bekommt er ein neues verliehen
if (aktuelleAnzahlRohstoffrechte < anzahlRohstoffrechte)
for (int i = 1; i < SW.Statisch.GetMaxRohID(); i++)
{
int neuesRecht = SW.Statisch.Rnd.Next(minRohID, maxRohID);
if (SW.Dynamisch.GetRohstoffwithID(i).GetRohStufe() != tierStufeRohstoff)
continue;

// Solange der Spieler das neue Recht aber schon hat, soll ein anderes gewählt werden
while (GetRohstoffrechteX(neuesRecht) == true)
{
neuesRecht = SW.Statisch.Rnd.Next(minRohID, maxRohID);
}

SetRohstoffrechteXZuY(neuesRecht, true);
SetBekamHandelszertifikatX(neuesRecht);
if (!GetRohstoffrechteX(i))
rohstoffeOhneRecht.Add(i);
}

return rohstoffeOhneRecht;
}
#endregion

Expand Down
31 changes: 17 additions & 14 deletions Conspiratio.Lib/Gameplay/Privilegien/FestGeben/FestManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Linq;

using Conspiratio.Lib.Extensions;
using Conspiratio.Lib.Gameplay.Gebiete;
using Conspiratio.Lib.Gameplay.Spielwelt;

namespace Conspiratio.Lib.Gameplay.Privilegien.FestGeben
Expand Down Expand Up @@ -126,7 +127,7 @@ public string ErstelleNeuesFest(int stadtID, EnumFestGroesse groesse, EnumFestMu

int anteilGesamtvermoegen = SW.Dynamisch.GetAktHum().GetGesamtVermoegen(SW.Dynamisch.GetAktiverSpieler()) / 200; // 0,5 % des Gesamtvermögens

int grundpreis = 800;
int grundpreis = 1200;
int geplanteKosten = Convert.ToInt32((grundpreis * faktorGroesse + (grundpreis * faktorMusiker)) * faktorVergangeneSpielzeit) + anteilGesamtvermoegen;

if (geplanteKosten > 500000) // Kosten deckeln bei sehr weit fortgeschrittenen Spielen
Expand All @@ -135,7 +136,7 @@ public string ErstelleNeuesFest(int stadtID, EnumFestGroesse groesse, EnumFestMu
Fest fest = new Fest(spielerID, stadtID, groesse, musiker, jahr, geplanteKosten);
SW.Dynamisch.Spielstand.Feste.Add(fest);

string message = $"Denkt daran, dass Eure Niederlassung in {GetStadtName(stadtID)} im Jahr {jahr} mit kulinarischen Köstlichkeiten gut gefüllt sein sollte ...{Environment.NewLine}" +
string message = $"Denkt daran, dass die Lager der Stadt {GetStadtName(stadtID)} im Jahr {jahr} mit kulinarischen Köstlichkeiten gut gefüllt sein sollten ...{Environment.NewLine}" +
$"Die Musiker werden Euch etwa {geplanteKosten.ToStringGeld()} kosten.";

return message;
Expand All @@ -151,12 +152,14 @@ public string FestFeiern(Fest fest)
if (SW.Dynamisch.GetAktuellesJahr() != fest.Jahr)
throw new ArgumentOutOfRangeException(nameof(fest), "Das Jahr des Festes ist nicht das aktuelle Jahr.");

int lagerstandObst = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 3);
int lagerstandBier = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 4);
int lagerstandFisch = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 6);
int lagerstandWein = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 9);
int lagerstandRind = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 10);
int lagerstandRum = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 12);
Stadt stadtVomFest = SW.Dynamisch.GetStadtwithID(fest.StadtID);

int lagerstandObst = stadtVomFest.GetRohstoffIDXVorrat(3);
int lagerstandBier = stadtVomFest.GetRohstoffIDXVorrat(4);
int lagerstandFisch = stadtVomFest.GetRohstoffIDXVorrat(6);
int lagerstandWein = stadtVomFest.GetRohstoffIDXVorrat(9);
int lagerstandRind = stadtVomFest.GetRohstoffIDXVorrat(10);
int lagerstandRum = stadtVomFest.GetRohstoffIDXVorrat(12);

int verbrauchProWareKlein = 100;
int verbrauchProWareNormal = 200;
Expand Down Expand Up @@ -421,7 +424,7 @@ public string FestFeiern(Fest fest)

// Ware verbrauchen
if (verbrauchBier > 0)
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 4, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 4) - verbrauchBier);
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(4, -verbrauchBier);
}

if ((verbrauchSollFisch > 0) && (erfolgWarenInProzent < 100))
Expand Down Expand Up @@ -458,7 +461,7 @@ public string FestFeiern(Fest fest)

// Ware verbrauchen
if (verbrauchFisch > 0)
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 6, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 6) - verbrauchFisch);
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(6, -verbrauchFisch);
}

if ((verbrauchSollObst > 0) && (erfolgWarenInProzent < 100))
Expand Down Expand Up @@ -489,7 +492,7 @@ public string FestFeiern(Fest fest)

// Ware verbrauchen
if (verbrauchObst > 0)
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 3, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 3) - verbrauchObst);
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(3, -verbrauchObst);
}

if ((verbrauchSollWein > 0) && (erfolgWarenInProzent < 100))
Expand Down Expand Up @@ -520,7 +523,7 @@ public string FestFeiern(Fest fest)

// Ware verbrauchen
if (verbrauchWein > 0)
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 9, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 9) - verbrauchWein);
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(9, -verbrauchWein);
}

if ((verbrauchSollRum > 0) && (erfolgWarenInProzent < 100))
Expand Down Expand Up @@ -551,7 +554,7 @@ public string FestFeiern(Fest fest)

// Ware verbrauchen
if (verbrauchRum > 0)
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 12, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 12) - verbrauchRum);
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(12, -verbrauchRum);
}

if ((verbrauchSollRind > 0) && (erfolgWarenInProzent < 100))
Expand Down Expand Up @@ -582,7 +585,7 @@ public string FestFeiern(Fest fest)

// Ware verbrauchen
if (verbrauchRind > 0)
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 10, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 10) - verbrauchRind);
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(10, -verbrauchRind);
}

#endregion
Expand Down
5 changes: 5 additions & 0 deletions Conspiratio.Lib/Gameplay/Rohstoffe/Rohstoff.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,11 @@ public string GetRohName()
return _name;
}

public int GetRohStufe()
{
return _rohStufe;
}

public string GetProdText()
{
return _produktionstext;
Expand Down
Loading

0 comments on commit f52b02d

Please sign in to comment.