('BL1', 1.045, ' (approximately; BL1 scaling is a bit weird)'),
    ('BL2', 1.13, ''),
    ('TPS', 1.1, ''),
]:

    full_filename = 'alternate_scaling_{}.bl3hotfix'.format(label.lower())
    mod = Mod(
        full_filename,
        'Alternate Scaling: {}'.format(label),
        'Apocalyptech',
        [
            "Updates the universal scaling constant from BL3's default of 1.09 to match",
            "{}'s {}{}".format(label, scale, extra),
            "",
            "(NOTE: These scaling vars don't play intuitively with Mayhem levels.  Anything",
            "above the default 1.09 will end up making the game quite a bit easier in higher",
            "Mayhem levels, so you'd actually want to *reduce* the scaling to make Mayhem",
            "harder.)",
        ],
        lic=Mod.CC_BY_SA_40,
        v='1.0.0',
        cats='scaling',
    )

    mod.reg_hotfix(
        Mod.PATCH, '',
        '/Game/GameData/Balance/HealthAndDamage/Att_UniversalBalanceScaler.Att_UniversalBalanceScaler:BP_ConstantValueResolver_C_0',
        'Value', BVC(bvc=scale))

    mod.close()
 mod_label='Eridium',
 mod_filename='eridium',
 desc_text='eridium',
 card_text='eridium',
 part_text='ERIDIUM',
 single_name='Eridium',
 combo_name_money='Hoarding',
 triple_name="Earl's Choice",
 # Honestly *most* of the combo names still work all right for the Eridium
 # variant, so I'm basically happy with where this one ended up.
 combo_name_singularity='Sunk Cost',
 combo_name_transfusion='Infusion',
 combo_name_elemental='Infusion',
 rewards1=[
     ('/Game/Pickups/Eridium/InvBal_Eridium_Single', None,
      BVC(bvc=.75)),
     ('/Game/Pickups/Eridium/InvBal_Eridium_Stack', None,
      BVC(bvc=.25)),
 ],
 rewards2=[
     ('/Game/Pickups/Eridium/InvBal_Eridium_Single', None,
      BVC(bvc=.5)),
     ('/Game/Pickups/Eridium/InvBal_Eridium_Stack', None,
      BVC(bvc=.5)),
 ],
 rewards3=[
     ('/Game/Pickups/Eridium/InvBal_Eridium_Single', None,
      BVC(bvc=.25)),
     ('/Game/Pickups/Eridium/InvBal_Eridium_Stack', None,
      BVC(bvc=.75)),
 ],
Exemple #3
0
    def process_bvc_struct(self, data):
        """
        Given a serialized BVC/BVSC/etc structure, return a value.
        """

        return self.process_bvc(BVC.from_data_struct(data))
Exemple #4
0
            elif idx == 5:
                for part in cat.partlist:
                    skill_parts.append(part.part_name)
        assert (modtype_part)
        assert (skill_parts)

        # Now add those in to the base-game COMs
        for idx, cat in enumerate(base_com.categories):
            if idx == 1:
                cat.add_part_name(modtype_part)
            elif idx == 3:
                # While we're in here, fix up the blank Primary part that Siren COMs can
                # spawn with.  The Fix Siren COM Blank Parts mod does this too, but since
                # we're changing the indexes, it won't actually know what to do with this.
                # So that mod should be run first, and then this mod will overwrite the
                # Balance completely.
                if base_char == 'Siren':
                    for part in cat.partlist:
                        if part.part_name == 'None':
                            part.weight = BVC(bvc=0)
            elif idx == 5:
                for part in skill_parts:
                    cat.add_part_name(part)

        # ... and now write out the hotfixes
        mod.comment('{} {}'.format(base_char, rarity))
        base_com.hotfix_balance_full(mod)
        mod.newline()

mod.close()
                    leg_pools[drop_type])
    mod.newline()

mod.comment(
    'Special-case for Heavyweight Harker, in Stormblind Complex (also randomizes other enemies there)'
)
mod.reg_hotfix(
    Mod.CHAR, 'BPChar_FrontRider_Rider',
    '/Game/PatchDLC/Ixora/GameData/Loot/ItemPools/ItemPool_Ixora_Guns_Legendary',
    'BalancedItems', """(
            (
                ItemPoolData={},
                Weight={}
            )
        )""".format(
        Mod.get_full_cond(
            '/Game/GameData/Loot/ItemPools/Guns/ItemPool_Guns_Legendary',
            'ItemPoolData'),
        BVC(bvc=1),
    ))
