You are viewing a potentially older version of this package. View all versions.
doombubbles-PathsPlusPlus-1.2.3 icon

PathsPlusPlus

A helper mod allowing additional upgrade paths and tiers to be made for towers.

Date uploaded 2 weeks ago
Version 1.2.3
Download link doombubbles-PathsPlusPlus-1.2.3.zip
Downloads 867
Dependency string doombubbles-PathsPlusPlus-1.2.3

This mod requires the following mods to function

LavaGang-MelonLoader-0.7.3 icon
LavaGang-MelonLoader

The World's First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono

Preferred version: 0.7.3
doombubbles-Btd6ModHelper-3.6.5 icon
doombubbles-Btd6ModHelper

A powerful and easy to use API for modding BTD6.

Preferred version: 3.6.5

README

Paths++

A helper mod allowing additional upgrade paths to be made for towers.

Toggle "Balanced Mode" to switch from being still only able to get up to 5 upgrades in any one path and 2 in another, vs getting all vanilla upgrades you normally can as well as any/all available Paths++ upgrades.

Toggling off Balanced Mode can also function well with Ultimate Crosspathing, allowing you to get 5/5/5/5/... towers (assuming the Mod Creators were keeping it in mind while coding).

Example Mods

doombubbles' Tornado Wizards

Tornado Wizards Screenshot

doombubbles' Mirror Universe Paths

Mirror Universe Paths Screenshot

For Modders: Creating your own Path++ mod

Reference Paths++ in your mod

Add Paths++ as a dependency for your mod within your csproj, which can be done by adding this to your main PropertyGroup:

<Dependencies>PathsPlusPlus</Dependencies>

Doing this will make sure the PathsPlusPlus dll is referenced properly by your csproj from your Mods folder.

Full .csproj example
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <RootNamespace>MirrorUniversePaths</RootNamespace>
    <Configurations>Debug;Release</Configurations>
    <Nullable>enable</Nullable>
    <AssemblyName>MirrorUniversePaths</AssemblyName>
    <LangVersion>preview</LangVersion>
    <Optimize>False</Optimize>
    <DebugType>embedded</DebugType>
    <Dependencies>PathsPlusPlus</Dependencies> <!--Added here-->
  </PropertyGroup>

  <ItemGroup>
    <Content Include=".github\workflows\build.yml"/>
  </ItemGroup>

  <Import Project="..\btd6.targets"/>
</Project>

You should also list Paths++ as a dependency in your ModHelperData, that will look something like this

public static class ModHelperData
{
    /* ... */
        
    public const string Dependencies = "doombubbles/PathsPlusPlus";
}

Doing this will also make your GitHub actions workflow download Paths++ automatically when building.

Old Instructions

The easiest way to reference the PathsPlusPlus dll is to put the following within your .csproj file (BELOW where you import btd6.targets)

<ItemGroup>
    <Reference Include="PathsPlusPlus">
        <HintPath>$(BloonsTD6)\Mods\PathsPlusPlus.dll</HintPath>
    </Reference>
</ItemGroup>
Full .csproj example
<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <RootNamespace>FourthPath</RootNamespace>
        <Configurations>Debug;Release</Configurations>
        <Nullable>enable</Nullable>
        <AssemblyName>FourthPath</AssemblyName>
        <LangVersion>latest</LangVersion>
        <Optimize>false</Optimize>
        <DebugType>embedded</DebugType>
    </PropertyGroup>
    
    <Import Project="..\btd6.targets" />
    
    <ItemGroup>
        <Reference Include="PathsPlusPlus">
            <HintPath>$(BloonsTD6)\Mods\PathsPlusPlus.dll</HintPath>
        </Reference>
    </ItemGroup>
    
</Project>
GitHub Actions

To download PathsPlusPlus within GitHub actions, add the following step:

- name: Download PathsPlusPlus
  uses: dawidd6/action-download-artifact@v6
  with:
    github_token: ${{ secrets.GITHUB_TOKEN }}
    workflow: build.yml
    branch: main
    name: PathsPlusPlus.dll
    repo: doombubbles/paths-plus-plus
    path: ${{ env.BLOONSTD6 }}/Mods/

Create your PathPlusPlus

Each Path++ path begins with creating a very simple class just to register your path. All it needs to specify is which tower the path is for. UpgradeCount is set automatically based on how many upgrade classes you add.

