Unfortunately, balancing every aspect is extremely difficult, but I believe that — from a gameplay perspective — vassalizing a country that is too far away doesn’t make much sense and mostly benefits the human player.Something does indeed seem to be bugged. On SVN 5508, I loaded a quick test as Crimea, and, though the scenario did actually load this time, I had no units whatsoever, and all AI civs had 0 score and an even delta of (+10,000) or something like that. I should have taken a screenshot at the time, but alas, I did not. Thinking that Crimea itself may just have had no units by intention for some reason, I tried to load it as Austria on another attempt this morning, since I know that they do. It once again got snagged on Setup Map indefinitely, and I ended up having to restart my PC to get around it.
Looking at the error log, I believe this is because I may have manually enabled revolutions in the scenario file previously and this is incompatible with your fix. I'm not sure that that would have any bearing on the units not appearing for Crimea, however (unless that was somehow by design).
It seems that .log files can't be attached directly, so here is the raw text with a timestamp from this morning, so it should contain the failure with loading the scenario.
Spoiler :
sys.path = ['..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\email', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\encodings', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\build', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\lib', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\py', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\tools', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\lib\\colourchooser', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\lib\\editor', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\lib\\floatcanvas', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\lib\\masked', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\lib\\mixins', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\lib\\ogl', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\af', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\ca', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\cs', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\da', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\de', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\el', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\es', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\eu', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\fi', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\fr', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\hi', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\hu', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\id', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\it', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\ja', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\lv', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\nb', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\nl', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\pl', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\pt_BR', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\ru', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\sl', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\sv', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\tr', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\uk', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\zh_CN', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\zh_TW', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\af\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\ca\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\cs\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\da\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\de\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\el\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\es\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\eu\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\fi\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\fr\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\hi\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\hu\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\id\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\it\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\ja\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\lv\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\nb\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\nl\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\pl\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\pt_BR\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\ru\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\sl\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\sv\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\tr\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\uk\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\zh_CN\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\locale\\zh_TW\\LC_MESSAGES', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\py\\tests', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\tools\\XRCed', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM\\wx\\tools\\XRCed\\src-images', '..\\WARLORDS\\ASSETS\\PYTHON\\SYSTEM']
sys.modules = {'zipimport': <module 'zipimport' (built-in)>, 'signal': <module 'signal' (built-in)>, '__builtin__': <module '__builtin__' (built-in)>, 'sys': <module 'sys' (built-in)>, '__main__': <module '__main__' (built-in)>, 'exceptions': <module 'exceptions' (built-in)>, 'CvPythonExtensions': <module 'CvPythonExtensions' (built-in)>}
sys.builtin_module_names = ('CvPythonExtensions', '__builtin__', '__main__', '_bisect', '_codecs', '_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', '_codecs_tw', '_csv', '_heapq', '_hotshot', '_locale', '_multibytecodec', '_random', '_sre', '_subprocess', '_symtable', '_weakref', '_winreg', 'array', 'audioop', 'binascii', 'cPickle', 'cStringIO', 'cmath', 'collections', 'datetime', 'errno', 'exceptions', 'gc', 'imageop', 'imp', 'itertools', 'marshal', 'math', 'md5', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'regex', 'rgbimg', 'sha', 'signal', 'strop', 'struct', 'sys', 'thread', 'time', 'xxsubtype', 'zipimport')
load_module CvEventInterface
load_module BugEventManager
load_module CvEventManager
load_module CvUtil
load_module traceback
load_module CvScreensInterface
load_module CvMainInterface
load_module ScreenInput
load_module CvScreenEnums
load_module time
load_module Revolutions
load_module BugUtil
load_module ColorUtil
load_module BugDll
load_module BugOptions
load_module BugConfig
load_module BugCore
load_module BugInit
load_module BugPath
load_module BugConfigTracker
load_module shutil
load_module BugTypes
load_module xmllib
..\WARLORDS\ASSETS\PYTHON\SYSTEM\xmllib.py:9: DeprecationWarning: The xmllib module is obsolete. Use xml.sax instead.
11:03:12 DEBUG: BugConfig - registering xml handler BugConfig.RootHandler
11:03:12 DEBUG: BugConfig - registering bug handler BugConfig.BugHandler
11:03:12 DEBUG: BugConfig - registering load handler BugConfig.LoadHandler
11:03:12 DEBUG: BugConfig - registering config handler BugConfig.ConfigHandler
11:03:12 DEBUG: BugConfig - registering arg handler BugConfig.ArgHandler
load_module configobj
load_module __future__
load_module codecs
load_module validate
validate import failed
load_module BugOptionsScreen
load_module BugErrorOptionsTab
load_module BugOptionsTab
load_module BugHelp
load_module Popup
11:03:12 INFO : BugCore - creating uninitialized mod Core
11:03:12 INFO : BugCore - creating uninitialized mod MainInterface
load_module FontUtil
load_module CityUtil
11:03:12 INFO : BugCore - creating uninitialized mod NJAGC
11:03:12 INFO : BugCore - creating uninitialized mod Scores
11:03:12 INFO : BugCore - creating uninitialized mod CityScreen
load_module ReligionUtil
11:03:12 INFO : BugCore - creating uninitialized mod PLE
load_module Scoreboard
load_module DealUtil
load_module PlayerUtil
load_module TradeUtil
load_module DiplomacyUtil
load_module AttitudeUtil
load_module GameUtil
load_module BugUnitPlot
load_module MonkeyTools
load_module PyHelpers
load_module UnitUtil
load_module ReminderEventManager
load_module SdToolKit
load_module BugData
load_module cPickle
load_module autolog
load_module CvModName
11:03:12 INFO : BugCore - creating uninitialized mod Autolog
11:03:12 INFO : BugCore - creating uninitialized mod Reminder
load_module CvAppInterface
load_module GGUtil
load_module GPUtil
load_module ProgressBarUtil
load_module PLE
load_module AStarTools
load_module RawYields
load_module CvTechChooser
load_module math
load_module PyTechGraph
11:03:12 INFO : BugCore - creating uninitialized mod Advisors
load_module TechPrefs
load_module CvForeignAdvisor
load_module CvExoticForeignAdvisor
load_module IconGrid_BUG
load_module DomPyHelpers
load_module TechTree
load_module FavoriteCivicDetector
load_module CvReligionScreen
load_module CvCivicsScreen
load_module CvVictoryScreen
load_module TechUtil
load_module CvEspionageAdvisor
load_module CvPopulationAdvisor
load_module CvOptionsScreen
load_module CvReplayScreen
load_module CvHallOfFameScreen
load_module CvDanQuayle
load_module CvGameUtils
load_module Consts
load_module CvUnVictoryScreen
load_module CvDawnOfMan
load_module Buffy
11:03:12 INFO : BugCore - creating uninitialized mod BUFFY
load_module GameSetUpCheck
load_module AutoSave
load_module MapFinder
load_module MapFinderStatusScreen
11:03:12 INFO : BugCore - creating uninitialized mod MapFinder
11:03:12 INFO : BugCore - creating uninitialized mod AutoSave
load_module CvTechSplashScreen
load_module CvTopCivs
load_module random
load_module CvInfoScreen
load_module CvIntroMovieScreen
load_module CvVictoryMovieScreen
load_module CvWonderMovieScreen
load_module CvEraMovieScreen
load_module CvSpaceShipScreen
load_module CvDebugTools
load_module CvDebugInfoScreen
load_module CvMapGeneratorUtil
load_module CvGFCScreen
load_module CvPopupInterface
load_module CvScreenUtilsInterface
load_module CvOverlayScreenUtils
load_module CvDotMapOverlayScreen
load_module CvStrategyOverlay
11:03:12 INFO : BugCore - creating uninitialized mod StrategyOverlay
load_module CvGreatPersonScreen
load_module GreatPersonNaming
load_module RandomNameUtils
11:03:12 INFO : BugCore - creating uninitialized mod CustDomAdv
11:03:12 INFO : BugCore - creating uninitialized mod TechWindow
load_module CvPlatyBuilderScreen
load_module WBPlotScreen
load_module WBEventScreen
load_module WBCityEditScreen
load_module WBBuildingScreen
load_module WBCityDataScreen
load_module WBPlayerScreen
load_module WBProjectScreen
load_module WBTeamScreen
load_module WBTechScreen
load_module WBPlayerUnits
load_module WBUnitScreen
load_module WBPromotionScreen
load_module WBInfoScreen
load_module WBReligionScreen
load_module WBGameDataScreen
load_module WBCorporationScreen
load_module WBDiplomacyScreen
load_module WBTradeScreen
load_module CvCameraControls
load_module CvAdvisorUtils
load_module DynamicCityNaming
load_module StoredData
load_module DynamicCivNaming
load_module BarbCiv
load_module IDW
load_module AheadOfTime
load_module InputUtil
load_module CvAirCombatExperienceEventManager
11:03:12 DEBUG: BugUtil - extending BugEventManager.preGameStart instead CvAppInterface
11:03:12 DEBUG: BugEventManager - adding event 'PreGameStart'
11:03:12 DEBUG: BugEventManager - adding event 'BeginActivePlayerTurn'
11:03:12 DEBUG: BugEventManager - adding event 'SwitchHotSeatPlayer'
11:03:12 DEBUG: BugEventManager - adding event 'LanguageChanged'
11:03:12 DEBUG: BugEventManager - adding event 'ResolutionChanged'
11:03:12 DEBUG: BugEventManager - adding event 'PythonReloaded'
11:03:12 DEBUG: BugEventManager - adding event 'unitUpgraded'
11:03:12 DEBUG: BugEventManager - adding event 'unitCaptured'
11:03:12 DEBUG: BugEventManager - adding event 'combatWithdrawal'
11:03:12 DEBUG: BugEventManager - adding event 'combatRetreat'
11:03:12 DEBUG: BugEventManager - adding event 'combatLogCollateral'
11:03:12 DEBUG: BugEventManager - adding event 'combatLogFlanking'
11:03:12 WARN : BugEventManager - event 'playerRevolution' already defined
11:03:12 DEBUG: BugInit - game not fully initialized
PY:OnInit
If it's not too much of an ask, could the border requirement for vassalization be wrapped behind an option in the menu? I don't particularly like this idea, for the same reasons as Noyyau; it feels somewhat forced and dissonant with both reality and valid gameplay situations where the ability to peace-vassalize away from borders makes good sense. (I do like the idea of making it more "sticky" however.)
What about the Hapsburg's dominion over the Low Countries and Naples, flanking France and the Papacy far away from Spain proper (and I hear you about to say that they technically controlled the Holy Roman Empire at this time, too, but I think you know what I mean)? What about, later in the game, the USA's Monroe Doctrine on South America without direct control (or any other Victorian era gunboat diplomacy of the time for control of resources, just as non-contiguous vassals provide in-game), or the spheres of influence in the Cold War which in many cases were patchworks of political geography far away from those pulling the strings? I think that for the already quite limited range of diplomatic options we have in the game, vassals satisfyingly model a number of things that a strict border requirement would mitigate even further.
It’s one thing to attack a vassal state in America that’s protected by Spain, and another thing entirely if its overlord is right next door or at least nearby. Maybe in the modern era, or from the mid-1800s onward, it could make some sense because distances become less relevant — but before that, it feels a bit unrealistic.
Keep in mind that the system you're planning to implement will most likely cause a state to become a vassal of its invader before being completely destroyed or turned into a zombie civ. That alone should already lead to non-capitulated vassals forming between neighboring countries.
Still, I believe it’s inevitable that if China invades a European country, and that country starts collapsing, it will have to submit — as a vassal — before being fully capitulated.
But it’s also true that, for China, attacking a country like Spain — which has France and Italy as vassals — becomes much more complicated, especially if those vassal states are still competitive.
Let’s be honest — it takes a lot of imagination

It’s simply a nation on the brink of collapse, offering itself to anyone willing to take it. There’s no real strategy behind it — no long-term diplomacy, no calculated protection deal. Just pure desperation.That said, I really think the attempt to give it some logic is a great first step. It's not about making the AI perfect — just about pushing it toward more coherent and interesting behavior.
Last edited: