REX / M2EX - 08/06
Important: old REX/M2EX saves still load. As usual, new saves use a slightly upgraded format and are not backward-compatible in older versions.
Core Engine & Performance
- New shiny logger, should be faster and nicer. And more importantly, doesn't have trace logging at all (mwhahahahaha) (RTW/M2TW)
- Speeded up large EDB loading. The default EDB algorithm had a few problems, now thoroughly optimised (RTW/M2TW)
- Speeded up loading animation by using SIMD witch magic (RTW/M2TW)
- Did lots of optimisations for loading times (RTW/M2TW)
- Speeded up generating the battlefields and their textures with more witch magic (RTW/M2TW)
- Made @anhlego's pp hard by optimising the battle loading a bit more (RTW/M2TW)
- The AI invasion-strength analyser now skips non-neighbour factions in M2, which should be a noticeable turn-time win in mods with lots of factions (M2TW)
- Uncapped the video memory detection from 32 bits, capping out at 2 GB on modern GPUs. Texture quality stuff and the VRAM log lines now see the card's actual VRAM (RTW/M2TW)
- Removed the 2000-per-frame campaign map tile-update cap. No more AERIAL_MAP max tile updates exceeded spam (RTW/M2TW)
- Added automatic map.rwm regeneration. Change your map TGAs and the rwm rebuilds itself, no more fishing around for rwm-cleaner scripts (RTW/M2TW)
- Did some optimisations in draw-heavy battles, most noticeable on extreme graphics where every unit is drawn as a mesh instead of sprites (RTW/M2TW)
Limits & Uncaps
- Uncapped cultures from the hard limit of 7. Mods can now define as many cultures as they want (RTW/M2TW)
- Uncapped the number of BI beliefs / M2 religions you can have. The M2 religion system is still hardcoded, but you can now add new ones in an unlimited manner. We've pretty much finished uncapping everything now, haven't we? ;) (RTW/M2TW)
- Uncapped max_number_of_children in descr_campaign_db from 4 (M2TW)
- Character age is no longer capped at 127 internally, so a very high death age set in descr_campaign_db is now respected (M2TW)
- Character kill count is no longer capped at 7 (RTW/M2TW)
- Raised the per-mesh model size cap from 10000 to 21845 faces (the .cas format ceiling), and the per-mesh vertex cap from 32752 to 65535 to match. Big modded unit and building meshes that used to crash with "model too large to fit into a vertex buffer" now load (RTW/M2TW)
- Removed the 30 per cell campaign map overlay icon cap (RTW/M2TW)
- Removed the 5000-vertex / 4000-vertex campaign map coastline cap (RTW/M2TW)
- Removed the 25000-vertex tree cap on the campaign map (RTW/M2TW)
- Removed the campaign map sea route cap. Big mod maps with extensive trade networks no longer have routes blink when you move the camera (RTW/M2TW)
- Removed the campaign map road cap. Roads should no longer flicker on bigger maps (RTW/M2TW)
- Removed the campaign map movement-path overlay cap. Long character paths on big mod maps should no longer get cut off halfway (RTW/M2TW)
- Removed the campaign map arrows cap (was this ever hit? good question, but now it won't be) (RTW/M2TW)
- Removed the campaign map battle-zone overlay cap. Battle area highlights on the campaign map no longer clip on bigger maps. We don't think this is a realistic limit but just in case (RTW/M2TW)
- Removed the bs 20000-denarii sanity assert on building construction. Modded buildings with costs above 20k no longer spam "BUILDING CONSTRUCTION ITEM that costs over 20000!" every AI turn (RTW/M2TW)
- Also removed the "BUILDING CONSTRUCTION ITEM that costs nothing!" stuff (RTW/M2TW)
Battle: Combat, Deployment & AI
- Make quick battle actually random. The game literally just gave you a list of 20 pre-determined positions, making it kinda boring. A new battle every day (RTW/M2TW)
- Made navies always "long-retreat". Helps avoid having to fight 10 naval battles for the same ship, and lessens the impact of baiting the AI against you so they get excommunicated (RTW/M2TW)
- Aligned combat statistics closer to vanilla RTW. FYI there is no guarantee that combat outcomes or stats will continue to match, this was part of a larger cleanup, but there's no promise of behavioural compatibility (RTW/M2TW)
- Adjusted pike bracing depth so the front 4 ranks brace instead of the front 5 (M2TW)
- Adjusted pikes so they no longer run with pikes down. They run with pikes up but lower the moment they contact an enemy unit. This is a slight nerf because you no longer have pikemen invulnerable to frontal enemies while repositioning, but it gives you more opportunities for counterplay (M2TW)
- Raised the "max men on the battlefield" warning to 30000. This is roughly the performance ceiling we'd be happy recommending to people (RTW/M2TW)
- Raised the reinforcement limit to 30000 too, even without unlimited_men_on_the_battlefield (RTW/M2TW)
- Fixed playable_area_dimensions in battle scripts being silently divided by 32 instead of rounded to a multiple of 32, which shrank the camera-clamp box to ~3% of the intended size and trapped the view in a tiny square at map centre (M2TW)
- Fixed AI armies and agents slow-walking through the entire AI turn after one of them transited player territory. It's not like pressing space would help (RTW)
- Fixed units being impossible to move during battle deployment. Or during the battle as well (RTW/M2TW)
- Fixed schiltrom-capable spear infantry not bracing against cavalry charges (M2TW)
- Fixed cavalry (and to a lesser extent infantry) randomly warping to a different rotation entirely during animations (RTW/M2TW)
- Fixed the defender brace check not working against ~50% of attacks. Attacks coming in from the left side bypassed the brace entirely no matter how front-on the charge was (RTW)
- Fixed soldiers gliding past targets that were behind them when the shortest turn was clockwise. Another parity bug (RTW)
- Fixed units (most especially cavalry) feeling a bit "sluggish" compared to retail (RTW/M2TW)
- Fixed cavalry spacing being wrong: mounts too spread out side to side but overlapping nose to tail, because x_radius in descr_mount.txt effectively drove the front-to-back dimension and vice versa (RTW/M2TW)
- Fixed massive logspam / OOB with units of more than 400 men (RTW/M2TW)
- Fixed logspam when a formation couldn't deploy all its units at once (RTW/M2TW)
- Fixed elephants ignoring their charge bonus, so elephant charges actually do something now (RTW/M2TW)
- Elephants now trample and kill men across their whole charge path, instead of only the tusk animation dealing damage (RTW/M2TW)
- Fixed scythed chariots doing almost nothing until they hit full speed. Scythe hits now ramp up with wheel speed, so a chariot still accelerating still does damage (RTW)
- Chariots now deal trample damage with the horses like elephants do, instead of the horses just shoving people aside while only the scythed wheels hurt (RTW)
- Fixed M2 chariots never getting a mount attack. The engine now reads it from stat_sec like RTW does, so their scythe and trample have real stats instead of being ignored (M2TW)
- Sharpened stakes now bog down infantry that hit the front of the field, killing their charge and forcing walk mode until they pass. Only from the front, and only cavalry actually gets impaled (M2TW)
- Fixed halberds and pikes in spearwall drifting apart while marching, because the braced front ranks were walking at a different speed to the rest of the unit (vanilla bug) (M2TW)
- Fixed crossbowmen and gunpowder units on walls barely shooting, or roleplaying as archers, because their own battlements counted as an obstacle and blocked the shot. They now fire flat out so you can larp proper crossbow action while defending Constantinople (M2TW)
- Fixed units standing in melee contact without actually fighting, sometimes for a minute or so, then snapping back and suddenly dying. Especially cavalry. Long-standing vanilla bug (RTW/M2TW)
- Fixed spurious "no valid defense" battle errors when low or zero defence-skill units like peasants got hit by missiles (RTW/M2TW)
- Fixed the soldier animation twitching. They aren't absolute spazzes any more (RTW/M2TW)
- Fixed crossbowmen and gunpowder units on walls still shooting into the air or just not firing in more cases, where their own battlements blocked the shot. More of the earlier wall-shooting fix (M2TW)
- Fixed being unable to click-order units onto bridges in battle. You can now left-click a bridge to send units across instead of only dragging a formation onto it. Shoutout to @KuroGuroChan as usual (M2TW)
- Fixed player-controlled battle reinforcements wandering off and ignoring your orders. If you set your own reinforcing stack to player control (the non-AI option), they now actually obey you (RTW/M2TW)
- Fixed missile units (archers, crossbows, etc.) standing frozen mid-aim while an enemy swings at them. They now switch to swords properly and fight back (RTW/M2TW)
- Reworked chariots and elephants: they now carry momentum as they trample through infantry and bog to a halt once the charge runs out of steam, instead of casually prancing through whole formations untouched. Chariot trample was also nerfed quite a bit (50% to 15%) (RTW/M2TW)
- Braced spear and phalanx units now stop a charging chariot or elephant far faster than loose infantry, and heavier mounts carry more momentum than light ones (RTW/M2TW)
- Fixed spear units pushing uncontrollably through their own formation and the enemy instead of holding a line in melee. Only the front ranks brace and push now, so the formation keeps some coherence (RTW)
- long_pike and short_pike units now brace against attacks like spears do, where before they got no bracing at all (RTW)
- spear_bonus_4 .. spear_bonus_12 now work on their own. Previously the bonus did nothing unless the unit also had spear, light_spear or a pike attribute, so a unit with just spear_bonus_8 now counts as a spearman (RTW/M2TW)
- short_pike units now form a proper spear wall / phalanx, like long_pike but with shorter reach (1.8m / 2 ranks). Until now their spears only worked in schiltrom (RTW)
- Fixed units getting stuck in shieldwall (or any toggleable formation) when their base formation was horde instead of square. It now returns to the unit's actual default formation (RTW/M2TW)
- Fixed being unable to drop siege equipment (rams, ladders, towers) carried by your general's unit in a siege. The rally button was using that slot instead of the drop button (RTW)
Models, Skeletal Animation & .cas
- Max bones per skinned model raised to 72. Modders can now use much higher-bone-count character rigs (RTW/M2TW)
- Max siege engine bones raised to 96 (RTW/M2TW)
- Increased the maximum bones for buildings to 48 (RTW/M2TW)
- The animation packs' format bone count raised from 64 to 96. Old anim packs still work, the loader auto-detects the older 2-chunk layout and zero-extends it properly (RTW/M2TW)
- Added full support for weighted meshes. Mixed-skinning .cas files now auto-promote to model_flexi_m if the CAS actually contains weighted geometry, even when the DMB says model_flexi. Logs a one-line note pointing at the wrong keyword. Previously the weights silently dropped, leaving shields and limbs floating in the wrong places (RTW/M2TW)
- Lifted the hard 100-vert cap per weighted submesh in mixed-skinning models. High-poly modder meshes with multi-bone skinning now load instead of crashing on the assert (RTW/M2TW)
- Better diagnostics for .cas models: out-of-range bone indices and unknown chunk types now log instead of corrupting memory. Easier to find skeleton mismatches, bad exports and the quality of your average modder-provided .cas tool (RTW/M2TW)
- Skeletal animation interp went from "everything is linear" to spherical-cubic rotation + Catmull-Rom translation. A bunch of technical mumbo-jumbo for continuous smoothing without too much jorking (RTW/M2TW)
- Soldier rotation now interpolates between ticks instead of snapping every 100ms, removing the "jerky" soldier rotation (RTW/M2TW)
- Same rotation fix applied to chariot scorpion crew, chariot body rotation, the lod3 sprites, and night-battle torch positions (RTW/M2TW)
- Crossblending between two animations now actually uses each anim's pose for bones instead of zeroing it out, so bones don't glitch out randomly on animation transitions (RTW/M2TW)
- Looping animations (idle, walk) detect their cycle at load and sample cleanly across the seam, so the loop boundary doesn't have hitches (RTW/M2TW)
- Fixed a crash when entering battles with mods that ship pre-built .rum model caches. The recent CAS expansion to 65k changed the on-disk layout of .rum files but didn't invalidate old ones, so stale caches got memory-corrupted into garbage vertex counts. Old .rum files are now rejected cleanly and rebuilt from .cas on next load. If you unironically only shipped .rum files with your mod (not .cas), then your mod will stop working, and you only have yourself to blame for it (RTW/M2TW)
- Fixed a bug where bones randomly shrank by about 5% near the keyframes (RTW/M2TW)
- Fixed a small bug with mounts using raw last-tick rotation instead of being interpolated, which caused a small snap when a horse went from being a mesh to being a sprite in the distance (M2TW)
- Fixed logspam from CAS models with empty pieces. Empty rigid pieces now drop at load with a one-line warning naming the piece, instead of stackframing every frame on render (RTW/M2TW)
- Animation frame mismatches between soldier and weapon anims now log once per pair instead of every frame. Stops the log spam from things like ID_um axe idle and EB slingers tanking framerate when they're reloading (RTW/M2TW)
- Fixed coastal settlements with a broken port position (no sea-adjacent dock tile) leaving a half-built port that spammed errors every frame. The port now refuses to register, settlement degrades cleanly to "no port", and the modder gets a log line with the region and tile so they can fix their fucking descr_strat (RTW/M2TW)
- Added universal DMB textures: a texture line with an empty faction field or the keyword default now applies to every faction without its own entry, so you no longer have to list all 30 factions for a shared texture. Faction lines still override the default. This is the DMB path only, not the modeldb path (RTW/M2TW)
Camera & Controls
- The strat-map camera floatiness reduced by default. The deceleration after you stop scrolling is now ~1/3 shorter (RTW/M2TW)
- Four new cfg knobs to tune strat camera feel to taste: scroll friction, acceleration, max velocity, and zoom smoothing half-life. Higher friction = "snappier", stops more easily, lower = "floatier". Lower accel / max-velocity = slower pan overall (RTW/M2TW)
- CAMPAIGN_SCROLL_FRICTION / camera.campaign_scroll_friction: how fast the camera decelerates after you release input. Default 12 (was 8 before this change) (RTW/M2TW)
- CAMPAIGN_SCROLL_ACCELERATION / camera.campaign_scroll_acceleration: how hard each scroll tick pushes the camera. Default 15 (RTW/M2TW)
- CAMPAIGN_SCROLL_MAX_VELOCITY / camera.campaign_scroll_max_velocity: the top camera pan speed. Default 20 (RTW/M2TW)
- CAMPAIGN_ZOOM_SMOOTHING_HALFLIFE / camera.campaign_zoom_smoothing_halflife: seconds for zoom to close half the gap to target. Lower = "snappier" zoom, 0 = instant. Default 0.05 (RTW/M2TW)
- Added a "Legacy RTS camera" setting (RTW/M2TW)
- Lowered the RTS camera a bit so you can stare at your soldiers' faces, as you're supposed to in a strategy game (RTW/M2TW)
- Majorly overhauled and simplified the campaign character speedup logic. Space now reliably shoos characters away (i.e. speeds their movement up a lot), characters in the fog of war won't have animations, the long-standing bug with spacebar giving no speedup has been fixed, and so on (RTW/M2TW)
- Fixed middle-mouse camera rotation not working when viewing a settlement from the stratmap (RTW)
- Fixed the Camera Options button in the pause menu doing exactly nothing when viewing a settlement (RTW)
- Fixed the pre-battle camera zooming into your general's dick on the first general close-up. Now framed at face height (RTW/M2TW)
- Fixed an issue where you could move the camera and zoom while the AI turn was ongoing, causing some hilariously messed-up map rendering (RTW/M2TW)
- Added a "No Camera Tilt" option, a modern-style RTS zoom that doesn't change your camera angle as you zoom in. Works with both the normal and the retro RTS cameras (RTW/M2TW)
- Fixed the "No Camera Tilt" option losing its angle when zoomed all the way in. It now refuses to go further once it would flatten out, instead of snapping (RTW/M2TW)
- Fixed the Total War camera's keyboard controls having wildly inconsistent speeds between directions (RTW/M2TW)
- Fixed Total War camera mouselook being floaty and lagging behind the cursor. It's pixel-precise now (M2TW)
- Fixed the middle-mouse camera rotate getting stuck on in battle when a message, advisor text or the victory/results scroll appeared while you were holding it, leaving the cursor invisible and the camera stuck until you hit esc (RTW/M2TW)
UI & Settings
- Added a safeguard for dragging formations, so you can cancel the drag formation order with left click without deselecting the units (RTW/M2TW)
- Added terrain detail as a setting in Med2 (M2TW)
- Made the video settings / preferences "modernslop", i.e. when you change the setting it saves immediately instead of only saving prefs when you exit the game (RTW/M2TW)
- Made preferences always save when you change a setting, instead of only being saved when you exit the menu, preventing "lost" settings (RTW/M2TW)
- Building detail and unit detail dropdowns on the RTW main menu video options now have 6 entries (Lowest through Extreme) instead of 5 (RTW)
- Added an option to turn ALL logging off. RTW: I_LIKE_CRASHING_MY_GAME: TRUE; M2: i_like_crashing_my_game = 1 in prefs. Kills all logging and stacktraces. No warranty. If you send a bug report or crash with logging off, we'll stare at you awkwardly (RTW/M2TW)
- Holding Ctrl during a move order now forces walk even with "Always Run" enabled (M2TW)
- Shift now queues turn orders properly instead of being ignored (RTW)
- Reminder from earlier: the radar map can be set to faction colour-coding for own / ally / enemy units. Check game options for faction radar colors (RTW/M2TW)
- Properly fixed Ctrl+click selection. Clicking an unselected unit with Ctrl now adds it to the selection, and Ctrl+click on an already-selected unit deselects it (RTW)
- Properly fixed Ctrl+drag-select. Cards being dragged now toggle their selection state instead of cancelling out (RTW)
- Fixed the unit greeting sound playing twice when first selecting a unit by clicking it in the world. Ironically, clicking a unit card never had this issue (RTW)
- Fixed group attack orders: missile-primary units no longer use their missile weapon in melee, and the first melee unit no longer receives two attack orders (RTW/M2TW)
- Fixed siege engines accepting run orders (M2TW)
- Fixed split unit cards landing in schizo positions until the next layout trigger (RTW)
- Fixed slider scroll sound silently being chomped under some UI parents (RTW)
- Fixed the "first element of a list isn't visible" bug (RTW/M2TW)
- Fixed dead character names and death dates overflowing the family tree tooltip when localised strings are long, splitting them onto two lines so they fit the scroll instead of disappearing behind the corner buttons (RTW/M2TW)
- Fixed the control settings menu showing only dotted lines and no key bindings. Same with the save/load file lists and everything else with dots in it (RTW/M2TW)
- Fixed dotted leader lines overlapping the text in menu lists like the campaign selector (RTW/M2TW)
- Custom resolutions now display properly in the video settings instead of showing 0x0 (RTW/M2TW)
- Fixed the loading screen having a black background on certain setups. Now the proper loading screen is shown (RTW/M2TW)
- Fixed banners not showing on some configurations (RTW/M2TW)
- The character age is now shown on the diplomacy screen (M2TW)
- Backported the M2TW diplomacy proposal indicator to RTW. When you make an offer to an AI faction, the scroll now shows their opinion of it (Very Demanding / Demanding / Balanced / Generous / Very Generous) so you can gauge whether they'll accept. The logic didn't change and it isn't exact, so it's not a guarantee (RTW)
- Added a difficulty indicator at the top of the campaign pause menu, showing Difficulty: campaign / battle. The difficulty you pick at setup was never displayed anywhere, now you can actually check it (RTW/M2TW)
- Fixed the settlement retrain panel scrollbar appearing but not actually scrolling when you had more than 18 retrainable units. The extra rows are now reachable (M2TW)
- Fixed unit drag-and-drop reordering so it works properly in both campaign and battles (RTW/M2TW)
- Added mouse-wheel scrolling to the building and recruitment panels in the settlement scroll (M2TW)
- Fixed fractional percentages displaying without a leading zero (.5% instead of 0.5%), e.g. the population-growth modifier on building scrolls (RTW/M2TW)
- Fixed missing building text in the UI (RTW/M2TW)
- Text labels in RTW can now show hover tooltips the way M2's already could. Side effect: a few tooltips that were set in code but never displayed will start appearing on hover (RTW)
- Fixed family-member portraits vanishing for adopted characters and around coming-of-age, which also shoved the Governor / Command / Management / Influence text downwards so it overlapped the rows below (RTW)
- Portraits now re-roll a valid face from the pool when a character's portrait isn't valid, instead of showing nothing. Handy for mods that ship more unit cards than portrait images for a culture (RTW)
- Fixed character portraits randomly turning into unit cards, building pictures or other people's faces, and changing every time you reopened the panel. A UI image that fails to load now shows white instead of leftover pixels from whatever last used that texture slot. This is a mod issue, yell at the author for mismatching portraits and unit cards (RTW/M2TW)
- Fixed a general's army card and his portrait showing two different faces, same underlying bug as above (RTW)
- Fixed mod portraits going missing or black when a culture added religion-specific portrait folders like catholic_generals (M2TW)
- Added Alt+drag on a selected group to move the whole formation together while keeping its shape, and Ctrl+Alt+drag to rotate the dragged formation, just like in modern TW (RTW/M2TW)
- Fixed Alt-drag formation moves deforming the formation a little more each time, and grabbing units' current positions instead of their real formation (RTW/M2TW)
- Fixed Alt-dragging a formation and releasing over the UI panel leaving you unable to click terrain to deselect, until you Alt-dragged a unit again (RTW/M2TW)
- You can now release Alt partway through an Alt-drag and keep dragging as long as the left mouse button is held, without the selection box appearing (RTW/M2TW)
- Fixed selecting multiple unit cards and dragging them combining the cards into a stack (RTW/M2TW)
- Fixed whole-number values showing a stray .0 in tooltips (e.g. free upkeep 6.0, public order from happiness 10.0%). Fractions like 6.5 still show correctly (RTW/M2TW)
- The recruitment panel now shows a "Recruited: X / N" counter on any unit or agent with a recruitment cap, so you can see your headroom instead of counting stacks or finding out only when it greys out (M2TW)
- The rosters scroll now shows the movement points left for armies and agents (M2TW)
- The settlement list now shows each settlement's current tax level, so you can spot the one you left on Very High (M2TW)
- Unit cards now show casualties the instant a man dies, instead of waiting for his death animation to finish (M2TW)
- Character age now shows next to a character's name on the marriage and betrothal proposal windows, e.g. "Betrothed: Nikaia (Age: 18)" (RTW/M2TW)
- Fixed blank captain portraits for factions that ship no captain banner of their own. They now fall back to the rebel captain portraits in the pre-battle screen and everywhere else captains appear (RTW/M2TW)
- Fixed character portraits showing up black or blank (often after a Man of the Hour) in campaigns continued from a savegame made by an earlier build (RTW/M2TW)
- Fixed the settlement building list showing empty on the first settlement you click after loading a game, where the Town tab did nothing until you toggled to Army and back (RTW/M2TW)
- Fixed the settlement scroll vanishing for the rest of the turn after you queue a city/castle conversion and close the window. The convert confirmation popup now puts the settlement panel back instead of eating it. hi @Σπαρτιάτης (M2TW)
- Fixed the placeholder "<< THIS TEXT SHOULDN'T BE DISPLAYED >>" appearing in a building tooltip when the building granted a weapon_other capability (RTW)
- Fixed the campaign minimap hijacking the whole screen on enlarged maps, where every click teleported the camera and buttons like end-turn did nothing if you had an oversized radar_map1.tga / radar_map2.tga (RTW/M2TW)
- The campaign radar now uses only radar_map2.tga and scales it to fit its box, so it can be any resolution and radar_map1.tga is no longer needed (you can delete it) (RTW/M2TW)
- Made the campaign minimap crisp by rendering it at native screen resolution instead of the old blurry upscaled UI (RTW/M2TW)
Building Mechanics
A chunky overhaul to how you manage buildings.
- Added a downgrade-building button which drops a building one tier instead of razing the whole chain and rebuilding from scratch. Costs some money and takes a turn (RTW/M2TW)
- Added a convert-building option which converts a building's culture to your own, for some money (RTW/M2TW)
- Added a convert-settlement option which converts the base type of the settlement (the town plan and the walls) to your own culture (RTW/M2TW)
- Destroying a building now goes through the build queue and takes a turn instead of being instant. You still get some money back but can't rage-raze a whole settlement in one click (RTW/M2TW)
- Ports can be downgraded now (RTW/M2TW)
- Added no_destroy and no_downgrade EDB flags, placed after the classification tag, to forbid those actions on specific buildings (RTW/M2TW)
- The demolish, downgrade and convert building buttons now grey out when you can't use them instead of silently failing, with a tooltip saying why: already queued, build queue full, not enough money or the building can't be modified (RTW/M2TW)
- Building action tooltips now show the cost (downgrade / convert) and the refund (demolish), so you can see the price before committing (RTW/M2TW)
- Demolish, downgrade and convert now use their own button sprites (DOWNGRADE_BUILDING_BUTTON_IMAGE, SIDEGRADE_BUILDING_BUTTON_IMAGE in strat3.sd.xml) instead of all sharing the demolish icon, so you can retexture each one separately. Happy now @lanjane (RTW/M2TW)
Multiplayer
- The same faction can now be used on different teams in MP. This required rewriting probably way too many things, but it's possible now. Macedon vs. Macedon anyone? (RTW/M2TW)
- Wired up shared deployment properly for M2 (M2TW)
- Fixed the game syncer ignoring the shared-deployment flag. Two games differing only by this field were treated as equal, which means in theory you could have joined a game and desynced it. In practice no one has hit this, but peace of mind (RTW)
- Added a config to raise the engine team cap from 4 to at most 8, so N-way free-for-alls (1v1v1v1v1v1v1v1) are possible without scripted scenarios. The new max_battle_teams (2 to 8, default 4) and max_players_per_team (1 to 7, default 7) live in descr_caps_ex. Note: to use more than 4 teams you must expand your lobby .lnt with extra team panels and faction-symbol slots, since the engine now follows whatever your LNT lays out instead of hardcoding 4 (M2TW)
- Added a build-match check to multiplayer. Players on different exes can no longer connect to each other and desync (RTW/M2TW)
- Reworked the MP kick dialog so it shows exactly the mismatch in a user-friendly way, without being overly generic like M2 or cryptic like RTW (RTW/M2TW)
- Made multiplayer networking single-threaded by default, removing flakiness that could crash or desync games (more likely the more players there are). If it causes performance problems it'll be turned back on and rewritten properly (RTW/M2TW)
- Fixed an MP infoleak where hovering the cursor over an enemy you hadn't actually spotted would change the cursor or show a tooltip, confirming the position of units you couldn't see. Same for middle-click (RTW/M2TW)
Save System
- Cultures are now stored in save games by name rather than by slot index, so adding, removing or reordering cultures in descr_cultures.txt no longer corrupts existing saves (RTW/M2TW)
- Made religion order in descr_religions.txt reorderable without corrupting saves by storing faction state religion and per-region religious distributions by name (M2TW)
- Fixed the spurious "do you want to overwrite" when your modded saves have the same names as vanilla (RTW/M2TW)
- Fixed old save games crashing on the loading screen on the culture-uncapped build. Saves made before the recent build load fine again (RTW/M2TW)
- Fixed old save games crashing or mis-loading on the loading screen, caused by the engine misreading version info from saves made by older builds (RTW)
- Fixed a crash loading saves with the belief uncap, where the rwm file format and savegame region format disagreed (RTW)
- Fixed characters losing children past the 4th on save and reload when a mod allowed more than 4 (M2TW)
- Fixed more saveload-related issues (RTW/M2TW)
- Fixed trade resources getting shuffled to the wrong types (gold showing as wine, and so on) when loading a save made before the resource unhardcode. Old saves now match resources by name correctly (RTW/M2TW)
- Fixed pre-unhardcode RTW saves swapping the dogs and pigs resources on the map, since vanilla listed them in a different order than the engine did internally (RTW)
Modding: descr_ex
- Added a descr_ex toggle to go back to the old REX behaviour for watchtowers (single per turn), defaulting to multiple watchtowers per turn (RTW/M2TW)
- Made the max number of children configurable both for RTW and M2TW. In RTW it's in descr_ex, in M2TW it's in the campaign db (RTW/M2TW)
- Character ageing is now configurable in descr_ex: death age, old age, coming-of-age, plus the marriage, consent and adoption ages (RTW)
- Added minimum_load_time N to descr_ex.txt which makes the loading screen show at least N seconds (you can also use floats), so your beautiful poetry / quote / tip text stays readable on fast machines. 0 disables this "feature" (RTW/M2TW)
- Added free_upkeep_cheap_first to descr_ex. Free-upkeep slots cover the most expensive garrisoned units first by default, set it true to cover the cheapest first. Applies to free_upkeep and the free_upkeep_infantry / cavalry / siege category slots (RTW/M2TW)
- Added one_fort_per_general_per_turn to descr_ex. Set it true to stop a single general throwing down more than one fort per turn (default false, same as vanilla) (RTW/M2TW)
- Added one_watchtower_per_general_per_turn to descr_ex. Set it true to cap a general at building or removing one watchtower per turn (default false, same as vanilla) (RTW/M2TW)
- Added base_corruption_percent to descr_ex (default 0): a flat % corruption applied to every settlement including the capital, on top of the usual distance-based corruption. Corruption reducers (law_bonus, corruption_bonus, governor law and piety) now also work in the capital and nearby regions, where they previously did nothing (RTW/M2TW)
Modding: descr_caps_ex
- Added default_recruitment_slots in descr_caps_ex for the base number of recruitment slots. RTW has it 1 by default (1 unit per turn), M2 has 0 (EDB needs to grant at least one, otherwise units can't be built at all) (RTW)
- Added armour_upgrade_gating in descr_caps_ex with values universal (default for m2+kingdoms; every unit gets bronze/silver/gold even without multiple armour_ug_models declared) or per_unit (old behaviour). Padded tiers reuse the unit's last declared model so lancers, peasants and the rest gain the upgrade without needing new models (M2TW)
- Moved population_on_disband from descr_ex.txt to descr_caps_ex.txt. If your mod set it in descr_ex, move it across (or copy from a vanilla install), otherwise it falls back to the default: off for Medieval, on for Rome (RTW/M2TW)
- Medieval can now return disbanded soldiers to a settlement's population, the way Rome always has. Off by default, set population_on_disband true in descr_caps_ex to enable it (M2TW)
- Added sea_trade_base_multiplier to descr_caps_ex (default 8.0), a multiplier on the income of every sea trade route (RTW/M2TW)
- Added sea_trade_distance_exponent to descr_caps_ex (default 1.0), controlling how fast sea trade income falls off with distance. Above 1 shortens the reach of sea trade, below 1 lessens the decay (RTW/M2TW)
- Added sea_trade_max_mp to descr_caps_ex (default 0), a hard cap on trade distance. Brand new, it wasn't a thing before (RTW/M2TW)
- Rome's trade_fleet_source capability works in descr_caps_ex now. Same as Med really, use the trade_fleet cap in the EDB (RTW)
Modding: Map Resources & Economy
- Uncapped map resources. Trade goods (gold, wine, slaves, etc.) are no longer a hardcoded list, they're fully data-driven from descr_sm_resources.txt and you can add as many new ones as you want (RTW/M2TW)
- New resources auto-resolve their name from SMT_RESOURCE_NAME and their tooltip from TMT_NAME_TOOLTIP. Use localised_name in descr_sm_resources to override the name if you want something different (RTW/M2TW)
- Added a has_mine flag (the settlement earns mining income and shows the mine model) and an is_slave flag to descr_sm_resources.txt (RTW/M2TW)
- Added a resource_role_source toggle in descr_caps_ex. legacy_names (default) keeps old mods working by inferring the mine and slave roles from resource names, data_only uses only the flags (RTW/M2TW)
- Mining now works for every resource the game shipped a mine tooltip for: iron, marble, sulfur, tin, amber and coal are mineable alongside gold and silver. Previously the engine only ever mined gold and silver, so the other mine tooltips were just lying to you (M2TW)
- Added a localised_tooltip line for resources in descr_sm_resources.txt, same as localised_name but for the tooltip, replacing the auto-derived TMT__TOOLTIP (RTW/M2TW)
Modding: EDU & Mercenaries
- Raised the cap for weapon upgrades from bronze only to bronze/silver/gold, matching armour and matching RTW too. It adds +3 attack each step, unlike Rome where it adds 2. That might be unhardcoded later (M2TW)
- Every unit can now upgrade armour through bronze/silver/gold tiers, not just the ones with multiple armour_ug_models declared. See armour_upgrade_gating in descr_caps_ex above (M2TW)
- Added armour upgrade model visualisation to RTW. Set armour_ug_levels and armour_ug_models in the EDU to give the unit a different model per armour upgrade tier, like M2 (RTW)
- Added "unit variation": the new soldiers { } block in the EDU lets a unit list several models (default { id1 id2 id3 }) and each soldier is randomly assigned one, so a unit isn't rows of identical starwars clones any more (RTW)
- The soldiers { } block also supports armour upgrade model visualisation. Specify armour 1/2/3... { } tiers inside the soldiers block which swaps a unit's model as its armour gets upgraded (RTW/M2TW)
- Added a fearless EDU attribute. Basically arcade mode but per unit (RTW/M2TW)
- Added optional armour N and weapon_lvl N fields to mercenary entries in descr_mercenaries.txt. They go between exp N and cost N, are inherent to the merc (retrains keep them), and default to 0. Example: unit merc gondorsword, exp 7 armour 0 weapon_lvl 3 cost 940 replenish 0.12 - 0.20 max 2 initial 1 (RTW/M2TW)
- Ported the free_upkeep mechanic to RTW. Use the EDU keyword free_upkeep_unit to opt a unit in. Forts in RTW are intentionally not covered because of how differently they work from settlements (M2 has it in descr_strat, not the EDB) (RTW)
- Added per-category free-upkeep EDB capabilities: free_upkeep_infantry, free_upkeep_cavalry, free_upkeep_siege. Each picks the top N most expensive eligible units in its category. This stacks on top of the existing free_upkeep, applies separately, no doublecounting (M2TW)
- Added all 3 free_upkeep_* category tokens to RTW as well, matching M2 (RTW)
- Lowered the EDU minimum missile ammo per soldier from 2 to 1, so you can finally give a unit a single shot only (RTW/M2TW)
- Lowered the minimum missile range in export_descr_unit.txt from 20m to 1m (RTW)
- Lowered the same ammo and range minimums for siege engines in the EDU, so artillery can go down to 1 ammo and 1m range. Single-shot catapults, kamikaze onagers, whatever you like (RTW/M2TW)
- Added random general bodyguard units. If a faction has more than one unit flagged general_unit in the EDU, each new general's bodyguard is picked at random from that list. Factions with a single general_unit are unaffected (RTW/M2TW)
Modding: EDB Capabilities
A pile of new building-bonus capability tokens follow. They all live in the same capability blocks in export_descr_buildings.txt.
- Capability bonuses in export_descr_buildings.txt accept decimal values now, e.g. happiness_bonus bonus 0.5 gives +2.5%, bonus 0.2 gives +1%. Previously rounded to integer pips of 5% (RTW/M2TW)
- Building tooltips show the actual fractional percentage instead of truncating to int, for loyalty / health / happiness / law / taxable income / religion level / religion amplifier / naval recruits cost / retrain cost (RTW/M2TW)
- pip_modifier in descr_settlement_mechanics.xml accepts decimals now instead of just integers. (It was previously rounded to 5% pips before reaching public order, so fractional values silently became 0.) (M2TW)
- Added a population_squalor_bonus building capability, like Squalor. Positive = more squalor, negative = less (RTW/M2TW)
- Added a population_unrest_bonus building capability, like the Unrest trait. Positive = more unrest, negative = less (RTW/M2TW)
- Added a religious_unrest_bonus building capability. Positive = reduces religious unrest. (Are these the right way around? The semantics are confusing af.) (M2TW)
- Added a corruption_bonus building capability. Positive = reduces the corruption percentage on the settlement's income, negative = increases it. Like law_bonus but without the public order side effect (RTW/M2TW)
- Added distance_capital_bonus N. Reduces the settlement's effective distance-to-capital by N (RTW/M2TW)
- Changed distance_capital_bonus to be order-only, so the corruption-from-distance side is left to vanilla behaviour. Use law_bonus or corruption_bonus for corruption reductions (RTW/M2TW)
- Added training_units_bonus N building capability which gives an N% discount on unit recruitment cost in the settlement (RTW/M2TW)
- Added training_agents_bonus N building capability which gives an N% discount on agent recruitment cost in the settlement (RTW/M2TW)
- Added inc_recruit_pool_bonus N building capability which scales every recruitable unit's pool growth rate in the settlement by (1 + N/100). Applies to both per-turn replenishment and the initial pool added when the building completes (M2TW)
- Added inc_recruit_limit_bonus N building capability which gives a flat +N to the max pool size of every recruitable unit in the settlement (M2TW)
- Added construction_time_bonus N capability. An N% construction time discount applied to every building, the unified counterpart to the existing construction_time_bonus_military / _religious / _defensive / _other set (RTW/M2TW)
- Added construction_turn_reduction N capability. Takes N turns off the construction time of every building in the settlement. Applied after the percentage discount (RTW/M2TW)
- Added "split" variants for construction_turn_reduction: _military, _religious, _defensive, _other. They stack with the unified version and with the percentage discounts too (RTW/M2TW)
- Added construction_turn_reduction_wooden and _stone for wood/stone buildings (M2TW)
- Added per-class recruitment cost discounts: recruits_cost_bonus_cavalry, recruits_cost_bonus_heavy_infantry, recruits_cost_bonus_light_infantry, recruits_cost_bonus_missile, recruits_cost_bonus_artillery. Each gives N% off recruit cost for the given units, stacks with training_units_bonus. Heavy infantry includes spearmen, light includes skirmishers. Horse archers belong to both missile and cav (RTW/M2TW)
- Added recruits_cost_bonus_naval to RTW to match M2 (RTW)
- Added a recruits_cost_bonus_animal building capability. N% off animal unit recruit cost (elephants, dogs, etc.). Stacks with the governor TrainingAnimalUnits trait (RTW/M2TW)
- Added a farm_income_bonus building capability, gives N% scaling on farm income but NO population-growth (unlike farming_level, which gives both) (RTW/M2TW)
- Added a food_reserves building capability, gives +N turns to a settlement's siege endurance, i.e. how long those mfs hold out (RTW/M2TW)
- Added a siege_immune building capability. While positive, the settlement skips per-turn siege attrition AND the surrender countdown. The garrison still falls if its army is wiped out (like sallying out) since there's nothing left to defend with. Stacks with food_reserves (RTW/M2TW)
- Added order_bonus_fine and population_growth_bonus_fine building capabilities. These ones are 1 unit = 1% instead of the pip stuff, so something like bonus 0.5 actually works (RTW/M2TW)
- Cross-ported the recruitment_slots system to RTW, i.e. you can recruit more than 1 unit a turn. recruitment_slots bonus 2 adds 2 to the settlement's per-turn recruitment, so a 1-point unit completes 3 per turn (RTW)
- Fixed taxable_income_bonus doing bloody nothing in M2 and silently clipping negatives in RTW. Both games now honour the value as a percent bonus to tax, negatives included (RTW/M2TW)
- Dropped the -100% floor on tax bonuses. Tax income can go negative now, useful for vassal-tribute or corrupt-governor type effects (RTW/M2TW)
- Negative trade capabilities like trade_base_income_bonus -5 actually subtract from trade per link instead of clamping at zero (RTW/M2TW)
- Added a trading_income_bonus N building capability, giving +N% trade income (RTW/M2TW)
- Added a mine_income_bonus N building capability, giving +N% mining income (RTW/M2TW)
- Added a building_income_bonus N building capability, scaling the flat income_bonus income by +N% (M2TW)
- Added a free_upkeep_animal N building capability, free upkeep for the N most expensive animal/handler units (elephants, dogs, etc.), matching the existing free_upkeep_infantry / cavalry / siege set (RTW/M2TW)
- Added a public_security_bonus N building capability, making enemy spy and assassin actions against the settlement N% less likely to succeed, nice for a city-watch building. Works in both games now (RTW/M2TW)
- Added a religion_level_bonus religion N building capability, like religion_level_bonus islam 2, which converts the region's population toward that religion each turn. Unlike a building's built-in religion field, you can stack several on one building and gate each with requires (M2TW)
- Added an optional agent type to training_agents_bonus, like training_agents_bonus spy 25. It discounts the recruit cost for that one agent type and stacks on top of the plain training_agents_bonus N which still applies to all agents (RTW/M2TW)
- Made the food_reserves building capability accept negative values, so food_reserves bonus -5 lowers siege endurance instead of raising it (RTW/M2TW)
- Building income capabilities can now be penalties instead of clamping at zero. farm_income_bonus, trading_income_bonus and mine_income_bonus (plus M2's income_bonus and building_income_bonus) take negatives via the bonus form, like trading_income_bonus bonus -20, and a settlement can genuinely run negative income and lose you money (RTW/M2TW)
- farming_level can now go negative to cut a region's base fertility, floored at zero so there are no negative crops (RTW/M2TW)
- Added a display keyword for EDB capability lines, letting you control what shows in the building scroll separately from what the line actually does (RTW/M2TW)
- display hide keeps a capability working but hides it from the building scroll, e.g. recruit_pool "Town Militia" 1 0.5 4 requires factions { england, } display hide (RTW/M2TW)
- display key or display "literal text" replaces a line's auto-generated text with your own (the key is looked up in export_buildings.txt), e.g. recruit_pool "Town Militia" 1 0.5 4 display my_militia_text requires factions { england, } (RTW/M2TW)
- Added standalone eyecandy lines: display key in provides|trains|recruits adds explanation text to a building scroll section with no gameplay effect, e.g. display barracks_note in trains (RTW/M2TW)
- Building scrolls now show a "Provides:" line for a pile of capabilities that already worked but were invisible, including population_squalor_bonus, corruption_bonus, population_unrest_bonus, training_units_bonus, training_agents_bonus, distance_capital_bonus, farm_income_bonus, order_bonus_fine, population_growth_bonus_fine, the per-class recruits_cost_bonus_* set, construction_time_bonus, construction_turn_reduction, and the free_upkeep infantry / cavalry / siege categories (RTW/M2TW)
- Building scrolls now show agent_limit lines too, e.g. agent_limit merchant 1 displays as "Recruitment limit: +1 (Merchant)". They used to be silently invisible (M2TW)
- Fixed population_growth_bonus_fine not showing in a settlement's displayed growth percentage. It always affected real growth, the number just never reflected it (RTW/M2TW)
- Fixed the recruitment UI ignoring inc_recruit_limit_bonus (M2TW)
- The display tag (display hide, display "text", display some_key) now works anywhere on a capability line: before requires, in the middle of the condition or after it (RTW/M2TW)
- Moved the agent recruitment-limit line out of the "can recruit" section and into the "Provides" section on building scrolls (M2TW)
- Added a unit_limit N EDB capability, e.g. unit_limit town_militia 3, a faction-wide recruitment cap on a unit type. The unit equivalent of agent_limit (M2TW)
- Made corruption_bonus, religious_unrest_bonus and distance_capital_bonus signed: a positive value reduces the penalty, a negative value adds to it. Negatives used to be silently ignored (RTW/M2TW)
- corruption_bonus building tooltips now show the sign, so bonus -2 shows "Corruption reduced by: -2%" (a penalty) instead of looking like a reduction (RTW/M2TW)
- Fractional capability bonuses now show on the Settlement Details tab and in the population and order breakdowns. Sub-1 values like population_health_bonus bonus 0.2 (+1% health) just didn't show up at all before (RTW/M2TW)
- Fixed typed free-upkeep slots eating into each other when a settlement had two or more overlapping sources (e.g. free_upkeep plus free_upkeep_infantry), which silently covered fewer units than the buildings granted. Each source now frees its full count in distinct units (RTW/M2TW)
Modding: EDB Conditions
- Added a factionwide modifier for EDB conditions, like requires factions { spain, } and hidden_resource iron factionwide. The condition tests the whole faction instead of just the local settlement, so conquering any region with iron unlocks the unit empire-wide, and losing the last one revokes it. Works on building_present, building_present_min_level, building_present_specific_level, port, resource, hidden_resource, plus region_religion at M2TW (RTW/M2TW)
- Added a governor_in_residence EDB capability condition. True when a general is posted as the city's governor, false otherwise. Plays nice with and / or / not, e.g. law_bonus bonus 1 requires factions { all, } and governor_in_residence (RTW/M2TW)
- Added an ai_controlled EDB capability condition. True when the settlement's faction is not human-controlled, e.g. law_bonus bonus 1 requires factions { all, } and ai_controlled (RTW/M2TW)
- Added a merchant_trade_resource EDB capability condition, true when a merchant is trading the named resource in the settlement's region, e.g. trade_base_income_bonus bonus 1 requires factions { all, } and merchant_trade_resource wine (M2TW)
- Added a faction_merchant_trade_resource EDB capability condition. True when the settlement's faction has merchants trading at least that many distinct resources of the type, anywhere on the map. Usage: happiness_bonus bonus 1 requires factions { all, } and faction_merchant_trade_resource spices 3. This is the EDB sister of the FactionMerchantTradeResource script condition (M2TW)
- Added an agent_in_city EDB capability condition. True when an agent of that type, owned by the settlement's faction, is currently in the city. Usage: taxable_income_bonus requires factions { all, } and agent_in_city priest. Accepts spy, assassin, diplomat on both games, plus merchant, priest, heretic, witch, inquisitor on M2TW. Works with and / or / not (RTW/M2TW)
- Extended the region_religion EDB condition to accept local in place of a religion name, which means the bonus-receiving faction's own religion. Usage: taxable_income_bonus requires factions { greeks, } and region_religion local 30. Lets one line cover every religion instead of cloning the condition per faith (M2TW)
- Added faction_leader_trait and faction_leader_attribute EDB conditions. Use them in capability { requires ... } blocks to require something of the settlement's faction leader. Example: law_bonus bonus 1 requires factions { all, } and faction_leader_attribute Chivalry >= 2. Supports the usual counter operators (>=, <, ==, etc.) (RTW/M2TW)
- Added a diplomatic_status <other_faction> <allied|neutral|war> EDB condition. Example: recruit "Mercenary Pikemen" 0 requires factions { byzantium, } and diplomatic_status hre allied (RTW/M2TW)
- Fixed the merchant_trade_resource and faction_merchant_trade_resource EDB conditions so enemy merchants squatting on your resources still granted the trade bonus, and your merchant in enemy territory still counted toward the global threshold. If the old behaviour is needed anywhere we can add a separate condition, but this seemed hilariously illogical (M2TW)
- Added a settlement_tax_level op level EDB condition, where level is tax_low / tax_normal / tax_high / tax_extortionate, e.g. population_growth_bonus_fine bonus 1 requires factions { all, } and settlement_tax_level <= tax_normal (RTW/M2TW)
- Extended the diplomatic_status EDB condition with trade, has_protectorate and protectorate_of on top of allied / neutral / war, e.g. recruit "War Elephants" 0 requires factions { seleucid, } and diplomatic_status maurya trade (RTW/M2TW)
- Added a control_city settlement EDB condition, true when the settlement's faction controls the named city, e.g. religious_unrest_bonus bonus -2 requires factions { all, } and control_city Memphis and hidden_resource nile (RTW/M2TW)
- Added a num_building_exist building count EDB condition, true when the faction owns at least that many of the building, e.g. alchemists_lab city requires factions { hellas, } and not num_building_exist alchemists_lab 3 to cap a faction at 3 (RTW/M2TW)
- Added a random_percent op N EDB condition, e.g. population_unrest_bonus bonus 2 requires factions { all, } and random_percent <= 5. The roll is fixed per settlement per turn (it doesn't regen if you reopen the scroll, and it's identical across save reloads) but different each turn (RTW/M2TW)
- Added a population_squalor EDB condition, like religious_unrest_bonus bonus -2 requires factions { all, } and population_squalor >= 30. It tests the settlement's squalor as the percentage shown on the scroll (RTW/M2TW)
- Added a settlement_has_plague EDB condition, like taxable_income_bonus bonus -50 requires factions { all, } and settlement_has_plague. True while a settlement has plague, so plague can now hit tax, farm and mine income, not just trade (RTW/M2TW)
- Added a treasury EDB condition, e.g. corruption_bonus -5 requires factions { all, } and treasury >= 10000. Tests the faction's treasury with the usual comparisons (>= > <= < = !=) (RTW/M2TW)
- Added a garrisoned_unit EDB condition, e.g. garrisoned_unit spear_militia >= 2. True when the garrison holds that many units of the given type (RTW/M2TW)
Modding: Cultures, Religions, descr_strat
- Added an optional package_mapping entry to culture definitions. A new culture can borrow an existing culture's UI and portrait asset package instead of shipping its own full set (RTW/M2TW)
- Added sub_faction as an attribute on spawn_army character lines like in descr_strat. Place it anywhere in the list, e.g. character Anaksarxos, named character, sub_faction greek_cities, command 0, age 20, x 117, y 120 (RTW/M2TW)
- Fixed out-of-range descr_campaign_db values clamping to the minimum instead of the nearest valid bound (M2TW)
- Added ownerless wasteland regions. Put wasteland as the settlement name in descr_regions.txt and the region belongs to nobody: no settlement, no owner, no economy, the AI ignores it and it doesn't count for victory. Full guide in the modding docs (RTW/M2TW)
- Added a minimal wasteland region format in descr_regions.txt: just the name, then wasteland, then the r g b map colour. Old full-length entries still load fine, this is just optional if you want to save on typing (RTW/M2TW)
Modding: Data Loading & Error Handling
- The game no longer "truncates" log issues in the same place when they happen more than once. This does create logspam when there are lots of errors in a mod, but it guarantees no errors get accidentally missed. As promised, the last release was the last one where we tried very hard to keep non-functional mods working (RTW/M2TW)
- Made the campaign script parser recoverable. Unknown commands or bad arguments now log a warning and skip just the broken line instead of aborting the ENTIRE script. (Sidenote: we didn't do this willingly, only because people have been insistently yelling in the issue channel. The proper solution is fixing the bloody mods.) (RTW/M2TW)
- Added lclick and rclick as aliases for lclick_up and rclick_up in simulate_mouse_click, because many mods wrote that and consequently the campaign script didn't even open when you clicked on showme (RTW/M2TW)
- Mods can now skip levels in export_descr_buildings.txt building trees without 449 spurious "Building DB error - faction X has gap in building prior to Y" entries clogging the log (the famous "unknown escape" error) (RTW/M2TW)
- A better error message for "failed to load descr_win_conditions.txt" now says "stopped parsing before EOF (unrecognised faction or malformed entry)". The file did load, the game just bailed at a bad faction name (RTW/M2TW)
- Made advice parsing a bit more robust (RTW)
- Fixed another issue with RTW mods that have a text descr_vegetation, no source layout TGAs, and zero vegetation because the game rejected the entries. The game now uses the vanilla entries. Vegetation will look different (and in many cases straight-up weird) but the alternative is fishing it out from the binary vegetation.db, which is just painful for everyone. If vegetation looks broken, yell at the mod author (RTW)
- Fixed a syntax parsing error with for_each and local (RTW/M2TW)
- Stopped LOCOMOTION_OBSTACLE_HANDLER_AVOID invalid movement modifier log spam triggered by ground modifiers > 1.0 in descr_battle_map_movement_modifiers.txt. Even the vanilla file ships values like stone_road 1.06 and ice 1.03 that the assert refused to allow, so any battle on a road wrote that line every frame for every soldier. Your data is actually fine, this wasn't a real problem (RTW/M2TW)
- Fixed set_bit assert when an unrecognised character type appears in a Characters line in export_descr_character_traits.txt. The unknown token now logs a SCRIPT warning and is skipped (RTW/M2TW)
- Fixed a first-turn assert spam from character trait gains (RTW/M2TW)
- Fixed a harmless logspam from aerial-map road handles during init (RTW/M2TW)
- Fixed some assert spam in the log when a script trait or message handler ran for a faction whose type was invalid (RTW/M2TW)
- Fixed assert spam when opening the public-order details on a settlement scroll (RTW)
- Fixed choke-point assert spam in system.log.txt during world map open on larger maps (M2TW)
- Fixed log spam of "Invalid detail level!" stack traces during battle radar generation when preferences/preferences.txt is missing (RTW/M2TW)
- Fixed more sources of logspam (RTW/M2TW)
- Bad tokens in a building condition now name the offending word in the error instead of just saying "Unexpected" (RTW/M2TW)
- descr_regions now complains loudly about the specific region by name when its default faction can't be resolved, instead of failing silently and only griping randomly at runtime (RTW/M2TW)
- Fixed rebel and slave settlements spamming the log with a false m_sub_faction_type data error when a region's default faction couldn't be resolved (also fix your mods) (RTW/M2TW)
- Fixed rebel armies and settlements in descr_regions regions with an unresolved default faction returning a bogus faction instead of falling back to the rebels, which could show messed-up banner colours or accents (RTW)
- Stopped "defend evaluation failed" errors spamming the log when a mod's descr_campaign_ai_db doesn't cover every faction or situation (skill issue, modders) (M2TW)
Scripting: Engine
- Made the local and target keywords work universally across script commands and conditions that take a faction, settlement, or character argument. Previously each command DIYd its own argument handling, so stuff like increment_kings_purse local -800 silently didn't do shit while increment_kings_purse egypt -800 unironically paid out without the fanum tax. So, we did whatever every sane person would do: rewrote every single script command in the game. In exchange, script errors happen when the command executes, NOT at loading, but this is necessary to support the dynamic keywords. This one is for you @Delabras (RTW/M2TW)
- Battle script commands are notably not supported (they aren't that good, not many mods are using them, and they're slow), but extended the same local / target support to the battle script commands invulnerable_general and vulnerable_general, which used to demand a literal character's name (M2TW)
- Fixed scripts silently dropping any label named unused_hash or deleted_hash (no kidding, this was unironically a thing) (RTW/M2TW)
Scripting: Control Flow
- Extended if / while / monitor_event to accept && as a synonym for and (RTW/M2TW)
- Added if_not , an inverted if. Body runs only when conditions are NOT all satisfied. Closes with end_if (RTW/M2TW)
- Added set X = A op B, a ternary expression command. Operations: + - * / % min max. A and B can be literals or counter names. Example: set total = supply - demand. The degenerate case where set X = A matches set_counter X A. For you RR chicks, this is also available as counter_operation (RTW/M2TW)
- Extended the for_each syntax. There's now an optional faction keyword between in and faction name (for_each settlement in faction "romans_julii"), surrounding double quotes are stripped, and in world iterates every settlement or character across all factions (RTW/M2TW)
- Added holding_while as an alias for while_fast for you all RR kiddies (RTW/M2TW)
- Added declare_persistent_counter as an alias for declare_counter (RTW/M2TW)
- Extended set_event_counter to accept another event counter's name as its value, copying that counter's current value instead of only taking a literal number. Usage: set_event_counter percent_slaves slave_counter_venice. One shared counter can stand in for a pile of per-faction ones (M2TW)
- Extended historic_event to accept local in its factions list, like historic_event LOOT_REWARD factions { local, }, so a monitored event only notifies the faction it actually happened to, instead of spamming everyone (M2TW)
- Added else and else_if to the campaign script, so you no longer need a separate inverted monitor for the "otherwise" case. Write if ... else_if ... else ... end_if, with one end_if closing the whole block (RTW/M2TW)
- else / else_if also work on if_not, and inside monitor_event, while and for_each bodies (RTW/M2TW)
Scripting: Commands
- Added close_scroll. Closes any open dialog scrolls on the next frame. You can also pair it with monitor_event ScrollOpened ScrollOpened <scroll_id> to suppress unwanted scrolls, e.g. the crusade target picker when "Call Crusade" is used purely as a script trigger. cc @Delabras (RTW/M2TW)
- Added add_religion in M2, which adds to a region's religious distribution (amount is divided by 100 internally). Example: add_religion judaism Judaea 500. RTW has no per-region religion model, so the same function doesn't do anything there other than logging a warning. This might be upgraded in the future (RTW/M2TW)
- Added add_random_money . add_random_money local 500 1000 adds a random amount in that range to the faction's treasury (inclusive; negatives work fine too if you want a roll for losing money) (RTW/M2TW)
- Added decimation_army <character_name> . decimation_army Gaius Maximus 10 yeets off 10% off every unit in the named character's army (RTW/M2TW)
- Added inc_recruit_pool_faction <unit | all>. inc_recruit_pool_faction local 2 temp_heavy_spearmen adds 2 to that unit's pool in every settlement of the faction. inc_recruit_pool_faction local 1 all does it for every unit in unit_db (M2TW)
- Added give_settlement <faction_type> <settlement_name>. Transfers the named settlement to the given faction with no diplomatic transgression. Also ends any ongoing sieges (RTW/M2TW)
- Added create_fort <faction_type> [variant]. Drops a fort at the given strat tile owned by the faction. M2 takes the optional variant arg for the fort model, RTW has no variant because it doesn't have fort models, rest in pepperoni (RTW/M2TW)
- Added destroy_fort , which removes the fort at the given strat tile. Fails if the fort has a garrison (only empty ones) (RTW/M2TW)
- Fixed spawn_battle in campaign scripts. The command now actually transitions to the scripted battle and resumes the campaign on exit, instead of kicking you to the main menu when the battle ends, and/or crashing. In theory this lets you script historical battles inside a live campaign, e.g. spawn_battle custom/cannae followed by prepare_for_battle (M2TW)
- Fixed kill_character local and target doing nothing in scripts (RTW/M2TW)
- kill_character now pops the death-notification scroll like a natural death, instead of the character quietly getting yeeted into the aether. Named and family characters get the message, captains and the like don't (RTW/M2TW)
Scripting: Conditions
- Added HighestAttSharedChar , like HighestAttSharedChar Influence diplomat >= 5. Checks the highest attribute among same-faction characters of the given type sharing the trigger character's tile, compared with level. The trigger character itself is excluded. If there's nothing else on that tile, returns false (RTW/M2TW)
- Added HighestTraitSharedChar <character_type> <trait_name> . Totally not a clone of HighestAttSharedChar that checks a named trait's level via trait->get_trait_level() instead of the attribute value, completely the same API. As usual, the triggered character is excluded, zero results means false (RTW/M2TW)
- Added an IsCapital condition, true when the trigger settlement is its faction's capital (RTW/M2TW)
- Added an IsFromFaction condition, true when the trigger character belongs to the named faction (RTW/M2TW)
- Added a FactionIsAlive condition, true when the named faction is still alive (RTW/M2TW)
- Added a HasTradeAgreementWith condition, true while the trigger faction is currently in an active trade agreement with the named faction. Example: HasTradeAgreementWith venice (RTW/M2TW)
- Extended OnResource to accept an optional resource name. Normally OnResource keeps the old "on any resource" behaviour; OnResource wine only matches if the character is standing on a wine resource specifically (M2TW)
- Added PopulationReligion , e.g. PopulationReligion judaism <= 60. Tests the named religion's percentage in the trigger character's current region. (PopulationOwnReligion only checked your own faction religion; this checks any.) (M2TW)
- Added I_NumBuildingsFaction , like I_NumBuildingsFaction venice church >= 2. Counts buildings of that type the faction owns right now, no event trigger required (unlike NumBuildingsCompletedFaction) (RTW/M2TW)
- Added I_NumCharacterFaction <character_type> , like I_NumCharacterFaction venice merchant >= 2. Counts characters of the given type (spy, assassin, diplomat, admiral, general, plus M2 merchant, priest, named character, etc.) owned by the faction (RTW/M2TW)
- Added FactionMerchantTradeResource <resource_type> , like FactionMerchantTradeResource wine >= 2. Counts distinct resources of that type traded by the trigger character's faction. Two merchants on the same wine deposit count as one (M2TW)
- Added a CharacterAge script condition, e.g. CharacterAge >= 25 (RTW/M2TW)
- Fixed the HighestAttSharedChar condition parser eating only one word instead of the whole comparison correctly (RTW/M2TW)
- Fixed the FactionMerchantTradeResource script condition throwing "character_record is unavailable" when used in faction events like PreFactionTurnStart (M2TW)
Scripting: Events & Monitors
- Added a DiplomatSelected event. Fires alongside CharacterSelected when the selected own-faction character is a diplomat (RTW/M2TW)
- Made gift_from_council mission completion fire the standard LeaderMissionSuccess and MissionFinished triggers. Previously the gift auto-resolved on notification and bypassed both, so MissionID gift_from_council and PaybackID payback_X monitors never bloody worked. They do now (M2TW)
Console Commands
- Added show_ui and hide_ui console commands so you can toggle the UI from the dev console without having to use a script (RTW/M2TW)
- Added a destroy_selected_fort console command which removes whatever fort is currently selected in the UI. Empty ones only (RTW/M2TW)
- Added delete_unit and disband_unit. delete_unit settlement/character/all, unit_id, [quantity] removes units of that type from one army, or from the entire stratmap if you pass all. Delete removes them outright, disband hands the men back. Default is all units of that type, and general bodyguards are always skipped (RTW/M2TW)
- Added a dump_region_names console command, which writes the current region and settlement names (including the ones you renamed in-game) to /data/text//_regions_and_settlement_names.dump.txt. Same format as the original, so you can drop-in replace it if you strip the suffix (RTW/M2TW)
Sound
- The engine can now load sound files straight from .pack archives, so a mod can ship its sounds packed instead of as a pile of loose files (RTW/M2TW)
- Restored the missing Steam voice sounds: animal sounds (camel, elephant, horse, wardog) and campaign character replies were missing, so many of them had only one voiceline (M2TW)
- Fixed some event sounds like building completions, recruitment scrolls, etc. not playing (RTW/M2TW)
- Fixed sounds not loading properly in many instances (RTW/M2TW)
- Fixed the main menu music being silent on startup. It was the first streamed music track of the game that broke, and toggling mute off then on used to be the only way to get it playing (RTW/M2TW)
- Fixed mods that ship only descr_sounds_*.txt subinclude overrides (e.g. EB1) having their music ignored, with vanilla RTW main-menu music playing instead. REX now chooses pack-vs-text based on whether the mod ships its own events.dat (0-byte ones excluded, since mods love to ship those to force a regen) (RTW/M2TW)
- Fixed pre-battle general speeches being stuck on the short version for every non-Roman culture. Any culture with its own recorded speech files now gets the full-length battle speech, so modded Greek / Barbarian / Eastern voice packs finally work (RTW)
- Fixed a wall of "Sound unserialisation failed" errors at startup with mods whose events.dat sound pack was corrupted. The game now spots the bad pack and rebuilds sounds from descr_sounds.txt instead of spamming asserts. This only works if you ship the text files, but if you do, you get sound back instead of silence (RTW/M2TW)
Strat Map / Campaign Map
- Made generals able to build multiple watchtowers per turn. Added a descr_ex config to go back to the old REX behaviour (RTW/M2TW)
- Fixed the "retreat bug" where defeated armies retreating only one tile leave them stuck in the winner's zone of control and re-attackable every turn until they get utterly destroyed (RTW/M2TW)
- Fixed the M2TW tax bug. Taxes used to drop 12.5% (e.g. 1000 to 875) the moment a settlement crossed 8000 and only catched up at about 15k. This was fixed on RTW ages ago but silly me forgot to crossport (M2TW)
- Fixed slave resources not actually giving their trade income while active. Enslaving a settlement now properly feeds the slave trade into neighbouring regions' economy and population growth, instead of the bonus being silently baked in from turn 1 and never changing. Thanks @Legionary2 for uncovering this truly schizo thing (RTW)
- Fixed assert spam and silently wrong sea trade income on regions with multiple trade fleets (RTW/M2TW)
- Fixed a bug where the trade calculations disagreed with each other, causing the game to always flash an "improving trade income" notification (RTW/M2TW)
- Fixed the radarmap deployment zones being disconnected sometimes (RTW/M2TW)
- Strat-map coastlines no longer render as blocky staircases on shores with higher heightmaps (RTW/M2TW)
- Brigand spawns now scale with a province's public order, so well-governed regions see far fewer random brigands and badly-governed ones see the usual rate (never more). On by default, set brigand_order_scaling false in descr_caps_ex to restore vanilla spawning (RTW/M2TW)
- Fixed a few more cases of random campaign-map character speedup left over from the speedup overhaul (RTW/M2TW)
- Added in-game province renaming, the same way you can already rename cities. Edit the grey name under the settlement name in the settlement scroll and it shows up on the map and everywhere else. Custom province names are saved with your savegame and don't touch your map files, and they change only the display name, not the internal name scripts use (RTW/M2TW)
- Stopping a character now also cancels their queued multi-turn movement, instead of leaving the path to resume next turn (RTW/M2TW)
Terrain & Fog of War
- Added the impassable_shrouded ground type, painted (32,32,32) in map_ground_types.tga. Those tiles are impassable and stay permanently black under the fog of war, for black-void wastelands, walled-off map borders and hidden barriers (RTW/M2TW)
- Backported the impassable land and impassable sea ground types to RTW, painted (64,64,64) and (0,0,64) in map_ground_types.tga, matching M2. Good for a visible uncrossable barrier like an impassable mountain range (RTW)
- The unexplored campaign map now renders solid black by default on both games. RTW matches M2's black shroud, and on either game you can set fog_of_war_shroud vanilla in descr_caps_ex.txt to switch to the lighter grey RTW-style shroud (RTW/M2TW)
- Fixed the black shroud letting shiny sea and rivers shine through it in Rome, thanks to the water shininess. Water is now properly hidden under the fog of war (RTW)
- Fixed the light (vanilla) fog of war going flat dead grey instead of the blue-grey cloud tint (RTW/M2TW)
- Fixed unexplored areas loading as grey instead of black on old saves, so they now match a fresh campaign (RTW)
- Fixed unexplored but visible areas turning solid black on the strat radar map while still showing terrain on the main map (RTW/M2TW)
Graphics & Rendering
- Removed hard caps on the model display (500 rigid models, 100 textures and 100 geometry per material set) (RTW/M2TW)
- Added clamping on the requested screen resolution before creating the screen (RTW/M2TW)
- Enabled more logging for the rendering (RTW/M2TW)
- Fixed the fire arrows not working, onagers having no ammo, arrows not having trails, and several effects being missing. This was an extremely elusive and schizoid error, also present in the original game, which you could observe when you used dxvk or alternate d3d8/d3d9 DLLs (RTW/M2TW)
- Fix "striped" grass (RTW/M2TW)
- Fixed a bunch of shader-related issues like glitchy lances, wrongly lit buildings, etc. (RTW/M2TW)
- Fixed banners and plaza flags not being visible (RTW/M2TW)
- Fixed Rome: Total Blackness, i.e. the "black void" bug where distant terrain simply wasn't generated in historical/custom battles, and sometimes campaign battles too (RTW)
- Rome: Dry Edition: the forest bug has been fixed (RTW/M2TW)
- Fixed battle maps loading without their scenery (settlement buildings, farm fields, rocks). Stock maps like Foothills and Southwater were turning up bare (RTW/M2TW)
- Fixed temple effects not showing in the building browser and scroll. Capabilities declared with faction_capability (the god-dependent temple bonuses like happiness and law) applied correctly but were invisible in the UI (RTW)
- Fixed vegetation textures failing to load when a model's .cas file stored the texture path with a leading slash (RTW)
- Fixed bump and reflection maps being silently loaded as plain colour empty textures on models whose .cas file referenced the texture with a folder path (RTW/M2TW)
- Fixed model textures failing to load when their path had a doubled separator like textures/\unit.tga (RTW)
- Missing model textures now log a warning instead of crashing (RTW/M2TW)
- Missing textures no longer crash RTW. The game now logs a warning and skips the affected geometry, so mods with broken texture references stay playable (RTW)
- Fixed the religion indicator thingie in Med2 being oversized when there's too many religions, like more than vanilla (M2TW)
- Fixed the campaign permanently freezing after alt-tabbing out of fullscreen. The game kept running in the background but never drew another frame again (RTW)
- Fixed windowed mode yanking non-standard resolutions to 1024x768 on M2, or to the nearest good-enough mode on RTW. Set whatever you want in medieval2.preference.cfg / preferences.txt and the game will just use it. Useful for running 16:9 on ultrawides or any other schizo resolution you have in mind (RTW/M2TW)
- Fixed mods failing to launch when even a single model texture was missing or had non-ASCII characters (Turkish, Chinese, etc.) in its .cas texture path. A missing texture now logs a warning and uses a blank placeholder instead of quitting the whole game (RTW/M2TW)
- CAS texture paths are now read as UTF-8 instead of being guessed through a fixed codepage, so they no longer resolve differently depending on the player's Windows language (RTW/M2TW)
- A missing model texture no longer reports a bogus "insufficient video memory" error that has nothing to do with VRAM (RTW/M2TW)
- Fixed garbled or empty vegetation sprites when a model was missing its lowest-detail .cas. Such variants now skip cleanly instead of corrupting their texture page and desyncing every page after it (RTW)
- Fixed forests having disappearing trees on the battlemap, where the engine capped each vegetation patch at 65,536 vertices and silently dropped the rest, so you got pop-in up close or zero trees at distance. Forests now draw in full at any density (RTW)
- Fixed the distant trees beyond the battlefield getting truncated the same way, so off-map forests render completely now (RTW)
- Removed the 65,536-vertex hard limit on engine-generated battlefield vegetation (read: grass) entirely. If you run out of VRAM, direct your complaints to the modder (RTW)
Campaign AI
- Fixed AI counter-offers in diplomacy becoming MORE demanding instead of less demanding. The AI now actually softens its offer over a haggling session instead of just digging its heels in (RTW/M2TW)
- Fixed factionless AI leaders (read: hordes) not knowing how to recapture regions properly. They now pick an adjacent at-war region and try to conquer it (RTW/M2TW)
- Fixed the Med2 AI happily assigning dreadful generals (negative chivalry) as governors. The check was abs(chivalry) > 0 (in English: "chivalry not exactly zero") so a chivalry -5 character ranked exactly the same as chivalry +5 (M2TW)
- The CAI now retrains experienced units before blowing its turn's budget on hash and snow new recruits (RTW)
- The CAI no longer blindly picks rebels/slaves as its top invasion target. Rebels now get fed into the threat calculation like everything else. No free pass from the AI eyeing your lands just because you aren't grey (RTW/M2TW)
- Fixed the campaign AI only ever staging naval invasions from one landmass / the mainland, with other places being silently dropped (RTW/M2TW)
- Loosened the campaign AI's naval invasion criteria. A faction that's at war can now still ship an army, instead of the previous behaviour of only naval-invading in peace while getting ready for an attack (RTW/M2TW)
- Reworked AI spending so factions keep a reserve when poor and only blow everything on hash and hookers when they can actually afford it, instead of pissing the whole treasury away every turn and bankrupting themselves (RTW/M2TW)
- Fixed the RTW AI recruiting only one unit per settlement per turn, ignoring extra capacity from recruitment_slots buildings or fast (0-turn) recruitment. It now uses its recruitment points each turn like the M2 AI already does (RTW)
- Removed a gate that kept the AI from invading while there were rebel regions nearby to grab first, so OPM factions and hordes that were hard-locked out of attacking can finally expand (RTW/M2TW)
- The naval invasion range now scales with map size, so the AI on big-map mods stops writing off perfectly reasonable sea invasions as too far away. Vanilla-size maps behave exactly as before (RTW/M2TW)
- Fixed AI-hired mercenary ships spawning stranded in tiny inland lakes and ponds where they could never move. Recruited ships now skip lake tiles when picking a spot (M2TW)
- The AI now garrisons its rich, rebellious and border settlements more heavily, and no longer strips a town's garrison down to a quarter of what it needs while an enemy army is sitting in the region (RTW/M2TW)
- The AI now weighs both garrison size and wall strength before committing to an assault, demanding a bigger force advantage for heavier fortifications, so it leans toward softer targets instead of hurling random stacks at the toughest province on its border (RTW/M2TW)
- The AI now counts the target city's garrison when sizing an invasion force, not just the armies out in the field (RTW/M2TW)
- The AI actively grabs undefended enemy settlements now, instead of strolling past the empty town next door (RTW/M2TW)
- The AI commits to an invasion once it has gathered enough force, instead of massing a doomstack and sitting on it forever waiting for every front to line up (RTW/M2TW)
- The AI now commits to finishing off near-extinct factions (RTW/M2TW)
- New army-handling system: the AI consolidates scattered half-stacks into real armies, avoids clearly losing fights with small stacks (falling back to a friendly settlement instead), and stops going AFK for a few turns by widening its search when it has nothing obvious to do (RTW/M2TW)
- The AI now counts nearby allied armies when judging a position, so it stops treating a spot an ally already covers as if it were standing there alone (RTW/M2TW)
- Fixed AI armies being indecisive, marching halfway to a target then reversing for a different one and flipping back again. They now stick with where they're headed unless something genuinely better turns up (RTW/M2TW)
- The AI no longer limits diplomacy to factions it borders. It now sets up trade (sea routes included) and alliances with distant factions, and asks far-off allies to gang up on whichever enemy is pressing it hardest (RTW/M2TW)
- The AI's diplomat cap now scales with faction count (was a flat 15), so many-faction mods get enough diplomats to keep up with negotiations (RTW/M2TW)
- The M2 AI now builds the buildings that raise its agent caps (embassies, brothels, taverns) instead of never bothering (M2TW)
- The AI no longer hard-caps itself at 6 spy/assassin missions a turn. Big empires now scale their spy and assassin activity with the number of agents they actually field (RTW/M2TW)
- The AI now beefs up a region's defenders when enemy stacks are actually massing on its borders, instead of sizing the garrison purely by how much it fears that neighbour on paper (RTW/M2TW)
- The AI now prefers conquests that shorten a hostile border over ones that only touch a friendly one, instead of treating an allied frontier as something it urgently needs to shrink (RTW/M2TW)
- The campaign AI now keeps recruiting as long as its reserves can cover the upkeep, instead of freezing the moment its income runs tight, which used to leave rich factions sitting on a pile of cash doing nothing (RTW/M2TW)
- The campaign AI now spends its treasury aggressively instead of saving for a rainy day that never comes, and only reins in when it's genuinely broke and bleeding money (RTW/M2TW)
- Fixed the AI badly misjudging its own wealth and reading itself as near-broke almost permanently, which had been freezing its spending and recruitment (M2TW)
- The AI now prioritises taking out the rebels early in the game (RTW/M2TW)
- The AI now uses a more lenient strength calculation against rebels, since rebels don't go out of their way to attack you anyway (RTW/M2TW)
- Fixed the AI treating the rebels as one giant faction. It now judges each rebel settlement on its own and grabs the soft ones (M2TW)
- The AI now commits to attacks at roughly parity instead of insisting on a 2-to-1 advantage before it moves (RTW/M2TW)
- Fixed the AI throwing under-strength armies at settlements and losing over and over. It now brings a real numerical edge before assaulting (RTW/M2TW)
- Fixed broke factions taxing settlements to the hilt and rioting them straight back into rebellion (RTW/M2TW)
- The campaign AI now concentrates its armies and actually invades, instead of sitting in its garrisons hoarding troops and money (RTW/M2TW)
- Fixed the campaign AI giving up on any target more than one turn's march away, so it would mass an army and then wander off or sit near a target instead of committing (RTW/M2TW)
- Fixed the AI never invading factions it shares no border with (RTW/M2TW)
- Fixed AI building and unit choices silently breaking in large mods where a settlement can build many things at once: the priority total overflowed and everything past the cap became unpickable (M2TW)
Crashes & Stability
- Fixed a crash when a settlement appoints a new governor and a candidate general died earlier at the same time (RTW/M2TW)
- Fixed a crash clicking the Senate Offices button when the senate faction has been eliminated or is human-controlled (RTW)
- Fixed a crash during rebellion garrison creation when the settlement's recruitment pool is empty (RTW/M2TW)
- Fixed a crash with rebellion unit selection (RTW/M2TW)
- Fixed a rare crash in battle autoresolve processing units with zero starting soldiers (RTW/M2TW)
- Fixed a crash clicking loot/occupy/sack on a captured settlement whose faction had been cleared (RTW)
- Fixed a state-corruption assert after battles when the opponent faction type was invalid (RTW/M2TW)
- Fixed a rare crash with the stratmap rendering (RTW/M2TW)
- Fixed crashes with XC5 when the mod supplies invalid data but the game just ignores it, causing memory corruption (RTW)
- Fixed a crash when a campaign script command (e.g. change_population_religion) referenced a faction name that doesn't exist. The engine now logs the parse error and skips the command instead of segfaulting on a null faction (RTW/M2TW)
- Fixed a freeze in 2v2+ battles when the AI tried to path for a battle group whose formation had no units. This was a vanilla issue plaguing large battles (RTW/M2TW)
- Fixed a crash on quitting from a battle (RTW/M2TW)
- Fixed a crash on battle load when Shader Version 3 was selected. The shader translator now falls back to a lower version per material if Shader3 isn't mapped in graphics_config.xml, so existing mods don't need updates (RTW/M2TW)
- Fixed a crash when clicking the Call Crusade button in mods that don't define all of catholic, orthodox, and heretic religions. The targets scroll opens empty instead (M2TW)
- Fixed a crash on the loading screen when a cavalry unit got deployed outside the battlefield somehow (probably when nowhere in a besieged settlement could fit the formation). Soldiers now end up clamped to the playable area instead of crashing (RTW/M2TW)
- Made the deployment clamp into the playable area instead of deploying out of bounds (RTW)
- Fixed a crash when opening the Video Options menu on a non-English language (RTW/M2TW)
- Fixed a startup crash when preferences.txt had uppercase X in resolution lines (e.g. STRATEGY_RESOLUTION:1920X1200) (RTW)
- Fixed a crash on projectile impact when a mod references an Area_Effect_Set whose entries don't exist (M2TW)
- Fixed a potential road saving issue under esoteric conditions (RTW/M2TW)
- Fixed a crash on battle start when a unit's .cas file had weighted vertices referencing bones outside the skeleton (RTW/M2TW)
- Fixed a crash on campaign load when a region's port_pos in descr_strat had no sea-adjacent dock tile. This was 100% preventable by reading the startup errors but seems like no one did it (RTW/M2TW)
- Fixed a startup crash when descr_vegetation.txt references a .cas model file that doesn't exist on disk. The bad variant now gets dropped at parse time with a log line instead of crashing later on a vegetation/(null) texture. Same applies for variants referencing an undefined model name or a model with no LOD levels (RTW)
- Fixed launch failing with "Reinstall DirectX" on recent AMD beta drivers, and intermittent crashes when switching from loading screen to 3D on Intel GPUs (RTW/M2TW)
- Fixed a crash in defend-crossing battle tactics when a formation was emptied out. The path no longer falls into an infinite loop and freezes the game (RTW/M2TW)
- Fixed a crash during character rebellions where a captain's army got destroyed mid-revolt (RTW/M2TW)
- Fixed a crash on revolt when a settlement's recruitment pool started with a mercenary unit, which overflowed the unit list (RTW/M2TW)
- Fixed a battle crash when a prebattle speech or event-notification sound used a file with a non-ASCII filename (RTW/M2TW)
- Fixed an infinite loop that froze the game when the AI disembarked a fleet carrying a passenger with no movement points left (RTW/M2TW)
- Fixed a potential crash when checking for character portrait image files (RTW/M2TW)
- Fixed a crash during campaign turn processing when a character still referenced an army that had been destroyed (RTW/M2TW)
- Fixed a crash at the start of an AI faction's turn when one of its settlements had negative generated income, from heavy devastation or modded economy values (RTW/M2TW)
- Fixed a crash when placing units on walls during a siege, caused by an out-of-bounds read in animated .cas mesh playback once a mesh animation reached its last frame (RTW/M2TW)
- Fixed a crash on returning to campaign after a battle if units were engaged in combat at the moment the battle closed (RTW/M2TW)
- Fixed a crash when starting a new campaign if any character's culture lookup returned no match. Such characters now fall back to Roman portraits instead of crashing out (RTW/M2TW)
- Fixed a crash that struck a turn or two after a general died and his bodyguard unit was destroyed (RTW/M2TW)
- Fixed a crash on end-turn when a settlement revolted and the rebel garrison was created without a valid army leader (typically an NPC getting promoted to lead the revolt) (RTW/M2TW)
- Fixed a crash when hovering a battlefield gate whose BUILDING_BATTLE_GATE failed to load (RTW/M2TW)
- Fixed a divide-by-zero crash when opening the Alexander campaign, custom battle, or historical battle screens if any battle script's play_sound_event referenced an event whose sound didn't exist. The event now logs "Sound event ... is empty" instead of dying (RTW)
- Fixed a potential crash when assigning portraits to slave generals or admirals with a non-existing original faction (M2TW)
- Fixed a potential crash drawing rebel banners for slave armies missing their sub-faction, or for cultures that omit rebel_standard_index in descr_cultures.txt (M2TW)
- Fixed a potential crash on campaign load when descr_strat references an unknown culture name on a fort. Unknown names now substitute the first culture and log a warning (M2TW)
- Fixed a potential crash when an EDB belief capability cites a misspelled belief name (RTW)
- Fixed a potential crash when a region changes religion and the region's official religion was unset (RTW)
- Fixed a potential crash from units whose armour_ug_levels and armour_ug_models lists are mismatched in length or declare too many armour tiers (RTW/M2TW)
- Fixed a possible crash loading a .cas model whose texture is referenced by a bare filename with no folder path (RTW/M2TW)
- Fixed a crash loading .cas files that contain only weighted geometry, with no flexi submeshes (RTW/M2TW)
- Fixed a long-standing OG crash when a faction became a horde in a region too crowded to place the new army stacks (RTW/M2TW)
- Fixed spawn_army crashing when its target tile already had an enemy garrison inside a settlement or fort. Now logs an error and skips the spawn (RTW/M2TW)
- Fixed a crash when a Roman faction reached its province victory target in a mod with no Senate faction (or something else going wrong) (RTW)
- Fixed a potential crash on opening the campaign map with radar maps larger than the UI texture page size (RTW)
- Fixed a multiplayer battle crash, and units only moving to a handful of spots during deployment, both caused by the game identifying the local player's army wrong, related to the same-faction army stuff (RTW/M2TW)
- Fixed an incredibly schizoid, long-standing CTD (inherited from CA, not our bug) which happened when ordering attacks in heavily modded campaigns (SYW ran into this). The engine was reporting "missing building image" errors into a buffer during the loading screen that was never big enough and wasn't checked. The overflow bytes happened to land on an unrelated cache's "I'm already initialised" flag, which then convinced the engine to skip allocating that cache. An eternity later, you would load a campaign, click on a unit, click attack, and the never-allocated cache would hit null in some random code that has nothing to do with buildings (RTW/M2TW)
- Hardened a class of latent crashes exposed by the recent culture, religion, and faction uncaps. When mod data has wrong references (typo'd entry, deleted faction, missing belief), lookups now log and fall back to a default instead of crashing out. Of course, you should still fix your mods, but the engine will crash less (RTW/M2TW)
- Went over roughly two-thirds of the array declaration callsites in the games and fixed up buffer overflows (memory corruption as you might know). Did the same with string stuff too, to prevent memory corruption in the future (RTW/M2TW)
- Fixed more long-standing silent heap corruption including one which fired every time a unit changed action or task in battle (RTW/M2TW)
- Fixed a double-free in the UI texture cache when it grew (RTW/M2TW)
- Fixed ~10 memory leaks that built up every battle related to units, siege engines and banners (along with their textures and materials), so more battles won't eat more memory (RTW/M2TW)
- Crash reports are now a bit better. We hesitated about including a full disassembler in them, but it's not needed for now and it keeps the crash report smaller. We'll have it if we get seriously messed-up memory corruptions in the future (RTW/M2TW)
- Fixed a crash, and possible save corruption, when capturing a faction's last settlement while its leader was inside and the heir was alive elsewhere on the map. Killing the heir first used to be the workaround, now you can just take the town properly (RTW/M2TW)
- Fixed a crash opening the siege scroll when a general's negative siege-engineering traits dropped an army's build points to exactly 0. Also fixed negative build points showing a bogus "0 turns" instabuild on the queue while nothing actually built (RTW)
- Fixed a crash during siege battles when units were reforming on the walls (RTW)
- Fixed a crash when a siege engine caught fire during a battle (rams, towers, ladders). The flames now render over the burning engine instead of taking the game down (M2TW)
- Fixed a battle crash when a soldier walked onto a wall, tower, gate or siege tower with a broken ground material, i.e. uninitialised pathfinding data. Looking at you, EBII sieges (M2TW)
- Fixed a startup crash in mods whose descr_names.txt lists a faction that isn't in descr_sm_factions.txt, or is misspelled. The bad line is now skipped and logged instead of taking the game down (M2TW)
- Fixed a crash on game close when loading a savegame with active senate missions (RTW)
- Fixed a crash when disbanding a unit standing in a region whose settlement had been destroyed (RTW)
- Fixed a vanilla crash in the building scroll when a recruit line had no requires condition, or sat in a faction_capability block (RTW/M2TW)
- Fixed a crash on startup when a building capability had a display tag placed inside its requires condition, like requires factions { all, } display hide and region_religion local 1 (RTW/M2TW)
- Fixed a crash on load when an EDB capability condition placed treasury, population_squalor, random_percent or settlement_tax_level before another condition (e.g. ... and treasury >= 10000 and not ai_controlled crashed, while the reverse order didn't) (RTW/M2TW)
- Fixed a crash when right-clicking a wasteland region on the campaign map (RTW/M2TW)
- Fixed a crash when an AI horde occupies a settlement (RTW/M2TW)
- Hardened the AI's region valuation against uninhabited and sea regions, so it can no longer crash on a missing settlement (RTW/M2TW)
- Fixed a crash on loading a save after editing the map's heights, when the AI evaluates a region with no owner (sea, wasteland or a broken province) (RTW/M2TW)
- Fixed a crash when a historic event fires without its _TITLE or _BODY text defined (e.g. a custom event in campaign_script.txt). The event now falls back to showing the raw event name instead of crashing out (RTW/M2TW)
- Fixed a campaign-map freeze (window goes unresponsive without actually crashing) caused by the strategic minimap failing to update its terrain and then spinning forever (RTW/M2TW)
- Hardened battlefield prop and sky rendering against a potential crash if the graphics device is lost (e.g. a driver update) mid-game (RTW/M2TW)
- Fixed a crash at the end of the turn when a region's religion data was never set up, for example a map_regions.tga colour with no matching descr_regions.txt entry. The region now runs without religion instead of crashing (M2TW)
- Fixed a crash at the end of the turn when a faction had no religion set, or referenced a religion that doesn't exist. Conversions from that faction are now ignored instead of crashing (M2TW)
- Fixed a battle-load crash in mods whose effect textures (.dds) were saved without all their mipmaps (RTW/M2TW)
- Fixed a crash when opening the battle editor (RTW/M2TW)
- Fixed a crash when merging two armies or fleets where one stack is emptied completely in the same exchange (RTW/M2TW)
- Fixed a crash when moving an entire generalless garrison into an adjacent army via the unit-exchange scroll (RTW/M2TW)
- Fixed a crash when ending a turn or saving if the mod's descr_names.txt listed a name missing from names.txt (RTW)
- Fixed a melee crash in custom battles when a unit lands a successful attack but its skeleton is missing the matching blocking/recovery animation and the defender blocks. The game now skips the missing recovery anim instead of crashing. This is for mods with custom animations like EB II (M2TW)
- Fixed a crash during battle when soldiers fight around planted stakes, and other cases involving freshly reinforcing units (RTW/M2TW)
- Fixed a crash when a script spawns a rebel/slave army with spawn_army faction slave and no sub_faction set. The game now falls back to the generic rebel portrait instead of crashing on the event turn (RTW/M2TW)
- Fixed a crash when right-clicking a building in the construction queue or build browser to open its description (most visible on temples) (RTW/M2TW)
- Fixed a crash to desktop when pressing Esc to open the in-game menu on the campaign map in Rome, where the menu would fail to appear and repeated Esc presses crashed (RTW/M2TW)
- Fixed battles freezing to a slideshow when a missile unit's skeleton was missing its attack_missile_reload animation. Affected units now reload instantly instead of spamming the log every shot, and the issue is reported once per skeleton (M2TW)
- Fixed log spam and framerate death on battle maps whose lighting was fully black (M2TW)
Misc
- The famous trait overflow bug is fixed (the one with chivalry, dread, authority and the rest). Seeker wants all you sinners to know it was apparently never posted before (RTW/M2TW)
- Added the full docudaemon to the REX docs on GitHub for both games (RTW/M2TW)
- Added a full list of console commands to the docudaemon (RTW/M2TW)
- Rome and Medieval (or any two installs in separate folders) can now run at the same time. The single-instance lock is per install folder instead of one shared lock, so different folders coexist while the same folder still blocks accidental double-launches, keeping your saves safe (RTW/M2TW)