public class DartMonkeyFourthPath : PathPlusPlus
{
    public override string Tower => TowerType.DartMonkey;
}

Similarly to ModTowers from Mod Helper, your UpgradeCount should reflect how many upgrades you've actually made so far.

Extending a Vanilla Path

If you instead want to add additional upgrades to a vanilla path, create your PathPlusPlus with an override for the ExtendVanillaPath property like so.

public class DartMonkeyTopPath : PathPlusPlus
{
    public override string Tower => TowerType.DartMonkey;
    
    public override int ExtendVanillaPath => Top;
}

Create your UpgradePlusPlus(s)

For each upgrade you want in your path, you will define an UpgradePlusPlus<T> where the generic parameter <T> will be your PathPlusPlus class above.

public class BetterDarts : UpgradePlusPlus<DartMonkeyFourthPath>
{
    public override int Cost => 50;
    public override int Tier => 1;
    public override string Icon => VanillaSprites.ArmorPiercingDartsUpgradeIcon;

    public override string Description => "Darts can pop Frozen bloons";

    public override void ApplyUpgrade(TowerModel towerModel)
    {
        foreach (var damageModel in towerModel.GetDescendants<DamageModel>().ToArray())
        {
            damageModel.immuneBloonProperties &= ~BloonProperties.Frozen;
        }
        
        if (IsHighestUpgrade(towerModel))
        {
            // apply a custom display, if you want
        }
    }
}

There are many familiar properties shared from ModUpgrade that all function basically the same, i.e. Cost, Tier, Icon, Description, DisplayName and ApplyUpgrade.

If you do not specify a Portrait, it will try to find an image from your mod with name {Path.Name}{Tier}.png such as DartMonkeyFourthPath1.png, otherwise the default tower portrait will be used.

If your upgrade adds an ability to the tower, override the Ability property to be true so it shows the lightning bolt in the Upgrade Screen.

If you want to change the container background for your upgrade in the upgrade screen, you can override the Container property with a string GUID. Some standard options you may want are the default VanillaSprites.UpgradeContainerBlue, VanillaSprites.UpgradeContainerTier5, or VanillaSprites.UpgradeContainerParagon. Additionally, the UpgradePlusPlus class contains some extra sprites that would be good options for Tier 6+ Upgrades including UpgradeContainerPlatinum, UpgradeContainerDiamond and UpgradeContainerRainbow.

Upgrade effects

When implementing ApplyUpgrade code, it's important for you to try to make as few assumptions as possible in order to increase compatibility and prevent bugs with other paths.

Whenever you can, use model.GetDescendants<T>() to easily affect all instances of a given type anywhere nested within the model.

For modifying something specific, retrieve it by name if possible rather than just relying on the order. (e.g. weapons.FirstOrDefault(model => model.name == ...) instead of weapons[2])

Applying to Multiple Towers

You can use the MultiPathPlusPlus and MultiUpgradePlusPlus classes for making paths that apply to multiple towers.

Apart from overriding Towers instead of Tower, usage will be the same

Alternate Vanilla Path Branches

New with version 1.2, your Path++s that extend vanilla paths can begin before Tier 6 and create an alternate branch of the vanilla path. These paths must add all upgrades from their starting tier through at least tier 5 to be valid. Users will be able to cycle between the vanilla and alternate path(s) on a per-tower basis in game as well as in the upgrade screen (which sets the default).

All you have to do is give your UpgradePlusPlus classes a Tier <= 5, and if your PathPlusPlus class's ExtendVanillaPath value is properly set it'll do the rest

Optionally there's a PathPlusPlus.UseUpgradedTowerModels override that can be set to true to make the base TowerModel for the upgrades be the corresponding upgraded version on the original path, rather than the last TowerModel before the branching off point

Requires BTD6 Mod Helper

CHANGELOG

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Unreleased

1.2.3 - 2026-07-01

  • A few minor bug fixes for edge cases

1.2.2 - 2026-06-03

  • Recompiled for BTD6 v55

1.2.0 - 2026-05-06

