RECORDANDRONCO/mods/vinylgod/rules/ai.yaml
type-two 39ca9c78a5 AI balance pass driven by arena telemetry
Two fair-map matches showed MRP annihilating Stream by ~5min. Build-order
telemetry (new BALTYPES histogram in balance.lua) found the cause: Stream's
podfarm arrived at 5.8min vs MRP's merchtable at 1.7min, so the cheap-swarm
faction fielded 1 bufferbot against 17 djgrunts, and Stream spent 1500cr on the
Algorithm superweapon before it had an army.

Fixes:
 * BuildingFractions: barracks 1 -> 10, factories 1 -> 6 so army buildings come
   before tech. Result: podfarm 5.8min -> 2.5min, algorithm 3.3min -> 5.8min,
   and Stream survived to 9.5min with 13 buildings instead of being wiped at 5.2.
 * BuildingDelays on mastering/algorithm (4500) — no superweapon before an army.
 * UnitsToBuild shares normalised. Reading UnitBuilderBotModule showed these are
   PERCENTAGES of army composition, and mine summed to 233% per faction, which
   made unit selection collapse to iteration order and starved Stream of infantry.

balance_report.py now emits a verdict (flatline / runaway / stalled production)
and refuses to judge matches under 5 minutes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-26 10:48:13 +10:00

113 lines
3.0 KiB
YAML

player:
ModularBot@WaxAI:
Name: bot-wax-ai.name
Type: wax
GrantConditionOnBotOwner@wax:
Condition: enable-wax-ai
Bots: wax
HarvesterBotModule:
RequiresCondition: enable-wax-ai
HarvesterTypes: digger, scraper
RefineryTypes: pressplant, transcoder
McvManagerBotModule:
RequiresCondition: enable-wax-ai
McvTypes: popupvan, streamvan
ConstructionYardTypes: popupshop, streamhub
McvFactoryTypes: garage, printfarm
BaseBuilderBotModule:
RequiresCondition: enable-wax-ai
MinimumExcessPower: 40
MaximumExcessPower: 160
ExcessPowerIncrement: 40
ExcessPowerIncreaseThreshold: 4
ConstructionYardTypes: popupshop, streamhub
RefineryTypes: pressplant, transcoder
PowerTypes: ampstack, datacentre
BarracksTypes: merchtable, podfarm
VehiclesFactoryTypes: garage, printfarm
ProductionTypes: merchtable, podfarm, garage, printfarm
SiloTypes: vault
DefenseTypes: hornpit, adblocker
BuildingLimits:
pressplant: 3
transcoder: 3
merchtable: 1
podfarm: 1
garage: 1
printfarm: 1
mastering: 1
algorithm: 1
launchramp: 1
droneport: 1
BuildingFractions:
pressplant: 30
transcoder: 30
hornpit: 8
adblocker: 8
# barracks first: infantry is the cheapest army and both sides need
# it early. Telemetry showed Stream getting its podfarm at 5.8min
# (1 bufferbot fielded) vs MRP's merchtable at 1.7min (17 djgrunts).
merchtable: 10
podfarm: 10
garage: 6
printfarm: 6
launchramp: 2
droneport: 2
mastering: 1
algorithm: 1
BuildingDelays:
# no superweapon building before there is an army to protect it
mastering: 4500
algorithm: 4500
UnitBuilderBotModule:
RequiresCondition: enable-wax-ai
UnitsToBuild:
# these are PERCENTAGES of army composition, not weights: the AI
# builds whatever sits furthest below its share. They previously
# summed to 233% per faction, which made selection arbitrary and
# starved Stream of infantry entirely.
# MRP ~98
digger: 8
djgrunt: 28
roadie: 3
spinner: 14
stacktank: 20
basscannon: 7
boombike: 6
flyer45: 10
selector: 2
# Stream ~98
scraper: 8
bufferbot: 34
crawler: 4
drmwalker: 26
compressor: 24
curator: 2
UnitLimits:
digger: 4
scraper: 4
roadie: 2
boombike: 3
crawler: 2
selector: 1
curator: 1
SupportPowerBotModule:
RequiresCondition: enable-wax-ai
Decisions:
thedrop:
OrderName: NukePowerInfoOrder
MinimumAttractiveness: 3000
Consideration@1:
Against: Enemy
Types: Structure
Attractiveness: 1
TargetMetric: Value
CheckRadius: 5c0
SquadManagerBotModule:
RequiresCondition: enable-wax-ai
SquadSize: 8
AirUnitsTypes: flyer45, compressor
ExcludeFromSquadsTypes: digger, scraper, popupvan, streamvan, roadie, crawler
ConstructionYardTypes: popupshop, streamhub
ProtectionTypes: launchramp, droneport, digger, scraper, popupvan, streamvan, pressplant, transcoder, popupshop, streamhub, ampstack, datacentre, vault, merchtable, podfarm, garage, printfarm, mastering