Skip to content

Commit f52b02d

Browse files
authored
Merge pull request #35 from Conspiratio/feature/testament-ausgelagert-balancing-kerkerstrafe
Feature/testament ausgelagert balancing kerkerstrafe
2 parents 45a3e24 + fd72440 commit f52b02d

File tree

9 files changed

+247
-86
lines changed

9 files changed

+247
-86
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
# Changelog Conspiratio.Lib
22

3+
## 2.2.0
4+
5+
_06.12.2022_
6+
7+
**[DE]**
8+
- 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.
9+
- Methode "TestamentVollstrecken" hinzugefügt (ausgelagert aus WinForms Client)
10+
- 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.
11+
- 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
12+
- 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).
13+
- Die von den Einwohnern einer Stadt verbrauchten Waren am Rundenende wurden reduziert
14+
- Kleinere Optimierungen
15+
316
## 2.1.1
417

518
_30.10.2022_

Conspiratio.Lib/Gameplay/Justiz/StrafeKerker.cs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,36 @@ public StrafeKerker() : base("Kerker")
1212

1313
public override string StrafeExecute(int opferID, int deliktpunkte)
1414
{
15-
double faktor = 10d;
16-
double deliktMultiplikator = (Convert.ToDouble(deliktpunkte) / 100d) + 1d;
15+
// Beispiel mit 2 Deliktpunkten (niederige Schwere der Schuld):
16+
// deliktMultiplikator: 2 / 100 * 10 + 1 = 1,2
17+
// gesundheitsaenderung = 15 * 1,2 = 18 * -1 = -18
18+
// laengeStrafeInMonaten = 18 / 10 = 1 (abgerundet)
19+
20+
// Beispiel mit 5 Deliktpunkten (mittlere Schwere der Schuld):
21+
// deliktMultiplikator: 5 / 100 * 10 + 1 = 1,5
22+
// gesundheitsaenderung = 15 * 1,5 = 23 * -1 = -23
23+
// laengeStrafeInMonaten = 23 / 10 = 2 (abgerundet)
24+
25+
// Beispiel mit 10 Deliktpunkten (hohe Schwere der Schuld):
26+
// deliktMultiplikator: 10 / 100 * 10 + 1 = 2,0
27+
// gesundheitsaenderung = 15 * 2,0 = 30 * -1 = -30
28+
// laengeStrafeInMonaten = 30 / 10 = 3 (abgerundet)
29+
30+
double faktor = 15d;
31+
double deliktMultiplikator = (Convert.ToDouble(deliktpunkte) / 100d * 10d) + 1d;
1732
int gesundheitsaenderung = Convert.ToInt32(Math.Abs(Math.Round(faktor * deliktMultiplikator, 0))) * -1;
1833

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

21-
return SW.Dynamisch.GetSpWithID(opferID).GetName() + " muss einen Monat im Kerker verbringen.\nDie Gesundheit von " + SW.Dynamisch.GetSpWithID(opferID).GetName() + " hat gelitten.";
36+
int laengeStrafeInMonaten = Convert.ToInt32(Math.Abs(Math.Floor(gesundheitsaenderung / 10d)));
37+
if (laengeStrafeInMonaten < 1)
38+
laengeStrafeInMonaten = 1;
39+
if (laengeStrafeInMonaten > 11)
40+
laengeStrafeInMonaten = 11;
41+
42+
string laengeStrafe = laengeStrafeInMonaten.ToString() + (laengeStrafeInMonaten == 1 ? " Monat" : " Monate");
43+
44+
return $"{SW.Dynamisch.GetSpWithID(opferID).GetName()} muss {laengeStrafe} im Kerker verbringen.\nDie Gesundheit von {SW.Dynamisch.GetSpWithID(opferID).GetName()} hat entsprechend gelitten.";
2245
}
2346
}
2447
}

Conspiratio.Lib/Gameplay/Justiz/StrafePranger.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public override string StrafeExecute(int opferID, int deliktpunkte)
2525
SW.Dynamisch.GetSpWithID(opferID).ErhoeheAnsehen(ansehensaenderung);
2626
}
2727

28-
return SW.Dynamisch.GetSpWithID(opferID).GetName() + " muss einen Tag am Pranger verbringen.\nDas Ansehen von " + SW.Dynamisch.GetSpWithID(opferID).GetName() + " hat deutlich gelitten";
28+
return SW.Dynamisch.GetSpWithID(opferID).GetName() + " muss einen Tag am Pranger verbringen.\nDas Ansehen von " + SW.Dynamisch.GetSpWithID(opferID).GetName() + " hat deutlich gelitten.";
2929
}
3030
}
3131
}