New functionality for Extended Vanilla Paths

  • Better support for multiple extensions of the same vanilla path: you can now cycle to choose which path to use on a per-tower basis in game as well as in the upgrade screen (which sets the default).
  • Extended paths can now begin before Tier 6 to create alternate branches of vanilla paths, using the same upgrade cycling to choose which path to use for each tower
    • These paths must add all upgrades from their starting tier through at least tier 5 to be valid
    • For Modders, all you have to do is give your UpgradePlusPlus classes a Tier <= 5, and if your PathPlusPlus class's ExtendVanillaPath value is properly set it'll do the rest
      • Optionally there's a PathPlusPlus.UseUpgradedTowerModels override that can be set to true to make the base TowerModel for the upgrades be the corresponding upgraded version on the original path, rather than the last TowerModel before the branching off point

1.1.19 - 2026-02-12

  • Fixed for BTD6 v53
  • Some internal reworking to better support Useful Utilities upgrade queueing

1.1.18 - 2025-12-03

  • Fixed a buggy interaction with the Frontier Legends Sheriff upgrades UI

1.1.17 - 2025-12-03

  • Fixed for v52

1.1.16 - 2025-09-27

  • Fixed a visual bug that could prevent buying Tier 6+ upgrades in the main 3 paths

1.1.15 - 2025-09-26

  • UpgradePlusPlus now has a MaxAtOnce to control how many of that upgrade can be purchased on different towers at the same time
    • Default is 1 for Tier 5+ upgrades (unless Unlimited5thTiers+ mod is installed), unlimited for other tiers
  • Added some more patches to prevent Beast Handler extra paths from breaking

1.1.14 - 2025-08-29

  • Fixed Paths++ UI changes to not interfere with Powers Pro upgrades

1.1.13 - 2025-08-27

  • Additional fixes for v50

1.1.12 - 2025-08-27

  • Fixed for BTD6 v50

1.1.11 - 2025-06-19

  • Fixed for BTD6 v49

1.1.10 - 2025-02-11

  • Fixed for BTD6 v47

1.1.9 - 2024-12-10

  • Fixed for BTD6 v46

1.1.8 - 2024-10-23

  • Fixed bug where upgrading a tower to Tier 6+ in an extra path could visually lock other towers' upgrades in Balanced Mode

1.1.7 - 2024-10-09

  • Fixed for BTD6 v45

1.1.6 - 2024-08-01

  • For modders, added MultiPathPlusPlus and MultiUpgradePlusPlus classes for making paths that apply to multiple towers
    • Apart from overriding Towers instead of Tower, usage will be the same

1.1.5 - 2024-05-29

  • Fixed for BTD6 v43

1.1.4 - 2024-04-08

  • Fixed for v42.0

1.1.3 - 2024-02-14

  • Fixed for BTD6 v41.1
    • The specific patch in question should now also be more resilient to game updates going forward

1.1.2 - 2023-12-05

  • Fixed for BTD6 v40.0
  • The UpgradeCount property no longer needs to be manually specified for Paths, it will be inferred if omitted

1.1.1 - 2023-10-26

  • Fix custom upgrade containers not appearing for tier 5+ upgrades on towers with paragons
  • Fixed Balanced Mode sometimes allowing you to get one more upgrade than intended
  • When Paths++ and Paragon upgrades overlap for a tower, a button now appears on the upgrade to swap which one is showing
    • The "Paragon Overlap Default" mod setting controls which is the one it starts off as showing, with Paths++ being the default
    • You can also right click the upgrade to swap
  • When multiple extensions for the same vanilla path on a tower are installed together, a button now appears in the upgrades screen to cycle through which will be used in games
    • Can only swap when not in an active game
  • Improved upgrade screen visuals for non 16x9 aspect ratios
  • PathPlusPlus.ValidTiers can now override Ultimate Crosspathing when Balanced Mode is on, if the modder so desires
  • Added NeedsConfirmation, ConfirmationTitle and ConfirmationBody overrides for UpgradePlusPluss that work like they do for ModUpgradess
  • Added PathPlusPlus.OnUpgraded and UpgradePlusPlus.OnUpgraded overrides to perform effects when upgrades are bought
    • The BloonsTD6Mod.OnTowerUpgraded hook will also be called for your mod's own Paths++ upgrades

1.1.0 - 2023-10-14

  • Fixed for BTD6 v39.0
  • Added functionality for creating additional tiers for tower upgrade paths, see updated readme for more details

1.0.2 - 2023-07-28

  • Fixed for BTD6 v38.1

1.0.1 - 2023-06-07

  • Fixed for BTD6 v37.0
  • Fixed error message when selecting the Rare Quincy Action Figure

1.0.0 - 2023-05-09

Initial Release