• We have updated our Community Code of Conduct. Please read through the new rules for the forum that are an integral part of Paradox Interactive’s User Agreement.

Vonsson

Second Lieutenant
Nov 5, 2017
111
0
Introduction

Over the past while I've spent significant time adjusting the Heart of Iron 3 TFH AI, game mechanics and technology to produce what I feel is a more accurate and difficult game. I have combined the Low Countries, Commonwealth and Scandinavia into single states while integrating their military and political leadership.

I have found these changes have produced a much improved experience.

---

Prologue

After assuming power, the regime has formulated a primary directive; the long-term security of the new government and where possible, limited territorial acquisitions to the East. To best achieve this aim, a redevelopment programme of the armed forces, industry production and research institutes has been established.

With reference to the latest theories in mobile warfare, we have come to the conclusion that the next conflict will be decided by the concentrated use of armour, mobile and air assets at specific points in the opposing forces lines. Conventional infantry and artillery forces will be utilised in a holding role to tie down regular enemy concentrations.

Vonsson, Winter 1934
 
In order to allay the fears of our friends in Western Europe we have disestablished the remaining land fortifications on the Franco-Dutch border. It was also felt that in any future conflict the British would attempt to make use of aerial bombing to avoid heavy ground force casualties. To counter this, substantial air defences have been implemented from Kiel in the north to Lörrach in the south.

Our statisticians inform us that we have an industrial capacity of 201 IC, we have focused on the development of further armoured units as well as interceptor squadrons. Our diplomatic efforts are directed to the newly established Scandinavian Union which we believe the British and French made some effort to establish in a containment operation. This follows a similar pattern to the reunification of the Low Countries that took place soon after the regime took power. Our chances of bringing them into our sphere of influence is deemed to be weak and therefore we are not expending efforts on that front.

Our friends in the Spanish Military have rebelled against their socialistic government and naturally we are providing assistance where possible but this must remain discreet. We follow developments elsewhere with much interest.

We currently have the following forces available to us.

Army
32 Infantry Divisions
3 Infantry Brigades
1 Artillary Brigades

2 Armoured Divisions
2 Medium Armoured Brigades
2 Mobile Infantry Brigades

8 Garrison Divisions
3 Garrison Brigades

Navy
1 Battle Fleet
1 Carrier
1 Battleship
2 Heavy Cruisers
2 Light Cruisers

1 Destroyer Flotilla
4 Destroyers

1 Transport Flotilla
1 Heavy Cruiser
1 Light Cruiser
4 Landing Craft

Air
3 Interceptor Wings
4 Interceptor Squadrons

1 Tactical Wing
4 Tactical Squadrons

Vonsson, Summer 1936

vkqKiKR.png
 
General Franco has successfully taken control of the Spanish Republic and our diplomatic efforts are now directed towards his new regime. It is understood that the rapidity of his victory was in part a result our our assistance and perhaps in time this will be repaid.

Our military development program continues in earnest as we add further interceptor squadrons are added. New naval and tactical bombers have been ordered in alignment with our overall strategy.

Vonsson, Winter 1937

7zFi9cc.png
 
The Japanese have begun an invasion of Nationalist China. The increasingly close relations between our two nations mean that out leadership are extremely pleased with these events. We are using our intelligence services to assist the Japanese as best we can.

We currently have the following forces available to us.

Army
32 Infantry Divisions
3 Infantry Brigades
1 Artillery Brigades

8 Armoured Divisions
2 Medium Armoured Brigades
2 Mobile Infantry Brigades

8 Garrison Divisions
3 Garrison Brigades

Navy
1 Battle Fleet
1 Carrier
1 Battleship
2 Heavy Cruisers
2 Light Cruisers

1 Destroyer Flotilla
4 Destroyers

1 Transport Flotilla
1 Heavy Cruiser
1 Light Cruiser
4 Landing Craft

Air
4 Interceptor Wings
4 Interceptor Squadrons

2 Tactical Wing
4 Tactical Squadrons