mod.newline()

mod.comment('Remove partlock attempt for Anointed Alpha drop')
mod.reg_hotfix(
    Mod.CHAR, 'BPChar_AnointedJoe',
    '/Game/Enemies/Enforcer/_Unique/AnointedJoe/_Design/ItemPools/ItemPool_AnointedJoe',
    'PartSelectionOverrides', '()')
mod.newline()

mod.close()
from bl3hotfixmod.bl3hotfixmod import Mod, BVC

for event, menunum in [
    ('normal', 0),
    ('halloween', 3),
    ('christmas', 4),
    ('cartels', 5),
]:

    mod_filename = 'main_menu_{}.txt'.format(event)
    event_cap = event.capitalize()

    mod = Mod(
        mod_filename,
        'Main Menu: {}'.format(event_cap),
        'Apocalyptech',
        [
            "Sets the main menu to have the {} visuals.  No actual effect on".
            format(event_cap),
            "gameplay or anything (use the `eventname_enable.txt` mods to actually",
            "turn timed events back on).",
        ],
        lic=Mod.CC_BY_SA_40,
    )

    mod.table_hotfix(Mod.PATCH, '',
                     '/Game/Common/_Design/Table_MicropatchSwitches',
                     'MainMenuAltBackground', 'Value', BVC(bvc=menunum))

    mod.close()
Exemple #7
0
        self.itempool_reg_qty = itempool_reg_qty
        self.itempool_leg_qty = itempool_leg_qty
        self.firerate_reg = firerate_reg
        self.firerate_leg = firerate_leg
        self.label_reg = label_reg
        self.label_leg = label_leg
        self.reg_cost = reg_cost
        self.leg_cost = leg_cost
        self.video = video

###
### Rapid-fire config (also defines the "default" reward pools)
###

fab_default_reg = ItemPool('/Game/GameData/Loot/ItemPools/Fabricator/ItemPool_FabricatorGuns')
fab_default_reg.add_pool('/Game/GameData/Loot/ItemPools/Guns/ItemPool_Guns_Uncommon', BVC(bvc=90))
fab_default_reg.add_pool('/Game/GameData/Loot/ItemPools/Guns/ItemPool_Guns_Rare', BVC(bvc=8))
fab_default_reg.add_pool('/Game/GameData/Loot/ItemPools/Guns/ItemPool_Guns_VeryRare', BVC(bvc=2))

fab_default_leg = ItemPool('/Game/GameData/Loot/ItemPools/Fabricator/ItemPool_FabricatorGuns_AltFire')
fab_default_leg.add_pool('/Game/GameData/Loot/ItemPools/Guns/ItemPool_Guns_Legendary')
fab_default_leg.add_pool('/Game/GameData/Loot/ItemPools/VendingMachines/DA_ItemPool_VendingMachine_CrazyEarl_MissionRewards', BVC(bvc=0.25))

