using Audio; using Platform; using System.Collections.Generic; using System.Drawing; using System.Linq; namespace Harmony.RewardLootItemPatches { [HarmonyPatch(typeof(RewardLootItem))] [HarmonyPatch("SetupReward")] public class SetupRewardPatch { public static bool Prefix(RewardLootItem __instance) { //Log.Out("RewardLootItem-SetupReward item: " + __instance.Item.itemValue.ItemClass.Name); if (RebirthUtilities.ScenarioSkip()) { string name = __instance.Item.itemValue.ItemClass.Name.ToLower(); if (name.StartsWith("armor") && (name.Contains("helmet") || name.Contains("outfit") || name.Contains("gloves") || name.Contains("boots") ) ) { //int questTier = __instance.OwnerQuest.OwnerJournal.GetCurrentFactionTier((byte)1); int questTier = __instance.OwnerQuest.QuestClass.DifficultyTier; //Log.Out("RewardLootItem-SetupReward questTier: " + questTier); Dictionary perks = new Dictionary(); if (questTier > 1 && questTier <= 2) { perks = new Dictionary { { "perkMeleeDamage", 1 }, { "perkSexualTrex", 1 }, { "perkMiner69r", 1 }, { "perkMotherLode", 1 }, { "perkRuleOneCardio", 1 }, { "perkParkour", 1 }, { "perkDodge", 1 }, { "perkPackMule", 1 } }; } else if (questTier > 2 && questTier <= 3) { perks = new Dictionary { { "perkMeleeDamage", 2 }, { "perkSexualTrex", 2 }, { "perkMiner69r", 2 }, { "perkMotherLode", 2 }, { "perkRuleOneCardio", 2 }, { "perkParkour", 2 }, { "perkDodge", 2 }, { "perkPackMule", 2 }, { "perkHealingFactor", 1 }, { "perkSlowMetabolism", 1 }, { "perkDeepCuts", 1 }, { "perkLuckyLooter", 1 }, { "perkPhysician", 1 }, { "perkTreasureHunter", 1 }, { "perkDaringAdventurer", 1 }, { "perkBetterBarter", 1 }, { "perkCharismaticNature", 1 } }; } else if (questTier > 3 && questTier <= 4) { perks = new Dictionary { { "perkMeleeDamage", 3 }, { "perkSexualTrex", 3 }, { "perkMiner69r", 3 }, { "perkMotherLode", 3 }, { "perkRuleOneCardio", 3 }, { "perkParkour", 3 }, { "perkDodge", 3 }, { "perkPackMule", 3 }, { "perkHealingFactor", 2 }, { "perkSlowMetabolism", 2 }, { "perkDeepCuts", 2 }, { "perkLuckyLooter", 2 }, { "perkPhysician", 2 }, { "perkTreasureHunter", 2 }, { "perkDaringAdventurer", 2 }, { "perkBetterBarter", 2 }, { "perkCharismaticNature", 2 } }; } else if (questTier > 4) { perks = new Dictionary { { "perkMeleeDamage", 4 }, { "perkSexualTrex", 4 }, { "perkMiner69r", 4 }, { "perkMotherLode", 4 }, { "perkRuleOneCardio", 4 }, { "perkParkour", 4 }, { "perkDodge", 4 }, { "perkPackMule", 4 }, { "perkHealingFactor", 2 }, { "perkSlowMetabolism", 2 }, { "perkDeepCuts", 2 }, { "perkLuckyLooter", 2 }, { "perkPhysician", 2 }, { "perkTreasureHunter", 2 }, { "perkDaringAdventurer", 2 }, { "perkBetterBarter", 2 }, { "perkCharismaticNature", 2 } }; } int chance = Manager.random.RandomRange(0, 101); EntityPlayer player = __instance.OwnerQuest.OwnerJournal.OwnerPlayer; float threshold = 60; if (player != null) { ProgressionValue progressionValue = player.Progression.GetProgressionValue("perkDaringAdventurer"); float perkDaringAdventurer = RebirthUtilities.GetCalculatedLevel(player, progressionValue); threshold = threshold + perkDaringAdventurer * 5; } if (questTier > 1 && chance <= threshold) { System.Random random = new System.Random(); KeyValuePair randomPerk = perks.ElementAt(random.Next(perks.Count)); ItemValue itemValue = new ItemValue(ItemClass.GetItem(__instance.Item.itemValue.ItemClass.Name, false).type); itemValue.SetMetadata("bonus", randomPerk.Key, TypedMetadataValue.TypeTag.String); itemValue.SetMetadata("type", "", TypedMetadataValue.TypeTag.String); itemValue.SetMetadata("level", randomPerk.Value, TypedMetadataValue.TypeTag.Integer); itemValue.SetMetadata("active", 2, TypedMetadataValue.TypeTag.Integer); __instance.Item.itemValue = itemValue; } } else { List tagNames = __instance.Item.itemValue.ItemClass.ItemTags.GetTagNames(); bool isMelee = RebirthUtilities.isMeleeWeapon(tagNames); bool isRanged = RebirthUtilities.hasTag(tagNames, "ranged"); bool isTool = RebirthUtilities.hasTag(tagNames, "tool"); bool isAxe = RebirthUtilities.hasTag(tagNames, "axe"); bool isRepairTool = RebirthUtilities.hasTag(tagNames, "repairTool"); bool isAmmo = RebirthUtilities.hasTag(tagNames, "ammo"); if ((isRanged && !isAmmo) || (isMelee && !(isTool || isRepairTool)) || (isAxe && !isRepairTool) ) { int questTier = __instance.OwnerQuest.QuestClass.DifficultyTier; int chance = Manager.random.RandomRange(0, 101); EntityPlayer player = __instance.OwnerQuest.OwnerJournal.OwnerPlayer; float threshold = 25; if (player != null ) { ProgressionValue progressionValue = player.Progression.GetProgressionValue("perkDaringAdventurer"); float perkDaringAdventurer = RebirthUtilities.GetCalculatedLevel(player, progressionValue); threshold = threshold + perkDaringAdventurer * 5; } if (questTier > 1 && chance <= threshold) { string bonusName = RebirthVariables.weaponAura[Manager.random.RandomRange(0, RebirthVariables.weaponAura.Count)]; string bonusType = "aura"; int bonusLevel = Manager.random.RandomRange(questTier, questTier + 1) - 1; ItemValue itemValue = new ItemValue(ItemClass.GetItem(__instance.Item.itemValue.ItemClass.Name, false).type); itemValue.SetMetadata("bonus", bonusName, TypedMetadataValue.TypeTag.String); itemValue.SetMetadata("type", bonusType, TypedMetadataValue.TypeTag.String); itemValue.SetMetadata("level", bonusLevel, TypedMetadataValue.TypeTag.Integer); itemValue.SetMetadata("active", 1, TypedMetadataValue.TypeTag.Integer); __instance.Item.itemValue = itemValue; } } } } __instance.LootGameStage = Convert.ToInt32(__instance.Value); ItemClass itemClass = __instance.Item.itemValue.ItemClass; __instance.Description = itemClass.GetLocalizedItemName(); __instance.ValueText = __instance.Value; switch (itemClass.Groups[0].ToLower()) { case "ammo/weapons": __instance.Icon = "ui_game_symbol_knife"; break; case "basics": __instance.Icon = "ui_game_symbol_shopping_cart"; break; case "books": __instance.Icon = "ui_game_symbol_book"; break; case "building": __instance.Icon = "ui_game_symbol_map_house"; break; case "chemicals": __instance.Icon = "ui_game_symbol_water"; break; case "clothing": __instance.Icon = "ui_game_symbol_shirt"; break; case "decor/miscellaneous": __instance.Icon = "ui_game_symbol_chair"; break; case "food/cooking": __instance.Icon = "ui_game_symbol_fork"; break; case "mods": __instance.Icon = "ui_game_symbol_assemble"; break; case "resources": __instance.Icon = "ui_game_symbol_resource"; break; case "science": __instance.Icon = "ui_game_symbol_science"; break; case "special items": __instance.Icon = "ui_game_symbol_book"; break; case "tools/traps": __instance.Icon = "ui_game_symbol_tool"; break; } __instance.IconAtlas = "ItemIconAtlas"; return false; } } }