1 Naval Wing
4 Tactical Squadrons

Vonsson, Winter 1938

f0h2Ryl.png
 
Interesting concept and it seems you have put a good deal into fine-tuning. Did you do anything about Nationalist China never fighting on against the Japanese during the war? Or was the focus more on Europe and making the game more of a challenge for Germany?

I actually don’t play Germany very often, in part because of the lack of challenge you have sought to redress in your mod, so will be interested to see how it plays.
 
We have annexed both Austria and the Sudetenland in a series of political coups that the leadership are exceedingly proud of... While these are undoubtedly good omens our potential foes have begun to prepare themselves for a clash of arms.

The combined economic capacity of the Allies is as follows:

Commonwealth - 50 IC
France - 137 IC
United Kingdom - 217 IC

Against this we produce 232 IC, we must hope that out strategy and technology can outweigh this disadvantage should it come it come to blows.

Our Japanese friends have made a successful counter attack against the Chinese after some early setbacks, this conflict remains in the balance.

Vonsson, Summer 1938
 
Interesting concept and it seems you have put a good deal into fine-tuning. Did you do anything about Nationalist China never fighting on against the Japanese during the war? Or was the focus more on Europe and making the game more of a challenge for Germany?

I actually don’t play Germany very often, in part because of the lack of challenge you have sought to redress in your mod, so will be interested to see how it plays.

Indeed, the Japanese are now almost certain to begin operations against the Chinese in 1938. I also merged the Chinese and Japanese minors, Manchukuo et al no longer appear. I felt the AI struggled to manage these fronts properly.
 
A moderate diplomatic blow as the Low Countries join the allies alongside Poland. Perhaps the leadership's certainty in their own genius was overdone for once. This only increases the economic and strategic disadvantage we already faced.

We have had to rearrange our force disposition with two infantry armies now placed on the western frontier to prevent any offensive actions there while we deal with our foes in the east. We still maintain a heavy advantage in eastern theatre.

Vonsson, Winter 1939
 
With Soviet arrangements in place to partition Poland, the time for war had begun. And only too soon as the Allies are mobilising in earnest. It is believed we face ~120 divisions in the west as well as ~30 divisions in the east. We must strike quickly in the east before turning on France and the Low Countries. As it stands we now posses the following forces.

Army
56 Infantry Divisions
3 Infantry Brigades
1 Artillary Brigades

12 Armoured Divisions
2 Medium Armoured Brigades
2 Mobile Infantry Brigades

12 Garrison Divisions
3 Garrison Brigades

Navy
1 Battle Fleet
1 Carrier
1 Battleship
2 Heavy Cruisers
2 Light Cruisers

1 Destroyer Flotilla
4 Destroyers

1 Transport Flotilla
1 Heavy Cruiser
1 Light Cruiser
4 Landing Craft

Air
5 Interceptor Wings
4 Interceptor Squadrons

2 Tactical Wing
4 Tactical Squadrons

2 Naval Wing
4 Naval Squadrons

Our battle plan in the east is to hold East Prussia while connecting it to the rest of the country. The main thrust will be conducted by two armoured corps from Silesia towards Warsaw with support from infantry forces. Assisting this thrust to Warsaw are two tactical bomber wings as well as an interceptor wing. A third armoured corps will move towards Kraków in the south thereby removing any lingering resistance.

In the west 32 infantry divisions with 4 interceptor wings and 2 naval bomber wings will contain Allied forces until an offensive can be conducted there.

Battle commences at 1600.

Vonsson, July 6th, 1939

5i4NA1C.png


ZKWoaKR.png


Gv5AUbB.png
 
Indeed, the Japanese are now almost certain to begin operations against the Chinese in 1938. I also merged the Chinese and Japanese minors, Manchukuo et al no longer appear. I felt the AI struggled to manage these fronts properly.
Good job! I'll watch with even more interest :). Because, as you no doubt were well aware and seem to have planned for, if playing Germany and wanting a good challenge from the Soviets, having unrestricted Japanese warfare against the Soviets in the Far East makes the SU AI's job even harder.
 
