Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 33 additions & 3 deletions src/core/execution/DonateGoldExecution.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
import { Execution, Game, Gold, Player, PlayerID } from "../game/Game";
import {
Difficulty,
Execution,
Game,
Gold,
Player,
PlayerID,
} from "../game/Game";
import { PseudoRandom } from "../PseudoRandom";
import { toInt } from "../Util";

export class DonateGoldExecution implements Execution {
private recipient: Player;
private random: PseudoRandom;
private mg: Game;

private active = true;
private gold: Gold;
Expand All @@ -16,8 +26,13 @@ export class DonateGoldExecution implements Execution {
}

init(mg: Game, ticks: number): void {
this.mg = mg;
this.random = new PseudoRandom(mg.ticks());

if (!mg.hasPlayer(this.recipientID)) {
console.warn(`DonateExecution recipient ${this.recipientID} not found`);
console.warn(
`DonateGoldExecution recipient ${this.recipientID} not found`,
);
this.active = false;
return;
}
Expand All @@ -32,7 +47,10 @@ export class DonateGoldExecution implements Execution {
this.sender.canDonateGold(this.recipient) &&
this.sender.donateGold(this.recipient, this.gold)
) {
this.recipient.updateRelation(this.sender, 50);
// Prevent players from just buying a good relation by sending 1% gold. Instead, a minimum is needed, and it's random.
if (this.gold >= BigInt(this.getMinGoldForRelationUpdate())) {
this.recipient.updateRelation(this.sender, 50);
}
} else {
console.warn(
`cannot send gold from ${this.sender.name()} to ${this.recipient.name()}`,
Expand All @@ -41,6 +59,18 @@ export class DonateGoldExecution implements Execution {
this.active = false;
}

getMinGoldForRelationUpdate(): number {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

instead of a binary update or not, what if we updated relations proportionally to the gold sent?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea, I added that

const { difficulty } = this.mg.config().gameConfig();
if (difficulty === Difficulty.Easy) return this.random.nextInt(0, 25_000);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be a switch statement.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done!

if (difficulty === Difficulty.Medium)
return this.random.nextInt(25_000, 50_000);
if (difficulty === Difficulty.Hard)
return this.random.nextInt(50_000, 125_000);
if (difficulty === Difficulty.Impossible)
return this.random.nextInt(125_000, 250_000);
return 0;
}

isActive(): boolean {
return this.active;
}
Expand Down
54 changes: 51 additions & 3 deletions src/core/execution/DonateTroopExecution.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { Execution, Game, Player, PlayerID } from "../game/Game";
import { Difficulty, Execution, Game, Player, PlayerID } from "../game/Game";
import { PseudoRandom } from "../PseudoRandom";

export class DonateTroopsExecution implements Execution {
private recipient: Player;
private random: PseudoRandom;
private mg: Game;

private active = true;

Expand All @@ -12,8 +15,13 @@ export class DonateTroopsExecution implements Execution {
) {}

init(mg: Game, ticks: number): void {
this.mg = mg;
this.random = new PseudoRandom(mg.ticks());

if (!mg.hasPlayer(this.recipientID)) {
console.warn(`DonateExecution recipient ${this.recipientID} not found`);
console.warn(
`DonateTroopExecution recipient ${this.recipientID} not found`,
);
this.active = false;
return;
}
Expand All @@ -27,11 +35,17 @@ export class DonateTroopsExecution implements Execution {

tick(ticks: number): void {
if (this.troops === null) throw new Error("not initialized");

const minTroops = this.getMinTroopsForRelationUpdate();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this variable can be inlined

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had it inlined, but then coderabbit rightfully said that we need to calculate the troops BEFORE donating them.


if (
this.sender.canDonateTroops(this.recipient) &&
this.sender.donateTroops(this.recipient, this.troops)
) {
this.recipient.updateRelation(this.sender, 50);
// Prevent players from just buying a good relation by sending 1% troops. Instead, a minimum is needed, and it's random.
if (this.troops >= minTroops) {
this.recipient.updateRelation(this.sender, 50);
}
} else {
console.warn(
`cannot send troops from ${this.sender} to ${this.recipient}`,
Expand All @@ -40,6 +54,40 @@ export class DonateTroopsExecution implements Execution {
this.active = false;
}

getMinTroopsForRelationUpdate(): number {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you use a switch case for this

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done!

const { difficulty } = this.mg.config().gameConfig();

// ~7.7k - ~9.1k troops (for 100k troops)
if (difficulty === Difficulty.Easy)
return this.random.nextInt(
this.sender.troops() / 13,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think about making it a function of the recipient max troops? This way you need to give more troops to be in favor of larger nations.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea, I added that

this.sender.troops() / 11,
);

// ~9.1k - ~11.1k troops (for 100k troops)
if (difficulty === Difficulty.Medium)
return this.random.nextInt(
this.sender.troops() / 11,
this.sender.troops() / 9,
);

// ~11.1k - ~14.3k troops (for 100k troops)
if (difficulty === Difficulty.Hard)
return this.random.nextInt(
this.sender.troops() / 9,
this.sender.troops() / 7,
);

// ~14.3k - ~20k troops (for 100k troops)
if (difficulty === Difficulty.Impossible)
return this.random.nextInt(
this.sender.troops() / 7,
this.sender.troops() / 5,
);

return 0;
}

isActive(): boolean {
return this.active;
}
Expand Down
Loading