From ab92b7e1ca8cc2e20d9aef61c0aa35ee75d5c4e3 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 25 Oct 2026 18:38:20 +0000 Subject: [PATCH] Blockilization: ten more civilizations America, Spain, Siam, Ethiopia, the Celts, Carthage, Poland, the Netherlands, Polynesia and Denmark join the game, thirty in all. Each has its own ability, unique unit and unique building in Civ V's spirit, a voxel leader bust with its three moods, an emblem, a bot personality, a true start on the Earth map and a win achievement. New rules behind them: +20% against civs with more cities, natural wonders doubled with gold for finding them, half again from city-state friends, a free coastal Lighthouse, a free policy each era, +2 gold on sea routes and half happiness from luxuries traded away, embarking and crossing the ocean from the start (bots know it too), one-move landings with +1 move at sea, and the unit abilities Homeland, Foreign lands, Haka and Amphibious. Each has a test. The effects coverage sweep placed six city-states past the edge of its map and crashed; they now fit. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01DVbMwbE8vBoP3gszk8WneD --- src/games/blockilization/client/concepts.ts | 4 + src/games/blockilization/client/icons.ts | 23 +- src/games/blockilization/client/models3d.ts | 2 + src/games/blockilization/client/pedia.ts | 1 + .../blockilization/client/picturefiles.ts | 42 +++- src/games/blockilization/meta.ts | 10 + .../blockilization/pictures/l_america.png | Bin 0 -> 2945 bytes .../pictures/l_america_cross.png | Bin 0 -> 2975 bytes .../pictures/l_america_glad.png | Bin 0 -> 2945 bytes .../pictures/l_america_sheet.png | Bin 0 -> 7215 bytes .../blockilization/pictures/l_carthage.png | Bin 0 -> 2833 bytes .../pictures/l_carthage_cross.png | Bin 0 -> 2866 bytes .../pictures/l_carthage_glad.png | Bin 0 -> 2848 bytes .../pictures/l_carthage_sheet.png | Bin 0 -> 7214 bytes src/games/blockilization/pictures/l_celts.png | Bin 0 -> 3530 bytes .../blockilization/pictures/l_celts_cross.png | Bin 0 -> 3562 bytes .../blockilization/pictures/l_celts_glad.png | Bin 0 -> 3542 bytes .../blockilization/pictures/l_celts_sheet.png | Bin 0 -> 7952 bytes .../blockilization/pictures/l_denmark.png | Bin 0 -> 2704 bytes .../pictures/l_denmark_cross.png | Bin 0 -> 2789 bytes .../pictures/l_denmark_glad.png | Bin 0 -> 2780 bytes .../pictures/l_denmark_sheet.png | Bin 0 -> 6736 bytes .../blockilization/pictures/l_ethiopia.png | Bin 0 -> 2973 bytes .../pictures/l_ethiopia_cross.png | Bin 0 -> 3081 bytes .../pictures/l_ethiopia_glad.png | Bin 0 -> 3060 bytes .../pictures/l_ethiopia_sheet.png | Bin 0 -> 7265 bytes .../blockilization/pictures/l_netherlands.png | Bin 0 -> 2922 bytes .../pictures/l_netherlands_cross.png | Bin 0 -> 3023 bytes .../pictures/l_netherlands_glad.png | Bin 0 -> 3001 bytes .../pictures/l_netherlands_sheet.png | Bin 0 -> 7138 bytes .../blockilization/pictures/l_poland.png | Bin 0 -> 2881 bytes .../pictures/l_poland_cross.png | Bin 0 -> 2957 bytes .../blockilization/pictures/l_poland_glad.png | Bin 0 -> 2950 bytes .../pictures/l_poland_sheet.png | Bin 0 -> 6704 bytes .../blockilization/pictures/l_polynesia.png | Bin 0 -> 2527 bytes .../pictures/l_polynesia_cross.png | Bin 0 -> 2558 bytes .../pictures/l_polynesia_glad.png | Bin 0 -> 2537 bytes .../pictures/l_polynesia_sheet.png | Bin 0 -> 6118 bytes src/games/blockilization/pictures/l_siam.png | Bin 0 -> 2777 bytes .../blockilization/pictures/l_siam_cross.png | Bin 0 -> 2790 bytes .../blockilization/pictures/l_siam_glad.png | Bin 0 -> 2786 bytes .../blockilization/pictures/l_siam_sheet.png | Bin 0 -> 6272 bytes src/games/blockilization/pictures/l_spain.png | Bin 0 -> 2755 bytes .../blockilization/pictures/l_spain_cross.png | Bin 0 -> 2786 bytes .../blockilization/pictures/l_spain_glad.png | Bin 0 -> 2769 bytes .../blockilization/pictures/l_spain_sheet.png | Bin 0 -> 6515 bytes src/games/blockilization/rules/ai/context.ts | 10 +- src/games/blockilization/rules/ai/military.ts | 8 +- .../blockilization/rules/ai/personality.ts | 10 + src/games/blockilization/rules/ai/settle.ts | 4 +- src/games/blockilization/rules/ai/strategy.ts | 7 +- src/games/blockilization/rules/buildings.ts | 10 + src/games/blockilization/rules/citystates.ts | 15 +- src/games/blockilization/rules/civs.ts | 131 ++++++++++- src/games/blockilization/rules/combat.ts | 17 +- src/games/blockilization/rules/core.ts | 17 +- src/games/blockilization/rules/earth.ts | 10 + src/games/blockilization/rules/economy.ts | 18 +- src/games/blockilization/rules/effects.ts | 2 + src/games/blockilization/rules/game.ts | 15 +- src/games/blockilization/rules/movement.ts | 19 +- src/games/blockilization/rules/trade.ts | 2 + src/games/blockilization/rules/units.ts | 18 ++ src/games/blockilization/tests/cases.ts | 210 +++++++++++++++++- src/games/blockilization/tests/sweep.ts | 2 +- src/games/blockilization/tools/portraits.mjs | 144 ++++++++++++ 66 files changed, 704 insertions(+), 47 deletions(-) create mode 100644 src/games/blockilization/pictures/l_america.png create mode 100644 src/games/blockilization/pictures/l_america_cross.png create mode 100644 src/games/blockilization/pictures/l_america_glad.png create mode 100644 src/games/blockilization/pictures/l_america_sheet.png create mode 100644 src/games/blockilization/pictures/l_carthage.png create mode 100644 src/games/blockilization/pictures/l_carthage_cross.png create mode 100644 src/games/blockilization/pictures/l_carthage_glad.png create mode 100644 src/games/blockilization/pictures/l_carthage_sheet.png create mode 100644 src/games/blockilization/pictures/l_celts.png create mode 100644 src/games/blockilization/pictures/l_celts_cross.png create mode 100644 src/games/blockilization/pictures/l_celts_glad.png create mode 100644 src/games/blockilization/pictures/l_celts_sheet.png create mode 100644 src/games/blockilization/pictures/l_denmark.png create mode 100644 src/games/blockilization/pictures/l_denmark_cross.png create mode 100644 src/games/blockilization/pictures/l_denmark_glad.png create mode 100644 src/games/blockilization/pictures/l_denmark_sheet.png create mode 100644 src/games/blockilization/pictures/l_ethiopia.png create mode 100644 src/games/blockilization/pictures/l_ethiopia_cross.png create mode 100644 src/games/blockilization/pictures/l_ethiopia_glad.png create mode 100644 src/games/blockilization/pictures/l_ethiopia_sheet.png create mode 100644 src/games/blockilization/pictures/l_netherlands.png create mode 100644 src/games/blockilization/pictures/l_netherlands_cross.png create mode 100644 src/games/blockilization/pictures/l_netherlands_glad.png create mode 100644 src/games/blockilization/pictures/l_netherlands_sheet.png create mode 100644 src/games/blockilization/pictures/l_poland.png create mode 100644 src/games/blockilization/pictures/l_poland_cross.png create mode 100644 src/games/blockilization/pictures/l_poland_glad.png create mode 100644 src/games/blockilization/pictures/l_poland_sheet.png create mode 100644 src/games/blockilization/pictures/l_polynesia.png create mode 100644 src/games/blockilization/pictures/l_polynesia_cross.png create mode 100644 src/games/blockilization/pictures/l_polynesia_glad.png create mode 100644 src/games/blockilization/pictures/l_polynesia_sheet.png create mode 100644 src/games/blockilization/pictures/l_siam.png create mode 100644 src/games/blockilization/pictures/l_siam_cross.png create mode 100644 src/games/blockilization/pictures/l_siam_glad.png create mode 100644 src/games/blockilization/pictures/l_siam_sheet.png create mode 100644 src/games/blockilization/pictures/l_spain.png create mode 100644 src/games/blockilization/pictures/l_spain_cross.png create mode 100644 src/games/blockilization/pictures/l_spain_glad.png create mode 100644 src/games/blockilization/pictures/l_spain_sheet.png diff --git a/src/games/blockilization/client/concepts.ts b/src/games/blockilization/client/concepts.ts index 29d698a..ef006b1 100644 --- a/src/games/blockilization/client/concepts.ts +++ b/src/games/blockilization/client/concepts.ts @@ -359,6 +359,10 @@ export const ABILITY_TEXT: Record = { discover_tech: 'Discovers science toward your research.', kill_heal: 'Heals 25 when it kills a unit.', jungle_fighter: '+33% strength fighting in forest and jungle.', + homeland: '+25% strength while it stands in your own land.', + foreign_lands: '+20% strength while it stands outside your own land.', + haka: 'Enemy units next to it fight at -10% strength.', + amphibious: 'No penalty for attacking from the sea or across a river.', political_treatise: 'Writes a political treatise: culture toward your next policy.', withdraw: 'May attack and still move.', }; diff --git a/src/games/blockilization/client/icons.ts b/src/games/blockilization/client/icons.ts index 79876df..56daf55 100644 --- a/src/games/blockilization/client/icons.ts +++ b/src/games/blockilization/client/icons.ts @@ -280,6 +280,22 @@ const G: Record = { tulip: ``, shield_spears: ``, chakana: ``, + star: ``, + castile: ``, + chedi: ``, + obelisk: ``, + triskele: [0, 120, 240].map((a) => turn(a, '')).join(''), + tanit: ``, + wing: '', + windmill: ``, + moai: ``, + longship: ``, + tricorne: ``, + morion: ``, + gasha: ``, + targe: ``, + patu: turn(-45, ``), + bearded_axe: ``, skull: ``, anchor_f: ``, lyre_f: ``, @@ -441,10 +457,12 @@ const UNIT_GLYPH: Record = { scout: 'footprints', explorer: 'compass', warrior: 'club', jaguar: 'jaguar', spearman: 'spear', immortal: 'spear_shield', pikeman: 'pikes', landsknecht: 'zweihander', swordsman: 'gladius', mohawk_warrior: 'tomahawk', legion: 'scutum', longswordsman: 'longsword', samurai: 'katana', hoplite: 'aspis', impi: 'isihlangu', + pictish_warrior: 'targe', maori_warrior: 'patu', berserker: 'bearded_axe', archer: 'bow', slinger: 'sling', composite_bowman: 'recurve', crossbowman: 'crossbow', longbowman: 'longbow', gatling_gun: 'gatling', machine_gun: 'machine_gun', chariot_archer: 'chariot', war_elephant: 'elephant', horseman: 'horse_head', knight: 'helm', camel_archer: 'camel', keshik: 'horse_bow', lancer: 'lance_flag', cavalry: 'horseshoe', + conquistador: 'morion', naresuans_elephant: 'elephant', winged_hussar: 'wing', catapult: 'catapult', trebuchet: 'trebuchet', cannon: 'cannon', artillery: 'artillery', rocket_artillery: 'rocket_truck', - musketman: 'musket', janissary: 'bork', rifleman: 'rifle', great_war_infantry: 'brodie', infantry: 'helmet', paratrooper: 'parachute', mechanized_infantry: 'apc', xcom_squad: 'visor', + musketman: 'musket', janissary: 'bork', minuteman: 'tricorne', rifleman: 'rifle', mehal_sefari: 'gasha', great_war_infantry: 'brodie', infantry: 'helmet', paratrooper: 'parachute', mechanized_infantry: 'apc', xcom_squad: 'visor', anti_tank_gun: 'at_gun', anti_aircraft_gun: 'aa_gun', mobile_sam: 'sam', bazooka: 'bazooka', landship: 'landship', tank: 'tank', modern_armor: 'modern_tank', giant_death_robot: 'mech', helicopter_gunship: 'helicopter', triplane: 'triplane', fighter: 'prop_plane', jet_fighter: 'jet', great_war_bomber: 'biplane', bomber: 'heavy_bomber', stealth_bomber: 'flying_wing', @@ -466,7 +484,8 @@ export function unitGlyph(type: string): string { export const CIV_SYMBOL: Record = { egypt: 'ankh', babylon: 'ziggurat', china: 'pagoda', india: 'chakra', persia: 'wingsun', korea: 'taeguk', arabia: 'crescent', germany: 'eagle', iroquois: 'pine', aztec: 'sunstone', russia: 'onion', france: 'fleur', rome: 'laurel', greece: 'corinthian', japan: 'torii', england: 'tudor', - mongolia: 'soyombo', ottomans: 'tulip', zulu: 'shield_spears', inca: 'chakana', barbarian: 'skull', + mongolia: 'soyombo', ottomans: 'tulip', zulu: 'shield_spears', inca: 'chakana', america: 'star', spain: 'castile', siam: 'chedi', ethiopia: 'obelisk', + celts: 'triskele', carthage: 'tanit', poland: 'wing', netherlands: 'windmill', polynesia: 'moai', denmark: 'longship', barbarian: 'skull', }; const CS_SYMBOL: Record = { maritime: 'anchor_f', cultured: 'lyre_f', militaristic: 'swords_f', mercantile: 'coin_f', religious: 'temple_f' }; diff --git a/src/games/blockilization/client/models3d.ts b/src/games/blockilization/client/models3d.ts index b331e48..3038dd2 100644 --- a/src/games/blockilization/client/models3d.ts +++ b/src/games/blockilization/client/models3d.ts @@ -53,6 +53,8 @@ const BY_TYPE: Partial> = { landship: 'u_landship', tank: 'u_tank', modern_armor: 'u_armor', giant_death_robot: 'u_robot', helicopter_gunship: 'u_heli', triplane: 'u_triplane', great_war_bomber: 'u_oldbomber', fighter: 'u_fighter', jet_fighter: 'u_fighter', bomber: 'u_bomber', stealth_bomber: 'u_stealth', guided_missile: 'u_missile', nuclear_missile: 'u_nuke', atomic_bomb: 'u_nuke', legion: 'u_sword', hoplite: 'u_spear', samurai: 'u_longsword', longbowman: 'u_bow', keshik: 'u_horse', janissary: 'u_musket', impi: 'u_spear', slinger: 'u_bow', + minuteman: 'u_musket', conquistador: 'u_knight', naresuans_elephant: 'u_elephant', mehal_sefari: 'u_rifle', pictish_warrior: 'u_spear', winged_hussar: 'u_cavalry', maori_warrior: 'u_warrior', berserker: 'u_longsword', + quinquereme: 'u_galley', sea_beggar: 'u_sail', trireme: 'u_galley', galleass: 'u_galley', turtle_ship: 'u_turtle', caravel: 'u_sail', frigate: 'u_sail', privateer: 'u_sail', ironclad: 'u_ironclad', destroyer: 'u_warship', battleship: 'u_warship', missile_cruiser: 'u_warship', submarine: 'u_sub', nuclear_submarine: 'u_sub', carrier: 'u_carrier', }; diff --git a/src/games/blockilization/client/pedia.ts b/src/games/blockilization/client/pedia.ts index 0d3f767..53dc456 100644 --- a/src/games/blockilization/client/pedia.ts +++ b/src/games/blockilization/client/pedia.ts @@ -260,6 +260,7 @@ const WHEN: Record = { vs_cities: 'against cities', vs_barbarians: 'against barbarians', vs_city_states: 'against city-states', + vs_more_cities: 'against civs with more cities', beside_friend: 'beside another of your units', faithful_land: 'in your land around cities of your religion', faithful_enemy_land: "in enemy land around cities of your religion", diff --git a/src/games/blockilization/client/picturefiles.ts b/src/games/blockilization/client/picturefiles.ts index e1786f6..d49c4f0 100644 --- a/src/games/blockilization/client/picturefiles.ts +++ b/src/games/blockilization/client/picturefiles.ts @@ -113,6 +113,36 @@ import l_zulu_cross from '../pictures/l_zulu_cross.png?url'; import l_inca from '../pictures/l_inca.png?url'; import l_inca_glad from '../pictures/l_inca_glad.png?url'; import l_inca_cross from '../pictures/l_inca_cross.png?url'; +import l_america from '../pictures/l_america.png?url'; +import l_america_glad from '../pictures/l_america_glad.png?url'; +import l_america_cross from '../pictures/l_america_cross.png?url'; +import l_spain from '../pictures/l_spain.png?url'; +import l_spain_glad from '../pictures/l_spain_glad.png?url'; +import l_spain_cross from '../pictures/l_spain_cross.png?url'; +import l_siam from '../pictures/l_siam.png?url'; +import l_siam_glad from '../pictures/l_siam_glad.png?url'; +import l_siam_cross from '../pictures/l_siam_cross.png?url'; +import l_ethiopia from '../pictures/l_ethiopia.png?url'; +import l_ethiopia_glad from '../pictures/l_ethiopia_glad.png?url'; +import l_ethiopia_cross from '../pictures/l_ethiopia_cross.png?url'; +import l_celts from '../pictures/l_celts.png?url'; +import l_celts_glad from '../pictures/l_celts_glad.png?url'; +import l_celts_cross from '../pictures/l_celts_cross.png?url'; +import l_carthage from '../pictures/l_carthage.png?url'; +import l_carthage_glad from '../pictures/l_carthage_glad.png?url'; +import l_carthage_cross from '../pictures/l_carthage_cross.png?url'; +import l_poland from '../pictures/l_poland.png?url'; +import l_poland_glad from '../pictures/l_poland_glad.png?url'; +import l_poland_cross from '../pictures/l_poland_cross.png?url'; +import l_netherlands from '../pictures/l_netherlands.png?url'; +import l_netherlands_glad from '../pictures/l_netherlands_glad.png?url'; +import l_netherlands_cross from '../pictures/l_netherlands_cross.png?url'; +import l_polynesia from '../pictures/l_polynesia.png?url'; +import l_polynesia_glad from '../pictures/l_polynesia_glad.png?url'; +import l_polynesia_cross from '../pictures/l_polynesia_cross.png?url'; +import l_denmark from '../pictures/l_denmark.png?url'; +import l_denmark_glad from '../pictures/l_denmark_glad.png?url'; +import l_denmark_cross from '../pictures/l_denmark_cross.png?url'; import w_pyramid from '../pictures/w_pyramid.png?url'; import w_henge from '../pictures/w_henge.png?url'; import w_colossus from '../pictures/w_colossus.png?url'; @@ -233,6 +263,16 @@ import l_mongolia_sheet from '../pictures/l_mongolia_sheet.png?url'; import l_ottomans_sheet from '../pictures/l_ottomans_sheet.png?url'; import l_zulu_sheet from '../pictures/l_zulu_sheet.png?url'; import l_inca_sheet from '../pictures/l_inca_sheet.png?url'; +import l_america_sheet from '../pictures/l_america_sheet.png?url'; +import l_spain_sheet from '../pictures/l_spain_sheet.png?url'; +import l_siam_sheet from '../pictures/l_siam_sheet.png?url'; +import l_ethiopia_sheet from '../pictures/l_ethiopia_sheet.png?url'; +import l_celts_sheet from '../pictures/l_celts_sheet.png?url'; +import l_carthage_sheet from '../pictures/l_carthage_sheet.png?url'; +import l_poland_sheet from '../pictures/l_poland_sheet.png?url'; +import l_netherlands_sheet from '../pictures/l_netherlands_sheet.png?url'; +import l_polynesia_sheet from '../pictures/l_polynesia_sheet.png?url'; +import l_denmark_sheet from '../pictures/l_denmark_sheet.png?url'; -export const PICTURES = { u_warrior, u_spear, u_pike, u_sword, u_longsword, u_bow, u_crossbow, u_musket, u_rifle, u_infantry, u_mech, u_scout, u_worker, u_missionary, u_inquisitor, u_prophet, u_great, u_horse, u_knight, u_cavalry, u_elephant, u_camel, u_general, u_chariot, u_catapult, u_trebuchet, u_cannon, u_artillery, u_rocket, u_gatling, u_landship, u_tank, u_armor, u_robot, u_heli, u_triplane, u_oldbomber, u_fighter, u_bomber, u_stealth, u_missile, u_nuke, u_galley, u_turtle, u_sail, u_ironclad, u_warship, u_sub, u_carrier, u_cargo, u_boat, u_transport, u_settler, u_caravan, l_egypt, l_egypt_glad, l_egypt_cross, l_babylon, l_babylon_glad, l_babylon_cross, l_china, l_china_glad, l_china_cross, l_india, l_india_glad, l_india_cross, l_persia, l_persia_glad, l_persia_cross, l_korea, l_korea_glad, l_korea_cross, l_arabia, l_arabia_glad, l_arabia_cross, l_germany, l_germany_glad, l_germany_cross, l_iroquois, l_iroquois_glad, l_iroquois_cross, l_aztec, l_aztec_glad, l_aztec_cross, l_russia, l_russia_glad, l_russia_cross, l_france, l_france_glad, l_france_cross, l_rome, l_rome_glad, l_rome_cross, l_greece, l_greece_glad, l_greece_cross, l_japan, l_japan_glad, l_japan_cross, l_england, l_england_glad, l_england_cross, l_mongolia, l_mongolia_glad, l_mongolia_cross, l_ottomans, l_ottomans_glad, l_ottomans_cross, l_zulu, l_zulu_glad, l_zulu_cross, l_inca, l_inca_glad, l_inca_cross, w_pyramid, w_henge, w_colossus, w_liberty, w_cristo, w_zeus, w_lighthouse, w_gardens, w_temple, w_palace, w_wall, w_arena, w_dome, w_steps, w_cathedral, w_castle, w_pagoda, w_clock, w_spire, w_gate, w_theatre, w_opera, w_modern, w_dish, w_army, w_rocket, w_atom, w_mausoleum, w_oracle, w_parthenon, w_great_mosque, w_alhambra, w_taj_mahal, w_borobudur, w_angkor_wat, w_machu_picchu, w_great_library, w_forbidden_palace, w_uffizi, w_louvre, w_sistine_chapel, w_leaning_tower, w_himeji_castle, w_broadway, w_cn_tower, w_petra, w_united_nations, w_pentagon, w_great_firewall, w_kremlin, w_pyramid_turn, w_henge_turn, w_colossus_turn, w_liberty_turn, w_cristo_turn, w_zeus_turn, w_lighthouse_turn, w_gardens_turn, w_temple_turn, w_palace_turn, w_wall_turn, w_arena_turn, w_dome_turn, w_steps_turn, w_cathedral_turn, w_castle_turn, w_pagoda_turn, w_clock_turn, w_spire_turn, w_gate_turn, w_theatre_turn, w_opera_turn, w_modern_turn, w_dish_turn, w_army_turn, w_rocket_turn, w_atom_turn, w_mausoleum_turn, w_oracle_turn, w_parthenon_turn, w_great_mosque_turn, w_alhambra_turn, w_taj_mahal_turn, w_borobudur_turn, w_angkor_wat_turn, w_machu_picchu_turn, w_great_library_turn, w_forbidden_palace_turn, w_uffizi_turn, w_louvre_turn, w_sistine_chapel_turn, w_leaning_tower_turn, w_himeji_castle_turn, w_broadway_turn, w_cn_tower_turn, w_petra_turn, w_united_nations_turn, w_pentagon_turn, w_great_firewall_turn, w_kremlin_turn, l_egypt_sheet, l_babylon_sheet, l_china_sheet, l_india_sheet, l_persia_sheet, l_korea_sheet, l_arabia_sheet, l_germany_sheet, l_iroquois_sheet, l_aztec_sheet, l_russia_sheet, l_france_sheet, l_rome_sheet, l_greece_sheet, l_japan_sheet, l_england_sheet, l_mongolia_sheet, l_ottomans_sheet, l_zulu_sheet, l_inca_sheet } as const; +export const PICTURES = { u_warrior, u_spear, u_pike, u_sword, u_longsword, u_bow, u_crossbow, u_musket, u_rifle, u_infantry, u_mech, u_scout, u_worker, u_missionary, u_inquisitor, u_prophet, u_great, u_horse, u_knight, u_cavalry, u_elephant, u_camel, u_general, u_chariot, u_catapult, u_trebuchet, u_cannon, u_artillery, u_rocket, u_gatling, u_landship, u_tank, u_armor, u_robot, u_heli, u_triplane, u_oldbomber, u_fighter, u_bomber, u_stealth, u_missile, u_nuke, u_galley, u_turtle, u_sail, u_ironclad, u_warship, u_sub, u_carrier, u_cargo, u_boat, u_transport, u_settler, u_caravan, l_egypt, l_egypt_glad, l_egypt_cross, l_babylon, l_babylon_glad, l_babylon_cross, l_china, l_china_glad, l_china_cross, l_india, l_india_glad, l_india_cross, l_persia, l_persia_glad, l_persia_cross, l_korea, l_korea_glad, l_korea_cross, l_arabia, l_arabia_glad, l_arabia_cross, l_germany, l_germany_glad, l_germany_cross, l_iroquois, l_iroquois_glad, l_iroquois_cross, l_aztec, l_aztec_glad, l_aztec_cross, l_russia, l_russia_glad, l_russia_cross, l_france, l_france_glad, l_france_cross, l_rome, l_rome_glad, l_rome_cross, l_greece, l_greece_glad, l_greece_cross, l_japan, l_japan_glad, l_japan_cross, l_england, l_england_glad, l_england_cross, l_mongolia, l_mongolia_glad, l_mongolia_cross, l_ottomans, l_ottomans_glad, l_ottomans_cross, l_zulu, l_zulu_glad, l_zulu_cross, l_inca, l_inca_glad, l_inca_cross, l_america, l_america_glad, l_america_cross, l_spain, l_spain_glad, l_spain_cross, l_siam, l_siam_glad, l_siam_cross, l_ethiopia, l_ethiopia_glad, l_ethiopia_cross, l_celts, l_celts_glad, l_celts_cross, l_carthage, l_carthage_glad, l_carthage_cross, l_poland, l_poland_glad, l_poland_cross, l_netherlands, l_netherlands_glad, l_netherlands_cross, l_polynesia, l_polynesia_glad, l_polynesia_cross, l_denmark, l_denmark_glad, l_denmark_cross, w_pyramid, w_henge, w_colossus, w_liberty, w_cristo, w_zeus, w_lighthouse, w_gardens, w_temple, w_palace, w_wall, w_arena, w_dome, w_steps, w_cathedral, w_castle, w_pagoda, w_clock, w_spire, w_gate, w_theatre, w_opera, w_modern, w_dish, w_army, w_rocket, w_atom, w_mausoleum, w_oracle, w_parthenon, w_great_mosque, w_alhambra, w_taj_mahal, w_borobudur, w_angkor_wat, w_machu_picchu, w_great_library, w_forbidden_palace, w_uffizi, w_louvre, w_sistine_chapel, w_leaning_tower, w_himeji_castle, w_broadway, w_cn_tower, w_petra, w_united_nations, w_pentagon, w_great_firewall, w_kremlin, w_pyramid_turn, w_henge_turn, w_colossus_turn, w_liberty_turn, w_cristo_turn, w_zeus_turn, w_lighthouse_turn, w_gardens_turn, w_temple_turn, w_palace_turn, w_wall_turn, w_arena_turn, w_dome_turn, w_steps_turn, w_cathedral_turn, w_castle_turn, w_pagoda_turn, w_clock_turn, w_spire_turn, w_gate_turn, w_theatre_turn, w_opera_turn, w_modern_turn, w_dish_turn, w_army_turn, w_rocket_turn, w_atom_turn, w_mausoleum_turn, w_oracle_turn, w_parthenon_turn, w_great_mosque_turn, w_alhambra_turn, w_taj_mahal_turn, w_borobudur_turn, w_angkor_wat_turn, w_machu_picchu_turn, w_great_library_turn, w_forbidden_palace_turn, w_uffizi_turn, w_louvre_turn, w_sistine_chapel_turn, w_leaning_tower_turn, w_himeji_castle_turn, w_broadway_turn, w_cn_tower_turn, w_petra_turn, w_united_nations_turn, w_pentagon_turn, w_great_firewall_turn, w_kremlin_turn, l_egypt_sheet, l_babylon_sheet, l_china_sheet, l_india_sheet, l_persia_sheet, l_korea_sheet, l_arabia_sheet, l_germany_sheet, l_iroquois_sheet, l_aztec_sheet, l_russia_sheet, l_france_sheet, l_rome_sheet, l_greece_sheet, l_japan_sheet, l_england_sheet, l_mongolia_sheet, l_ottomans_sheet, l_zulu_sheet, l_inca_sheet, l_america_sheet, l_spain_sheet, l_siam_sheet, l_ethiopia_sheet, l_celts_sheet, l_carthage_sheet, l_poland_sheet, l_netherlands_sheet, l_polynesia_sheet, l_denmark_sheet } as const; export type PictureId = keyof typeof PICTURES; diff --git a/src/games/blockilization/meta.ts b/src/games/blockilization/meta.ts index 74da9a5..9623f2c 100644 --- a/src/games/blockilization/meta.ts +++ b/src/games/blockilization/meta.ts @@ -70,5 +70,15 @@ export default defineMeta({ win_ottomans: { title: 'The Magnificent', description: 'Win as the Ottomans' }, win_zulu: { title: 'People of the Heavens', description: 'Win as the Zulu' }, win_inca: { title: 'Children of the Sun', description: 'Win as the Inca' }, + win_america: { title: 'E Pluribus Unum', description: 'Win as America' }, + win_spain: { title: 'Plus Ultra', description: 'Win as Spain' }, + win_siam: { title: 'Dawn of Happiness', description: 'Win as Siam' }, + win_ethiopia: { title: 'Land of Origins', description: 'Win as Ethiopia' }, + win_celts: { title: 'The Old Ways', description: 'Win as the Celts' }, + win_carthage: { title: 'The New City', description: 'Win as Carthage' }, + win_poland: { title: 'The Golden Freedom', description: 'Win as Poland' }, + win_netherlands: { title: 'Je Maintiendrai', description: 'Win as the Netherlands' }, + win_polynesia: { title: 'The Great Navigators', description: 'Win as Polynesia' }, + win_denmark: { title: 'Kings of the North Sea', description: 'Win as Denmark' }, }, }); diff --git a/src/games/blockilization/pictures/l_america.png b/src/games/blockilization/pictures/l_america.png new file mode 100644 index 0000000000000000000000000000000000000000..9191e6610995845ceb74b16782cb4d0c68320495 GIT binary patch literal 2945 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 VcBV-TIA;I=002ovPDHLkV1n4-S|I=c literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_america_glad.png b/src/games/blockilization/pictures/l_america_glad.png new file mode 100644 index 0000000000000000000000000000000000000000..0599ddd731f3aec8ed26cd261254cdf7f306c89d GIT binary patch literal 2945 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 literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_carthage.png b/src/games/blockilization/pictures/l_carthage.png new file mode 100644 index 0000000000000000000000000000000000000000..dd187cc54bd268ce01d8081040174192f58c4323 GIT binary patch literal 2833 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 z znk_SSIqJu8)X>dl4Ij^$jqH#s>39q~7)Z{^QpXn*upI8(F58<}9A#X4=AG}u+Easv zOWn6`Y1iqhdQup3*e!ri?rFJKPcZc;QL>cDP5I&ubwcOKfdD#q6BfWZV=8{jh-5FI+h7T z_XR>ydJ|39;2Srjhfi<9PsohRj0q+Zw&K-kaF9Aa*agY$Wcs`Iqk(Voo)ES2M5T{i zE!+fsGp$3HuCPHB7j(?1(2B<`#$E}U-=)ka?kC$E+s}I^D|Vd3Q_z8z(m)F#lIpL6 zQ~XbD3ZjGuwB5=V9vb&Fh^dYb%aNUQksMo((5`=!7`ccznLo=n!KhK9nQKq3Te)cz z{fk%EwpHP^6QRPn`5w}hOJytJ2WL689B}&G(;ui#vgHGt2JTZQNapeQ{vJ=ZIrv|< zVoXeZfxDK)iR^pCtZC;?i_DF2*6vq)*tGnWR7qY+BK!+`utngC4SJ^1WbC_?u7gens6 z@RZhc+H1-oQ#cMAa(OHd7ETW5R=D@!eev$i6`AgRa|36~j^>%K;`i;IiL5|1F}#kR zgCE4k>rp5s|5Orb9{CF*O*(;i*T8aUl3(c8I-Ns~BxfD^gP0Xs*IVGUS01_^o7qMM zeL-tUT$_=5U$xWm(s|@diS!|6D-so>Ncr1pwa%r+%b_VRm+w9DYdfnx&+c4PaQuid!Loe>Bqj<$vB)ak>C>E5%QHem-xAA92P*neOwVG{g2 zQvATbkeSnm4MDdwXQ*?+)=0bbh6uq>8#8+NU};Q5pl4^u?tSdM+=(~(J#oy~g?Zt# zyG(j8v5}}@(u9b_J*(nHWd3b-rm+jWmKIINiP5p6dEuMJcIk(?j~`A< zo=OcuDDJZeDLI~+PpU>nzzGqy8o41;ieNZ(8)mhx$R|o;=GnwFTwjxU2s$o1ghR*X zatF)iJaYeTsA4VfVMh4`I;=bEAA)QXaY=tG z22@BLcIUj)UZnHqIT$RI{!g(9;v{e(y@FCc62s4wy{gJkO%JsacWLD-Gi7|kjzJ1B z(w~~zGU`UfBQ>fygE(H}tp`X};x+{Z5Q@!9vd2=r7bersO7Uhrf!m;RuChdrBIa2iJkT%Tho#_l~AjG7-+mz|7(cmpFz zM7D#?Ia%ahPm`s0D;>sG>E3vpix+wiZu9U=-z%;88BO{S-GD?tv;9;1^~qs+0CHdi zUVc|N$5u9dr48g3!a_qN?b4*q##~o!JSzAOG0tXdVwf7VBzf5ElC!k-;_ zJTwE!-u;4a)CjGUDoCRj8%$_=sAD~kq*-m424qnYNaftk=Db+N9_2N(-(qH zprS2@P`pFHG>O<>QIEB^G{J_)oMaEb`giA>`{zWiy0DN4 zqWfj8zqstXV9C!bL2fZh_9j9?W{e(ymR7HK{7;hCn{3ptLRksOjqp3Pp^HVyc-jbu z$kufY_^bVPJ}Rxj*FP+Dx zwW<*`8o#*%eODG1#A7{xEVL4DeqQbhtpXqVaP~vV3U`Bi<#!3#_!$Ik3z>T|skFdj zgjEze_x@oAVzWfC0^w%y73yFy^0SE{*3dzr4K2Yl{!<_0?2~YpvH7^&%g36vwVtqs z3-!Cl&QeaETDc^EtEp4Zs>>99#Uzr9bz);ee0RBIwU$*!p7JX{&<$+S><^_I2qhh| z4E5a8$Yy26J=4gpaBr{oN?SsmP{+Uh9JimgV191h_c$*%rLGdSEi^~{YdI3hb(QYf zW~;(`UQMt!WTCc2e0x=SyJ2!pM%C>0l-QaMWf_GKLASF6dAUY4FZ~ADyrxeIe14#I z_8{!Iull9m*yOht)H8KsmVEJI2zd!*Yx6&T)~AawN6zOhvNSBylDrPwVe4R1wEf_p F{|7&^w88)Y literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_celts.png b/src/games/blockilization/pictures/l_celts.png new file mode 100644 index 0000000000000000000000000000000000000000..1e68ce43022a858da68eee4aa9db0c9f0f8ffd78 GIT binary patch literal 3530 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 WOd&#Uj(-kzIB?Ox3}2>4jQJmpuwMZH literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_celts_glad.png b/src/games/blockilization/pictures/l_celts_glad.png new file mode 100644 index 0000000000000000000000000000000000000000..e688691f5d6035067b7ccc8e33f98b17300c47fc GIT binary patch literal 3542 zcmZ`+c{J30)c?-HVC;K#S;jiD%_vM`Uqi+gCZm*{=aG;lKTCEG*%D*Po}EY}TlGY; zZ&4xh-+;ynnra+{B%%Tov&}OP*BUaNl)RnZ*R%L=QPQsty9CB!%tM_@9*7FqCQaC@7B;9 z@f_KEpC6VP_MD}?{ot(Xf-97dXdl6h>}aoQ#bOG3q7W!nA&tKld!i&3{%t69z6U-Q zGkUK+J4ZlPyB9`<2ZYx z5LWxqCaocLVqZ5!nYAbY|_j2>~9DO?&(3vu|Z?Iahy@=^D& zS|j2!%X0mSS)wdh3_b{8f$X*$X|qxjkQbR}SsSqbk{BzRAiUS8T0KNU8Fov%t^9f< z(D?SFajy89Dez#dqAJ^T@WT4JKv|qxlkU|7u&fM3J_)C$!s{dCkEu{7UQ?NIo5wU`Lnwx+FOyTlANg< zVl$tQ2KFYN(jBjC5WctJE9vHcQV8Avs(<6l^*J4_1y7d(1b%-BKFr*}%0mksdscsm zBH>#Wqpy^L?%K!Ul0@)UTjH3YHpbbN=^D+du4jLRyaXPHnJP%i9njg1$+N?t1p3YG zjdwLhM@K2+zZP5~_+V!Q0p_t0JJk7ssVh8=o_==Vz4B2A}gaUaJkuD@IXL@F5whROcc19VDzk)IU@9f-e)Hcm> z`oGW$o`BIlxqn)YbP3K7{WED+-_@4<~6n)AU5_4?Xmr zjkQ?Wx!{V+ywLe>TT7AKO_^VMTeWw2UI%WCcWwgX$auk3L7CWfpdlz)obJR6uJ4yc zr4HROIS8>TE7TJo*Cb0Y)F&!QBWNROICLDXQcze;v2uK90hbW?U_ohZstWH7-n@8s zN5S0$WJNb1A?jyduS~z&a!ocvFNiShjt_;rIYu*Ab+5yEIk}sY?0^Gp54kv$8)I&1 zOA;<%NT05X50zto@2z*7f9v6_lOkwgP+??4cTXa>DKaqH_LZ#g(8rly*jBGBKi~P} z=HDqhuv*Ivz2p#`y`eyT>=ymy-0J{T6mr(2Th=ff%1QBYldj2#B;P9s3jkl9gz~u;UUzc$7T?^@ksFbF0r$pe9+txRWdU+}8K# zbs{4oNy7kIWHYC?y{7hIS*7%yrmY?V!$O!0Rqx#@s^f|-;sT5DdvB9CZ}@56Kj22s zc`J!UJXp%Y>kl8s1X)aFY~Q8KVb~hZi13Ec^=ZXh#L6nXTDr-7a{BIo+4@$e%6aWEK1i5)+_{a1h;{(K84Gz4qSw9hhj7UOXKL>yvVOZL5FXY$G}@ zsc=k-4{>da!lP)Eelho7)=3Yn!8>=a^>8pacCW7kS%g|_{m41hi+Y6N3!ebRGtPR? zcqBJ(CNvLR3|3B@(jeuW_6)kn#occGqQy5r&lHFiJ5sx>X)GvW%Rn{>>{8Kc+di_1 z4Z+DNo4>nEhsqO1u#}~ia}m#B?6m=sj`()QD%GXaF}AGMzG7lyNrtYuO@^2SHFGPK??{mx$yw)Rcm-nQ9;}pK@_`4|zmj)O~fyEgDveFJEI(D9dH5GFm z-RHi}mR)&dh6h0!(*xN23urLNKmK*mJK%=06|wc5eE&zL%0?m0^_%IRvZc70L^z+= z;qn82BCT@mxFB~UxQSs~XelWOizHshT2;5}YF|_PL1vNK{i<*?ruuPcW;0`!c$Y%& zr58UwTlcoLY}QHN{k;Lw{pveG@zg~(8PM{E?(!X%e}r%FWe)6N$0tcTX4c16MCJU^ z;=PSZ^B{!`?MEkxi(O-1^dJ=`sQ{H>yy>oO-)4OIu$^O14Q-Q#!N z0tMT$G1`xtr!K&j%(!ZkPHUGx;dn9fk_f}FT)9Mti|EUca;t|~<(btB`FZY3o+7_B zW7H=fqKVQ+2eXb(V?y;TI?9-X4)xE!VgUU^bR(KdfKnM{bu_Ew;zZ6G!+F*R!NUw| zVr$1$7cq*O^6Q`O$HiD6De3~cS0|bl#bue0^+lg`P4Z|o~K>{ zCkPn4ZWe^x_72tvn|UgwFavs2xKyOH@cUZ%F+o0zgN9}fI6?C!DFqhL8nM#%x145h zd}gz=;{4(UdBg{PD52)RIp&8e#V|gWXvw00$dd&9}@;WvDXe3?RnmG_JTbC^{b> z(D&OJu`f`VD6~eQTCB+|C9he^r^d)u(BUyy3+YlBSd&xFt)>H)4{JoiC0b*9U0EWj zOzvB?y;%#_ZN1LiDb)4MlwDBuSk7srK2uD&7zUqu^YVE>)f@4j`Q4?r?^V;2=3Y*$ zm#!qlOBIYwaRK{cje{*_`flj!dUR~$(AD;6i;i;?6)(%;y!PUOEcM*)hHYJs)E*`q z%~6>0SlSIfT$|X*?f{gX+0>)UQNNC+2N=b+d3mL$Z*4HyAsR}5!1b#*N%FSdf{xHqt5+?A8+xOD2-h(~>JxK*zI zLnkMqxaUu)!7O~(rT`s8Jr{xe>~4~Z6^hw0#5)20zV%O|^nyphwkoeM=HjfOPe-ZDV^vwU}9jQU$0Av{vYmSJlX&N literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_celts_sheet.png b/src/games/blockilization/pictures/l_celts_sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..c924ce7e8feacdadaa1a71eadd8ee6383309a2a0 GIT binary patch literal 7952 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 literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_denmark.png b/src/games/blockilization/pictures/l_denmark.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2197e30c0d2bab8e2c986fb0d9a8bd8adfc60b GIT binary patch literal 2704 zcmY*bc|6o>7k_5VFqUCZ){D{DN*R-~O)`a|gsVc4EfKOM>(KlxWxHj{GL}SdA`zl4 z5+++|3QbhTSW?4?EW@Qiywm;beV@p4=lMK;obx?PnuFa@w3w0@003=cZRse` z&~HHr3+|4CUJL-loNX)*or-4t7@0n)Jf$KMx&@1WZ=~3eHsdHVoOZsPU>xD?JyD4v zb!yY3QJ54GN`p!zrCLCZQsLTSLC7os9R zRSwR5_k6Za_HE7TL|Ki_AMIPpqW`4B+!{l_v|kgK*AoC0d70!<=jnpX&3!AGnrs za~{8H)^*KPKNcw}qvabIKCq{)!VG*mUK!270dx?b%t>Mz zMey!_Q;H|d?$jHb`+u~AF2J; zH+E6)tzJl7nmlA_yT+z^WbIOeq3-fa-QXmD1)a_Dyh|XhU^$;Uf@Qfu08z6z2=|}y)6X7w|HO1|1SRQfy>#Xd-n@6#)lx6Kql7qV zcK;@`8@DoX8Gm4>w>hxx`edL%W*!AQ{8~f%zXo^J|LJ~PG^Fy1aHG3y{411tIF zeLSd3!)MBYw~PKms%~|=E-(>zQl+7SGf?4?^2{3_hIPqNw@lMfK(j*?ZoLC&{<(fP z=}rShnj{8NIXVS-9uIB_l8S*O!RvS{2w(u51W*8m1qh60v;VaAja5T^c`W;vsN#l~qbhSUGH1ok4k>R1cHIp;(kb{F1I)352-ra3YH5V#j zO-}sKYrn6fZ(OZJ|9)zJ)s2Ga2kB_Ck0d5H#1b?w9>MH9{kP%6s*ne5Y7Wy=m!D8m zRjgDgm}8l2sx@;7+J3C zi|E=O@d)TNg{Xtc)o#m1A{IzOYMh3#a3xjBA^;q z$r+-ZDs`a$w8t6$dPxrLSQatVHF!MRd)SXrfdcY}_qn042|%k-&&sy;Ibb&|-Ft@3 zYB9^ouON)Zx5llZU|cllAq~YKN(!UkM#AG=^7XX@ZgP*I_~&D`C^|O;$w2m>c1CpZ zX`e6YoxlphM6GWYC?SWRPWo_b8K}*C7NSsQN|*X-SllgN-bAoGyx#!ukaybRPg+nY zDzaaqhTb3-0vIX45e@ix1J`~n{kr^FwYhilCH=I^Ki{6@2Q?lRik8ufNB2_h?yo0` z_jnkxFr-H?hk{}?*J!WEoGHrQj+QTu2r4&%_e&z(QVf_(<@<3eRb1U**4vYT%tlq8 z>DJC?b;d{yVqhdjh!n(%@!QP6S4u;wZ}9lGce!{Z6lbNUcnt?>{tY!jlaeTlm<)biHeeKW6w{>CjoCA%7w51=c>5J@Nr-ArmrJx z+jd{B2z|6x{z)8y-p3C8r+T5L(7vZF(8YNAILF->CFN{-5oKN#S!xKqKRXEI%1te6 zr1A^%HVE3ZV`;o=S*`5ZWQzqKlb>5vMx}BPOq=a7=Op1-Houh02{$ku5Gv+O29UK= z_f1!}(@m6~N_uL3yQfy~2ue3NO%4Nr(%gWQ*uV#W!>GUebh!+aljgoc(1nHimAE+Z z-J`_MwU)uCBBw7@lyo0%(I;-7uxbED&c<+bVfxCC{#sivE>=W3XWZE1u>^u?IS#+f z+^KIoDe@Q%+pSqSeM>ekB*UkhSW3t@v&2b$t4C5PBeDa9OB@FZupm4iqf<9;z z8d!CNGCscR9^oWk>oGkIw1kiafJ)}W;Z$+bZbafj`0IM&zz6#9nb(UJzL?vCHsTV? zPk#`hf{6o-(ccAp-3IxXM{0scV&)0FsxftdgV%nGx2Dzj10NOg>b4xpwCt|&hlpSd zWD1_;$~cUQH>rE+d4TPK-SMqXh+5}Xemn66F9JsL zZ*;M4bctonM2JEXWN(hL4C$$$zIJ+4MI*4Xr0O9d=VL7F@PLF`!HYWBGEwZjY5D{V z%3qcyNdT^2{nr=Vpg>!Bx?i)_nh7kt?Az8W*V~#g+qwkNo5n#17*?^q=p>S4lblpN z=Cmy=D$LL+;W5_2iH{;_K?&Ex*TqQw1>rYw;8~MV-m8p(dNmjq12GZ0eYGyFXJ1$e zrCt|?aZ!+5(*I7J{~JHp-18}8%$3a4Lm*A4gwN}VT{lX>kTzhmt&80?Cug*i2`14C zC(>udY%klX-K(Z#_jU)FKFI(#XUgL=jXT@BF3+{>Q_W4c&urNz1Kvr+t)s91Vf1Gt zEgK1OUMXfQ=*Z0Jt;cK=6);zdG3KZ5wp%0ZKzbu^^kyF2&1}wK-oGdXwO%*t+(GHz sUu1IFi!Usaya#y!00I`~XYJV@`lH;O zY};Yz)dK);rN!CP7o&&fM_J**(+9XhccI;WoK{_ueO@RMt|V?R#GhDkvVjr0+5To- zMyf{cQq9yE&hrg-7ZGDzZ$`YN-}_GeK=GVUXS08FUKTHrwT~qIU+`Q0I?I-P8W!Lm8Tz z6wja#UrHWKcVT(NXR6}>w(~Szp5T&P>O}9N5Ia07yU8A{D79)FMyf+YA}$}(IIgRH1<%yB zRIN-+-48`uZVrrB2jtiQk!n0f4E8evJWv3ykz!a;OggJ`8etZ`ZPw2SdMLe?oa)=^zZIDl_2X5Q+hJ1-| z)bQnif@Jz2H*j5ATRmp8iNrE`odjbBsL{&pau1gqV*DUyM9T3QVXz;>6a`bM;t6_p ziYh>q6Sle9A4ap>L`t6nrdMDAzX}aCtrsJIjGD|U8iSZ*19&DD#CWfU3u4H-a=-#e zKPvI}iAgnU*P7c0i2!l`DXcGF>ieCGyabSrFo-cpE5%5$cSaQdO>i(Vt3=Ql zO)^^#u9m~l@`M0Zg)BKyb?iDgLYPcm4cZWldd`2oGXr)3k!ihYEIHbER7EnOO}<3{ zrjh?h9))^RUx6CgMMrQX`&t}@zTKP9>E6R@8hNvj(%t5J=bW>qO$Xx<#qA3Z=GD4O zy2f;Z#pwgi92nG)&y#Y2*ppm}JasIzn>Hs8965_ICW9sv86XPxoLcvV zK}JIC#^|LP5pvr%DeV)Wewhc$51M0^3NcAZ9GMLS1=6Xo&<-%dm$Sr**ghB^-}htX zVvhm{LqcH}b5fsHl-qM;<`oEVp_=*fg4@JuPkmNez~qx16B>cJOrlB=I11?gtQi{5 z#VKejP`hsGkWh%ak9V;74YGP$+*x2R0OXw`NPyDoKo86ut8&^RX$-k?GT{<1+JtZM z@k($iXj$55t1iF(DwwBgdiV8v5t|UQkKb}Lu;%pJc^T-2iyFmb$vkht|-u-PI6*Ylrr<- z{mLoeHOqk-t>;}JvO`e29n_>s`MECn`u|8#PtTLNY@eUXqAGF*Qk>9;S+P@;5 ze+KkA#$6^9R&F~Z{LP1jwB0+I^oY@=l=ZOqiFS$j*!6;(Ksfr{&}KoQTWQ~py-VB? znCI=UT=@%J)ryJVe-|`4vAnslA`JES_ox*)A&y``zo?aD3vRxgd5Rccqlq5{!XZ=FdtCb}BUah^@ekfEg`5V!T6CKgsl5}kp z$X~+?HQ)m{w_?X9do9Bkk>BMBXT*=1C47ZplJ&PQf93-{xEK4=HrzJ!hKn1@KaGIU z!E^`KTcl^$RO3ee8p!AWaV%#sQfGxxa1a=lE!PB%*#10anUUm^ssI=d$+ke}k`H4R zrmv*BHFtdXZvR0eO@kmiq ziScyC0}7&8LDj0hmvKoDay8v@4-M*?uH&w#tIGBp(_$Zt%zN5=rTwGBVZ z2p?t|zlc_ogyY`2Xcp#ZAIOzx6@~w9+jL$cKvwQHWBKCzP>PiV_||z@AZqTv0r%T z3!jv5D8YL3XNL$nR>_PZvnCH$9%zQEHG?yu(<*UPE&yiB(tPt+KP|hd$5hhf92+A$ zmIS|P8i#OSi8-&dl02dPaZA%rgES9>In|3uqoEobI)-(X$0j^~x)lHSPh>xgIkYt+ X9&B5p>XD5?z!nP=>$6qHp11!2RRIpW literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_denmark_glad.png b/src/games/blockilization/pictures/l_denmark_glad.png new file mode 100644 index 0000000000000000000000000000000000000000..6512c2d8231ca6ba09f6bcb891df020408b93b37 GIT binary patch literal 2780 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 P$!=g`Xl_tSqD1@;?fzrG literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_ethiopia_cross.png b/src/games/blockilization/pictures/l_ethiopia_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..c4cdd62ffc8f3228f8445a8df2ae65990f241e3d GIT binary patch literal 3081 zcmYLLX*kr27d|rvW8V#>nUN*gLzY|&LKJBda)nX0tl5(FN8)DRmxxi?M3mGeG?{E! zFG(sR$#zXimXP7^e)@kn=X^NJbDr}&@B5zXwl)@g+nb0JV=tD; zqdfgGy*lt-9n1K6A-9fjje&vLKW5i^o1@m;=t+Egwf)}LQRtqDYw0Z`K7wUjxi{jN zUDEdc{;@8HR|~W_%~dChA0iy`wJLlsKQ!r>arO+nOC9YbDw}J?EimlNGd2|S zDkze3=~yH?fj$19DVvCvmg{40#~_8Fh~|kyyO|Px(3Fo+Wlrb%fO^Q#ZoTKp&AS{B`%0wKeg4nFPVBu!MyX&|^-Ku| za{aOQ=9`c7qZyBCTWq`?zqf?gLC-ISen3}UGIU``*UJLEzn%A} z&jL~gS-zG(Gs}PF#IYig(H%p=e%BT$@wvc(sIKu<{F)ZDSSjpm3zB}(5&=VCqZ-}NIf^wsOZTS#qvGcK8Sp<~25>!x2r0zek zfL;#T(vmhK8biAP$cA=FzRqr12yWA}m6wGe7qXaq9+Gj?yN1hsf&1=nEuwn)L6#*o zlUv1Vn0YT+HElAehF_`6L4RHv!Csj)33dSL?pD-nl>0bC!aa&}@ah8V#>?{3%D_nA ze>*m0{~~og+C_N5PkzZUQMT#N?$?fK&43^2&Q zTyN1-JG5gdUP$>(6b?5fvnsCdQ}@1}aXftki)8Gc^+_bI!{XwCaOQ-jtZ=U4nwks?jb$ptAEit!{63Rug_Gf$izBDC@ z4MV~pEjL_^BDv)Ocf%!D~`TSX_ls&eeZ zup;}z>FGa%$3-Ju4ubmh0oOo4Cclg(bw1^wJuQ!}XLIxSCP7Lu`(O8xLPu*Z18wX4 zH&qOh1a^v3c{Y+gTu5gCr7w9(2!t@x7}6gjx08iyOxy-NrZdeTlot{1W+w`{V`gMP z5f$&2DUZ9r86xD~4@b@^T z(OlzAqqoX?8KP}DpfsFwKCnujzRkLzWp~q|mUAr^WVVFw8NKWOrCgFaRRz?BKeF}_ zg&-Z}9qM!}bGAWwHS%E>Y3f;IOKo;tm>R{8ukE$b;bPVYeL64NEeO2Zoqr1=R$TEX zzc*WJ*Qzd0d^T&=#?btRN%4~70b`IT!Gm`51W)(0&y6}KLwO<#X9Xtm#W;izZWL)X zY6gW2JAdlI=Pu}i+hXe;EmtmBj*&J+5#_X8Q83GCTB$GG^`U%1{AYb;J$EB7JA|{i z;d4RsJZtkyPbWIyg)%t#{XV8OCu8~zr7^zmD|?nS9N{Eg|HQxdg*NRVvr2|Ci~17W z$m8OR#l@A{Xi0-P2ertTZ}JTxavuSuKuK*lGW5V$P3>Nbp|2@6vBfPn?)RHw{!pidqC&>Eou~(19MsL>%oH<(VxTGt93$^ElyIO?U$^3be%W^y1KcsRYBrCDc z>Xx>?nm|~71{pTn7&&Z$p;|@5TZD-Ws~fJ|K>H!*TT=;wdbJ*pkJKkr417DdJEnpW zeaNsaod+0sg&{%f9=;u$eWx4p<<%*ta1$JV2V<;B$ zYO3_BC*qEBG<;{i6Cim%vx|${!{m;gjjc(hw&SOe*d@xA81L;;;t9GQ-co(@YK864 zfS2Lin}4p#p-A28OLrSGZW`nXBT765Rla=2feQC#w+2#WH&()rx~5u^zD^h|NE4fa zME=^ItcY}|5ILm^q#uqC;P1v#JAcDcoE`zM5XnA6x2_Fir`Z-Notq0750dfHYcEXW zpg9MMG`=`Q7GHi9VUvU*_4kSACz1k63pHDPQBV}O({XBKh90EQxur%R2p8?r-&?FF zuc>w_Q9`jBf_#hUHTdx2^_dg6v*l?8?OPK8X7#&pf1|(;PVIJL*XlS=yXjFD3rlMB z`bNdTg}~9io>9aIKsI= zVQi&v5XnrvuojW@-;dG>^Ug{m+t<9H%C(lL}jI^V= z8Fy|Q5I;sAZhCyEEg?8S^;MGohv@aottNR%>~5RRc~UNZ1$ORlERJNVCspseZ=YI! z2@k6C$It9H14U6dva2p0x=SZ@lDi3I{yW|C^yQcrXxheD_}Q7gdys3(m(Buj@A{Z+ z#0)us?^@}*cN|vXLxc&-Cq4B$G1*@W-FF)EiE8?2G>aIfu5>?kXN@S(+oE&_Maozb z)8TV=way9YF=+NIC5DcNw-4Lkg1K;rctSAN_oqp>PIZip#w#1+-$C8YLHNyOOL zmYwzeN?iXUQ)pK`Hsq4H0@l=npEb@=_7mW#`04HH@_57T0i%@MiMZw#3L8p+4N5sY zSxtbr(2PM4Fw{>#Qa=icyvRttp|LuKsC%dX*%NtQHB9$wC*S^{V+Yo*@m#`CgVknk_P@g;1EVDjTpC^sk>6!+`UP z-1Nrtrf}9r62=Xe#8qU|rXCMPqM&+!2w3=!n{CuOwZ=jam?Jf=Nd;;Cb$eMzqv>tV zpj^ua2MYdQH2TEZ|9W`|1Ko>hz2mf|JWl9kF ziKZ$oH;Qv#8Kz!;tWY~PzpjL#K83#x_+uuN$^Y^fjvQX~;TIiri#rNwc(nT?1I~o8 zwlt%~GPcOsCm*N^?7Qf=mvci@nYgE*KZEw@mnvAc8gQ=kdpMHu`eS4(&^R*^=ICP1 zEq<>@8j_Okc$IoQI8csROw}7ZbAZP(`e`$J*be3E71&wpk!uMf+|pd zS7x@fk3QL`K{xPS84l|my+g_4H4_YF#p>({3?=p6B9sqcnO^x*JBF6qLS`HK$mF!|8of7}F{zX{)Iv2`tjc@wsc*&ea-)htTOSqkDzgf@x88=io?U>#R>!`0X`~{d z-m8lhL0bu?om$I~g=jKwn7h$^p{f17&0YdJ{v)++9k=+Tb^MLJzl=ENBfjRVKViQ~ zmHGDRqwtiyy`QO#`cv+H7s=!5*8+SN28UXeGp(7Wk+zj&ay0$Kt4l`AhE>Z)vw1ZJ zKG>Z7;xZtiOcu-&KCZ5B$P`PuiAp$<^5(}OW}*$s(4qRilJi(5Q6%*tLyg}UJC?*>YN zE)(}BDuDt*gr=9QlWuN}TYWZ=>X)ds7jhl42%HE|h-@Ml?eEmv#L_n-3WrP6ehUjY zgCN1H6!XlO-Ij#i<>9@S{Vg_*y)>InjES1GT&)fd?Qg8pP#tadmShRSN093aG(GmT z;-SpQ&ExvTE`Bo*>Bx6d*!&WC=zf_XQwXF$+q*UezF?+YkSUUYK*JXxbi%0_qCFl# z)d8t#f343Q1-~IdZ^LM13mXk50tv}KX?bZNj|29w*6r9v+W)l}NM9zhV+5#I0dCPt zcS2G0n56q4eV~t$RF$} zh|!hvbnIg1+EzwH)KSyUl7|)b`N?Tr-O^b_EoP|19N=NTgKpyoxaI-FiAl~2h;wDP zI4>c{4*l|1xQNvc)4&Rt3SxT{)Yw&32|? zh#|-;CgOpa0{nVWto=btcyQz1!=X!xSFllCeor(GLmx6a4Q-6qzOk~Fq1~&^bgNU%q!qHHU883y$LYmg@qHNa$lBF zfW;Z$v{W?FpTG8BD1aZ(9rdqKzcdJe&wt+Z)SPV7b5#Wv?8OtppwW)^pzAgP7W>^N z{s2QwCpn0GV59SCEMI5pKapIZS8r&^0Fco{GmxJ7QQ2J?S|7s~vV%?`aB+-maL#hm zy9SXiDgvkXygQr(79_wiLTkJWXnJ)y_JAQ~;PK<%u1TWc>3`{~WDW)z?9N(KFdN>> z$ad~{EI>1X{Nsbk$Fs-7gb zI7IA$me%G!+S0s}%;!J3#%5w2mmS zHDHQ?AUe+CWJ!DS9vlA^Z0VNP_K*N|xCQ`nwh(1X?q#&uetd*WRnwn5>#<_+1G+GISNRq(PdBN ztZ9B9D_Vx^5$V+xklS)r#{iOQs_`H`i>Zl2I(+OgpO#8ham6N$t~i>Z`d3c-9@i z5@l|9-RPK7HuoLdCyX1iezh;=cfWOXsz?|=!C7<=WLHC$1#U%~>gBQ-DkcJ06i`l# z;zq-x22?rVa$&*Yq8~cakZ^iF##O$%w4r3j$pUfY=l+EgP~FV};>zy=gU$aH-L{2r zjv>&C#zMP*Glk-W!?H?|sJRZynk%R_YJ$q0wacG_j(QPZ=O%NuxmY6`n>Ad7ne7qB z3=z0_T9U8DrTOhg9H95_nCUWKrkifI`+jbk0C%qm@W6CMNFkt10{}aB$XsTH^mLx^ zI{9|Tqf&nE=T(&)w*#FwumNN-TYJ%0vKFzkH(Du|b-c7Gj$nKDvJ&zh?aNF(S4j)K zN!!9TI$OSf^6*U8^|z2Q7yKSi`ptod=`%8*4c5(PRMu5X`_!UZgaGOM`cC&=UGfE+ zmk$HcAbZmGqAwPxOB@1^uB0q%NE-EwzsqogloEIuSKL&TuZJ}zR`xgG0PO$)MOSjb z`o0eyz(3aG8IRLtAziKE9z40uP&}Er@*xMmfW@@MZ=wU~7m(@Z{%*JGzDfvSl!Upx z`QZT{#Q~9EdwucLYul4HbQ(wfk@DZqtiI=I3wJ2lQPr;Dgj0Bs9;?1w`7bBCxc6TM z5!(HHN)jqvSB{!jEb*LD>kZ?9W8cZDs+&Q8={T9`c-5*eB)od`L&}|0US=TvP_I*J zUo9wf3Q%-cv2hg_>Xe_6>7)&qK~mxQL6d zl9^w>G-7O|u<&B2Mo2`RjqSzr^pEt;fVX3@zJKW!OhF7&O1ZEyg7g^FnjVIf+7n}b z{p5B3AJ*jp{adRTFz@B;nIGs4uziXi&<8z{DTA;1<`-R*9y&QM|2}3K6Rp^d@891# zn@Ra|Z{9)t+9+0ZflGu-D{g5kP++}nqS;mk%t%nK4zz6!$`cwU-uqo$6qKabX9(On z@94gptY29-drrTmsA_CmF-7*jtlPQK*v;T3O<7?M`wwfyTb_G;vXIhHA>~pYqdwtl zeF{oIq!Cd6(iM8UeQ0F*=WYoHd+*J-w2mMw42Xkz(jQP@1;LMi0S-Lk1aWc*5)D*V zZ(!o&fWCI{^L#BgZ#ko`;k)&>40Y;$cR7axv+JJeWWbrH5nXLs`z+eOD&Kk;-2RlQ zi6C(T(M%CRzyW?K=crD=MA7QhGs2{?EK56M_B=jrC4&d9>e1j}WXCbi#eW^i_qGC5 zQ^IgD@|bo_%ulCGBE$%$4SL(4K zPZZq!|3Rg>(|1=0L=eXCkK$k8{k9ODovf-oI}u6@SG(t$mUZWjD@WUHp!Bc8$Rp2_ zNw9(^K7sotcqjx5^NZlBLgQROq_EuHgeE_vga=KU_nrrhc-Au1-c%0XO&NTl5lwTV2hz%&7PHR}uuOXWRsC4oxS612+#$&srH(8&Ko^2OsET0RR91 literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_ethiopia_sheet.png b/src/games/blockilization/pictures/l_ethiopia_sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..9adcfcf41ae5ef466027a960fc6caff720e59b7c GIT binary patch literal 7265 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 F`+rDM&N=`9 literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_netherlands.png b/src/games/blockilization/pictures/l_netherlands.png new file mode 100644 index 0000000000000000000000000000000000000000..a0756decaceee13ea18acdc107f0c05eb842923e GIT binary patch literal 2922 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 E9}Mt84FCWD literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_netherlands_cross.png b/src/games/blockilization/pictures/l_netherlands_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..817b1c9bafaf2cab605c1d2e9a45a4b9a0873961 GIT binary patch literal 3023 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 EAG)nr*8l(j literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_netherlands_glad.png b/src/games/blockilization/pictures/l_netherlands_glad.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f3ec2de3095de3ca17ad9710e2bade76ed154a GIT binary patch literal 3001 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 Yg!d-PQLFMLpYRSJ(A%H9*Ye8$0Tp#{DF6Tf literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_poland.png b/src/games/blockilization/pictures/l_poland.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4ec17ee7b5b05fe19e2353d3d0376cc624220d GIT binary patch literal 2881 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 literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_poland_cross.png b/src/games/blockilization/pictures/l_poland_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..23b90c9965c00445fd13fdb3ee0e2fdd1f7e5c42 GIT binary patch literal 2957 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 GU;hW*)L}#b literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_polynesia.png b/src/games/blockilization/pictures/l_polynesia.png new file mode 100644 index 0000000000000000000000000000000000000000..e322cce2e718cbe337e8d11613e3db77477917b5 GIT binary patch literal 2527 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 EKlC|zV*mgE literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_polynesia_glad.png b/src/games/blockilization/pictures/l_polynesia_glad.png new file mode 100644 index 0000000000000000000000000000000000000000..e49a79ca64ea29b1d1d32deb21736220993f9c36 GIT binary patch literal 2537 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 literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_polynesia_sheet.png b/src/games/blockilization/pictures/l_polynesia_sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..8430d01caadfdb9c1cbae0ed6da334e9ece4877b GIT binary patch literal 6118 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 P9Kit5)=Bi7}7p*wvRa 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 literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_siam_cross.png b/src/games/blockilization/pictures/l_siam_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..1be1acf0e27108dedc5462d8be63d0026ac3de73 GIT binary patch literal 2790 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 DX-V@+ literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_siam_sheet.png b/src/games/blockilization/pictures/l_siam_sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..3a970979bf828d5a1254d37c9a229e31268e0a2a GIT binary patch literal 6272 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 F{{edk&gTFC literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_spain_cross.png b/src/games/blockilization/pictures/l_spain_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..b1142b8f4fb0036e842e1fdcd8fc89efc3b2bed0 GIT binary patch literal 2786 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 literal 0 HcmV?d00001 diff --git a/src/games/blockilization/pictures/l_spain_sheet.png b/src/games/blockilization/pictures/l_spain_sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..1a595b71987a75f5fdec018f04441eb3a55616a7 GIT binary patch literal 6515 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 KZJED#g#QnjeKooO literal 0 HcmV?d00001 diff --git a/src/games/blockilization/rules/ai/context.ts b/src/games/blockilization/rules/ai/context.ts index 8b4efa5..65ece00 100644 --- a/src/games/blockilization/rules/ai/context.ts +++ b/src/games/blockilization/rules/ai/context.ts @@ -1,11 +1,11 @@ import { sizeOf } from '../armies'; import { allyOf, cityStates } from '../citystates'; -import { atWar, canStand, citiesOf, knows, seesUnit, unitsOf } from '../core'; +import { atWar, canStand, citiesOf, seesUnit, unitsOf } from '../core'; import { dangerCost, dangerZones, type Danger } from '../danger'; import { happiness, type CityYields } from '../economy'; import { apply, eraOf, type Order } from '../game'; import { distance, neighbours, path, within } from '../hex'; -import { ALL, occupants, stepCost } from '../movement'; +import { ALL, canCrossOcean, canEmbark, occupants, stepCost } from '../movement'; import { questsFor, type QuestKind } from '../quests'; import type { City, Game, Player, Unit } from '../state'; import { teammates } from '../teams'; @@ -205,7 +205,7 @@ export function regions(game: Game): Int32Array { export function passable(ctx: Ctx, u: Unit, t: number, passing = false): boolean { const { game } = ctx; const type = UNITS[u.type]; - if (!canStand(game, u.type, t) && !(type.domain === 'land' && TERRAINS[game.tiles[t].terrain].water && knows(game.players[u.owner], 'optics'))) return false; + if (!canStand(game, u.type, t) && !(type.domain === 'land' && TERRAINS[game.tiles[t].terrain].water && canEmbark(game, u.owner))) return false; const city = cityOn(ctx, t); if (city && city.owner !== u.owner) return false; const m = militaryAt(ctx, t); @@ -353,8 +353,8 @@ export function landRoute(game: Game, from: number, to: number, by?: Player, foe * over the ocean with Astronomy), by the lie of the land alone; null if there's none. */ export function seaRoute(game: Game, p: Player, from: number, to: number): number[] | null { - const embark = knows(p, 'optics'); - const ocean = knows(p, 'astronomy'); + const embark = canEmbark(game, p.index); + const ocean = canCrossOcean(game, p.index); return path(game.grid, from, to, (_a, b) => { const tile = game.tiles[b]; if (tile.elevation === 'mountain' || tile.feature === 'ice') return Infinity; diff --git a/src/games/blockilization/rules/ai/military.ts b/src/games/blockilization/rules/ai/military.ts index 1773368..78b7d06 100644 --- a/src/games/blockilization/rules/ai/military.ts +++ b/src/games/blockilization/rules/ai/military.ts @@ -1,9 +1,9 @@ import { sizeOf } from '../armies'; import { canFire, canPillage, cityFireStrength, cityMaxHp, cityStrength, rangeOf, strength } from '../combat'; -import { canStand, citiesOf, knows } from '../core'; +import { canStand, citiesOf } from '../core'; import { weighing } from '../economy'; import { neighbours, within } from '../hex'; -import { ALL, stepCost } from '../movement'; +import { ALL, canCrossOcean, canEmbark, stepCost } from '../movement'; import type { City, Unit } from '../state'; import { teamOf } from '../teams'; import { TERRAINS } from '../terrain'; @@ -607,8 +607,8 @@ function explore(ctx: Ctx, u: Unit) { */ export function exploreAbroad(ctx: Ctx, u: Unit): boolean { const { game, p } = ctx; - if (!knows(p, 'optics')) return false; - const ocean = knows(p, 'astronomy'); + if (!canEmbark(game, p.index)) return false; + const ocean = canCrossOcean(game, p.index); const edge = unknownEdge(ctx); let best = -1; let bestScore = Infinity; diff --git a/src/games/blockilization/rules/ai/personality.ts b/src/games/blockilization/rules/ai/personality.ts index 7b1a6c9..656501e 100644 --- a/src/games/blockilization/rules/ai/personality.ts +++ b/src/games/blockilization/rules/ai/personality.ts @@ -46,6 +46,16 @@ export const PERSONALITIES: Record = { ottomans: L(6, 6, 7, 6, 5, 6, 6, 7, 5, 6), // Suleiman: a lawgiver's cities and a conqueror's fleets zulu: L(5, 2, 10, 4, 3, 3, 4, 3, 2, 10), // Shaka: war, always inca: L(7, 6, 4, 7, 5, 5, 6, 6, 4, 4), // Pachacuti: towns in the hills, roads between them + america: L(9, 5, 5, 6, 7, 6, 4, 7, 5, 6), // George Washington: a continent settled, then made rich + spain: L(7, 6, 6, 5, 4, 5, 9, 7, 4, 7), // Isabella: faith, and the gold of new lands + siam: L(5, 6, 4, 6, 5, 7, 6, 5, 10, 4), // Ramkhamhaeng: a father to the city-states + ethiopia: L(5, 5, 4, 9, 5, 5, 9, 4, 5, 6), // Haile Selassie: faith, and a defence that never gives + celts: L(6, 4, 6, 5, 4, 6, 10, 4, 4, 6), // Boudicca: the old gods of the forest, and a fight for them + carthage: L(7, 5, 5, 5, 5, 4, 4, 9, 5, 6), // Dido: harbours and trade all round the sea + poland: L(6, 5, 7, 6, 5, 8, 5, 5, 5, 6), // Casimir III: policies, and winged horsemen + netherlands: L(5, 5, 3, 6, 6, 6, 4, 10, 6, 4), // William of Orange: merchants and the sea + polynesia: L(9, 6, 5, 4, 4, 7, 5, 5, 4, 6), // Kamehameha: island after island + denmark: L(6, 3, 9, 3, 4, 4, 5, 6, 3, 9), // Harald Bluetooth: raids from the sea }; /** A city-state: keeps its one city and defends it. */ diff --git a/src/games/blockilization/rules/ai/settle.ts b/src/games/blockilization/rules/ai/settle.ts index c1828c2..34d208a 100644 --- a/src/games/blockilization/rules/ai/settle.ts +++ b/src/games/blockilization/rules/ai/settle.ts @@ -1,8 +1,8 @@ -import { knows } from '../core'; import { canFound } from '../game'; import { freshWater, tileYields } from '../economy'; import { neighbours, within } from '../hex'; import type { Unit } from '../state'; +import { canEmbark } from '../movement'; import { teamOf } from '../teams'; import { RESOURCES, TERRAINS } from '../terrain'; import { act, cityOn, civilianAt, coastal, danger, dist, goTo, militaryAt, sameLand, seaRoute, type Ctx } from './context'; @@ -74,7 +74,7 @@ export function bestSite(ctx: Ctx, from: number, settler?: Unit): { tile: number if (tile.owner >= 0 && tile.owner !== ctx.me) continue; // Over the water (with Optics, to embark): a site on the coast of other land, worth a little less for the voyage. const overseas = !sameLand(game, from, t) && !settler?.embarked; - if (overseas && !(knows(p, 'optics') && coastal(game, t))) continue; + if (overseas && !(canEmbark(game, p.index) && coastal(game, t))) continue; if (taken.has(t) || tile.camp || theirs.some((x) => dist(ctx, x, t) < 4)) continue; // Three tiles from its own cities (closer packed, as Civ V's bots do), four from anyone else's. let near = Infinity; diff --git a/src/games/blockilization/rules/ai/strategy.ts b/src/games/blockilization/rules/ai/strategy.ts index c53bd6c..609ba32 100644 --- a/src/games/blockilization/rules/ai/strategy.ts +++ b/src/games/blockilization/rules/ai/strategy.ts @@ -2,11 +2,12 @@ import { sizeOf } from '../armies'; import { allyOf, cityStates } from '../citystates'; import { cityMaxHp, cityStrength } from '../combat'; import { askOf, capitulationProblem, dealer, dealProblem, declinedLately, friends, pacted, warWords, type Deal, type WarWhy } from '../diplomacy'; -import { atWar, capitalOf, citiesOf, knows, note, random } from '../core'; +import { atWar, capitalOf, citiesOf, note, random } from '../core'; import { score } from '../game'; import { within } from '../hex'; import type { City, Game, Player } from '../state'; import { scenarioOf } from '../starts'; +import { canEmbark } from '../movement'; import { masterOf, sameSide, sideOf, teamedWithPeople, teamOf } from '../teams'; import { independence } from '../vassals'; import { TERRAINS } from '../terrain'; @@ -232,7 +233,7 @@ function targetCity(ctx: Ctx, o: Player): { city: number; near: number; amphibio const home = nearestCity(ctx, c.tile); if (!home) continue; const across = !sameLand(game, home.tile, c.tile); - if (across && !(knows(p, 'optics') && coastal(game, c.tile) && seaRoute(game, p, home.tile, c.tile))) continue; + if (across && !(canEmbark(game, p.index) && coastal(game, c.tile) && seaRoute(game, p, home.tile, c.tile))) continue; // (Across the water, a strong or well-guarded city is all the worse: the army lands under it.) const guards = across ? game.units.filter((u) => u.owner === o.index && p.visible[u.tile] && isSoldier(u) && dist(ctx, u.tile, c.tile) <= 2).reduce((s, u) => s + sizeOf(u), 0) : 0; const d = dist(ctx, home.tile, c.tile) * (across ? 0.5 : 1) + (across ? 5 + guards : 0) + cityStrength(game, c) / 5 + (c.capital && mem.aim === 'domination' ? -1 : 0) + (c.capital && racing ? -8 : 0) + (c.founder === ctx.me ? -6 : freeable(ctx, c) ? -3 : 0) + (wanted(c) ? -10 : 0); @@ -337,7 +338,7 @@ export function planWar(ctx: Ctx) { // The city's fallen (to us or anyone): on to their next. if (!city || city.owner !== plan.target) { if (city?.owner === ctx.me) plan.taken = game.turn; - const reach = (c: (typeof ctx.cities)[number]) => ctx.cities.some((m) => sameLand(game, m.tile, c.tile)) || (knows(p, 'optics') && coastal(game, c.tile)); + const reach = (c: (typeof ctx.cities)[number]) => ctx.cities.some((m) => sameLand(game, m.tile, c.tile)) || (canEmbark(game, p.index) && coastal(game, c.tile)); // (Pressing for the capitals: theirs next, if it can be reached.) const race = capitalsRace(ctx); const open = citiesOf(game, plan.target).filter((c) => p.explored[c.tile] && reach(c)); diff --git a/src/games/blockilization/rules/buildings.ts b/src/games/blockilization/rules/buildings.ts index 6226836..95817a0 100644 --- a/src/games/blockilization/rules/buildings.ts +++ b/src/games/blockilization/rules/buildings.ts @@ -126,6 +126,16 @@ export const BUILDING_LIST: Building[] = [ B({ id: 'hammam', name: 'Hammam', cost: 100, upkeep: 1, tech: 'engineering', civ: 'ottomans', replaces: 'aqueduct', effects: { foodKept: 40, happiness: 1 } }), B({ id: 'ikanda', name: 'Ikanda', cost: 75, upkeep: 1, tech: 'bronze_working', civ: 'zulu', replaces: 'barracks', effects: { xp: [{ domain: 'all', xp: 15 }, { domain: 'land', xp: 10 }] }, note: 'A Barracks whose land units start with 10 more experience.' }), B({ id: 'terrace_farm', name: 'Terrace Farm', cost: 65, upkeep: 1, tech: 'pottery', civ: 'inca', replaces: 'granary', effects: { yields: { food: 2 }, tiles: [{ where: { resource: ['wheat', 'bananas', 'deer'] }, yields: { food: 1 } }, { where: { elevation: ['hills'] }, yields: { food: 1 } }] }, note: 'A Granary whose terraces give +1 food on every worked hill.' }), + B({ id: 'film_studio', name: 'Film Studio', cost: 450, upkeep: 3, tech: 'radio', needs: 'museum', civ: 'america', replaces: 'broadcast_tower', effects: { yields: { culture: 3 }, percent: { culture: 33 }, greatWorks: { kind: 'music', slots: 1 }, tourismPercent: 50 }, note: 'A Broadcast Tower whose films go round the world: +50% tourism from the city.' }), + B({ id: 'mission', name: 'Mission', cost: 100, upkeep: 2, tech: 'philosophy', needs: 'shrine', civ: 'spain', replaces: 'temple', effects: { yields: { faith: 2, science: 2 } }, note: 'A Temple that teaches too: +2 science.' }), + B({ id: 'wat', name: 'Wat', cost: 160, upkeep: 3, tech: 'education', needs: 'library', civ: 'siam', replaces: 'university', effects: { yields: { culture: 3 }, percent: { science: 33 }, tiles: [{ where: { feature: ['jungle'] }, yields: { science: 2 } }], specialists: [{ kind: 'scientist', slots: 2 }] }, note: 'A University with +3 culture.' }), + B({ id: 'stele', name: 'Stele', cost: 40, upkeep: 1, civ: 'ethiopia', replaces: 'monument', effects: { yields: { culture: 2, faith: 2 } }, note: 'A Monument with +2 faith.' }), + B({ id: 'ceilidh_hall', name: 'Ceilidh Hall', cost: 220, upkeep: 2, tech: 'acoustics', needs: 'amphitheater', civ: 'celts', replaces: 'opera_house', effects: { yields: { culture: 1 }, happiness: 3, greatWorks: { kind: 'music', slots: 1 } }, note: 'An Opera House with music and dancing for everyone: +3 happiness.' }), + B({ id: 'cothon', name: 'Cothon', cost: 75, upkeep: 1, tech: 'optics', coastal: true, civ: 'carthage', replaces: 'lighthouse', effects: { tiles: [{ where: { terrain: ['coast', 'ocean'] }, yields: { food: 1 } }], xp: [{ domain: 'sea', xp: 15 }], unitProduction: [{ domain: 'sea', percent: 25 }] }, note: 'A Lighthouse with a round inner harbour: ships built a quarter faster.' }), + B({ id: 'ducal_stable', name: 'Ducal Stable', cost: 100, upkeep: 0, tech: 'horseback_riding', nearResource: ['horses', 'cattle', 'sheep'], civ: 'poland', replaces: 'stable', effects: { unitProduction: [{ classes: ['mounted'], percent: 25 }], tiles: [{ where: { improvement: ['pasture'] }, yields: { prod: 1 } }] }, note: 'A Stable with no upkeep that builds mounted units a quarter faster.' }), + B({ id: 'polder', name: 'Polder', cost: 75, upkeep: 2, tech: 'the_wheel', river: true, civ: 'netherlands', replaces: 'water_mill', effects: { yields: { food: 2, prod: 1 }, tiles: [{ where: { feature: ['marsh'] }, yields: { food: 2 } }, { where: { feature: ['floodplains'] }, yields: { food: 1 } }] }, note: 'A Water Mill whose dykes drain the land: +2 food from the marshes the city works, +1 from flood plains. Needs a river or a lake.' }), + B({ id: 'marae', name: 'Marae', cost: 40, upkeep: 1, tech: 'pottery', civ: 'polynesia', replaces: 'shrine', effects: { yields: { faith: 1, culture: 2 } }, note: 'A Shrine where the people gather: +2 culture.' }), + B({ id: 'ring_fortress', name: 'Ring Fortress', cost: 75, upkeep: 1, tech: 'masonry', civ: 'denmark', replaces: 'walls', effects: { defense: 5, hp: 50, xp: [{ domain: 'land', xp: 10 }] }, note: 'Walls round a war camp: land units trained here start with 10 experience.' }), // ----- National wonders NW({ id: 'national_college', name: 'National College', cost: 125, tech: 'philosophy', everyCity: 'library', effects: { yields: { science: 3 }, percent: { science: 50 } } }), diff --git a/src/games/blockilization/rules/citystates.ts b/src/games/blockilization/rules/citystates.ts index db00307..3be2762 100644 --- a/src/games/blockilization/rules/citystates.ts +++ b/src/games/blockilization/rules/citystates.ts @@ -51,6 +51,9 @@ export function standing(game: Game, p: Player, cs: number): Standing { return influenceOf(p, cs) >= FRIEND ? 'friend' : 'neutral'; } +/** How much more food, culture and faith a civ has of its city-state friends and allies: half again for Siam (each gift rounded up). */ +const gifts = (p: Player, n: number) => (civOf(p).ability.effects.special?.includes('city_state_gifts_50') ? Math.ceil(n * 1.5) : n); + /** What being a friend or ally of each city-state is worth this turn: food in every city, happiness. */ export function cityStateBonus(game: Game, p: Player): { food: number; happiness: number } { let food = 0; @@ -59,7 +62,7 @@ export function cityStateBonus(game: Game, p: Player): { food: number; happiness const s = standing(game, p, cs.index); if (s !== 'friend' && s !== 'ally') continue; const k = cs.cityState!.kind; - if (k === 'maritime') food += s === 'ally' ? 2 : 1; + if (k === 'maritime') food += gifts(p, s === 'ally' ? 2 : 1); if (k === 'mercantile') happiness += s === 'ally' ? 3 : 2; } return { food, happiness }; @@ -122,15 +125,15 @@ export function cityStateGives(game: Game, p: Player, cs: Player, as: 'friend' | const gives = (() => { switch (cs.cityState?.kind) { case 'maritime': - return `+${ally ? 2 : 1} food in every city`; + return `+${gifts(p, ally ? 2 : 1)} food in every city`; case 'cultured': - return `+${(ally ? 6 : 3) * era} culture a turn`; + return `+${gifts(p, (ally ? 6 : 3) * era)} culture a turn`; case 'militaristic': return `a unit about every ${Math.round((ally ? 14 : 20) / often)} turns`; case 'mercantile': return `+${ally ? 3 : 2} happiness`; case 'religious': - return `+${ally ? 4 : 2} faith a turn`; + return `+${gifts(p, ally ? 4 : 2)} faith a turn`; default: return ''; } @@ -299,8 +302,8 @@ export function cityStateTurn(game: Game) { if (s !== 'friend' && s !== 'ally') continue; const k = cs.cityState!.kind; const era = 1 + Math.floor(p.techs.length / 10); - if (k === 'cultured') p.culture += (s === 'ally' ? 6 : 3) * era; - if (k === 'religious') p.faith += s === 'ally' ? 4 : 2; + if (k === 'cultured') p.culture += gifts(p, (s === 'ally' ? 6 : 3) * era); + if (k === 'religious') p.faith += gifts(p, s === 'ally' ? 4 : 2); const often = has(effects, 'cs_units_often') ? 2 : 1; if (k === 'militaristic' && game.turn % Math.round((s === 'ally' ? 14 : 20) / often) === cs.index % 7) { const home = capitalOf(game, p.index); diff --git a/src/games/blockilization/rules/civs.ts b/src/games/blockilization/rules/civs.ts index 63897ad..8c8b4ad 100644 --- a/src/games/blockilization/rules/civs.ts +++ b/src/games/blockilization/rules/civs.ts @@ -2,7 +2,7 @@ import type { Effects } from './effects'; import type { TerrainId } from './terrain'; /** - * The twenty civilizations: each with a leader, its colours, its cities' names (in founding order), + * The thirty civilizations: each with a leader, its colours, its cities' names (in founding order), * an ability (the effects of Civilization V's, said our own way), a unique unit and a unique building * (`units.ts`, `buildings.ts`), and where it likes to start. */ @@ -278,6 +278,135 @@ export const CIV_LIST: Civ[] = [ cities: ['Cusco', 'Tiwanaku', 'Quito', 'Ollantaytambo', 'Vilcabamba', 'Vitcos', 'Andahuaylas', 'Huanuco Pampa', 'Cajamarca', 'Arequipa', 'Nasca', 'Ica', 'Pisac', 'Tumbes', 'Chan Chan', 'Pachacamac'], startBias: 'hills', }, + { + id: 'america', + name: 'America', + adjective: 'American', + leader: 'George Washington', + color: '#24348a', + accent: '#f2f2f2', + ability: { name: 'Manifest Destiny', text: '+1 sight for land units; buying tiles costs half the gold.', effects: { sight: [{ domain: 'land', sight: 1 }], tileGoldCost: 50 } }, + unit: 'minuteman', + building: 'film_studio', + cities: ['Washington', 'New York', 'Boston', 'Philadelphia', 'Atlanta', 'Chicago', 'Seattle', 'San Francisco', 'Los Angeles', 'Houston', 'Portland', 'St. Louis', 'Miami', 'Buffalo', 'Detroit', 'New Orleans'], + }, + { + id: 'spain', + name: 'Spain', + adjective: 'Spanish', + leader: 'Isabella', + color: '#7a0a2a', + accent: '#f2c840', + ability: { name: 'Seven Cities of Gold', text: 'Natural wonders give twice the yields and happiness; 100 gold for finding each one (three times as much for the first to find it).', effects: { special: ['natural_wonders_double', 'natural_wonder_gold'] } }, + unit: 'conquistador', + building: 'mission', + cities: ['Madrid', 'Barcelona', 'Seville', 'Cordoba', 'Toledo', 'Santiago', 'Salamanca', 'Murcia', 'Valencia', 'Zaragoza', 'Pamplona', 'Vitoria', 'Santander', 'Oviedo', 'Jaen', 'Granada'], + startBias: 'coast', + }, + { + id: 'siam', + name: 'Siam', + adjective: 'Siamese', + leader: 'Ramkhamhaeng', + color: '#e070a8', + accent: '#f8f0d8', + ability: { name: 'Father Governs Children', text: 'Half again as much food, culture and faith from city-state friends and allies.', effects: { special: ['city_state_gifts_50'] } }, + unit: 'naresuans_elephant', + building: 'wat', + cities: ['Sukhothai', 'Si Satchanalai', 'Muang Saluang', 'Lampang', 'Phitsanulok', 'Kamphaeng Phet', 'Nakhon Chum', 'Vientiane', 'Nakhon Si Thammarat', 'Martaban', 'Nakhon Sawan', 'Chainat', 'Luang Prabang', 'Uthai Thani', 'Chiang Mai', 'Ayutthaya'], + startBias: 'river', + }, + { + id: 'ethiopia', + name: 'Ethiopia', + adjective: 'Ethiopian', + leader: 'Haile Selassie', + color: '#9ac83a', + accent: '#c8282a', + ability: { name: 'Spirit of Adwa', text: '+20% combat strength against civs with more cities than yours.', effects: { combat: [{ percent: 20, when: 'vs_more_cities' }] } }, + unit: 'mehal_sefari', + building: 'stele', + cities: ['Addis Ababa', 'Harar', 'Adwa', 'Lalibela', 'Gondar', 'Mekele', 'Aksum', 'Dire Dawa', 'Bahir Dar', 'Jimma', 'Dessie', 'Debre Markos', 'Nekemte', 'Debre Berhan', 'Asmara', 'Arba Minch'], + startBias: 'hills', + }, + { + id: 'celts', + name: 'Celts', + adjective: 'Celtic', + leader: 'Boudicca', + color: '#3a5a3a', + accent: '#e8d8a8', + ability: { name: 'Druidic Lore', text: '+1 faith from every forest your cities work.', effects: { tiles: [{ where: { feature: ['forest'] }, yields: { faith: 1 } }] } }, + unit: 'pictish_warrior', + building: 'ceilidh_hall', + cities: ['Edinburgh', 'Dublin', 'Cardiff', 'Aberdeen', 'Inverness', 'Cork', 'Glasgow', 'Galway', 'Swansea', 'Armagh', 'Kilkenny', 'Brest', 'Quimper', 'Douglas', 'Tara', 'Dunadd'], + startBias: 'forest', + }, + { + id: 'carthage', + name: 'Carthage', + adjective: 'Carthaginian', + leader: 'Dido', + color: '#8a7aa8', + accent: '#2a1a3a', + ability: { name: 'Phoenician Heritage', text: 'Every coastal city it founds has a free Lighthouse (its Cothon), with no upkeep.', effects: { special: ['free_coastal_lighthouse'] } }, + unit: 'quinquereme', + building: 'cothon', + cities: ['Carthage', 'Utique', 'Hippo Regius', 'Gades', 'Saldae', 'Leptis Magna', 'Hadrumetum', 'Rusadir', 'Lixus', 'Tingis', 'Tipasa', 'Motya', 'Panormus', 'Kerkouane', 'Malaca', 'Tharros'], + startBias: 'coast', + }, + { + id: 'poland', + name: 'Poland', + adjective: 'Polish', + leader: 'Casimir III', + color: '#c8c8d0', + accent: '#c8143c', + ability: { name: 'Solidarity', text: 'A free social policy each time you enter a new era.', effects: { special: ['policy_each_era'] } }, + unit: 'winged_hussar', + building: 'ducal_stable', + cities: ['Krakow', 'Warsaw', 'Gniezno', 'Wroclaw', 'Poznan', 'Gdansk', 'Torun', 'Lublin', 'Lodz', 'Szczecin', 'Bydgoszcz', 'Katowice', 'Plock', 'Sandomierz', 'Lwow', 'Wilno'], + startBias: 'plains', + }, + { + id: 'netherlands', + name: 'Netherlands', + adjective: 'Dutch', + leader: 'William of Orange', + color: '#ff6a10', + accent: '#f2f2f2', + ability: { name: 'Dutch East India Company', text: 'Sea trade routes give +2 gold; a luxury traded away (your last of it) still gives half its happiness.', effects: { special: ['dutch_sea_trade', 'luxuries_traded_half'] } }, + unit: 'sea_beggar', + building: 'polder', + cities: ['Amsterdam', 'Rotterdam', 'Utrecht', 'Groningen', 'Breda', 'Nijmegen', 'Den Haag', 'Haarlem', 'Arnhem', 'Zutphen', 'Maastricht', 'Tilburg', 'Eindhoven', 'Dordrecht', 'Leiden', 'Middelburg'], + startBias: 'coast', + }, + { + id: 'polynesia', + name: 'Polynesia', + adjective: 'Polynesian', + leader: 'Kamehameha', + color: '#2ab0a0', + accent: '#f8f0d8', + ability: { name: 'Wayfinding', text: 'Land units can take to the sea from the start, and cross the ocean; +1 sight at sea.', effects: { special: ['wayfinding'] } }, + unit: 'maori_warrior', + building: 'marae', + cities: ['Honolulu', 'Samoa', 'Tonga', 'Tahiti', 'Rapa Nui', 'Aotearoa', 'Fiji', 'Rarotonga', 'Hiva Oa', 'Nuku Hiva', 'Raiatea', 'Mangareva', 'Tuvalu', 'Tokelau', 'Kiritimati', 'Moorea'], + startBias: 'coast', + }, + { + id: 'denmark', + name: 'Denmark', + adjective: 'Danish', + leader: 'Harald Bluetooth', + color: '#e81e3a', + accent: '#f2f2f2', + ability: { name: 'Viking Fury', text: 'Land units take to the sea and come ashore for a single move, and have +1 move at sea.', effects: { special: ['viking_fury'] } }, + unit: 'berserker', + building: 'ring_fortress', + cities: ['Copenhagen', 'Aarhus', 'Kaupang', 'Ribe', 'Viborg', 'Odense', 'Roskilde', 'Hedeby', 'Uppsala', 'Jelling', 'Trondheim', 'Aalborg', 'Esbjerg', 'Helsingor', 'Lund', 'Birka'], + startBias: 'coast', + }, ]; /** The barbarians: no cities, at war with everyone, coming out of their camps (`barbarians.ts`). Not a civ anyone picks. */ diff --git a/src/games/blockilization/rules/combat.ts b/src/games/blockilization/rules/combat.ts index 316d3f5..d7df154 100644 --- a/src/games/blockilization/rules/combat.ts +++ b/src/games/blockilization/rules/combat.ts @@ -1,6 +1,6 @@ import { formationBonus, formationKind, sizeOf, unitName } from './armies'; import { BUILDINGS } from './buildings'; -import { atWar, canStand, cityAt, cityById, note, random, removeUnit, seesUnit, speed, updateVisibility } from './core'; +import { atWar, canStand, cityAt, cityById, citiesOf, note, random, removeUnit, seesUnit, speed, updateVisibility } from './core'; import { assignCitizens, blockaded, cityEffects, civEffects, garrisoned, has, happiness } from './economy'; import type { CombatWhen } from './effects'; import { cityReligion } from './faith'; @@ -162,8 +162,10 @@ export function strength(game: Game, u: Unit, role: 'attack' | 'defend' | 'range // into a river from outside it, -50% from the sea (Civ V's). if (role === 'attack' && against) { if (vsUnit) add('Flanking', 10 * neighbours(game.grid, vsUnit.tile).filter((n) => n !== u.tile && occupants(game, n).military?.owner === u.owner).length); - if (game.tiles[target].river && !tile.river && !u.embarked) add('Across a river', -20); - if (u.embarked) add('From the sea', -50); + // (Denmark's Berserkers land and ford rivers fighting.) + const amphibious = type.abilities?.includes('amphibious'); + if (game.tiles[target].river && !tile.river && !u.embarked && !amphibious) add('Across a river', -20); + if (u.embarked && !amphibious) add('From the sea', -50); } // Promotions. for (const id of u.promotions) { @@ -182,6 +184,11 @@ export function strength(game: Game, u: Unit, role: 'attack' | 'defend' | 'range if (p.goldenTurns > 0 && has(civ, 'golden_age_moves_combat')) add('Golden age', 10); add(type.domain === 'sea' ? 'Great Admiral' : 'Great General', leadership(game, u, at)); if (type.abilities?.includes('jungle_fighter') && (game.tiles[target].feature === 'forest' || game.tiles[target].feature === 'jungle')) add('Jungle fighter', 33); + // Where it stands: Ethiopia's Mehal Sefari at home, the Celts' Pictish Warriors abroad. + if (type.abilities?.includes('homeland') && tile.owner === u.owner) add('Homeland', 25); + if (type.abilities?.includes('foreign_lands') && tile.owner !== u.owner) add('Foreign lands', 20); + // A Maori war dance next to it unnerves an enemy. + if (game.units.some((o) => UNITS[o.type]?.abilities?.includes('haka') && !o.embarked && atWar(game, u.owner, o.owner) && distance(game.grid, o.tile, at) === 1)) add('Haka', -10); // An unhappy empire fights worse (Civ V: -2% a point below zero, down to -90%). if (!p.cityState && p.civ !== 'barbarian') { const mood = happiness(game, p); @@ -233,6 +240,10 @@ function combatCounts(when: CombatWhen, game: Game, u: Unit, role: 'attack' | 'd return !!vsUnit && game.players[vsUnit.owner]?.civ === 'barbarian'; case 'vs_city_states': return !!game.players[(vsUnit ?? vsCity)?.owner ?? -1]?.cityState; + case 'vs_more_cities': { + const foe = (vsUnit ?? vsCity)?.owner; + return foe !== undefined && citiesOf(game, foe).length > citiesOf(game, u.owner).length; + } case 'beside_friend': return besideFriend(game, u, at); case 'faithful_land': diff --git a/src/games/blockilization/rules/core.ts b/src/games/blockilization/rules/core.ts index 10b0d24..1b1a238 100644 --- a/src/games/blockilization/rules/core.ts +++ b/src/games/blockilization/rules/core.ts @@ -347,6 +347,8 @@ export function unitSight(game: Game, u: Unit, civ = game.players[u.owner] ? civ const type = UNITS[u.type]; let s = (type?.sight ?? 2) + fromPromotions(u, 'sight'); if (type?.abilities?.includes('extra_sight')) s += 1; + // (Polynesia's Wayfinding: further at sea.) + if (u.embarked && game.players[u.owner] && civOf(game.players[u.owner]).ability.effects.special?.includes('wayfinding')) s += 1; if (type) for (const e of civ) for (const x of e.sight ?? []) if (x.domain === type.domain) s += x.sight; for (const w of wondersBeside(game, u.tile)) s += w.sight ?? 0; return s; @@ -357,7 +359,8 @@ export function maxMoves(game: Game, u: Unit): number { const type = UNITS[u.type]; const p = game.players[u.owner]; if (!type || !p) return 0; - if (u.embarked) return knows(p, 'compass') ? 3 : 2; + // (Denmark's Viking Fury: a move more at sea.) + if (u.embarked) return (knows(p, 'compass') ? 3 : 2) + (civOf(p).ability.effects.special?.includes('viking_fury') ? 1 : 0); const civ = civEffects(game, p); let moves = type.moves + fromPromotions(u, 'moves'); for (const e of civ) for (const m of e.moves ?? []) if (m.domain === type.domain && (!m.classes || m.classes.includes(type.class))) moves += m.moves; @@ -430,6 +433,9 @@ function meetSeen(game: Game, p: Player) { /** A name for the middle of a sentence ("the Sky Pillar"). */ export const inSentence = (name: string) => name.replace(/^The /, 'the '); +/** Gold Spain has for finding a natural wonder (before the game's speed; three times as much for the first to find it). */ +export const SEVEN_CITIES_GOLD = 100; + /** * Natural wonders a civilization has come to know of, however it did (its units' sight, a map from * ruins, satellites), found for good: happier for each (`natureHappiness`), and the first civ to find @@ -443,15 +449,20 @@ function findWonders(game: Game, p: Player) { const found = ((game.found ??= {})[w.id] ??= { tile: t, by: [] }); if (found.by.includes(p.index)) continue; found.by.push(p.index); + // (Spain's Seven Cities of Gold: gold for each, three times as much for the first; and twice the happiness.) + const spain = civOf(p).ability.effects.special ?? []; + const cheer = FOUND_HAPPINESS * (spain.includes('natural_wonders_double') ? 2 : 1); + const treasure = spain.includes('natural_wonder_gold') ? Math.floor(SEVEN_CITIES_GOLD * (found.by.length > 1 ? 1 : 3) * speed(game)) : 0; + p.gold += treasure; if (found.by.length > 1) { - note(game, p.index, { text: `You have found ${inSentence(w.name)}, a natural wonder: +${FOUND_HAPPINESS} happiness for good.`, at: t, kind: 'wonder' }); + note(game, p.index, { text: `You have found ${inSentence(w.name)}, a natural wonder: +${cheer} happiness for good${treasure ? ` and ${treasure} gold` : ''}.`, at: t, kind: 'wonder' }); continue; } const golden = Math.floor(FIRST_FINDER_GOLDEN * speed(game)); const gold = Math.floor((w.finderGold ?? 0) * speed(game)); p.goldenPoints += golden; p.gold += gold; - note(game, p.index, { text: `You are the first to find ${inSentence(w.name)}: +${FOUND_HAPPINESS} happiness for good, ${golden} golden age points${gold ? ` and ${gold} gold` : ''}.`, at: t, kind: 'wonder' }); + note(game, p.index, { text: `You are the first to find ${inSentence(w.name)}: +${cheer} happiness for good, ${golden} golden age points${gold + treasure ? ` and ${gold + treasure} gold` : ''}.`, at: t, kind: 'wonder' }); } } diff --git a/src/games/blockilization/rules/earth.ts b/src/games/blockilization/rules/earth.ts index 1cd4b78..5035234 100644 --- a/src/games/blockilization/rules/earth.ts +++ b/src/games/blockilization/rules/earth.ts @@ -206,6 +206,16 @@ export const TRUE_STARTS: Record = { ottomans: [29, 41], zulu: [31.5, -28.5], inca: [-72, -13.5], + america: [-77, 38.9], + spain: [-3.7, 40.4], + siam: [99.8, 17], + ethiopia: [38.7, 9], + celts: [-3.2, 55.9], + carthage: [10.3, 36.9], + poland: [19.9, 50.1], + netherlands: [4.9, 52.4], + polynesia: [174.8, -36.9], + denmark: [12.6, 55.7], cs_venice: [12.3, 45.4], cs_lisbon: [-9.1, 38.7], cs_kyoto: [135.8, 35], diff --git a/src/games/blockilization/rules/economy.ts b/src/games/blockilization/rules/economy.ts index 250052c..2afbbc4 100644 --- a/src/games/blockilization/rules/economy.ts +++ b/src/games/blockilization/rules/economy.ts @@ -8,7 +8,7 @@ import { cityBeliefEffects, cityReligion, religionEffects } from './faith'; import { alliedLuxuries, alliedStrategics, cityStateBonus } from './citystates'; import { banned, fundedGreatPeople, inForce } from './congress'; import { projectEffects } from './projects'; -import { tradeLuxuries, tradeStrategics } from './diplomacy'; +import { lentLuxuries, tradeLuxuries, tradeStrategics } from './diplomacy'; import { aroundYields, naturalWonderOf, natureHappiness } from './nature'; import { SPEEDS, type City, type Game, type Player, type Unit } from './state'; import { teammates } from './teams'; @@ -188,11 +188,15 @@ export function freshWater(game: Game, t: number): boolean { return neighbours(game.grid, t).some((n) => game.tiles[n].terrain === 'lake' || game.tiles[n].feature === 'oasis' || game.tiles[n].river || !!naturalWonderOf(game.tiles[n])?.freshWater); } +/** Whether a civ has twice the yields and happiness of natural wonders (Spain). */ +const seesWondersDouble = (p: Player) => civOf(p).ability.effects.special?.includes('natural_wonders_double') ?? false; + /** What a tile yields to its owner (before a city's buildings): a natural wonder its own yields, nothing else; land by one that enriches it, more. */ export function tileYields(game: Game, t: number, p: Player | null): Yields { const tile = game.tiles[t]; const wonder = naturalWonderOf(tile); - if (wonder) return { ...wonder.yields }; + // (Spain's Seven Cities of Gold: twice what each gives.) + if (wonder) return p && seesWondersDouble(p) ? Object.fromEntries(Object.entries(wonder.yields).map(([k, v]) => [k, (v ?? 0) * 2])) : { ...wonder.yields }; if (tile.elevation === 'mountain' || tile.feature === 'ice') return {}; let y: Yields = tile.elevation === 'hills' ? { ...HILLS.yields } : { ...TERRAINS[tile.terrain].yields }; if (tile.feature) { @@ -594,15 +598,19 @@ function moodOf(game: Game, p: Player, parts?: { label: string; value: number }[ tell('Base', 9); tell('City-state friends', friends); const lux = luxuries(game, p); - const fromLuxuries = lux.size * (4 + civ.reduce((s, e) => s + (e.happinessPerLuxury ?? 0), 0)); + const perLuxury = 4 + civ.reduce((s, e) => s + (e.happinessPerLuxury ?? 0), 0); + const fromLuxuries = lux.size * perLuxury; // Cultural Diplomacy: luxuries from city-state allies half again as cheering. const own = has(civ, 'cs_resources_double') ? ownLuxuries(game, p) : null; const allied = own ? new Set(alliedLuxuries(game, p).filter((r) => lux.has(r) && !own.has(r))).size * 2 : 0; - good += fromLuxuries + allied; + // The Netherlands: a luxury traded away (the last of it) still half as cheering. + const traded = has(civ, 'luxuries_traded_half') ? [...lentLuxuries(game, p).sent.keys()].filter((r) => !lux.has(r) && !banned(game, r)).length * (perLuxury / 2) : 0; + good += fromLuxuries + allied + traded; tell(`Luxuries (${lux.size} kind${lux.size === 1 ? '' : 's'})`, fromLuxuries + allied); + tell('Luxuries traded away', traded); const big = has(civ, 'happiness_per_10_pop') ? cities.reduce((s, c) => s + Math.floor(c.pop / 10), 0) : 0; const faith = religionHappiness(game, p); - const nature = natureHappiness(game, p.index); + const nature = natureHappiness(game, p.index) * (seesWondersDouble(p) ? 2 : 1); good += big + faith + nature; tell('Large cities', big); tell('Religion', faith); diff --git a/src/games/blockilization/rules/effects.ts b/src/games/blockilization/rules/effects.ts index 5f6ac62..ad7387e 100644 --- a/src/games/blockilization/rules/effects.ts +++ b/src/games/blockilization/rules/effects.ts @@ -70,6 +70,8 @@ export type CombatWhen = | 'vs_barbarians' /** Fighting a city-state's units or its city. */ | 'vs_city_states' + /** Fighting a civ with more cities than its own (units or a city). */ + | 'vs_more_cities' /** Another of its owner's military units is next to it. */ | 'beside_friend' /** In its own land around a city that follows its owner's religion, or an enemy's that does. */ diff --git a/src/games/blockilization/rules/game.ts b/src/games/blockilization/rules/game.ts index a996aec..d7a89f0 100644 --- a/src/games/blockilization/rules/game.ts +++ b/src/games/blockilization/rules/game.ts @@ -27,7 +27,7 @@ import { breakFree, release, vassalsTurn } from './vassals'; import { checkEurekas, killDeeds } from './eurekas'; import { clanById, clanHarmed, clanHooks, clanProblem, dealWithClan, type ClanAct } from './clans'; import { merge, mergeProblem, shrink, sizeOf, unitName } from './armies'; -import { canResearch, eraOfCol, ERAS, TECHS } from './techs'; +import { canResearch, eraOfCol, ERA_NAMES, ERAS, TECHS } from './techs'; import { eraStartOf, scenarioOf, startEraOf } from './starts'; import { startSequence, waitsFor, warBegun } from './turns'; import { climateTurn } from './climate'; @@ -364,6 +364,12 @@ export function foundCity(game: Game, owner: number, t: number): City { p.freeBuildings![b] = left - 1; if (!c.buildings.some((x) => isBuilding(x, b))) c.buildings.push(unitFor(p.civ, b, BUILDINGS)); } + // Carthage: a free Lighthouse (its Cothon) in a city by the sea, with no upkeep. + if (civOf(p).ability.effects.special?.includes('free_coastal_lighthouse') && coastal(game, c)) { + const id = unitFor(p.civ, 'lighthouse', BUILDINGS); + c.buildings.push(id); + (c.free ??= []).push(id); + } if (startEraOf(game.settings) > 0 || scenarioOf(game.settings)) foundedInEra(game, p, c, first); assignCitizens(game, c); // A bot's new city starts on a Warrior; a person's asks what to build (Civ V's way: a Warrior in the Middle Ages is no help). @@ -585,6 +591,7 @@ ruinHooks.onRuin = (game, u) => { /** A tech learned: what it starts (Babylon's free scientist, a free tech's choice). */ export function learn(game: Game, p: Player, id: string) { + const era = eraOf(p); if (id === 'future_tech') p.futureTechs++; else if (!p.techs.includes(id)) p.techs.push(id); delete p.research[id]; @@ -595,6 +602,12 @@ export function learn(game: Game, p: Player, id: string) { if (id === 'future_tech' && !p.researching && !Object.keys(TECHS).some((t) => t !== 'future_tech' && canResearch(new Set(p.techs), t))) p.researching = 'future_tech'; note(game, p.index, { text: `You have discovered ${TECHS[id].name}.`, kind: 'tech' }); if (id === 'writing' && has(civEffects(game, p), 'scientist_on_writing')) greatPersonBorn(game, p, 'scientist'); + // Poland's Solidarity: a free social policy for each new era. + const eras = eraOf(p) - era; + if (eras > 0 && civOf(p).ability.effects.special?.includes('policy_each_era')) { + for (let n = 0; n < eras; n++) p.culture += policyCost(game, p, p.policies.length + n); + note(game, p.index, { text: `You have entered the ${ERA_NAMES[ERAS[eraOf(p)]]}: Solidarity gives you ${eras > 1 ? `${eras} free social policies` : 'a free social policy'}.`, kind: 'good' }); + } updateVisibility(game, p); } diff --git a/src/games/blockilization/rules/movement.ts b/src/games/blockilization/rules/movement.ts index 9286b45..c3a9e38 100644 --- a/src/games/blockilization/rules/movement.ts +++ b/src/games/blockilization/rules/movement.ts @@ -55,10 +55,14 @@ export function civiliansAt(game: Game, t: number): Unit[] { export { ALL }; -/** Whether a land unit of this owner may step onto water here (embarking: Optics). */ -const canEmbark = (game: Game, owner: number) => knows(game.players[owner], 'optics'); -/** Whether ocean is open to embarked units and early ships (Astronomy). */ +/** Whether a civ has a special ability (its civilization's own, by name). */ +const civCan = (game: Game, owner: number, special: string) => civOf(game.players[owner]).ability.effects.special?.includes(special) ?? false; +/** Whether a land unit of this owner may step onto water here (embarking: Optics; Polynesia's from the start). */ +export const canEmbark = (game: Game, owner: number) => knows(game.players[owner], 'optics') || civCan(game, owner, 'wayfinding'); +/** Whether ocean is open to early ships (Astronomy). */ const canOcean = (game: Game, owner: number) => knows(game.players[owner], 'astronomy'); +/** Whether ocean is open to this owner's embarked units (Astronomy; Polynesia's from the start). */ +export const canCrossOcean = (game: Game, owner: number) => canOcean(game, owner) || civCan(game, owner, 'wayfinding'); /** Movement points to step from `a` to its neighbour `b` (Infinity: can't). Ignores other units. */ export function stepCost(game: Game, u: Unit, a: number, b: number): number { @@ -76,13 +80,14 @@ export function stepCost(game: Game, u: Unit, a: number, b: number): number { } if (type.domain === 'air') return 1; // Land. + // Embarking or disembarking takes the rest of the turn (a single move for Denmark's); moving at sea, one a tile. + const landing = civCan(game, u.owner, 'viking_fury') ? 1 : ALL; if (water) { if (!canEmbark(game, u.owner)) return Infinity; - if (to.terrain === 'ocean' && !canOcean(game, u.owner)) return Infinity; - // Embarking or disembarking takes the rest of the turn; moving at sea, one a tile. - return TERRAINS[from.terrain].water ? 1 : ALL; + if (to.terrain === 'ocean' && !canCrossOcean(game, u.owner)) return Infinity; + return TERRAINS[from.terrain].water ? 1 : landing; } - if (TERRAINS[from.terrain].water) return ALL; // disembarking ends the move + if (TERRAINS[from.terrain].water) return landing; // disembarking ends the move // The Great Wall: an enemy's land costs every move (until its owner knows Dynamite). if (to.owner >= 0 && to.owner !== u.owner && atWar(game, u.owner, to.owner) && greatWall(game, to.owner)) return ALL; // Roads (both ends) and railroads; for the Iroquois, the forests and jungles of their own land. diff --git a/src/games/blockilization/rules/trade.ts b/src/games/blockilization/rules/trade.ts index 4ae006f..a46eb8f 100644 --- a/src/games/blockilization/rules/trade.ts +++ b/src/games/blockilization/rules/trade.ts @@ -118,6 +118,8 @@ export function routeYield(game: Game, p: Player, r: Route): { gold: number; sci const civ = civEffects(game, p); let gold = 3 + Math.floor(to.pop / 2) + (r.sea ? 2 : 0) + (has(civ, 'trade_gold_2') ? 2 : 0); if (r.sea && has(civ, 'sea_trade_gold_2')) gold += 2; + // (The Netherlands' East India Company: two more, Treasure Fleets' or not.) + if (r.sea && has(civ, 'dutch_sea_trade')) gold += 2; if (them.cityState && has(civ, 'cs_trade_gold_3')) gold += 3; if (p.ideology && them.ideology === p.ideology && has(civ, 'ideology_trade_gold')) gold += 3; const science = Math.max(0, Math.floor((them.techs.length - p.techs.length) / 3)); diff --git a/src/games/blockilization/rules/units.ts b/src/games/blockilization/rules/units.ts index 18a9996..4cf0321 100644 --- a/src/games/blockilization/rules/units.ts +++ b/src/games/blockilization/rules/units.ts @@ -63,6 +63,14 @@ export type Ability = | 'discover_tech' | 'kill_heal' | 'jungle_fighter' + /** Fighting in its own land (Ethiopia's Mehal Sefari). */ + | 'homeland' + /** Fighting outside its own land (the Celts' Pictish Warrior). */ + | 'foreign_lands' + /** Enemies next to it fight worse (Polynesia's Maori Warrior). */ + | 'haka' + /** Attacks from the sea and across rivers as from the land (Denmark's Berserker). */ + | 'amphibious' | 'political_treatise' | 'withdraw'; @@ -208,6 +216,16 @@ export const UNIT_LIST: UnitType[] = [ U({ id: 'janissary', name: 'Janissary', class: 'gun', cost: 150, strength: 26, moves: 2, tech: 'gunpowder', obsolete: 'rifling', upgrade: 'rifleman', civ: 'ottomans', replaces: 'musketman', abilities: ['kill_heal'] }), U({ id: 'impi', name: 'Impi', class: 'melee', cost: 90, strength: 16, moves: 3, tech: 'civil_service', obsolete: 'metallurgy', upgrade: 'lancer', civ: 'zulu', replaces: 'pikeman', abilities: ['bonus_vs_mounted'] }), U({ id: 'slinger', name: 'Slinger', class: 'ranged', cost: 35, strength: 5, ranged: 7, range: 2, moves: 2, tech: 'archery', obsolete: 'machinery', upgrade: 'composite_bowman', civ: 'inca', replaces: 'archer' }), + U({ id: 'minuteman', name: 'Minuteman', class: 'gun', cost: 150, strength: 24, moves: 2, tech: 'gunpowder', obsolete: 'rifling', upgrade: 'rifleman', civ: 'america', replaces: 'musketman', abilities: ['ignore_terrain'] }), + U({ id: 'conquistador', name: 'Conquistador', class: 'mounted', cost: 120, strength: 20, moves: 4, tech: 'chivalry', obsolete: 'military_science', upgrade: 'cavalry', resource: 'horses', civ: 'spain', replaces: 'knight', abilities: ['no_terrain_defense', 'withdraw', 'extra_sight'] }), + U({ id: 'naresuans_elephant', name: "Naresuan's Elephant", class: 'mounted', cost: 120, strength: 25, moves: 3, tech: 'chivalry', obsolete: 'military_science', upgrade: 'cavalry', civ: 'siam', replaces: 'knight', abilities: ['no_terrain_defense'] }), + U({ id: 'mehal_sefari', name: 'Mehal Sefari', class: 'gun', cost: 225, strength: 34, moves: 2, tech: 'rifling', obsolete: 'replaceable_parts', upgrade: 'great_war_infantry', civ: 'ethiopia', replaces: 'rifleman', abilities: ['homeland'] }), + U({ id: 'pictish_warrior', name: 'Pictish Warrior', class: 'melee', cost: 56, strength: 11, moves: 2, tech: 'bronze_working', obsolete: 'civil_service', upgrade: 'pikeman', civ: 'celts', replaces: 'spearman', abilities: ['bonus_vs_mounted', 'foreign_lands'] }), + U({ id: 'quinquereme', name: 'Quinquereme', class: 'naval_melee', domain: 'sea', cost: 56, strength: 13, moves: 4, tech: 'sailing', obsolete: 'astronomy', upgrade: 'caravel', civ: 'carthage', replaces: 'trireme', abilities: ['coast_only'] }), + U({ id: 'winged_hussar', name: 'Winged Hussar', class: 'mounted', cost: 185, strength: 30, moves: 5, tech: 'metallurgy', obsolete: 'combined_arms', upgrade: 'anti_tank_gun', resource: 'horses', civ: 'poland', replaces: 'lancer', abilities: ['no_terrain_defense', 'penalty_vs_cities', 'bonus_vs_mounted'] }), + U({ id: 'sea_beggar', name: 'Sea Beggar', class: 'naval_melee', domain: 'sea', cost: 150, strength: 27, moves: 5, tech: 'navigation', obsolete: 'combustion', upgrade: 'destroyer', civ: 'netherlands', replaces: 'privateer', abilities: ['heal_adjacent'] }), + U({ id: 'maori_warrior', name: 'Maori Warrior', class: 'melee', cost: 40, strength: 8, moves: 2, obsolete: 'metal_casting', upgrade: 'swordsman', civ: 'polynesia', replaces: 'warrior', abilities: ['haka'] }), + U({ id: 'berserker', name: 'Berserker', class: 'melee', cost: 120, strength: 21, moves: 3, tech: 'steel', obsolete: 'gunpowder', upgrade: 'musketman', resource: 'iron', civ: 'denmark', replaces: 'longswordsman', abilities: ['amphibious'] }), ]; export const UNITS: Record = Object.fromEntries(UNIT_LIST.map((u) => [u.id, u])); diff --git a/src/games/blockilization/tests/cases.ts b/src/games/blockilization/tests/cases.ts index 593d01f..96f95be 100644 --- a/src/games/blockilization/tests/cases.ts +++ b/src/games/blockilization/tests/cases.ts @@ -10,7 +10,7 @@ import { PERSONALITIES } from '../rules/ai/personality'; import { UNITS } from '../rules/units'; import { CIV_SYMBOL, glyphPaths } from '../client/icons'; import { atWar, canStand, cityAt, createGame, maxMoves, seesUnit, techCost, unitSight, updateAllVisibility } from '../rules/core'; -import { assignCitizens, cityEffects, cityYields, workedYields, connected, dissent, foodKept, freshWater, goldUpkeep, growthThreshold, greatCost, greatPeopleBonus, happiness, policyCost, purchaseCost, strategic, tileCultureCost, tileYields, UNHAPPINESS_PER_CITY, weighing, workable } from '../rules/economy'; +import { assignCitizens, cityEffects, cityYields, workedYields, connected, dissent, foodKept, freshWater, goldUpkeep, growthThreshold, greatCost, greatPeopleBonus, happiness, policyCost, purchaseCost, strategic, tileCultureCost, tileGoldCost, tileYields, UNHAPPINESS_PER_CITY, weighing, workable } from '../rules/economy'; import { faithCost, faithTurn, faithUnit, foundReligion, maxReligions, prophetCost, religionsLeft, spreadsOf } from '../rules/faith'; import { ANARCHY_TURNS, apply, applyOnce, blockers, canBuild, workTurns, constructible, canChooseIdeology, ideologySwitch, SWITCH_DISSENT, canDig, canFound, checkVictory, endTurn, faithPurchases, healing, learn, plunder, productionToward, score, shareResearch, trainable, trainOptions, upgradeCost, upgradeTo, wellFormed, type Order } from '../rules/game'; import { colOf, distance, line, neighbour, neighbours, rowOf, tileAt, within } from '../rules/hex'; @@ -34,7 +34,7 @@ import { previewAttack, previewCityFire } from '../rules/preview'; import { promotionsDue } from '../rules/promotions'; import { BELIEF_LIST } from '../rules/religion'; import { campCleared, QUEST_REWARD, questsFor, questsOf, questsTurn, type Quest, type QuestKind } from '../rules/quests'; -import { allyOf, cannotBully, cannotCoup, cityStateTurn, coupChance, influenceFall, TRIBUTE_COST, tributeGold, tributeTurns } from '../rules/citystates'; +import { allyOf, cannotBully, cannotCoup, cityStateBonus, cityStateTurn, coupChance, influenceFall, TRIBUTE_COST, tributeGold, tributeTurns } from '../rules/citystates'; import { banned, cannotPropose, delegates, delegateSources, embargoed, inForce, propose as proposeResolution, proposers, sessionTurns, vote as castVote } from '../rules/congress'; import { replayAt, replayEnd, type ReplayEvent } from '../rules/replay'; import { MAP_SIZES, SPEEDS, TURN_LIMITS, type Game, type MapSize, type Settings } from '../rules/state'; @@ -78,7 +78,7 @@ import { botAnswer, EMOTES, isEmote, isPing, moodOf, toneOf } from '../rules/cha import { isMilitary } from '../rules/units'; import { civEffects, has } from '../rules/core'; import { bribeTurns, clanCost, clansOf, clansTurn, clanUnit, hireRest, inciteTurns, newClan, raidTarget, SETTLE, spares } from '../rules/clans'; -import { CLAN_STATES, speed } from '../rules/core'; +import { CLAN_STATES, SEVEN_CITIES_GOLD, speed } from '../rules/core'; import { barbarianTurn } from '../rules/barbarians'; import { clans as botClans } from '../rules/ai/clans'; import { die } from '../rules/combat'; @@ -5420,6 +5420,210 @@ test('the Inca: a hill is a single move; roads on hills cost no upkeep and half eq(roads('inca', true), 0, 'none on hills'); }); +test('America: +1 sight for land units; tiles cost half the gold to buy', () => { + const { game, at } = blank(['america', 'egypt']); + const mine = unit(game, 'warrior', 0, at(4, 4)); + const theirs = unit(game, 'warrior', 1, at(16, 4)); + eq(unitSight(game, mine) - unitSight(game, theirs), 1, 'a tile further'); + const cost = (civ: string) => { + const w = blank([civ, 'egypt']); + const c = city(w.game, 0, w.at(6, 6)); + return tileGoldCost(w.game, c, w.at(6, 9)); + }; + ok(Math.abs(cost('america') / cost('egypt') - 0.5) < 0.02, `half the gold (${cost('america')} against ${cost('egypt')})`); +}); + +test('Spain: natural wonders give twice the yields and happiness; gold for finding each, three times as much for the first', () => { + const { game, at } = blank(['spain', 'egypt']); + const [spain, egypt] = game.players; + city(game, 0, at(3, 8)); + city(game, 1, at(21, 8)); + const peak = at(12, 8); + naturalWonder(game, peak, 'gilded_peak'); + const moods = [happiness(game, spain), happiness(game, egypt)]; + unit(game, 'scout', 1, at(14, 8)); + unit(game, 'scout', 0, at(10, 8)); + eq(game.found?.gilded_peak?.by.join(), '1,0', 'found by Egypt, then Spain'); + eq(happiness(game, spain) - moods[0], 2, 'twice as happy for it'); + eq(happiness(game, egypt) - moods[1], 1, 'Egypt as usual'); + eq(spain.gold, Math.floor(SEVEN_CITIES_GOLD * speed(game)), 'gold for finding it second'); + const mine = tileYields(game, peak, spain); + const theirs = tileYields(game, peak, egypt); + for (const k of Object.keys(theirs) as (keyof typeof theirs)[]) eq(mine[k], 2 * (theirs[k] ?? 0), `twice the ${k}`); + const first = blank(['spain', 'egypt']); + naturalWonder(first.game, first.at(12, 8), 'gilded_peak'); + unit(first.game, 'scout', 0, first.at(10, 8)); + eq(first.game.players[0].gold, Math.floor(SEVEN_CITIES_GOLD * 3 * speed(first.game)) + Math.floor(100 * speed(first.game)), 'three times as much first (and the Gilded Peak’s own gold)'); +}); + +test('Siam: half again as much food, culture and faith from city-state friends', () => { + const gifts = (civ: string) => { + const { game, at } = blank([civ, 'egypt'], { cityStates: 3 }); + const css = game.players.filter((x) => x.cityState); + (['maritime', 'cultured', 'religious'] as const).forEach((k, i) => { + css[i].cityState!.kind = k; + city(game, css[i].index, at(6 + i * 6, 12)); + }); + const p = game.players[0]; + city(game, 0, at(3, 3)); + for (const cs of css) p.influence[cs.index] = 40; + const food = cityStateBonus(game, p).food; + [p.culture, p.faith] = [0, 0]; + cityStateTurn(game); + return { food, culture: p.culture, faith: p.faith }; + }; + const siam = gifts('siam'); + const egypt = gifts('egypt'); + eq(egypt.food, 1, 'a maritime friend: +1 food'); + eq(siam.food, 2, 'half again, rounded up, for Siam'); + eq(siam.culture, Math.ceil(egypt.culture * 1.5), 'culture'); + eq(siam.faith, Math.ceil(egypt.faith * 1.5), 'faith'); + ok(egypt.culture > 0 && egypt.faith > 0, 'from cultured and religious friends'); +}); + +test('Ethiopia: +20% against civs with more cities than its own', () => { + const { game, at } = blank(['ethiopia', 'egypt']); + war(game, 0, 1); + city(game, 0, at(3, 3)); + city(game, 1, at(20, 3)); + const mine = unit(game, 'warrior', 0, at(10, 9)); + const foe = unit(game, 'warrior', 1, at(11, 9)); + near(strength(game, mine, 'attack', foe, mine.tile), 8, 'as many cities: none'); + city(game, 1, at(20, 14)); + near(strength(game, mine, 'attack', foe, mine.tile), 8 * 1.2, 'they have more'); + near(strength(game, foe, 'attack', mine, foe.tile), 8, 'not for them'); +}); + +test('the Celts: +1 faith from each forest their cities work', () => { + const faith = (civ: string) => { + const { game, at } = blank([civ, 'egypt']); + const c = city(game, 0, at(6, 6)); + const t = neighbours(game.grid, c.tile)[0]; + game.tiles[t].feature = 'forest'; + return workedYields(game, c, t).faith ?? 0; + }; + eq(faith('celts') - faith('egypt'), 1, 'a faith more'); +}); + +test('Carthage: a free Lighthouse (its Cothon), with no upkeep, in every coastal city it founds', () => { + const found = (civ: string, coast: boolean) => { + const { game, at } = blank([civ, 'egypt']); + if (coast) game.tiles[neighbours(game.grid, at(6, 6))[0]].terrain = 'coast'; + const c = city(game, 0, at(6, 6)); + return { buildings: c.buildings, upkeep: goldUpkeep(game, game.players[0]).buildings }; + }; + const carthage = found('carthage', true); + ok(carthage.buildings.includes('cothon'), 'a Cothon by the sea'); + eq(carthage.upkeep, 0, 'that costs nothing'); + ok(!found('carthage', false).buildings.includes('cothon'), 'none inland'); + ok(!found('egypt', true).buildings.some((b) => b === 'lighthouse'), 'none for others'); +}); + +test('Poland: a free social policy on entering each new era', () => { + const classical = TECH_LIST.find((t) => t.col > 2 && t.col <= 4)!.id; + const run = (civ: string) => { + const { game } = blank([civ, 'egypt']); + const p = game.players[0]; + p.culture = 0; + learn(game, p, 'pottery'); + const ancient = p.culture; + const cost = policyCost(game, p); + learn(game, p, classical); + return { ancient, classical: p.culture, cost }; + }; + const poland = run('poland'); + eq(poland.ancient, 0, 'nothing within the Ancient Era'); + eq(poland.classical, poland.cost, 'a policy’s culture on reaching the Classical'); + eq(run('egypt').classical, 0, 'nothing for others'); +}); + +test('the Netherlands: +2 gold from sea trade routes; a luxury traded away keeps half its happiness', () => { + const { game, at } = blank(['netherlands', 'egypt']); + const mine = city(game, 0, at(3, 3), { pop: 4 }); + const theirs = city(game, 1, at(12, 3), { pop: 4 }); + const gold = (p: number, sea: boolean) => routeYield(game, game.players[p], { from: p ? theirs.id : mine.id, to: p ? mine.id : theirs.id, turns: 10, sea }).gold; + eq(gold(0, true) - gold(0, false) - (gold(1, true) - gold(1, false)), 2, 'two more by sea'); + const traded = (civ: string) => { + const w = blank([civ, 'babylon']); + const c = city(w.game, 0, w.at(3, 3)); + city(w.game, 1, w.at(20, 3)); + Object.assign(w.game.tiles[neighbours(w.game.grid, c.tile)[0]], { resource: 'silver', improvement: 'mine' }); + const p = w.game.players[0]; + const before = happiness(w.game, p); + makeDeal(w.game, { from: 0, to: 1, items: [{ kind: 'luxury', from: 0, resource: 'silver' }] }); + return before - happiness(w.game, p); + }; + eq(traded('egypt'), 4, 'others lose all of it'); + eq(traded('netherlands'), 2, 'the Dutch half'); + const polder = city(game, 0, at(6, 12)); + game.tiles[polder.tile].river = true; + const [marsh, flood] = neighbours(game.grid, polder.tile); + game.tiles[marsh].feature = 'marsh'; + Object.assign(game.tiles[flood], { terrain: 'desert', feature: 'floodplains' }); + const before = [workedYields(game, polder, marsh).food ?? 0, workedYields(game, polder, flood).food ?? 0]; + polder.buildings.push('polder'); + eq((workedYields(game, polder, marsh).food ?? 0) - before[0], 2, 'the Polder: +2 food from a marsh'); + eq((workedYields(game, polder, flood).food ?? 0) - before[1], 1, '+1 from flood plains'); +}); + +test('Polynesia: land units take to the sea and cross the ocean from the start, and see further there', () => { + const step = (civ: string, terrain: 'coast' | 'ocean') => { + const { game, at } = blank([civ, 'egypt']); + game.tiles[at(6, 6)].terrain = terrain; + const u = unit(game, 'warrior', 0, at(5, 6)); + return stepCost(game, u, at(5, 6), at(6, 6)); + }; + ok(Number.isFinite(step('polynesia', 'coast')) && Number.isFinite(step('polynesia', 'ocean')), 'onto the coast and the ocean'); + eq(step('egypt', 'coast'), Infinity, 'not others before Optics'); + const { game, at } = blank(['polynesia', 'egypt']); + for (const t of [at(6, 6), at(16, 6)]) game.tiles[t].terrain = 'ocean'; + const mine = unit(game, 'warrior', 0, at(6, 6), { embarked: true }); + const theirs = unit(game, 'warrior', 1, at(16, 6), { embarked: true }); + eq(unitSight(game, mine) - unitSight(game, theirs), 1, 'a tile further at sea'); +}); + +test('Denmark: taking to the sea and landing take a single move; a move more at sea', () => { + const steps = (civ: string) => { + const { game, at } = blank([civ, 'egypt']); + game.players[0].techs.push('optics'); + game.tiles[at(6, 6)].terrain = 'coast'; + const u = unit(game, 'warrior', 0, at(5, 6)); + const out = [stepCost(game, u, at(5, 6), at(6, 6)), stepCost(game, u, at(6, 6), at(5, 6))]; + u.embarked = true; + return { out, moves: maxMoves(game, u) }; + }; + eq(steps('denmark').out.join(), '1,1', 'a move each way'); + ok(steps('egypt').out.every((c) => c >= 99), 'every move for others'); + eq(steps('denmark').moves - steps('egypt').moves, 1, 'a move more at sea'); +}); + +test('the new unique units: the Mehal Sefari at home, Pictish Warriors abroad, the Maori war dance, Berserkers from the sea', () => { + const { game, at } = blank(['ethiopia', 'celts']); + war(game, 0, 1); + const home = city(game, 0, at(3, 8)); + city(game, 1, at(21, 8)); + const inLand = neighbours(game.grid, home.tile)[0]; + const sefari = unit(game, 'mehal_sefari', 0, inLand); + const foe = unit(game, 'rifleman', 1, neighbours(game.grid, inLand).find((t) => t !== home.tile && game.tiles[t].owner !== 1 && !game.units.some((u) => u.tile === t))!); + near(strength(game, sefari, 'attack', foe, sefari.tile), 34 * 1.25, 'Mehal Sefari: +25% in its own land'); + const away = unit(game, 'mehal_sefari', 0, at(12, 14)); + near(strength(game, away, 'attack', unit(game, 'rifleman', 1, at(13, 14)), away.tile), 34, 'none away'); + const pict = unit(game, 'pictish_warrior', 1, at(12, 2)); + near(strength(game, pict, 'attack', unit(game, 'warrior', 0, at(13, 2)), pict.tile), 11 * 1.2, 'Pictish Warrior: +20% outside its land'); + const w = blank(['polynesia', 'denmark']); + war(w.game, 0, 1); + const maori = unit(w.game, 'maori_warrior', 0, w.at(10, 8)); + const dane = unit(w.game, 'longswordsman', 1, w.at(11, 8)); + const far = unit(w.game, 'longswordsman', 1, w.at(16, 8)); + near(strength(w.game, dane, 'attack', maori, dane.tile), 21 * 0.9, 'beside a Maori Warrior: -10%'); + near(strength(w.game, far, 'attack', unit(w.game, 'warrior', 0, w.at(17, 8)), far.tile), 21, 'none further off'); + near(strength(w.game, maori, 'attack', dane, maori.tile), 8, 'not for the Maori'); + const berserker = unit(w.game, 'berserker', 1, w.at(10, 14), { embarked: true }); + const sword = unit(w.game, 'longswordsman', 1, w.at(14, 14), { embarked: true }); + near(strength(w.game, berserker, 'attack', unit(w.game, 'warrior', 0, w.at(11, 14)), berserker.tile), 21, 'Berserker: no penalty from the sea'); + near(strength(w.game, sword, 'attack', unit(w.game, 'warrior', 0, w.at(15, 14)), sword.tile), 21 * 0.5, 'half for others'); +}); + // ------------------------------------------------------------------------------------------------- // A living world: seasons, disasters, the rising sea // ------------------------------------------------------------------------------------------------- diff --git a/src/games/blockilization/tests/sweep.ts b/src/games/blockilization/tests/sweep.ts index c3c5686..9507800 100644 --- a/src/games/blockilization/tests/sweep.ts +++ b/src/games/blockilization/tests/sweep.ts @@ -111,7 +111,7 @@ function sweepOf(civs: string[]) { claim(game, a, t); }); }); - for (const [i, other] of cs.entries()) city(game, other.index, at(4 + i * 12, 24), { pop: 5 }); + for (const [i, other] of cs.entries()) city(game, other.index, at(4 + i * 8, 24), { pop: 5 }); // Everyone's religion holds every belief (the founder's and its followers' beliefs, all at work). majors.forEach((p, i) => { const id = `r${i}`; diff --git a/src/games/blockilization/tools/portraits.mjs b/src/games/blockilization/tools/portraits.mjs index f53c549..3766e4f 100644 --- a/src/games/blockilization/tools/portraits.mjs +++ b/src/games/blockilization/tools/portraits.mjs @@ -362,6 +362,150 @@ const BUSTS = [ for (let y = 0; y < 6; y += 2) for (let x = -8; x < 8; x += 2) m.box([x, y, 4], [x + 1, y + 1, 5], (x + y) % 4 ? 'gold' : 'redDark'); }, }), + bust('l_america', { + robe: 'blueDark', + skin: 'skin3', + hair: 'hairWhite', + extra: (m) => { + // Powdered hair rolled at the sides and tied back with a black ribbon; a blue coat with buff facings, a white stock and gold epaulettes. + m.box([-7, 12, -3], [-5, 14, 1], 'hairWhite').box([5, 12, -3], [7, 14, 1], 'hairWhite'); + m.box([-1, 11, -7], [1, 17, -5], 'hairWhite').box([-2, 15, -8], [2, 17, -7], 'black'); + m.box([-5, 0, 4], [-2, 7, 5], 'sand').box([2, 0, 4], [5, 7, 5], 'sand'); + m.box([-2, 5, 4], [2, 9, 5], 'white'); + m.box([-11, 6, -3], [-8, 8, 3], 'gold').box([8, 6, -3], [11, 8, 3], 'gold'); + for (let y = 1; y < 5; y += 2) m.set(-2, y, 5, 'gold').set(1, y, 5, 'gold'); + }, + }), + bust('l_spain', { + robe: 'crimson', + skin: 'skin3', + hair: 'orange', + extra: (m) => { + // A white veil framing the face and falling to the shoulders, a gold crown on it; a gold cross on the gown. + m.box([-6, 16, -6], [6, 21, 4], 'white').box([-6, 19, 4], [6, 21, 5], 'white'); + m.box([-6, 8, -6], [-5, 16, 4], 'white').box([5, 8, -6], [6, 16, 4], 'white').box([-6, 7, -7], [6, 19, -6], 'white'); + m.box([-5, 21, -5], [5, 23, 5], 'gold'); + for (const x of [-5, -1, 3]) m.box([x, 23, 3], [x + 2, 25, 5], 'gold'); + m.box([-1, 21, 5], [1, 22, 6], 'redDark'); + m.box([-9, 6, -4], [9, 7, 5], 'gold'); + m.box([-1, 0, 4], [1, 5, 5], 'gold').box([-2, 3, 4], [2, 4, 5], 'gold'); + }, + }), + bust('l_siam', { + robe: 'white', + skin: 'skin2', + nose: 'skin4', + hair: 'black', + extra: (m) => { + // The chada: a gold crown rising in tiers to a spire, wings over the ears; a broad jewelled gold collar. + m.box([-6, 17, -6], [6, 19, 6], 'gold'); + m.box([-5, 19, -5], [5, 21, 5], 'gold').box([-4, 21, -4], [4, 23, 4], 'sash').box([-3, 23, -3], [3, 25, 3], 'gold'); + m.box([-2, 25, -2], [2, 27, 2], 'sash').box([-1, 27, -1], [1, 32, 1], 'gold'); + for (const x of [-4, -1, 2]) m.set(x, 18, 6, 'jade'); + m.box([-7, 13, -2], [-6, 18, 1], 'gold').box([6, 13, -2], [7, 18, 1], 'gold'); + m.box([-9, 5, -4], [9, 8, 5], 'gold'); + for (const x of [-7, -4, -1, 2, 5]) m.set(x, 6, 5, x % 2 ? 'redDark' : 'jade'); + }, + }), + bust('l_ethiopia', { + robe: 'khaki', + skin: 'skin4', + nose: 'horseDark', + hair: 'black', + beard: 'black', + extra: (m) => { + // A peaked officer's cap with a gold badge; a dress uniform with a sash and rows of medals. + m.box([-6, 18, -6], [6, 21, 5], 'khaki').box([-6, 17, -6], [6, 18, 5], 'black'); + m.box([-5, 17, 5], [5, 18, 7], 'black').box([-1, 19, 5], [1, 21, 6], 'gold'); + for (let y = 0; y < 6; y++) m.box([4 - y * 2, y, 4], [6 - y * 2, y + 1, 5], 'green'); + for (const [x, c] of [[2, 'gold'], [3, 'red'], [4, 'green'], [5, 'gold']]) m.set(x, 5, 5, c).set(x, 4, 5, c); + m.box([-9, 6, -4], [-7, 8, 3], 'gold').box([7, 6, -4], [9, 8, 3], 'gold'); + }, + }), + bust('l_celts', { + robe: 'green', + skin: 'skin3', + hair: 'orange', + extra: (m) => { + // Long red hair falling past the shoulders; blue woad on the cheeks; a gold torc; a cloak in a check. + m.box([-7, 3, -6], [-5, 18, 2], 'orange').box([5, 3, -6], [7, 18, 2], 'orange').box([-6, 2, -7], [6, 19, -5], 'orange'); + for (const [x, y] of [[-4, 10], [-4, 11], [3, 10], [3, 11]]) m.set(x, y, 4, 'blue'); + m.box([-4, 8, 3], [4, 9, 6], 'gold').box([-4, 8, 5], [-3, 10, 6], 'gold').box([3, 8, 5], [4, 10, 6], 'gold'); + for (let y = 0; y < 7; y++) for (let x = -9; x < 9; x++) if ((x + 9) % 4 === 0 || y % 4 === 0) m.set(x, y, 4, (x + y) % 2 ? 'redDark' : 'cypress'); + }, + }), + bust('l_carthage', { + robe: 'purple', + skin: 'skin2', + nose: 'skin4', + hair: 'black', + extra: (m) => { + // Curled black hair falling down her back under a gold diadem; gold earrings; a crescent of gold on a purple robe edged in gold. + m.box([-7, 6, -6], [-5, 17, 1], 'black').box([5, 6, -6], [7, 17, 1], 'black').box([-6, 5, -7], [6, 19, -5], 'black'); + for (const [x, y] of [[-7, 8], [-7, 11], [-7, 14], [6, 9], [6, 12], [6, 15]]) m.set(x, y, 1, 'black'); + m.box([-6, 17, -6], [6, 18, 5], 'gold').box([-1, 17, 5], [1, 19, 6], 'gold'); + m.box([-7, 9, 0], [-6, 11, 1], 'gold').box([6, 9, 0], [7, 11, 1], 'gold'); + m.box([-9, 6, -4], [9, 7, 5], 'gold'); + m.box([-2, 3, 4], [2, 4, 5], 'gold').set(-2, 4, 4, 'gold').set(1, 4, 4, 'gold'); + }, + }), + bust('l_poland', { + robe: 'red', + skin: 'skin3', + hair: 'hair', + beard: 'hair', + extra: (m) => { + // Long hair and a full beard under a closed gold crown topped with a cross; an ermine collar on a red robe. + m.box([-7, 8, -6], [-5, 16, 2], 'hair').box([5, 8, -6], [7, 16, 2], 'hair').box([-6, 7, -7], [6, 18, -5], 'hair'); + m.box([-5, 19, -5], [5, 21, 5], 'gold'); + for (const [x, z] of [[-5, 3], [-1, 3], [3, 3], [-5, -5], [3, -5]]) m.box([x, 21, z], [x + 2, 23, z + 2], 'gold'); + m.box([-1, 21, -4], [1, 25, 4], 'gold').box([-1, 25, -1], [1, 28, 1], 'gold').box([-2, 26, -1], [2, 27, 1], 'gold'); + m.set(-4, 20, 5, 'red').set(0, 20, 5, 'jade').set(3, 20, 5, 'red'); + m.box([-9, 5, -4], [9, 8, 5], 'ermine'); + for (const x of [-7, -3, 2, 6]) m.set(x, 6, 4, 'black'); + }, + }), + bust('l_netherlands', { + robe: 'black', + skin: 'skin3', + hair: 'hair', + beard: 'hair', + extra: (m) => { + // A flat black cap; a white ruff; an orange sash across a black doublet. + m.box([-6, 18, -6], [6, 20, 6], 'black').box([-5, 20, -5], [5, 21, 5], 'black'); + m.box([-7, 6, -4], [7, 8, 5], 'white').box([-6, 8, -3], [6, 9, 4], 'white'); + for (let y = 0; y < 6; y++) m.box([-6 + y * 2, y, 4], [-3 + y * 2, y + 1, 5], 'orange'); + }, + }), + bust('l_polynesia', { + robe: 'gold', + skin: 'skin4', + nose: 'horseDark', + hair: 'black', + extra: (m) => { + // The feathered helmet with its crest; a cloak of yellow and red feathers. + m.box([-6, 17, -6], [6, 20, 5], 'gold').box([-5, 20, -5], [5, 21, 4], 'gold'); + m.box([-1, 20, -6], [1, 25, 4], 'red').box([-1, 18, 5], [1, 20, 6], 'red'); + m.box([-6, 17, 4], [6, 18, 5], 'red'); + for (let y = 0; y < 8; y++) for (let x = -9; x < 9; x++) if (Math.abs(x + 0.5) < y - 1 && y < 7) m.set(x, y, 4, 'red'); + m.box([-9, 7, -4], [9, 8, 5], 'red'); + }, + }), + bust('l_denmark', { + robe: 'leather', + skin: 'skin3', + hair: 'straw', + beard: 'straw', + extra: (m) => { + // An iron helmet with a ridge and a nose guard; a great fair beard, braided; a fur collar fastened with a blue stone. + m.box([-6, 17, -6], [6, 21, 5], 'iron').box([-5, 21, -5], [5, 22, 4], 'iron').box([-1, 21, -6], [1, 23, 5], 'steel'); + m.box([-6, 16, 4], [6, 17, 5], 'steel').box([-1, 14, 5], [1, 17, 6], 'steel'); + m.box([-7, 8, -5], [-5, 16, 1], 'straw').box([5, 8, -5], [7, 16, 1], 'straw'); + m.box([-2, 4, 5], [-1, 7, 6], 'straw').box([1, 4, 5], [2, 7, 6], 'straw'); + m.box([-9, 5, -4], [9, 8, 5], 'hairGrey'); + m.box([-1, 5, 5], [1, 7, 6], 'nemes'); + }, + }), ]; /** The leaders' pictures, each in three moods. */