Welcome to AARland, hopefully this will be an adventure you appreciate!:)

I haven't played Germany in a long time, so I'm not entirely familiar with what it is like, but you certainly look to have given yourself a challenge.
 
Code:
local P = {}
AI_ENG = P

-- #######################################
-- Static Production Variables overide
function P._LandRatio_Units_(minister)
    local laLandRatioUnits = {
        'garrison_brigade', -- Garrison
        'infantry_brigade', -- Infantry
        'motorized_brigade', -- Motorized
        'mechanized_brigade', -- Mechanized
        'armor_brigade|heavy_armor_brigade|super_heavy_armor_brigade', -- Armor
        'militia_brigade', -- Militia
        'cavalry_brigade'}; -- Cavalry
   
    return laLandRatioUnits
end

-- #######################################

-- #######################################
-- Start of Trade Weights
function P.TradeWeights(voResourceData)
    local laResouces = {
        METAL = {
            Buffer = 2,
            BufferSaleCap = 5000},
        ENERGY = {
            Buffer = 2,
            BufferSaleCap = 5000},
        RARE_MATERIALS = {
            Buffer = 2,
            BufferSaleCap = 5000},
        CRUDE_OIL = {
            Buffer = 2,
            BufferSaleCap = 10000},
        FUEL = {
            Buffer = 2,
            BufferSaleCap = 10000}}
   
    return laResouces
end

-- Tech weights
--   1.0 = 100% the total needs to equal 1.0
function P.TechWeights(voTechnologyData)
    local laTechWeights = {
        0.15, -- landBasedWeight
        0.10, -- landDoctrinesWeight
        0.15, -- airBasedWeight
        0.15, -- airDoctrinesWeight
        0.14, -- navalBasedWeight
        0.15, -- navalDoctrinesWeight
        0.10, -- industrialWeight
        0.03, -- secretWeaponsWeight
        0.03}; -- otherWeight
   
    return laTechWeights
end

