Merge branch 'main' into patterned-territory

This commit is contained in:
Aotumuri
2025-06-01 11:00:54 +09:00
committed by GitHub
2 changed files with 44 additions and 41 deletions
+32 -25
View File
@@ -9,7 +9,13 @@ import targetIcon from "../../../../resources/images/TargetIcon.svg";
import traitorIcon from "../../../../resources/images/TraitorIcon.svg";
import { PseudoRandom } from "../../../core/PseudoRandom";
import { Theme } from "../../../core/configuration/Config";
import { AllPlayers, Cell, nukeTypes, UnitType } from "../../../core/game/Game";
import {
AllPlayers,
Cell,
nukeTypes,
PlayerType,
UnitType,
} from "../../../core/game/Game";
import { GameView, PlayerView } from "../../../core/game/GameView";
import { createCanvas, renderNumber, renderTroops } from "../../Utils";
import { TransformHandler } from "../TransformHandler";
@@ -211,27 +217,29 @@ export class NameLayer implements Layer {
troopsDiv.style.marginTop = "-5%";
element.appendChild(troopsDiv);
const shieldDiv = document.createElement("div");
shieldDiv.classList.add("player-shield");
shieldDiv.style.zIndex = "3";
shieldDiv.style.marginTop = "-5%";
shieldDiv.style.display = "flex";
shieldDiv.style.alignItems = "center";
shieldDiv.style.gap = "0px";
const shieldImg = document.createElement("img");
shieldImg.src = this.shieldIconImage.src;
shieldImg.style.width = "16px";
shieldImg.style.height = "16px";
if (player.type() !== PlayerType.Bot) {
const shieldDiv = document.createElement("div");
shieldDiv.classList.add("player-shield");
shieldDiv.style.zIndex = "3";
shieldDiv.style.marginTop = "-5%";
shieldDiv.style.display = "flex";
shieldDiv.style.alignItems = "center";
shieldDiv.style.gap = "0px";
const shieldImg = document.createElement("img");
shieldImg.src = this.shieldIconImage.src;
shieldImg.style.width = "16px";
shieldImg.style.height = "16px";
const shieldSpan = document.createElement("span");
shieldSpan.textContent = "0";
shieldSpan.style.color = "black";
shieldSpan.style.fontSize = "10px";
shieldSpan.style.marginTop = "-2px";
const shieldSpan = document.createElement("span");
shieldSpan.textContent = "0";
shieldSpan.style.color = "black";
shieldSpan.style.fontSize = "10px";
shieldSpan.style.marginTop = "-2px";
shieldDiv.appendChild(shieldImg);
shieldDiv.appendChild(shieldSpan);
element.appendChild(shieldDiv);
shieldDiv.appendChild(shieldImg);
shieldDiv.appendChild(shieldSpan);
element.appendChild(shieldDiv);
}
// Start off invisible so it doesn't flash at 0,0
element.style.display = "none";
@@ -300,11 +308,10 @@ export class NameLayer implements Layer {
const density = renderNumber(
render.player.troops() / render.player.numTilesOwned(),
);
const shieldDiv = render.element.querySelector(
".player-shield",
) as HTMLDivElement;
const shieldImg = shieldDiv.querySelector("img");
const shieldNumber = shieldDiv.querySelector("span");
const shieldDiv: HTMLDivElement | null =
render.element.querySelector(".player-shield");
const shieldImg = shieldDiv?.querySelector("img");
const shieldNumber = shieldDiv?.querySelector("span");
if (shieldImg) {
shieldImg.style.width = `${render.fontSize * 0.8}px`;
shieldImg.style.height = `${render.fontSize * 0.8}px`;
+12 -16
View File
@@ -66,8 +66,8 @@ const numPlayersConfig = {
} as const satisfies Record<GameMapType, [number, number, number]>;
const TERRAIN_EFFECTS = {
[TerrainType.Plains]: { mag: 1, speed: 0.8 }, // higher speed, lower damage
[TerrainType.Highland]: { mag: 1.15, speed: 1 },
[TerrainType.Plains]: { mag: 1.1, speed: 0.8 }, // higher speed, lower damage
[TerrainType.Highland]: { mag: 1.2, speed: 1 },
[TerrainType.Mountain]: { mag: 1.3, speed: 1.25 },
} as const;
@@ -230,7 +230,7 @@ export class DefaultConfig implements Config {
falloutDefenseModifier(falloutRatio: number): number {
// falloutRatio is between 0 and 1
// So defense modifier is between [3, 1]
return 3 - falloutRatio * 2;
return 2 - falloutRatio;
}
SAMCooldown(): number {
return 75;
@@ -512,16 +512,12 @@ export class DefaultConfig implements Config {
if (attacker.isPlayer() && defenderIsPlayer) {
if (
attackerType === PlayerType.Human &&
(attackerType === PlayerType.Human ||
attackerType === PlayerType.FakeHuman) &&
defenderType === PlayerType.Bot
) {
mag *= 0.8;
}
if (
attackerType === PlayerType.FakeHuman &&
defenderType === PlayerType.Bot
) {
mag *= 0.8;
mag *= 0.6;
speed *= 0.6;
}
}
if (attackerType === PlayerType.Bot) {
@@ -536,7 +532,7 @@ export class DefaultConfig implements Config {
? this.traitorDefenseDebuff()
: 1;
const baseTroopLoss = 16;
const baseTileCost = 23;
const baseTileCost = 30;
const attackStandardSize = 10_000;
return {
attackerTroopLoss:
@@ -545,15 +541,15 @@ export class DefaultConfig implements Config {
tilesPerTickUsed:
baseTileCost *
within(defenderDensity, 3, 100) ** 0.2 *
(attackStandardSize / attackTroops) ** 0.075 *
(attackStandardSize / attackTroops) ** 0.1 *
speed *
within(attackRatio, 0.1, 20) ** 0.4,
within(attackRatio, 0.1, 20) ** 0.35,
};
} else {
return {
attackerTroopLoss: 16 * mag,
defenderTroopLoss: 0,
tilesPerTickUsed: 31 * speed,
tilesPerTickUsed: 492 * speed * within(attackTroops, 1, 10000) ** -0.3,
};
}
}
@@ -646,7 +642,7 @@ export class DefaultConfig implements Config {
//population grows proportional to current population with growth decreasing as it approaches max
// smaller countries recieve a boost to pop growth to speed up early game
const baseAdditionRate = 10;
const basePopGrowthRate = 1200 / max + 1 / 150;
const basePopGrowthRate = 1100 / max + 1 / 160;
const reproductionPop = 0.9 * player.troops() + 1.1 * player.workers();
let toAdd = baseAdditionRate + basePopGrowthRate * reproductionPop;
const totalPop = player.totalPopulation();