Scale gas spread, weapon refill, litter size, and post-mating stop with difficulty

Four gameplay parameters are now driven by the selected difficulty,
following the existing 'hard = harder for the player' philosophy:

  param                       easy   normal   hard
  gas_spread_speed            40     50       90     (higher = slower gas)
  weapon_refill_multiplier    1.3    1.0      0.6    (less ammo on hard)
  max_babies                  2      3        5      (more pups on hard)
  mate_stop_male / female     120/240 100/200 60/120 (shorter stop on hard)

Implementation:
- engine/config.py: new keys on each DIFFICULTY_OPTIONS entry.
- rats.py: _apply_difficulty() loads them onto the game (with __init__
  defaults for safety); normal keeps the previous hardcoded values.
- units/gas.py: Gas.speed reads game.gas_spread_speed (fallback 50).
- engine/unit_manager.py: refill_ammo() scales per-frame refill chances
  by game.weapon_refill_multiplier (fallback 1.0).
- units/rat.py: Male.fuck() uses game.mate_stop_male/mate_stop_female
  and random.randint(1, game.max_babies) (fallbacks to old values).

All reads use getattr with the previous constant as fallback, so older
configs / saved state keep working.
This commit is contained in:
Matteo Benedetto
2026-06-27 19:52:27 +02:00
parent a09b9f0878
commit 4bab8d1a79
5 changed files with 44 additions and 8 deletions
+19
View File
@@ -27,6 +27,15 @@ DIFFICULTY_OPTIONS = (
"label": "Easy",
"starting_rats_multiplier": 1,
"speed_multiplier": 1.0,
# Gas spread tick interval (higher = slower spread = less effective weapon).
"gas_spread_speed": 40,
# Multiplier applied to per-frame weapon refill probabilities.
"weapon_refill_multiplier": 1.3,
# Upper bound for babies per litter (random.randint(1, max_babies)).
"max_babies": 2,
# Stop ticks after mating for the male / the pregnant female.
"mate_stop_male": 120,
"mate_stop_female": 240,
"fill": (235, 246, 234),
"accent": (88, 148, 82),
},
@@ -35,6 +44,11 @@ DIFFICULTY_OPTIONS = (
"label": "Normal",
"starting_rats_multiplier": 2,
"speed_multiplier": 1.5,
"gas_spread_speed": 50,
"weapon_refill_multiplier": 1.0,
"max_babies": 3,
"mate_stop_male": 100,
"mate_stop_female": 200,
"fill": (252, 242, 223),
"accent": (204, 146, 44),
},
@@ -43,6 +57,11 @@ DIFFICULTY_OPTIONS = (
"label": "Hard",
"starting_rats_multiplier": 3,
"speed_multiplier": 2.0,
"gas_spread_speed": 90,
"weapon_refill_multiplier": 0.6,
"max_babies": 5,
"mate_stop_male": 60,
"mate_stop_female": 120,
"fill": (251, 229, 229),
"accent": (188, 68, 68),
},
+9 -4
View File
@@ -51,17 +51,22 @@ class UnitManager:
return count
def refill_ammo(self):
"""Randomly refill ammo during gameplay."""
"""Randomly refill ammo during gameplay.
Per-frame refill probabilities are scaled by the current difficulty's
weapon_refill_multiplier (harder difficulties refill less often).
"""
import random
multiplier = getattr(self.game, "weapon_refill_multiplier", 1.0)
for ammo_type, data in self.game.ammo.items():
if ammo_type == "bomb":
if random.random() < 0.02:
if random.random() < 0.02 * multiplier:
data["count"] = min(data["count"] + 1, data["max"])
elif ammo_type == "mine":
if random.random() < 0.05:
if random.random() < 0.05 * multiplier:
data["count"] = min(data["count"] + 1, data["max"])
elif ammo_type == "gas":
if random.random() < 0.01:
if random.random() < 0.01 * multiplier:
data["count"] = min(data["count"] + 1, data["max"])
def spawn_gas(self, parent_id=None):