-- Techs that are used in the main file to be ignored
--   techname|level (level must be 1-9 a 0 means ignore all levels
--   use as the first tech name the word "all" and it will cause the AI to ignore all the techs
function P.LandTechs(voTechnologyData)
    local ignoreTech = {
        {"cavalry_smallarms", 0},
        {"cavalry_support", 0},
        {"cavalry_guns", 0},
        {"cavalry_at", 0}};
       
    local preferTech = {};
       
    return ignoreTech, preferTech
end

function P.LandDoctrinesTechs(voTechnologyData)
    local ignoreTech = {};
       
    local preferTech = {};
       
    return ignoreTech, preferTech
end

function P.AirTechs(voTechnologyData)
    local ignoreTech = {};

    local preferTech = {};
       
    return ignoreTech, preferTech
end

function P.AirDoctrineTechs(voTechnologyData)
    local ignoreTech = {};

    local preferTech = {};  
       
    return ignoreTech, preferTech
end
       
function P.NavalTechs(voTechnologyData)
    local ignoreTech = {
        {"battlecruiser_technology", 0},
        {"battlecruiser_antiaircraft", 0},
        {"battlecruiser_engine", 0},
        {"battlecruiser_armour", 0}};

    local preferTech = {};
       
    return ignoreTech, preferTech
end
       
function P.NavalDoctrineTechs(voTechnologyData)
    local ignoreTech = {};

    local preferTech = {};
       
    return ignoreTech, preferTech
end

function P.IndustrialTechs(voTechnologyData)
    local ignoreTech = {};

    local preferTech = {};
       
    return ignoreTech, preferTech
end
       
function P.SecretWeaponTechs(voTechnologyData)
    local ignoreTech = {};

    local preferTech = {};
       
    return ignoreTech, preferTech
end

function P.OtherTechs(voTechnologyData)
    local ignoreTech = {};
       
    local preferTech = {
        "supply_transportation",
        "supply_organisation",
        "civil_defence"};      

    return ignoreTech, preferTech
end

-- END OF TECH RESEARCH OVERIDES
-- #######################################


-- #######################################
-- Production Overides the main LUA with country specific ones

-- Production Weights
--   1.0 = 100% the total needs to equal 1.0
function P.ProductionWeights(voProductionData)
    -- Default Ratio when no conditions are met
    local laArray = {
        0.40, -- Land
        0.20, -- Air
        0.40, -- Sea
        0.00}; -- Other
   
    -- Check to see if manpower is to low
    -- More than 900 brigades so build stuff that does not use manpower
    if (voProductionData.ManpowerTotal < 300 or voProductionData.LandCountTotal > 500) then
        laArray = {
            0.00, -- Land
            0.45, -- Air
            0.45, -- Sea
            0.10}; -- Other  

    elseif voProductionData.IsAtWar then
        local gerTag = CCountryDataBase.GetTag('GER')
        local lbControlBerlin = (CCurrentGameState.GetProvince(1861):GetController() == gerTag)
        local lbGerEngWar = voProductionData.ministerCountry:GetRelation(gerTag):HasWar()
        local lbGerEngAlly = voProductionData.ministerCountry:GetRelation(gerTag):HasAlliance()  
        local japTag = CCountryDataBase.GetTag('JAP')
        local lbControlTokyo = (CCurrentGameState.GetProvince(5315):GetController() == japTag)
        local lbJapEngWar = voProductionData.ministerCountry:GetRelation(japTag):HasWar()

    if lbGerEngAlly then
        laArray = {
            0.30, -- Land
            0.30, -- Air
            0.40, -- Sea
            0.00}; -- Other

    elseif lbJapEngWar and lbControlTokyo then
        laArray = {
            0.30, -- Land
            0.20, -- Air
            0.50, -- Sea
            0.00}; -- Other

    elseif lbGerEngWar and lbControlBerlin then
        laArray = {
            0.40, -- Land
            0.20, -- Air
            0.40, -- Sea
            0.00}; -- Other              
    end
    end  

    return laArray
end

-- Land ratio distribution
function P.LandRatio(voProductionData)
    local laArray = {
        garrison_brigade = 4,
        infantry_brigade = 20,
        motorized_brigade = 2,
        mechanized_brigade = 1,
        armor_brigade = 2};
   
    return laArray
end

-- Special Forces ratio distribution
function P.SpecialForcesRatio(voProductionData)
    local laRatio = {
        12, -- Land
        1}; -- Special Force Unit

    local laUnits = {
        marine_brigade = 1,
        bergsjaeger_brigade = 1,
        paratrooper_brigade = 1};
   
    return laRatio, laUnits  
end

-- Elite Units
function P.EliteUnits(voProductionData)
    local laUnits = {"gurkha_brigade"};
   
    return laUnits  
end

-- Which units should get 1 more Support unit with Superior Firepower tech
function P.FirePower(voProductionData)
    local laArray = {
        "infantry_brigade",
        "motorized_brigade",
        "mechanized_brigade",
        "armor_brigade",
        "heavy_armor_brigade"};
       
    return laArray
end

-- Air ratio distribution
function P.AirRatio(voProductionData)
    local laArray = {
        interceptor = 4,
        multi_role = 4,
        rocket_interceptor = 1,
        cas = 2,
        tactical_bomber = 2,
        naval_bomber = 1,
        strategic_bomber = 2};
   
    return laArray
end

-- Naval ratio distribution
function P.NavalRatio(voProductionData)
    local laArray = {
        destroyer = 4,
        submarine = 1,
        light_cruiser = 3,
        heavy_cruiser = 3,
        battleship = 1.5,
        super_heavy_battleship = 0.5,
        escort_carrier = 1,
        carrier = 1};

        local gerTag = CCountryDataBase.GetTag('GER')
        local lbControlBerlin = (CCurrentGameState.GetProvince(1861):GetController() == gerTag)
        local lbGerEngWar = voProductionData.ministerCountry:GetRelation(gerTag):HasWar()
        local lbGerEngAlly = voProductionData.ministerCountry:GetRelation(gerTag):HasAlliance()  
        local japTag = CCountryDataBase.GetTag('JAP')
        local lbControlTokyo = (CCurrentGameState.GetProvince(5315):GetController() == japTag)
        local lbJapEngWar = voProductionData.ministerCountry:GetRelation(japTag):HasWar()

    if lbGerEngWar and lbControlBerlin then
        laArray = {
        destroyer = 4,
        submarine = 1,
        light_cruiser = 3,
        heavy_cruiser = 3,
        battleship = 1.5,
        super_heavy_battleship = 0.5,
        escort_carrier = 1,
        carrier = 0.5};

    elseif lbJapEngWar then
        laArray = {
        destroyer = 2,
        submarine = 1,
        light_cruiser = 3,
        heavy_cruiser = 3,
        battleship = 1.5,
        super_heavy_battleship = 1,
        escort_carrier = 1.5,
        carrier = 1};
       
    elseif lbGerEngAlly then
        laArray = {
        destroyer = 2,
        submarine = 1,
        light_cruiser = 3,
        heavy_cruiser = 3,
        battleship = 1,
        super_heavy_battleship = 1,
        escort_carrier = 1,
        carrier = 1};
   
    end      
    return laArray
end

-- Transport to Land unit distribution
function P.TransportLandRatio(voProductionData)
    local laArray = {
        16, -- Land
        1,  -- transport
        0.5};  -- invasion craft
 
    return laArray
end

-- Convoy Ratio control
--- NOTE: If goverment is in Exile these parms are ignored
function P.ConvoyRatio(voProductionData)
    local laArray = {
        20, -- Percentage extra (adds to 100 percent so if you put 10 it will make it 110% of needed amount)
        80, -- If Percentage extra is less than this it will force it up to the amount entered
        150, -- If Percentage extra is greater than this it will force it down to this
        5}; -- Escort to Convoy Ratio (Number indicates how many convoys needed to build 1 escort)
 
    return laArray
end

-- Create Armored
function P.Build_Armor(ic, voProductionData, armor_brigade, vbGoOver)
    return Support.Build_Standard_Armor(ic, voProductionData, armor_brigade, vbGoOver)
end

-- Create Motorised
function P.Build_Motorized(ic, voProductionData, motorized_brigade, vbGoOver)
    return Support.Build_Standard_Motorized(ic, voProductionData, motorized_brigade, vbGoOver)
end

-- Never build and underground
function P.Build_Underground(ic, voProductionData)
    return ic, false
end

function P.Build_AntiAir(vIC, voProductionData)
    if voProductionData.ManpowerTotal > 800 then
        return vIC, false
    end
    return vIC, true
end

function P.Build_Infrastructure(vIC, voProductionData)
    if voProductionData.ManpowerTotal > 800 then
        return vIC, false
    end
    return vIC, true
end

function P.Build_Fort(vIC, voProductionData)
    if voProductionData.ManpowerTotal > 800 then
        return vIC, false
    end
    return vIC, true
end

function P.Build_CoastalFort(vIC, voProductionData)
    if voProductionData.ManpowerTotal > 800 then
        return vIC, false
    end
    return vIC, true
end

function P.Build_AirBase(vIC, voProductionData)
    if voProductionData.ManpowerTotal > 800 then
        return vIC, false
    end
    return vIC, true
end

function P.Build_NavalBase(vIC, voProductionData)
    if voProductionData.ManpowerTotal > 800 then
        return vIC, false
    end
    return vIC, true
end

function P.Build_Radar(vIC, voProductionData)
    if voProductionData.ManpowerTotal > 800 then
        return vIC, false
    end
    return vIC, true
end

function P.Build_Industry(ic, voProductionData)
    return ic, false
end

-- END OF PRODUTION OVERIDES
-- #######################################

-- #######################################
-- Intelligence Hooks


-- End of Intelligence Hooks
-- #######################################

function P.DiploScore_Embargo(voDiploScoreObj)
    -- If Japan then do some special checks
    if tostring(voDiploScoreObj.EmbargoTag) == "JAP" then
        -- If we are part of the allies and JAP in axis
        if (voDiploScoreObj.ministerCountry:GetFaction() == CCurrentGameState.GetFaction("allies")) and
            (voDiploScoreObj.Faction == CCurrentGameState.GetFaction("axis"))
        then
            local usaTag = CCountryDataBase.GetTag("USA")
            local loRelation = usaTag:GetCountry():GetRelation(voDiploScoreObj.EmbargoTag)
           
            -- USA is currently embargoing Japan
            -- and is at war so we make sure they dow US first
            if loRelation:HasEmbargo() and loRelation:HasWar() then
                voDiploScoreObj.Score = 100
               
            -- Do not embargo japan unless the USA does so first
            else
                voDiploScoreObj.Score = 0
            end
           
        -- Never embargo Japan then
        else
            voDiploScoreObj.Score = 0
        end
    end
   
    return voDiploScoreObj.Score
end

function P.DiploScore_OfferTrade(voDiploScoreObj)
    local laTrade = {
        CAN = {Score = 100},
        USA = {Score = 100},
        HOL = {Score = 100},
        CHI = {Score = 100},
        GER = {Score = 20},
        ITA = {Score = 20},
        JAP = {Score = 20}}
   
    if laTrade[voDiploScoreObj.TagName] then
        return voDiploScoreObj.Score + laTrade[voDiploScoreObj.TagName].Score
    end
   
    return voDiploScoreObj.Score
end

function P.DiploScore_InfluenceNation(voDiploScoreObj)
    -- Only do this if we are in the allies
    if voDiploScoreObj.FactionName == "allies" then
        local loInfluences = {
            CHI = {Score = 50},
            CAN = {Score = 50},
            USA = {Score = 50},
            HOL = {Score = 20},
            YUG = {Score = 20},
            NOR = {Score = 20},
            SPR = {Score = 20},
            POR = {Score = 20},
            GRE = {Score = 20},
            TUR = {Score = 20},
            SAU = {Score = 20},
            PER = {Score = 20}}  
   
        -- Are they on our list
        if loInfluences[voDiploScoreObj.TargetName] then
            return (voDiploScoreObj.Score + loInfluences[voDiploScoreObj.TargetName].Score)
        end
    end

    return voDiploScoreObj.Score
end

--##########################
-- Foreign Minister Hooks
function P.ForeignMinister_Influence(voForeignMinisterData)
    local laIgnoreWatch -- Ignore this country but monitor them if they are about to join someone else
    local laWatch -- Monitor them and also fi their score is high enough they can be influenced normally
    local laIgnore -- Ignore them completely

    if voForeignMinisterData.FactionName == "allies" then
        laWatch = {
            "CAN",
            "USA",
            "CHI"}
           
        laIgnoreWatch = {
            "TUR", -- Turkey
            "SPA", -- Spain
            "PER", -- Persia
            "SAU", -- Saudi Arabia
            "ARG", -- South America
            "BOL",
            "BRA",
            "CHL",
            "COL",
            "ECU",
            "GUY",
            "PAR",
            "PRU",
            "URU",
            "VEN",
            "CUB", -- Central America
            "COS",
            "DOM",
            "GUA",
            "HAI",
            "HON",
            "MEX",
            "NIC",
            "PAN",
            "HOL", -- Holland
            "SWE", -- Sweden
            "SPR", -- Republic Spain
            "POR", -- Portugal
            "SAL"}
           
        laIgnore = {
            "HUN", -- Hungary
            "ROM", -- Romania
            "BUL", -- Bulgaria
            "FIN", -- Finland
            "CYN", -- Yunnan
            "SIA", -- Siam
            "SIK", -- Sikiang
            "CGX", -- Guangxi Clique
            "CSX", -- Shanxi
            "TIB", -- Tibet
            "CHC", -- Communist China
            "LAT", -- Lativia
            "LIT", -- Lithuania
            "EST", -- Estonia
            "LUX", -- Luxemburg
            "VIC", -- Vichy
            "DEN", -- Denmark
            "ETH", -- Ethiopia
            "AUS", -- Austria
            "CZE", -- Czechoslovakia
            "SCH", -- Switzerland
            "VIC", -- Vichy
            "JAP", -- Japan
            "ITA"} -- Italy
    end
   
    return laWatch, laIgnoreWatch, laIgnore
end

function P.ForeignMinister_ProposeWar(voForeignMinisterData)
    if not(voForeignMinisterData.Strategy:IsPreparingWar()) then
        if voForeignMinisterData.FactionName == "allies" then
            local loMinisterCapital = voForeignMinisterData.ministerCountry:GetCapitalLocation():GetContinent()
       
            -- Generic DOW for countries not part of the same faction
            if not(voForeignMinisterData.IsAtWar) then
                for loDiploStatus in voForeignMinisterData.ministerCountry:GetDiplomacy() do
                    local loTargetTag = loDiploStatus:GetTarget()

                    if loTargetTag:IsValid() then
                        local loTargetCountry = loTargetTag:GetCountry()
                        local loTargetContinent = loTargetCountry:GetCapitalLocation():GetContinent()
                       
                        -- Limit DOWs to the same continent as the UKs capital
                        if loMinisterCapital == loTargetContinent then
                            if loDiploStatus:GetThreat():Get() > voForeignMinisterData.ministerCountry:GetMaxNeutralityForWarWith(loTargetTag):Get() then
                                if Support.GoodToWarCheck(loTargetTag, loTargetCountry, voForeignMinisterData, true, true) then
                                    voForeignMinisterData.Strategy:PrepareWar(loTargetTag, 100 )
                                end
                            end
                        end
                    end
                end
            end

            -- Special Checks Start after this point
            local loWarTag = nil
            local loAxisTag = CCurrentGameState.GetFaction("axis"):GetFactionLeader()
           
            -- Normal DOW checks
            if not(voForeignMinisterData.IsAtWar) and voForeignMinisterData.Year < 1941 then
                local loCominternTag = CCurrentGameState.GetFaction("comintern"):GetFactionLeader()
                local loCominternCountry = loCominternTag:GetCountry()
                local loAxisCountry = loAxisTag:GetCountry()
               
                local lbAxisVsComintermWar = loAxisCountry:GetRelation(loCominternTag):HasWar()
               
                if lbAxisVsComintermWar then
                    -- Both Axis and Comintern are at war but we are at peace then check to see if we help Russia or Germany
                    if loCominternCountry:CalcDesperation():Get() > 0.4 then
                        loWarTag = loAxisTag
                       
                    elseif loAxisCountry:CalcDesperation():Get() > 0.4 then
                        loWarTag = loCominternTag
                    end
                else
                    -- If Axis are at war
                    if loAxisCountry:IsAtWar() then
                        loWarTag = loAxisTag
                       
                    -- If Comintern are at war
                    elseif loCominternCountry:IsAtWar() then
                        loWarTag = loCominternTag
                    end          
                end
               
                -- Seperate Watch for Italy
                if loWarTag == nil then
                    local loITATag = CCountryDataBase.GetTag("ITA")
                    local loItalyCountry = loITATag:GetCountry()

                    if loItalyCountry:IsAtWar() then
                        for loDiploStatus in loItalyCountry:GetDiplomacy() do
                            local loTargetTag = loDiploStatus:GetTarget()
                            local lsTargetTag = tostring(loTargetTag)
                           
                            if loTargetTag:IsValid() and loDiploStatus:HasWar() and lsTargetTag ~= "ETH" then
                                loWarTag = loITATag
                                break
                            end
                        end
                    end
                end
               
            -- If we are atwar with the leader of the Axis then look for Vichy
            elseif voForeignMinisterData.ministerCountry:GetRelation(loAxisTag):HasWar() then
                -- Vichy Check and allied with USA
                local loUSATag = CCountryDataBase.GetTag("USA")
                local loUSACountry = loUSATag:GetCountry()
               
                -- Only consider this if we are in the same faction
                if loUSACountry:GetFaction() == voForeignMinisterData.Faction then
                    local loVICTag = CCountryDataBase.GetTag("VIC")
                    local loVichyCountry = loVICTag:GetCountry()
                   
                    if Support.GoodToWarCheck(loVICTag, loVichyCountry, voForeignMinisterData, true, false) then
                        loWarTag = loVICTag
                    end
                end
            end
           
            -- Do we have a DOW?
            if loWarTag ~= nil then
                voForeignMinisterData.Strategy:PrepareWar(loWarTag, 100)
            end          
        end
    end
end

-- Produce slightly better trained troops
function P.CallLaw_training_laws(minister, voCurrentLaw)
    local _ADVANCED_TRAINING_ = 29
    return CLawDataBase.GetLaw(_ADVANCED_TRAINING_)
end

function P.DiploScore_Debt(voDiploScoreObj)
    if (tostring(voDiploScoreObj.ToTag) == "USA") then
        return 100
    end
    return voDiploScoreObj.Score
end

return AI_ENG
 
I was going to prefix that with an explanation by was tripped up by the forum interface. That is an example of the UK AI file, I have stripped out some of entries, adjusted diplomatic and technology goals while simplifying the build profile.
 
Welcome to the forums and to AARland. A very intriguing setup.
 
I take it this is a Germany specific mod? Sounds like if you played the Soviets or Allies, it would make for an easier game for therm

The modifications apply to all sides, having previously tested with most nations it takes a considerable effort to prevail. For instance the Soviets will have roughly 260 divisions by mid-1941, a previous play through as Germany where I attempted an invasion of Russia with 140 divisions resulted in eventual defeat to the AI.

Something I've noticed is more effectual invasions by the Allies, the Dominions, UK and USA will pool troops and offer them to the invading force, it isn't uncommon for them to land 120 divisions in France in a short space of time.

On the other hand Germany is a hard nut to crack, one time it required my 320 Soviet divisions plus a landing of 100 combined Allied divisions to eventually knock them over. Adjustments of the DiploScore_SendExpeditionaryForce function in the ai_diplomacy.lua file seems to have made the allies function as allies if that makes sense.

In summary, the effective use of superior forces in a confined area can make big successes possible (as you will see in coming posts) however is the expanses of Russia you need enormous forces to pull off singular encirclements. Though I am certainly not the most skilled so others may find results differ...
 
Results better than expected, the armoured drive to Warsaw completely obliterated Polish defences and broke morale. The Poles surrender
unconditionally on July 21st. In the meantime strategic bombing has been conducted on our industrial facilities in the West with some success though our interceptor wings have exacted a toll. Critically the combined Franco-Dutch forces have not conducted an offensive despite their 3-1 numerical superiority. French troops have been moved en masse into the Low Countries, strengthening the Allied front but perhaps leaving an opportunity for our forces to exploit.

The 1st Army Group consisting of two infantry armies and the mobile army are being relocated to Frankfurt in preparation for the great drive
west. The Italian regime have indicated their willingness to join the Axis however we believe their contribution will be outweighed by the potential risk of another front to the south. We simply to do not posses the naval forces required to knock out the British in the near-future.

Vonsson, July 25th, 1939

p6QeAUo.png
 
With the 1st Army Group relocated to the west, Operation Onbillijk has been developed. The current disposition of forces prevent us from conducting a broad offensive through the Netherlands, particularly with dikes scattered across the country affecting our mobile divisions. The operation involves the 1st Army Group spearheaded by 12 armoured divisions driving directly towards Bruges thereby isolating most of the Low Countries forces as well as a significant portion of the French Army dug-in there from France itself. These forces are thought to number at least 80 division.

Let battle commence.

Vonsson, August 24th, 1939

fPSfQtb.png