rapidfire = Config(filename='rapidfire',
        label='Rapid-Fire',
        desc=[
            "Converts the Fabricator's primary firing mode to full auto single-gun",
            "firing, and the legendary mode to a full auto shotgun-like blast.  The",
            "quantity of gear dropped on the legendary mode has been buffed up a bit",
            "as well, which is mildly cheaty.",
            ],
Exemple #8
0
    def get_extra_anoints(self, balance_name):
        """
        Given a `balance_name`, return a list of tuples, each with two elements:
          1) The GPartExpansion object providing extra anointments (or None)
          2) A list of anointments which that GPartExpansion is adding to the object.
        """

        # First, if we haven't read in the GPartExpansion data and created our lookup
        # object, do that.
        if not self.balance_to_extra_anoints:

            self.balance_to_extra_anoints = {}

            for expansion_name in [
                    '/Game/PatchDLC/Raid1/Gear/_GearExtension/GParts/GPartExpansion_Grenades_Raid1',
                    '/Game/PatchDLC/Raid1/Gear/_GearExtension/GParts/GPartExpansion_Shields_Raid1',
                    '/Game/PatchDLC/Raid1/Gear/_GearExtension/GParts/GPartExpansion_Weapons_Raid1',
                    # Cartels expansions have become part of the base game, add those in.
                    '/Game/PatchDLC/Event2/Gear/_Design/_GearExtension/GParts/GPartExpansion_Grenades_Event2',
                    '/Game/PatchDLC/Event2/Gear/_Design/_GearExtension/GParts/GPartExpansion_Shields_Event2',
                    '/Game/PatchDLC/Event2/Gear/_Design/_GearExtension/GParts/GPartExpansion_Weapons_Event2',
                    # Designer's Cut expansion (yep, just weapons)
                    '/Game/PatchDLC/Ixora/Gear/_GearExtension/GParts/GPartExpansion_Weapons_Ixora',
                    # These objects do exist, but they don't actually add any parts, so whatever.
                    # The BloodyHarvest ones *do* add them, but only during the event, so we're ignoring
                    # those too.
                    #'/Game/PatchDLC/BloodyHarvest/Gear/_Design/_GearExtension/GParts/GPartExpansion_Grenades_BloodyHarvest',
                    #'/Game/PatchDLC/BloodyHarvest/Gear/_Design/_GearExtension/GParts/GPartExpansion_Shields_BloodyHarvest',
                    #'/Game/PatchDLC/BloodyHarvest/Gear/_Design/_GearExtension/GParts/GPartExpansion_Weapons_BloodyHarvest',
                    #'/Game/PatchDLC/Dandelion/Gear/_GearExtension/GParts/GPartExpansion_Grenades_Dandelion',
                    #'/Game/PatchDLC/Dandelion/Gear/_GearExtension/GParts/GPartExpansion_Shields_Dandelion',
                    #'/Game/PatchDLC/Dandelion/Gear/_GearExtension/GParts/GPartExpansion_Weapons_Dandelion',
                    #'/Game/PatchDLC/Hibiscus/Gear/_GearExtension/GParts/GPartExpansion_Grenades_Hibiscus',
                    #'/Game/PatchDLC/Hibiscus/Gear/_GearExtension/GParts/GPartExpansion_Shields_Hibiscus',
                    #'/Game/PatchDLC/Hibiscus/Gear/_GearExtension/GParts/GPartExpansion_Weapons_Hibiscus',
                    #'/Game/PatchDLC/Geranium/Gear/_GearExtension/GParts/GPartExpansion_Weapons_Geranium',
                    #'/Game/PatchDLC/Geranium/Gear/_GearExtension/GParts/GPartExpansion_Shields_Geranium',
                    #'/Game/PatchDLC/Geranium/Gear/_GearExtension/GParts/GPartExpansion_Grenades_Geranium',
            ]:

                # Construct a list of anointments which this GPartExpansion provides
                extra_anoints = []
                expansion_data = self.get_exports(
                    expansion_name, 'InventoryGenericPartExpansionData')[0]
                for part in expansion_data['GenericParts']['Parts']:
                    extra_anoints.append(
                        (part['PartData'][1],
                         BVC.from_data_struct(part['Weight'])))

                # Grab a list of balance collections which define the gear this expansion acts on.
                bal_collections = [
                    expansion_data['InventoryBalanceCollection'][1]
                ]
                for (extra,
                     extra_data) in self.get_refs_to_data(bal_collections[0]):
                    if extra_data \
                            and extra_data[0]['export_type'] == 'InventoryBalanceCollectionData' \
                            and extra_data[0]['ParentCollection'][1] == bal_collections[0]:
                        bal_collections.append(extra)

                # Now loop through all balances and populate our dict
                for bal_collection in bal_collections:
                    collection = self.get_exports(
                        bal_collection, 'InventoryBalanceCollectionData')[0]
                    if 'InventoryBalanceList' in collection:
                        for bal in collection['InventoryBalanceList']:
                            this_balance = bal['asset_path_name'].split('.')[0]
                            if this_balance not in self.balance_to_extra_anoints:
                                self.balance_to_extra_anoints[
                                    this_balance] = []
                            self.balance_to_extra_anoints[this_balance].append(
                                (expansion_name, extra_anoints))

        # Now, return the appropriate value
        if balance_name in self.balance_to_extra_anoints:
            return self.balance_to_extra_anoints[balance_name]
        else:
            return []
Exemple #9
0
        )""")

# The default here is apparently:
#   SpawnOptionData'/Game/PatchDLC/BloodyHarvest/NonPlayerCharacters/LeagueNPC/_Design/Spawning/SpawnOptions_LeagueNPC_Season01.SpawnOptions_LeagueNPC_Season01'
# Should maybe add that into our Bloody Harvest enabling thing
mod.reg_hotfix(
    Mod.EARLYLEVEL, 'Sanctuary3_P',
    '/Game/Maps/Sanctuary3/Sanctuary3_Season.Sanctuary3_Season:PersistentLevel.OakMissionSpawner_1.SpawnerComponent.SpawnerStyle_SpawnerStyle_Single',
    'SpawnOptions',
    "SpawnOptionData'/Game/PatchDLC/Event2/NonPlayerCharacters/LeagueNPC/_Design/Spawning/SpawnOptions_LeagueNPC_Season02.SpawnOptions_LeagueNPC_Season02'"
)

mod.newline()

mod.comment('Main Menu')
mod.table_hotfix(Mod.PATCH, '',
                 '/Game/Common/_Design/Table_MicropatchSwitches',
                 'MainMenuAltBackground', 'Value', BVC(bvc=5))
mod.newline()

# Bugfixes included with the rollout; stuff that was fixed after the data was
# cooked, presumably
mod.comment('Bugfixes')
mod.reg_hotfix(
    Mod.LEVEL, 'Cartels_P',
    '/Game/PatchDLC/Event2/Maps/Cartels_Mission.Cartels_Mission:PersistentLevel.OakMissionWaypointBox_ACtivateStairSlide.CollisionComp',
    'RelativeScale3D', '(X=1.000000,Y=1.000000,Z=1.600000)')
mod.newline()

mod.close()
            "drops to be either health charges or damage-reduction charges instead.",
        ],
        lic=Mod.CC_BY_SA_40,
        v='1.0.0',
        cats='mayhem',
        )

# Boosters to switch to
new_boosters = [
        '/Game/Gear/Shields/_Design/PartSets/Part_Augment/Charges/HealthCharge/HealthChargePickup/InvBal_HealthCharge',
        '/Game/Gear/Shields/_Design/PartSets/Part_Augment/Charges/FortifyCharge/FortifyCharge_Pickup/InvBal_FortifyCharge',
        # Not gonna do the damage one, since this is probably gonna be used by melee-focused builds.
        #'/Game/Gear/Shields/_Design/PartSets/Part_Augment/Charges/PowerCharge/PowerCharge_Pickup/InvBal_PowerCharge',
        ]
booster_weight = 1/len(new_boosters)

# Set up the pool
pool = ItemPool('/Game/PatchDLC/Mayhem2/Abilities/Enemy/FinishThem/ItemPool_Mayhem2_FinishThem')
pool.add_balance('/Game/Pickups/Health/DA_InventoryBalance_Health.DA_InventoryBalance_Health')
for booster in new_boosters:
    pool.add_balance(booster, weight=BVC(bvc=booster_weight))

# Write the hotfix
mod.reg_hotfix(Mod.EARLYLEVEL, 'MatchAll',
        pool.pool_name,
        'BalancedItems',
        str(pool))

mod.close()

Exemple #11
0
# The default here is apparently:
#   SpawnOptionData'/Game/PatchDLC/BloodyHarvest/NonPlayerCharacters/LeagueNPC/_Design/Spawning/SpawnOptions_LeagueNPC_Season01.SpawnOptions_LeagueNPC_Season01'
# Should maybe add that into our Bloody Harvest enabling thing
mod.reg_hotfix(Mod.EARLYLEVEL, 'Sanctuary3_P',
        '/Game/Maps/Sanctuary3/Sanctuary3_Season.Sanctuary3_Season:PersistentLevel.OakMissionSpawner_1.SpawnerComponent.SpawnerStyle_SpawnerStyle_Single',
        'SpawnOptions',
        "SpawnOptionData'/Game/PatchDLC/Event2/NonPlayerCharacters/LeagueNPC/_Design/Spawning/SpawnOptions_LeagueNPC_Season02.SpawnOptions_LeagueNPC_Season02'")

mod.newline()

mod.comment('Main Menu')
mod.table_hotfix(Mod.PATCH, '',
        '/Game/Common/_Design/Table_MicropatchSwitches',
        'MainMenuAltBackground',
        'Value',
        BVC(bvc=5))
mod.newline()

# Bugfixes included with the rollout; stuff that was fixed after the data was
# cooked, presumably
mod.comment('Bugfixes')
mod.reg_hotfix(Mod.LEVEL, 'Cartels_P',
        '/Game/PatchDLC/Event2/Maps/Cartels_Mission.Cartels_Mission:PersistentLevel.OakMissionWaypointBox_ACtivateStairSlide.CollisionComp',
        'RelativeScale3D',
        '(X=1.000000,Y=1.000000,Z=1.600000)')
mod.newline()

mod.close()