Conspiratio.Lib/Gameplay/Kampf/Stuetzpunkt.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ public bool KaufangebotAbgeben(int Preis)
545545
SW.Dynamisch.GetHumWithID(SW.Dynamisch.GetAktiverSpieler()).ErhoeheTaler(-Preis);
546546
SW.Dynamisch.GetKIwithID(Besitzer).SetTaler(SW.Dynamisch.GetKIwithID(Besitzer).GetTaler() + Preis);
547547
Besitzer = SW.Dynamisch.GetAktiverSpieler();
548+
SW.Dynamisch.GetHumWithID(SW.Dynamisch.GetAktiverSpieler()).NeuesHandelszertifikatVerleihen(3); // Es gibt immer ein Handelszertifikat der Stufe 3 beim Kauf eines Stützpunktes
548549
SW.Dynamisch.BelTextAnzeigen($"Euer Angebot wurde angenommen, Ihr seid nun stolzer Besitzer von {Name}.");
549550
return true;
550551
}

Conspiratio.Lib/Gameplay/Personen/HumSpieler.cs

Lines changed: 45 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Data.SqlClient;
4+
using System.Linq;
35

46
using Conspiratio.Lib.Gameplay.Ereignisse;
57
using Conspiratio.Lib.Gameplay.Hinterzimmer;
@@ -612,70 +614,62 @@ public int GetNextStadtIDMitWohnsitz(int aktuelleStadtID)
612614
}
613615
#endregion
614616

615-
#region VersuchHandelszertifikatVerleihen
616-
public void VersuchHandelszertifikatVerleihen()
617+
#region NeuesHandelszertifikatVerleihen
618+
public void NeuesHandelszertifikatVerleihen(int tierStufeRohstoff)
617619
{
618-
// Falls nicht schon eines diese Runde verliehen wird
619-
if (GetBekamHandeslzertifikatX() == 0)
620+
if (GetBekamHandeslzertifikatX() != 0) // Pro Runde kann immer nur ein Handelszertifikat verliehen werden, der erste Aufruf gewinnt daher immer
621+
return;
622+
623+
List<int> rohstoffOhneRecht = new List<int>();
624+
625+
// Liste aller RohstoffIDs zur Tier-Stufe ermitteln, für die der Spieler noch kein Rohstoff Recht besitzt.
626+
while (tierStufeRohstoff > 0)
620627
{
621-
int handzert = 0;
628+
rohstoffOhneRecht = ErmittleRohstoffeOhneRohstoffrecht(tierStufeRohstoff);
622629

623-
// Handelszertifikate zählen
624-
for (int i = 1; i < SW.Statisch.GetMaxRohID(); i++)
625-
{
626-
if (GetRohstoffrechteX(i))
627-
{
628-
handzert++;
629-
}
630-
}
630+
if (rohstoffOhneRecht.Any())
631+
break; // Es gibt auf der aktuellen Tier-Stufe Rohstoffe ohne Recht
631632

632-
// Falls er bereits 2 Rohstoffe besaß
633-
if (handzert >= 2)
634-
{
635-
if (GetTaler() >= 1000000)
636-
{
637-
HandelszertifikatVerleihen(5, 15, SW.Statisch.GetMaxRohID());
638-
}
639-
else if (GetTaler() >= 500000)
640-
{
641-
HandelszertifikatVerleihen(4, 8, 19);
642-
}
643-
else if (GetTaler() >= 100000)
644-
{
645-
HandelszertifikatVerleihen(3, 8, 15);
646-
}
647-
}
633+
if (tierStufeRohstoff == 1)
634+
break; // Der Spieler bereits alle möglichen Rohstoffrechte auf dieser oder kleineren Tier-Stufen
635+
636+
// Der Spieler hat alle Rohstoffrechte der aktuellen Tier-Stufe bereits und es handelt sich nicht um Tier-Stufe 1.
637+
// Dann ermitteln wir Liste aller RohstoffIDs zur nächst niedrigeren Tier-Stufe, für die der Spieler noch kein Rohstoff Recht besitzt.
638+
tierStufeRohstoff--;
639+
}
640+
641+
if (!rohstoffOhneRecht.Any()) // Hat der Spieler bereits alle möglichen Rohstoffrechte?
642+
return;
643+
644+
int neueRohstoffID;
645+
if (rohstoffOhneRecht.Count() > 1)
646+
{
647+
// Zufälligen Rohstoff aus der Liste wählen
648+
neueRohstoffID = rohstoffOhneRecht[SW.Statisch.Rnd.Next(0, rohstoffOhneRecht.Count())];
648649
}
650+
else
651+
neueRohstoffID = rohstoffOhneRecht.First();
652+
653+
SetRohstoffrechteXZuY(neueRohstoffID, true);
654+
SetBekamHandelszertifikatX(neueRohstoffID);
649655
}
650656
#endregion
651657

652-
#region HandelszertifikatVerleihen
653-
public void HandelszertifikatVerleihen(int anzahlRohstoffrechte, int minRohID, int maxRohID)
658+
#region ErmittleRohstoffeOhneRohstoffrecht
659+
public List<int> ErmittleRohstoffeOhneRohstoffrecht(int tierStufeRohstoff)
654660
{
655-
int aktuelleAnzahlRohstoffrechte = 0;
656-
// Rohstoffrecht verleihen
657-
for (int i = 1; i < SW.Statisch.GetMaxRohID(); i++)
658-
{
659-
if (GetRohstoffrechteX(i))
660-
{
661-
aktuelleAnzahlRohstoffrechte++;
662-
}
663-
}
661+
List<int> rohstoffeOhneRecht = new List<int>();
664662

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

670-
// Solange der Spieler das neue Recht aber schon hat, soll ein anderes gewählt werden
671-
while (GetRohstoffrechteX(neuesRecht) == true)
672-
{
673-
neuesRecht = SW.Statisch.Rnd.Next(minRohID, maxRohID);
674-
}
675-
676-
SetRohstoffrechteXZuY(neuesRecht, true);
677-
SetBekamHandelszertifikatX(neuesRecht);
668+
if (!GetRohstoffrechteX(i))
669+
rohstoffeOhneRecht.Add(i);
678670
}
671+
672+
return rohstoffeOhneRecht;
679673
}
680674
#endregion
681675

Conspiratio.Lib/Gameplay/Privilegien/FestGeben/FestManager.cs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Linq;
33

44
using Conspiratio.Lib.Extensions;
5+
using Conspiratio.Lib.Gameplay.Gebiete;
56
using Conspiratio.Lib.Gameplay.Spielwelt;
67

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

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

129-
int grundpreis = 800;
130+
int grundpreis = 1200;
130131
int geplanteKosten = Convert.ToInt32((grundpreis * faktorGroesse + (grundpreis * faktorMusiker)) * faktorVergangeneSpielzeit) + anteilGesamtvermoegen;
131132

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

138-
string message = $"Denkt daran, dass Eure Niederlassung in {GetStadtName(stadtID)} im Jahr {jahr} mit kulinarischen Köstlichkeiten gut gefüllt sein sollte ...{Environment.NewLine}" +
139+
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}" +
139140
$"Die Musiker werden Euch etwa {geplanteKosten.ToStringGeld()} kosten.";
140141

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

154-
int lagerstandObst = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 3);
155-
int lagerstandBier = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 4);
156-
int lagerstandFisch = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 6);
157-
int lagerstandWein = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 9);
158-
int lagerstandRind = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 10);
159-
int lagerstandRum = SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 12);
155+
Stadt stadtVomFest = SW.Dynamisch.GetStadtwithID(fest.StadtID);
156+
157+
int lagerstandObst = stadtVomFest.GetRohstoffIDXVorrat(3);
158+
int lagerstandBier = stadtVomFest.GetRohstoffIDXVorrat(4);
159+
int lagerstandFisch = stadtVomFest.GetRohstoffIDXVorrat(6);
160+
int lagerstandWein = stadtVomFest.GetRohstoffIDXVorrat(9);
161+
int lagerstandRind = stadtVomFest.GetRohstoffIDXVorrat(10);
162+
int lagerstandRum = stadtVomFest.GetRohstoffIDXVorrat(12);
160163

161164
int verbrauchProWareKlein = 100;
162165
int verbrauchProWareNormal = 200;
@@ -421,7 +424,7 @@ public string FestFeiern(Fest fest)
421424

422425
// Ware verbrauchen
423426
if (verbrauchBier > 0)
424-
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 4, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 4) - verbrauchBier);
427+
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(4, -verbrauchBier);
425428
}
426429

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

459462
// Ware verbrauchen
460463
if (verbrauchFisch > 0)
461-
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 6, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 6) - verbrauchFisch);
464+
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(6, -verbrauchFisch);
462465
}
463466

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

490493
// Ware verbrauchen
491494
if (verbrauchObst > 0)
492-
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 3, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 3) - verbrauchObst);
495+
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(3, -verbrauchObst);
493496
}
494497

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

521524
// Ware verbrauchen
522525
if (verbrauchWein > 0)
523-
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 9, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 9) - verbrauchWein);
526+
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(9, -verbrauchWein);
524527
}
525528

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

552555
// Ware verbrauchen
553556
if (verbrauchRum > 0)
554-
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 12, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 12) - verbrauchRum);
557+
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(12, -verbrauchRum);
555558
}
556559

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

583586
// Ware verbrauchen
584587
if (verbrauchRind > 0)
585-
SW.Dynamisch.GetAktHum().SetStadtRohstoffAnzahl(fest.StadtID, 10, SW.Dynamisch.GetAktHum().GetStadtRohstoffAnzahl(fest.StadtID, 10) - verbrauchRind);
588+
stadtVomFest.ErhoeheRohstoffVorratWithIDXByY(10, -verbrauchRind);
586589
}
587590

588591
#endregion

Conspiratio.Lib/Gameplay/Rohstoffe/Rohstoff.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ public string GetRohName()
128128
return _name;
129129
}
130130

131+
public int GetRohStufe()
132+
{
133+
return _rohStufe;
134+
}
135+
131136
public string GetProdText()
132137
{
133138
return _produktionstext;

0 commit comments

Comments
 (0)