diff --git a/BUILD/monsters/freerun.dat b/BUILD/monsters/freerun.dat index 9b99e2213..e836170b1 100644 --- a/BUILD/monsters/freerun.dat +++ b/BUILD/monsters/freerun.dat @@ -31,3 +31,14 @@ animated rustic nightstand Wardröb nightstand drunken rat bunch of drunken rats +tapdancing skeleton +floating platter of hors d\'oeuvres +boaraffe +pygmy assault squad +pygmy blowgunner +Copperhead Club bartender +fan dancer +Mob Penguin Capo +ninja snowman (chopsticks) +ninja snowman janitor +ninja snowman weaponmaster diff --git a/BUILD/monsters/sniff.dat b/BUILD/monsters/sniff.dat index 1f4194166..c59dc5b13 100644 --- a/BUILD/monsters/sniff.dat +++ b/BUILD/monsters/sniff.dat @@ -1,7 +1,7 @@ pygmy shaman loc:The Hidden Apartment Building;!effect:Thrice-Cursed;prop:hiddenApartmentProgress<7 Writing Desk prop:writingDesksDefeated<4 cabinet of Dr. Limpieza -Dairy Goat loc:The Goatlet +Dairy Goat loc:The Goatlet;item:goat cheese<3 Pygmy Bowler Pygmy Witch Surgeon pygmy witch accountant loc:The Hidden Office Building diff --git a/BUILD/restoration/skill.dat b/BUILD/restoration/skill.dat index adaca6040..aa4e21f3e 100644 --- a/BUILD/restoration/skill.dat +++ b/BUILD/restoration/skill.dat @@ -4,3 +4,4 @@ Shake it Off ALL 0 0 0 All Negative none Gelatinous Reconstruction 13 0 0 0 Beaten Up none Disco Nap 20 0 0 0 none none Lasagna Bandages 20 0 0 0 none none +Rest Upside Down 1000 1000 0 0 none none diff --git a/RELEASE/data/autoscend_monsters.txt b/RELEASE/data/autoscend_monsters.txt index 7a4206a5b..2205d2f75 100644 --- a/RELEASE/data/autoscend_monsters.txt +++ b/RELEASE/data/autoscend_monsters.txt @@ -99,6 +99,17 @@ freerun 29 animated rustic nightstand freerun 30 Wardröb nightstand freerun 31 drunken rat freerun 32 bunch of drunken rats +freerun 33 tapdancing skeleton +freerun 34 floating platter of hors d'oeuvres +freerun 35 boaraffe +freerun 36 pygmy assault squad +freerun 37 pygmy blowgunner +freerun 38 Copperhead Club bartender +freerun 39 fan dancer +freerun 40 Mob Penguin Capo +freerun 41 ninja snowman (chopsticks) +freerun 42 ninja snowman janitor +freerun 43 ninja snowman weaponmaster replace 0 Banshee Librarian item:Killing Jar>0 replace 1 Beefy Bodyguard Bat loc:The Boss Bat's Lair;turnsspent:The Boss Bat's Lair>=4;!path:Heavy Rains;!path:Actually Ed the Undying;!path:Pocket Familiars;!path:Dark Gyffte;!path:Path of the Plumber;!pathid:41;!path:Wildfire;!path:Fall of the Dinosaurs;!path:Avatar of Shadows Over Loathing;!path:Legacy of Loathing;!path:WereProfessor @@ -141,7 +152,7 @@ replace 34 trendy bugbear chef path:Bugbear Invasion;loc:Galley sniff 0 pygmy shaman loc:The Hidden Apartment Building;!effect:Thrice-Cursed;prop:hiddenApartmentProgress<7 sniff 1 Writing Desk prop:writingDesksDefeated<4 sniff 2 cabinet of Dr. Limpieza -sniff 3 Dairy Goat loc:The Goatlet +sniff 3 Dairy Goat loc:The Goatlet;item:goat cheese<3 sniff 4 Pygmy Bowler sniff 5 Pygmy Witch Surgeon sniff 6 pygmy witch accountant loc:The Hidden Office Building diff --git a/RELEASE/data/autoscend_restoration.txt b/RELEASE/data/autoscend_restoration.txt index 032bea615..7707c7fdf 100644 --- a/RELEASE/data/autoscend_restoration.txt +++ b/RELEASE/data/autoscend_restoration.txt @@ -117,4 +117,5 @@ skill 2 Shake it Off ALL 0 0 0 All Negative none skill 3 Gelatinous Reconstruction 13 0 0 0 Beaten Up none skill 4 Disco Nap 20 0 0 0 none none skill 5 Lasagna Bandages 20 0 0 0 none none +skill 6 Rest Upside Down 1000 1000 0 0 none none diff --git a/RELEASE/scripts/autoscend.ash b/RELEASE/scripts/autoscend.ash index 431f78b50..a6cddf10a 100644 --- a/RELEASE/scripts/autoscend.ash +++ b/RELEASE/scripts/autoscend.ash @@ -1,4 +1,4 @@ -since r28082; // Fixes for Avant Guard council text +since r28084; // feat: make bat wings rest always available /*** autoscend_header.ash must be first import All non-accessory scripts must be imported here diff --git a/RELEASE/scripts/autoscend/auto_acquire.ash b/RELEASE/scripts/autoscend/auto_acquire.ash index 0b3debf27..600774e5b 100644 --- a/RELEASE/scripts/autoscend/auto_acquire.ash +++ b/RELEASE/scripts/autoscend/auto_acquire.ash @@ -813,7 +813,7 @@ int handlePulls(int day) } // do this regardless of day if we still need to complete the bridge. - if (canPull($item[smut orc keepsake box]) && lumberCount() < 26 && fastenerCount() < 26) + if (canPull($item[smut orc keepsake box]) && (lumberCount() + 5 <= bridgeGoal()) && (fastenerCount() + 5 <= bridgeGoal())) { if (pullXWhenHaveY($item[smut orc keepsake box], 1, 0)) { @@ -844,10 +844,10 @@ boolean LX_craftAcquireItems() cli_execute("make 1 snow cleats"); } - if((item_amount($item[snow berries]) > 0) && (my_daycount() > 1) && (get_property("chasmBridgeProgress").to_int() >= 30) && (my_level() >= 9)) + if((item_amount($item[snow berries]) > 0) && (my_daycount() > 1) && (get_property("chasmBridgeProgress").to_int() >= bridgeGoal()) && (my_level() >= 9)) { visit_url("place.php?whichplace=orc_chasm"); - if(get_property("chasmBridgeProgress").to_int() >= 30) + if(get_property("chasmBridgeProgress").to_int() >= bridgeGoal()) { #if(in_hardcore() && isGuildClass()) if(isGuildClass()) diff --git a/RELEASE/scripts/autoscend/auto_bedtime.ash b/RELEASE/scripts/autoscend/auto_bedtime.ash index c39f81432..d4e013918 100644 --- a/RELEASE/scripts/autoscend/auto_bedtime.ash +++ b/RELEASE/scripts/autoscend/auto_bedtime.ash @@ -1366,6 +1366,11 @@ boolean doBedtime() auto_log_info("You have a tea tree to shake!", "blue"); } + if (auto_haveAugustScepter() && get_property("_augSkillsCast").to_int() < 5) + { + auto_log_info("You still have " + (5 - get_property("_augSkillsCast").to_int()) + " August Scepter casts remaining! Perhaps consider casting Aug 13th/30th for more rollover adventures, and/or 7th for a buff for tomorrow?", "blue"); + } + if (get_property("spadingData") != "") { cli_execute("spade autoconfirm"); diff --git a/RELEASE/scripts/autoscend/auto_choice_adv.ash b/RELEASE/scripts/autoscend/auto_choice_adv.ash index 9bb72a22c..bb1870e24 100644 --- a/RELEASE/scripts/autoscend/auto_choice_adv.ash +++ b/RELEASE/scripts/autoscend/auto_choice_adv.ash @@ -188,6 +188,10 @@ boolean auto_run_choice(int choice, string page) { run_choice(4); // get the model airship } + else if (options contains 6) + { + run_choice(6); // advance immateria quest + } else if (options contains 5) { run_choice(5); // get titanium umbrella, metallic A, SGEEA and a penultimate fantasy chest diff --git a/RELEASE/scripts/autoscend/auto_equipment.ash b/RELEASE/scripts/autoscend/auto_equipment.ash index b1a483639..2967c662c 100644 --- a/RELEASE/scripts/autoscend/auto_equipment.ash +++ b/RELEASE/scripts/autoscend/auto_equipment.ash @@ -752,9 +752,10 @@ void finalizeMaximize(boolean speculative) if(monseen == totalmob) nooculus = true; } //exclude certain locations as professor that require specific outfits (the War, the Goblin King) + //as we go through the hidden hospital we equip surgeon gear on the pants slot, so we can end up dying if we cast advanced research if(($locations[The Battlefield (Frat Uniform), The Battlefield (Hippy Uniform), Frat House, Hippy Camp, Frat House (Frat Disguise), Hippy Camp (Hippy Disguise), Next to that barrel with something burning in it, Out by that rusted-out car, over where the old tires are, near an abandoned refrigerator, Sonofa Beach, The Themthar Hills, McMillicancuddy's Barn, McMillicancuddy's Pond, McMillicancuddy's Back 40, - McMillicancuddy's Other Back 40, Cobb\'s Knob Barracks, Cobb\'s Knob Harem, Throne Room] contains my_location())) nooculus = true; + McMillicancuddy's Other Back 40, Cobb\'s Knob Barracks, Cobb\'s Knob Harem, Throne Room, The Hidden Hospital] contains my_location())) nooculus = true; if(!nooculus) { if(possessEquipment($item[biphasic molecular oculus])) @@ -810,6 +811,12 @@ void finalizeMaximize(boolean speculative) addBonusToMaximize($item[spring shoes], 50); } } + + if(auto_haveBatWings() && get_property("_batWingsFreeFights").to_int() < 5) + { + addBonusToMaximize($item[bat wings], 200); // get the 5 free fights + } + // We still need pixels in KoE, badly. if(in_koe() && auto_hasPowerfulGlove()) { diff --git a/RELEASE/scripts/autoscend/auto_pre_adv.ash b/RELEASE/scripts/autoscend/auto_pre_adv.ash index 4a0788e62..538502a4d 100644 --- a/RELEASE/scripts/autoscend/auto_pre_adv.ash +++ b/RELEASE/scripts/autoscend/auto_pre_adv.ash @@ -522,6 +522,12 @@ boolean auto_pre_adventure() addBonusToMaximize(exting, 200); // extinguisher prevents per-round hot damage in wildfire path } + if(place == $location[The Penultimate Fantasy Airship] && auto_haveBatWings()) + { + // only here to get immateria. Get it faster with bat wings + autoEquip($item[Bat Wings]); + } + if(in_plumber()) { diff --git a/RELEASE/scripts/autoscend/auto_restore.ash b/RELEASE/scripts/autoscend/auto_restore.ash index 89be94751..295c11b2b 100644 --- a/RELEASE/scripts/autoscend/auto_restore.ash +++ b/RELEASE/scripts/autoscend/auto_restore.ash @@ -677,7 +677,20 @@ __RestorationOptimization __calculate_objective_values(int hp_goal, int mp_goal, } else if(metadata.type == "skill") { - available = floor(get_value("mp_starting") / mp_cost(to_skill(metadata.name))); + int dailyLimit = to_skill(metadata.name).dailylimit; + int mpCost = mp_cost(to_skill(metadata.name)); + if(dailyLimit != -1 && mpCost > 0) + { + available = min(dailyLimit, floor(get_value("mp_starting") / mpCost)); + } + else if(dailyLimit != -1) + { + available = dailyLimit; + } + else + { + available = floor(get_value("mp_starting") / mpCost); + } } else if(metadata.name == __HOT_TUB) { @@ -955,6 +968,10 @@ __RestorationOptimization __calculate_objective_values(int hp_goal, int mp_goal, if(metadata.type == "skill") { skill s = to_skill(metadata.name); + if(s.dailylimit != -1) + { + return s.dailylimit > 0; + } if(my_maxmp() >= mp_cost(s)) { return true; diff --git a/RELEASE/scripts/autoscend/auto_util.ash b/RELEASE/scripts/autoscend/auto_util.ash index 12768aaa6..966138656 100644 --- a/RELEASE/scripts/autoscend/auto_util.ash +++ b/RELEASE/scripts/autoscend/auto_util.ash @@ -950,6 +950,13 @@ string freeRunCombatString(monster enemy, location loc, boolean inCombat) { return "skill " + $skill[Peel Out]; } + + // Bowling ball is a banish as well, but is available enough that we want to use it as a free run source too + // bowling ball is only in inventory if it is available to use in combat. While on cooldown, it is not in inventory + if((inCombat ? auto_have_skill($skill[Bowl a Curveball]) : item_amount($item[Cosmic Bowling Ball]) > 0) && auto_is_valid($skill[Bowl a Curveball])) + { + return "skill " + $skill[Bowl a Curveball]; + } //Non-standard free-runs if(!inAftercore()) @@ -1473,10 +1480,6 @@ boolean isGeneralStoreAvailable() { return false; } - if(in_zombieSlayer()) - { - return false; - } if(is_werewolf()) { return false; @@ -2619,9 +2622,12 @@ boolean woods_questStart() } visit_url("place.php?whichplace=woods"); visit_url("place.php?whichplace=forestvillage&action=fv_mystic"); - visit_url("choice.php?pwd=&whichchoice=664&option=1&choiceform1=Sure%2C+old+man.++Tell+me+all+about+it."); - visit_url("choice.php?pwd=&whichchoice=664&option=1&choiceform1=Against+my+better+judgment%2C+yes."); - visit_url("choice.php?pwd=&whichchoice=664&option=1&choiceform1=Er,+sure,+I+guess+so..."); + if (!in_zombieSlayer()) + { + visit_url("choice.php?pwd=&whichchoice=664&option=1&choiceform1=Sure%2C+old+man.++Tell+me+all+about+it."); + visit_url("choice.php?pwd=&whichchoice=664&option=1&choiceform1=Against+my+better+judgment%2C+yes."); + visit_url("choice.php?pwd=&whichchoice=664&option=1&choiceform1=Er,+sure,+I+guess+so..."); + } if(knoll_available()) { visit_url("place.php?whichplace=knoll_friendly&action=dk_innabox"); @@ -4183,7 +4189,7 @@ boolean _auto_forceNextNoncombat(location loc, boolean speculative) set_property("auto_forceNonCombatSource", "Apriling tuba"); return true; } - else if(auto_hasParka() && get_property("_spikolodonSpikeUses") < 5 && hasTorso()) + else if(auto_hasParka() && get_property("_spikolodonSpikeUses") < 5 && hasTorso() && (!in_wereprof() || !is_professor())) // if we're a professor, we can't use the spikes { if(speculative) return true; // parka spikes require a combat to active diff --git a/RELEASE/scripts/autoscend/auto_zone.ash b/RELEASE/scripts/autoscend/auto_zone.ash index b01d3d71f..33603a86f 100644 --- a/RELEASE/scripts/autoscend/auto_zone.ash +++ b/RELEASE/scripts/autoscend/auto_zone.ash @@ -173,7 +173,7 @@ generic_t zone_needItem(location loc) value = 20.0; break; case $location[The Smut Orc Logging Camp]: - if(get_property("chasmBridgeProgress").to_int() < 30) + if(get_property("chasmBridgeProgress").to_int() < bridgeGoal()) { value = 10.0; } @@ -870,7 +870,7 @@ generic_t zone_delay(location loc) } break; case $location[The Smut Orc Logging Camp]: - if (shenZones contains loc && get_property("chasmBridgeProgress").to_int() >= 30) + if (shenZones contains loc && get_property("chasmBridgeProgress").to_int() >= bridgeGoal()) { value = 3 - (loc.turns_spent - shenZones[loc]); } @@ -906,25 +906,25 @@ generic_t zone_delay(location loc) } break; case $location[Vanya\'s Castle]: - if (possessEquipment($item[Continuum Transfunctioner]) && EightBitScore() < 10000 && (get_property("8BitColor") == "black" || get_property("8BitColor") == "")) + if (need8BitPoints() && possessEquipment($item[Continuum Transfunctioner]) && (get_property("8BitColor") == "black" || get_property("8BitColor") == "")) { value = 5 - get_property("8BitBonusTurns").to_int(); } break; case $location[The Fungus Plains]: - if (possessEquipment($item[Continuum Transfunctioner]) && EightBitScore() < 10000 && get_property("8BitColor") == "red") + if (need8BitPoints() && possessEquipment($item[Continuum Transfunctioner]) && get_property("8BitColor") == "red") { value = 5 - get_property("8BitBonusTurns").to_int(); } break; case $location[Megalo-City]: - if (possessEquipment($item[Continuum Transfunctioner]) && EightBitScore() < 10000 && get_property("8BitColor") == "blue") + if (need8BitPoints() && possessEquipment($item[Continuum Transfunctioner]) && get_property("8BitColor") == "blue") { value = 5 - get_property("8BitBonusTurns").to_int(); } break; case $location[Hero\'s Field]: - if (possessEquipment($item[Continuum Transfunctioner]) && EightBitScore() < 10000 && get_property("8BitColor") == "green") + if (need8BitPoints() && possessEquipment($item[Continuum Transfunctioner]) && get_property("8BitColor") == "green") { value = 5 - get_property("8BitBonusTurns").to_int(); } diff --git a/RELEASE/scripts/autoscend/autoscend_header.ash b/RELEASE/scripts/autoscend/autoscend_header.ash index 5f1c03b65..c18e6e818 100644 --- a/RELEASE/scripts/autoscend/autoscend_header.ash +++ b/RELEASE/scripts/autoscend/autoscend_header.ash @@ -485,6 +485,7 @@ boolean auto_sendAutumnaton(location loc); boolean auto_autumnatonQuest(); boolean auto_hasSpeakEasy(); int auto_remainingSpeakeasyFreeFights(); +boolean speakeasyCombat(); boolean auto_haveTrainSet(); @@ -568,6 +569,8 @@ boolean auto_MayamClaimBelt(); boolean auto_MayamClaimWhatever(); boolean auto_MayamClaimAll(); boolean auto_haveRoman(); +boolean auto_haveBatWings(); +boolean auto_canLeapBridge(); ######################################################################################################## //Defined in autoscend/paths/actually_ed_the_undying.ash @@ -1083,6 +1086,7 @@ boolean L8_trapperQuest(); boolean LX_loggingHatchet(); boolean L9_leafletQuest(); void L9_chasmMaximizeForNoncombat(); +int bridgeGoal(); int fastenerCount(); int lumberCount(); boolean finishBuildingSmutOrcBridge(); @@ -1201,6 +1205,7 @@ boolean L12_islandWar(); //Defined in autoscend/quests/level_13.ash boolean needStarKey(); boolean needDigitalKey(); +boolean need8BitPoints(); int towerKeyCount(); int towerKeyCount(boolean effective); int EightBitScore(); diff --git a/RELEASE/scripts/autoscend/combat/auto_combat_default_stage2.ash b/RELEASE/scripts/autoscend/combat/auto_combat_default_stage2.ash index 4be497a9c..03251e85c 100644 --- a/RELEASE/scripts/autoscend/combat/auto_combat_default_stage2.ash +++ b/RELEASE/scripts/autoscend/combat/auto_combat_default_stage2.ash @@ -313,7 +313,7 @@ string auto_combatDefaultStage2(int round, monster enemy, string text) # Instakill handler boolean couldInstaKill = true; - if($monsters[Smut Orc Pipelayer,Smut Orc Jacker,Smut Orc Screwer,Smut Orc Nailer] contains enemy && get_property("chasmBridgeProgress").to_int() < 30) + if($monsters[Smut Orc Pipelayer,Smut Orc Jacker,Smut Orc Screwer,Smut Orc Nailer] contains enemy && get_property("chasmBridgeProgress").to_int() < bridgeGoal()) { //want to do cold damage in stage3 if(my_adventures() > 6) diff --git a/RELEASE/scripts/autoscend/combat/auto_combat_default_stage3.ash b/RELEASE/scripts/autoscend/combat/auto_combat_default_stage3.ash index 5b833a4d1..e8e01d52a 100644 --- a/RELEASE/scripts/autoscend/combat/auto_combat_default_stage3.ash +++ b/RELEASE/scripts/autoscend/combat/auto_combat_default_stage3.ash @@ -184,7 +184,14 @@ string auto_combatDefaultStage3(int round, monster enemy, string text) { boolean polarVortexAvailable = canUse($skill[Fire Extinguisher: Polar Vortex], false) && auto_fireExtinguisherCharges() > 10; boolean mildEvilAvailable = canUse($skill[Perpetrate Mild Evil],false) && get_property("_mildEvilPerpetrated").to_int() < 3; - // mild evil only can pick pocket. Use it before fire extinguisher + boolean swoopAvailable = canUse($skill[Swoop like a Bat], true) && get_property("_batWingsSwoopUsed").to_int() < 11; + + // mild evil and swoop can only pick pocket. Use them before fire extinguisher + if(swoopAvailable) + { + handleTracker(enemy, $skill[Swoop like a Bat], "auto_otherstuff"); + return useSkill($skill[Swoop like a Bat]); + } if(mildEvilAvailable) { handleTracker(enemy, $skill[Perpetrate Mild Evil], "auto_otherstuff"); @@ -356,7 +363,7 @@ string auto_combatDefaultStage3(int round, monster enemy, string text) } } - if(my_location() == $location[The Smut Orc Logging Camp] && canSurvive(1.0) && get_property("chasmBridgeProgress").to_int() < 30) + if(my_location() == $location[The Smut Orc Logging Camp] && canSurvive(1.0) && get_property("chasmBridgeProgress").to_int() < bridgeGoal()) { boolean coldMortarShell = canUse($skill[Stuffed Mortar Shell]) && have_effect($effect[Spirit of Peppermint]) != 0; skill coldSkillToUse; diff --git a/RELEASE/scripts/autoscend/combat/auto_combat_ed.ash b/RELEASE/scripts/autoscend/combat/auto_combat_ed.ash index 2df4f6f4a..cc50108f7 100644 --- a/RELEASE/scripts/autoscend/combat/auto_combat_ed.ash +++ b/RELEASE/scripts/autoscend/combat/auto_combat_ed.ash @@ -322,6 +322,7 @@ string auto_edCombatHandler(int round, monster enemy, string text) } } + //yellowray instantly kills the enemy and makes them drop all items they can drop. if(!combat_status_check("yellowray") && auto_wantToYellowRay(enemy, my_location())) { string combatAction = yellowRayCombatString(enemy, true, $monsters[bearpig topiary animal, elephant (meatcar?) topiary animal, spider (duck?) topiary animal, Knight (Snake)] contains enemy); @@ -354,27 +355,80 @@ string auto_edCombatHandler(int round, monster enemy, string text) if(!combat_status_check("banishercheck") && auto_wantToBanish(enemy, my_location())) { - string combatAction = banisherCombatString(enemy, my_location(), true); - if(combatAction != "") + string banishAction = banisherCombatString(enemy, my_location(), true); + if(banishAction != "") { + auto_log_info("Looking at banishAction: " + banishAction, "green"); combat_status_add("banisher"); - if(index_of(combatAction, "skill") == 0) + if(index_of(banishAction, "skill") == 0) { - handleTracker(enemy, to_skill(substring(combatAction, 6)), "auto_banishes"); + handleTracker(enemy, to_skill(substring(banishAction, 6)), "auto_banishes"); } - else if(index_of(combatAction, "item") == 0) + else if(index_of(banishAction, "item") == 0) { - handleTracker(enemy, to_item(substring(combatAction, 5)), "auto_banishes"); + if(contains_text(banishAction, ", none")) + { + int commapos = index_of(banishAction, ", none"); + handleTracker(enemy, to_item(substring(banishAction, 5, commapos)), "auto_banishes"); + } + else + { + handleTracker(enemy, to_item(substring(banishAction, 5)), "auto_banishes"); + } } else { - auto_log_warning("Unable to track banisher behavior: " + combatAction, "red"); + auto_log_warning("Unable to track banisher behavior: " + banishAction, "red"); } - return combatAction; + return banishAction; } + //we wanted to banish an enemy and failed. set a property so we do not bother trying in subsequent rounds combat_status_add("banishercheck"); } + // Free run from monsters we want to banish but are unable to, or monsters on the free run list + if(!combat_status_check("freeruncheck") && (auto_wantToFreeRun(enemy, my_location()) || auto_wantToBanish(enemy, my_location()))) + { + string freeRunAction = freeRunCombatString(enemy, my_location(), true); + if(freeRunAction != "") + { + if (index_of(freeRunAction, "runaway familiar") == 0) + { + handleTracker(enemy, to_familiar(substring(freeRunAction, 17)), "auto_freeruns"); + freeRunAction = "runaway"; + } + else if (index_of(freeRunAction, "runaway item") == 0) + { + handleTracker(enemy, to_item(substring(freeRunAction, 13)), "auto_freeruns"); + freeRunAction = "runaway"; + } + else if(index_of(freeRunAction, "skill") == 0) + { + handleTracker(enemy, to_skill(substring(freeRunAction, 6)), "auto_freeruns"); + } + else if(index_of(freeRunAction, "item") == 0) + { + if(contains_text(freeRunAction, ", none")) + { + int commapos = index_of(freeRunAction, ", none"); + handleTracker(enemy, to_item(substring(freeRunAction, 5, commapos)), "auto_freeruns"); + } + else + { + handleTracker(enemy, to_item(substring(freeRunAction, 5)), "auto_freeruns"); + } + } + else + { + auto_log_warning("Unable to track runaway behavior: " + freeRunAction, "red"); + } + return freeRunAction; + } + + //we wanted to free run an enemy and failed. set a property so we do not bother trying in subsequent rounds + combat_status_add("freeruncheck"); + } + if (!combat_status_check("replacercheck") && auto_wantToReplace(enemy, my_location())) { string combatAction = replaceMonsterCombatString(enemy, true); @@ -438,7 +492,10 @@ string auto_edCombatHandler(int round, monster enemy, string text) if (!get_property("edUsedLash").to_boolean() && canUse($skill[Lash of the Cobra]) && get_property("_edLashCount").to_int() < 30) { boolean doLash = false; - + if(enemy == $monster[Shadow Slab]) + { + doLash = true; + } if((enemy == $monster[Big Wheelin\' Twins]) && !possessEquipment($item[Badge Of Authority])) { doLash = true; @@ -584,14 +641,6 @@ string auto_edCombatHandler(int round, monster enemy, string text) } } - if (canUse($item[Tattered Scrap of Paper], false) && have_effect($effect[Everything Looks Green]) == 0) - { - if($monsters[Bubblemint Twins, Bunch of Drunken Rats, Coaltergeist, Creepy Ginger Twin, Demoninja, Drunk Goat, Drunken Rat, Fallen Archfiend, Hellion, Knob Goblin Elite Guard, L imp, Mismatched Twins, Sabre-Toothed Goat, W imp] contains enemy) - { - return useItem($item[Tattered Scrap Of Paper]); - } - } - if (!combat_status_check("talismanofrenenutet") && canUse($item[Talisman of Renenutet])) { boolean doRenenutet = false; @@ -682,6 +731,14 @@ string auto_edCombatHandler(int round, monster enemy, string text) { return useItem($item[Short Writ of Habeas Corpus]); } + + if(canUse($skill[Darts: Aim for the Bullseye]) && have_effect($effect[Everything Looks Red]) == 0 && dartELRcd() <= 40) + { + set_property("auto_instakillSource", "darts bullseye"); + set_property("auto_instakillSuccess", true); + loopHandlerDelayAll(); + return useSkill($skill[Darts: Aim for the Bullseye]); + } // use cosmic bowling ball iotm if(auto_bowlingBallCombatString(my_location(), true) != "" && !enemy.boss) @@ -689,6 +746,14 @@ string auto_edCombatHandler(int round, monster enemy, string text) return auto_bowlingBallCombatString(my_location(), false); } + // prep parka NC forcing if requested + if(canUse($skill[Launch spikolodon spikes]) && get_property("auto_forceNonCombatSource") == "jurassic parka" + && !get_property("auto_parkaSpikesDeployed").to_boolean()) + { + set_property("auto_parkaSpikesDeployed", true); + return useSkill($skill[Launch spikolodon spikes]); + } + if(instakillable(enemy) && !isFreeMonster(enemy,my_location()) && doInstaKill) { if(!combat_status_check("batoomerang") && (item_amount($item[Replica Bat-oomerang]) > 0)) @@ -708,6 +773,13 @@ string auto_edCombatHandler(int round, monster enemy, string text) } } + if(canUse($item[shadow brick]) && (get_property("_shadowBricksUsed").to_int() < 13)) + { + handleTracker(enemy, $item[shadow brick], "auto_instakill"); + loopHandlerDelayAll(); + return useItems($item[shadow brick], $item[none]); + } + if(!combat_status_check("jokesterGun") && (equipped_item($slot[Weapon]) == $item[The Jokester\'s Gun]) && !get_property("_firedJokestersGun").to_boolean() && auto_have_skill($skill[Fire the Jokester\'s Gun])) { combat_status_add("jokesterGun"); @@ -745,6 +817,33 @@ string auto_edCombatHandler(int round, monster enemy, string text) return "skill Mild Curse; repeat; "; } + + //Everfull Dart Holder + if(have_equipped($item[Everfull Dart Holster]) && get_property("_dartsLeft").to_int() > 0) + { + return useSkill(dartSkill(), false); + } + + // Don't risk drop forcing if we've already been beaten up twice + if (get_property("_edDefeats").to_int()<2) + { + if(wantToForceDrop(enemy)) + { + boolean polarVortexAvailable = canUse($skill[Fire Extinguisher: Polar Vortex], false) && auto_fireExtinguisherCharges() > 10; + boolean mildEvilAvailable = canUse($skill[Perpetrate Mild Evil],false) && get_property("_mildEvilPerpetrated").to_int() < 3; + // mild evil only can pick pocket. Use it before fire extinguisher + if(mildEvilAvailable) + { + handleTracker(enemy, $skill[Perpetrate Mild Evil], "auto_otherstuff"); + return useSkill($skill[Perpetrate Mild Evil]); + } + if(polarVortexAvailable) + { + handleTracker(enemy, $skill[Fire Extinguisher: Polar Vortex], "auto_otherstuff"); + return useSkill($skill[Fire Extinguisher: Polar Vortex]); + } + } + } // Actually killing stuff starts here if(canUse(auto_spoonCombatSkill())) diff --git a/RELEASE/scripts/autoscend/combat/auto_combat_quest.ash b/RELEASE/scripts/autoscend/combat/auto_combat_quest.ash index 885faae7b..3a992050a 100644 --- a/RELEASE/scripts/autoscend/combat/auto_combat_quest.ash +++ b/RELEASE/scripts/autoscend/combat/auto_combat_quest.ash @@ -222,5 +222,11 @@ string auto_JunkyardCombatHandler(int round, monster enemy, string text) { return useSkill($skill[Toss], false); } + + if (canUse($skill[Plague Claws], false)) + { + return useSkill($skill[Plague Claws], false); + } + return "attack with weapon"; } diff --git a/RELEASE/scripts/autoscend/combat/auto_combat_util.ash b/RELEASE/scripts/autoscend/combat/auto_combat_util.ash index f5d3dad04..0423cace7 100644 --- a/RELEASE/scripts/autoscend/combat/auto_combat_util.ash +++ b/RELEASE/scripts/autoscend/combat/auto_combat_util.ash @@ -199,47 +199,25 @@ string useItems(item it1, item it2) boolean isSniffed(monster enemy, skill sk) { - //checks if the monster enemy is currently sniffed using the specific skill sk - boolean retval = false; - switch(sk) - { - case $skill[Transcendent Olfaction]: - retval = contains_text(get_property("olfactedMonster"), enemy); - break; - case $skill[Make Friends]: - retval = contains_text(get_property("makeFriendsMonster"), enemy); - break; - case $skill[Long Con]: - retval = contains_text(get_property("longConMonster"), enemy); - break; - case $skill[Perceive Soul]: - retval = contains_text(get_property("auto_bat_soulmonster"), enemy); - break; - case $skill[Gallapagosian Mating Call]: - retval = contains_text(get_property("_gallapagosMonster"), enemy); - break; - case $skill[Monkey Point]: - retval = contains_text(get_property("monkeyPointMonster"), enemy); - break; - case $skill[Get a Good Whiff of This Guy]: - retval = contains_text(get_property("nosyNoseMonster"), enemy) && my_familiar() == $familiar[Nosy Nose]; - break; - case $skill[Offer Latte to Opponent]: - retval = contains_text(get_property("_latteMonster"), enemy); - break; - case $skill[Motif]: - retval = contains_text(get_property("motifMonster"), enemy); - break; - default: - abort("isSniffed was asked to check an unidentified skill: " +sk); + string search; + if (sk == $skill[Get a Good Whiff of This Guy]) { + search = "Nosy Nose"; + } else { + search = sk.to_string(); + } + string[0] tracked = tracked_by(enemy); + foreach n in tracked { + if (tracked[n] == search) { + return true; + } } - return retval; + return false; } boolean isSniffed(monster enemy) { //checks if the monster enemy is currently sniffed using any of the sniff skills - foreach sk in $skills[Transcendent Olfaction, Make Friends, Long Con, Perceive Soul, Gallapagosian Mating Call, Monkey Point, Offer Latte to Opponent, Motif] + foreach sk in $skills[Transcendent Olfaction, Make Friends, Long Con, Perceive Soul, Gallapagosian Mating Call, Monkey Point, Offer Latte to Opponent, Motif, Hunt] { if(isSniffed(enemy, sk)) return true; } @@ -259,11 +237,10 @@ skill getSniffer(monster enemy, boolean inCombat) { return $skill[Make Friends]; //avatar of sneaky pete specific skill } - //commented out because Mafia doesn't track Hunt yet - /*if(canUse($skill[Hunt], true, inCombat) && have_effect($effect[Everything Looks Red]) == 0 && !isSniffed(enemy, $skill[Hunt])) + if(canUse($skill[Hunt], true, inCombat) && have_effect($effect[Everything Looks Red]) == 0 && !isSniffed(enemy, $skill[Hunt])) { return $skill[Hunt]; //WereProfessor Werewolf specific skill - }*/ + } if(canUse($skill[Long Con], true , inCombat) && get_property("_longConUsed").to_int() < 5 && !isSniffed(enemy, $skill[Long Con])) { return $skill[Long Con]; @@ -995,6 +972,7 @@ boolean wantToForceDrop(monster enemy) //skills that can be used on any combat round, repeatedly until an item is stolen //take into account if a yellow ray has been used. Must have been one that doesn't insta-kill boolean mildEvilAvailable = canUse($skill[Perpetrate Mild Evil],false) && get_property("_mildEvilPerpetrated").to_int() < 3; + boolean swoopAvailable = canUse($skill[Swoop like a Bat], true) && get_property("_batWingsSwoopUsed").to_int() < 11; boolean forceDrop = false; @@ -1018,7 +996,7 @@ boolean wantToForceDrop(monster enemy) // polar vortex/mild evil is more likely to pocket an item the higher the drop rate. Unlike XO which has equal chance for all drops // reserve extinguisher 30 charge for filth worms - if(auto_fireExtinguisherCharges() > 20 || mildEvilAvailable) + if(auto_fireExtinguisherCharges() > 20 || mildEvilAvailable || swoopAvailable) { int dropsFromYR = 0; if(combat_status_check("yellowray")) @@ -1050,6 +1028,29 @@ boolean wantToForceDrop(monster enemy) forceDrop = true; } } + + if(isActuallyEd() && my_location() == $location[The Secret Council Warehouse]) + { + int progress = get_property("warehouseProgress").to_int(); + if(enemy == $monster[Warehouse Guard]) + { + int n_pages = item_amount($item[warehouse map page]); + int progress_with_pages = progress+n_pages*8; + if (progress_with_pages<39) // need 40 to "win", will get +1 for this combat + { + forceDrop = true; + } + } + else if(enemy == $monster[Warehouse Clerk]) + { + int n_pages = item_amount($item[warehouse inventory page]); + int progress_with_pages = progress+n_pages*8; + if (progress_with_pages<39) // need 40 to "win", will get +1 for this combat + { + forceDrop = true; + } + } + } // ed warehouse return forceDrop; } diff --git a/RELEASE/scripts/autoscend/combat/auto_combat_zombie_slayer.ash b/RELEASE/scripts/autoscend/combat/auto_combat_zombie_slayer.ash index e1db0becf..f47323f16 100644 --- a/RELEASE/scripts/autoscend/combat/auto_combat_zombie_slayer.ash +++ b/RELEASE/scripts/autoscend/combat/auto_combat_zombie_slayer.ash @@ -44,10 +44,15 @@ string auto_combatZombieSlayerStage3(int round, monster enemy, string text) return ""; } - if(canUse($skill[Infectious Bite]) && zombieSlayer_canInfect(enemy) && canSurvive(4.0)) + if(canUse($skill[Infectious Bite]) && canSurvive(4.0)) { return useSkill($skill[Infectious Bite]); } + + if(canUse($skill[Meat Shields]) && enemy.boss && canSurvive(4.0)) + { + return useSkill($skill[Meat Shields]); + } // Just always use Bear-ly Legal for the delevel + meat, unless we want to Bear Hug or Kodiak Moment if (canUse($skill[Bear-ly Legal]) && !wantBearHug(enemy) && !wantKodiakMoment(enemy)) diff --git a/RELEASE/scripts/autoscend/iotms/mr2014.ash b/RELEASE/scripts/autoscend/iotms/mr2014.ash index bb61679a2..aabacea26 100644 --- a/RELEASE/scripts/autoscend/iotms/mr2014.ash +++ b/RELEASE/scripts/autoscend/iotms/mr2014.ash @@ -69,12 +69,12 @@ boolean considerGrimstoneGolem(boolean bjornCrown) return false; } - if((get_property("desertExploration").to_int() >= 70) && (get_property("chasmBridgeProgress").to_int() >= 29)) + if((get_property("desertExploration").to_int() >= 70) && (get_property("chasmBridgeProgress").to_int() >= (bridgeGoal() - 1))) { return false; } - if(get_property("chasmBridgeProgress").to_int() >= 29) + if(get_property("chasmBridgeProgress").to_int() >= (bridgeGoal() - 1)) { if(!get_property("auto_grimstoneOrnateDowsingRod").to_boolean()) { @@ -407,7 +407,7 @@ boolean LX_ornateDowsingRod() boolean fancyOilPainting() { - if(get_property("chasmBridgeProgress").to_int() >= 30) + if(get_property("chasmBridgeProgress").to_int() >= bridgeGoal()) { return false; } diff --git a/RELEASE/scripts/autoscend/iotms/mr2021.ash b/RELEASE/scripts/autoscend/iotms/mr2021.ash index 9847f0e03..e8c9f9782 100644 --- a/RELEASE/scripts/autoscend/iotms/mr2021.ash +++ b/RELEASE/scripts/autoscend/iotms/mr2021.ash @@ -809,7 +809,7 @@ string auto_FireExtinguisherCombatString(location place) return "skill " + $skill[Fire Extinguisher: Zone Specific]; } - if(place == $location[The Smut Orc Logging Camp] && !get_property("fireExtinguisherChasmUsed").to_boolean() && get_property("chasmBridgeProgress").to_int() < 30 && !auto_hasAutumnaton()) + if(place == $location[The Smut Orc Logging Camp] && !get_property("fireExtinguisherChasmUsed").to_boolean() && get_property("chasmBridgeProgress").to_int() < bridgeGoal() && !auto_hasAutumnaton()) { return "skill " + $skill[Fire Extinguisher: Zone Specific]; } diff --git a/RELEASE/scripts/autoscend/iotms/mr2022.ash b/RELEASE/scripts/autoscend/iotms/mr2022.ash index a71bc6b57..62051d0b9 100644 --- a/RELEASE/scripts/autoscend/iotms/mr2022.ash +++ b/RELEASE/scripts/autoscend/iotms/mr2022.ash @@ -754,6 +754,20 @@ int auto_remainingSpeakeasyFreeFights() return max(3 - get_property("_speakeasyFreeFights").to_int(), 0); } +boolean speakeasyCombat() +{ + if(!auto_hasSpeakEasy()) + { + return false; + } + + if(auto_remainingSpeakeasyFreeFights()>0) + { + return autoAdv($location[An Unusually Quiet Barroom Brawl]); + } + return false; +} + boolean auto_haveTrainSet() { return auto_get_campground() contains $item[model train set] && auto_is_valid($item[model train set]); //check if the model train set is in the campground diff --git a/RELEASE/scripts/autoscend/iotms/mr2023.ash b/RELEASE/scripts/autoscend/iotms/mr2023.ash index 01559f3ed..d176592ab 100644 --- a/RELEASE/scripts/autoscend/iotms/mr2023.ash +++ b/RELEASE/scripts/autoscend/iotms/mr2023.ash @@ -487,7 +487,7 @@ void auto_buyFrom2002MrStore() use(itemConsidering); } /*// giant black monlith. Mostly useful at low level for stats - if (my_level() < 13 || get_property("auto_disregardInstantKarma").to_boolean()) { + if (have_campground() && (my_level() < 13 || get_property("auto_disregardInstantKarma").to_boolean())) { itemConsidering = $item[giant black monolith]; if(remainingCatalogCredits() > 0 && !(auto_get_campground() contains itemConsidering) && auto_is_valid(itemConsidering)) { diff --git a/RELEASE/scripts/autoscend/iotms/mr2024.ash b/RELEASE/scripts/autoscend/iotms/mr2024.ash index faa445845..c1392eea4 100644 --- a/RELEASE/scripts/autoscend/iotms/mr2024.ash +++ b/RELEASE/scripts/autoscend/iotms/mr2024.ash @@ -358,3 +358,26 @@ boolean auto_haveRoman() } return false; } + +boolean auto_haveBatWings() +{ + if(auto_is_valid($item[Bat Wings]) && possessEquipment($item[Bat Wings])) + { + return true; + } + return false; +} + +boolean auto_canLeapBridge() +{ + // bat wings allow for us to leap bridge at 5/6 progress (25 of 30) + if(!auto_haveBatWings()) + { + return false; + } + if(fastenerCount() < 25 || lumberCount() < 25) + { + return false; + } + return true; +} diff --git a/RELEASE/scripts/autoscend/paths/actually_ed_the_undying.ash b/RELEASE/scripts/autoscend/paths/actually_ed_the_undying.ash index 68a1948ca..c1683be3c 100644 --- a/RELEASE/scripts/autoscend/paths/actually_ed_the_undying.ash +++ b/RELEASE/scripts/autoscend/paths/actually_ed_the_undying.ash @@ -578,9 +578,9 @@ skill ed_nextUpgrade() { return $skill[Another Extra Spleen]; // 10 Ka } - else if (!have_skill($skill[Replacement Stomach])) + else if (!have_skill($skill[Replacement Liver])) { - return $skill[Replacement Stomach]; // 30 Ka + return $skill[Replacement Liver]; // 30 Ka } else if (!have_skill($skill[Upgraded Legs])) { @@ -602,9 +602,9 @@ skill ed_nextUpgrade() { return $skill[Just One More Extra Spleen]; // 25 Ka } - else if (!have_skill($skill[Replacement Liver])) + else if (!have_skill($skill[Replacement Stomach])) { - return $skill[Replacement Liver]; // 30 Ka + return $skill[Replacement Stomach]; // 30 Ka } else if (!have_skill($skill[Elemental Wards])) { @@ -1116,7 +1116,10 @@ boolean L1_ed_islandFallback() //track that we are farming Ka as Ed set_property("_auto_farmingKaAsEd", true); - + if (auto_remainingSpeakeasyFreeFights() > 0) + { + return speakeasyCombat(); + } if (neverendingPartyAvailable()) { return neverendingPartyCombat(); @@ -1448,8 +1451,10 @@ boolean LM_edTheUndying() // we should open the manor second floor sooner rather than later as starting the level 11 quest // ruins our pool skill and having delay burning zones open is nice. - if (LX_unlockManorSecondFloor() || LX_unlockHauntedLibrary() || LX_unlockHauntedBilliardsRoom(true)) { - return true; + if(my_level()<11) { + if (LX_unlockManorSecondFloor() || LX_unlockHauntedLibrary() || LX_unlockHauntedBilliardsRoom(true)) { + return true; + } } // as we do hippy side, the war is a 2 Ka quest (excluding sidequests but that shouldn't matter) if (L12_islandWar()) @@ -1472,6 +1477,10 @@ boolean LM_edTheUndying() { return true; } + // If we didn't get the Spookyraven unlock done before level 11, do it now since airship is done and we want more delay zones open + if (LX_unlockManorSecondFloor() || LX_unlockHauntedLibrary() || LX_unlockHauntedBilliardsRoom(true)) { + return true; + } // Smut Orcs are 1 Ka so build the bridge. if (L9_ed_chasmStart() || L9_chasmBuild()) { diff --git a/RELEASE/scripts/autoscend/paths/license_to_adventure.ash b/RELEASE/scripts/autoscend/paths/license_to_adventure.ash index 63446309c..1f6603d38 100644 --- a/RELEASE/scripts/autoscend/paths/license_to_adventure.ash +++ b/RELEASE/scripts/autoscend/paths/license_to_adventure.ash @@ -93,7 +93,7 @@ boolean bond_buySkills() points -= 1; } } - else if(!get_property("bondBridge").to_boolean() && (get_property("chasmBridgeProgress").to_int() < 28)) + else if(!get_property("bondBridge").to_boolean() && (get_property("chasmBridgeProgress").to_int() < (bridgeGoal() - 2))) { if(points >= 3) { diff --git a/RELEASE/scripts/autoscend/paths/low_key_summer.ash b/RELEASE/scripts/autoscend/paths/low_key_summer.ash index 4d58b80e0..20b4c1a41 100644 --- a/RELEASE/scripts/autoscend/paths/low_key_summer.ash +++ b/RELEASE/scripts/autoscend/paths/low_key_summer.ash @@ -308,7 +308,7 @@ boolean LX_findHelpfulLowKey() } // cold spell damage before orcs. Ice Key needs The Icy Peak access - if (internalQuestStatus("questL09Topping") == 0 && get_property("chasmBridgeProgress").to_int() < 30) + if (internalQuestStatus("questL09Topping") == 0 && get_property("chasmBridgeProgress").to_int() < bridgeGoal()) { if (lowkey_keyAdv($item[Ice Key])) { return true; } } diff --git a/RELEASE/scripts/autoscend/paths/wereprofessor.ash b/RELEASE/scripts/autoscend/paths/wereprofessor.ash index 258df3c24..8ca2d2db9 100644 --- a/RELEASE/scripts/autoscend/paths/wereprofessor.ash +++ b/RELEASE/scripts/autoscend/paths/wereprofessor.ash @@ -144,9 +144,9 @@ void wereprof_buySkills() cantbuy = 0; //Priority is: Expanding organs, useful skills (banish, instakill, ELR CD), stat gains, +meat, DR, relatively useless skills and waiting on Mafia support skills foreach sk in $strings[stomach3, liver3, stomach2, liver2, stomach1, liver1, hp3, init3, hp2, init2, hp1, init1, mus3, - mox3, mus2, mox2, mus1, mox1, punt, slaughter, pureblood, kick3, kick2, kick1, rend3, rend2, rend1, items3, items2, items1, + mox3, mus2, mox2, mus1, mox1, punt, slaughter, pureblood, hunt, kick3, kick2, kick1, rend3, rend2, rend1, items3, items2, items1, res3, res2, res1, myst3, myst2, myst1, bite3, bite2, bite1, perfecthair, meat3, meat2, meat1, ml3, ml2, ml1, skin3, - skin2, skin1, hunt, feasting, skinheal, howl, feed] + skin2, skin1, feasting, skinheal, howl, feed] { if(contains_text(get_property("beastSkillsAvailable").to_string(), sk)) { diff --git a/RELEASE/scripts/autoscend/paths/you_robot.ash b/RELEASE/scripts/autoscend/paths/you_robot.ash index 279fd3424..fa9d83c48 100644 --- a/RELEASE/scripts/autoscend/paths/you_robot.ash +++ b/RELEASE/scripts/autoscend/paths/you_robot.ash @@ -1323,7 +1323,7 @@ void robot_directive() boolean desert_ready = internalQuestStatus("questL11Desert") == 0; boolean desert_done = internalQuestStatus("questL11Desert") > 0; boolean chasm_offhand_slot_needed = possessEquipment($item[Loadstone]) || canPull($item[Loadstone]); - boolean chasm_ready = internalQuestStatus("questL09Topping") == 0 && get_property("chasmBridgeProgress").to_int() < 30 && !shenShouldDelayZone($location[The Smut Orc Logging Camp]); + boolean chasm_ready = internalQuestStatus("questL09Topping") == 0 && get_property("chasmBridgeProgress").to_int() < bridgeGoal() && !shenShouldDelayZone($location[The Smut Orc Logging Camp]); boolean chasm_done = internalQuestStatus("questL09Topping") > 0; if(directive == "chasm" && chasm_done) diff --git a/RELEASE/scripts/autoscend/paths/zombie_slayer.ash b/RELEASE/scripts/autoscend/paths/zombie_slayer.ash index d48bf3321..98eb77a65 100644 --- a/RELEASE/scripts/autoscend/paths/zombie_slayer.ash +++ b/RELEASE/scripts/autoscend/paths/zombie_slayer.ash @@ -165,7 +165,7 @@ boolean zombieSlayer_acquireMP(int goal, int meat_reserve) return false; } - if (my_hp() >= goal) return true; + if (my_mp() >= goal) return true; return lureMinions(goal) || summonMinions(goal, meat_reserve); } @@ -186,10 +186,10 @@ boolean zombieSlayer_acquireHP(int goal) int missingHP = goal - my_hp(); - // Devour Minions if you need at least 4 casts of Bite Minion + // Devour Minions if you need at least 4 casts of Bite Minion or if doing the Hidden Apartment Building if (auto_have_skill($skill[Devour Minions])) { - while (missingHP > floor(my_maxhp() * 0.3) && zombieSlayer_acquireMP(mp_cost($skill[Devour Minions]))) + while ((missingHP > floor(my_maxhp() * 0.3) || ((have_effect($effect[Thrice-Cursed]) > 0 || have_effect($effect[Twice-Cursed]) > 0 || have_effect($effect[Once-Cursed]) > 0) && !(internalQuestStatus("questL11Curses") > 1 || item_amount($item[Moss-Covered Stone Sphere]) > 0))) && zombieSlayer_acquireMP(mp_cost($skill[Devour Minions]))) { use_skill(1, $skill[Devour Minions]); if (my_hp() >= goal) break; diff --git a/RELEASE/scripts/autoscend/quests/level_04.ash b/RELEASE/scripts/autoscend/quests/level_04.ash index b5cf0d5e0..f0c1489b3 100644 --- a/RELEASE/scripts/autoscend/quests/level_04.ash +++ b/RELEASE/scripts/autoscend/quests/level_04.ash @@ -20,7 +20,7 @@ boolean L4_batCave() auto_log_info("In the bat hole!", "blue"); - if (possessEquipment($item[bat wings]) && auto_can_equip($item[bat wings])) + if (auto_haveBatWings()) { if (!get_property("batWingsBatHoleEntrance").to_boolean() && zone_available($location[The Bat Hole Entrance])) { diff --git a/RELEASE/scripts/autoscend/quests/level_09.ash b/RELEASE/scripts/autoscend/quests/level_09.ash index e79407481..5c625fc15 100644 --- a/RELEASE/scripts/autoscend/quests/level_09.ash +++ b/RELEASE/scripts/autoscend/quests/level_09.ash @@ -120,6 +120,11 @@ void L9_chasmMaximizeForNoncombat() } } +int bridgeGoal() +{ + return (!auto_haveBatWings() ? 30 : 25); +} + int fastenerCount() { int base = get_property("chasmBridgeProgress").to_int(); @@ -144,7 +149,7 @@ int lumberCount() boolean finishBuildingSmutOrcBridge() { - if (internalQuestStatus("questL09Topping") != 0 || get_property("chasmBridgeProgress").to_int() >= 30) + if (internalQuestStatus("questL09Topping") != 0 || get_property("chasmBridgeProgress").to_int() >= bridgeGoal()) { return false; } @@ -160,6 +165,13 @@ boolean finishBuildingSmutOrcBridge() visit_url("place.php?whichplace=orc_chasm&action=bridge"+(to_int(get_property("chasmBridgeProgress")))); // finish chasm if we can + if(auto_canLeapBridge()) + { + autoForceEquip($item[bat wings]); + visit_url("place.php?whichplace=orc_chasm&action=bridge_jump"); + visit_url("place.php?whichplace=highlands&action=highlands_dude"); + return true; + } if(get_property("chasmBridgeProgress").to_int() >= 30) { visit_url("place.php?whichplace=highlands&action=highlands_dude"); @@ -173,7 +185,7 @@ boolean finishBuildingSmutOrcBridge() void prepareForSmutOrcs() { - if(lumberCount() >= 30 && fastenerCount() >= 30) + if(lumberCount() >= bridgeGoal() && fastenerCount() >= bridgeGoal()) { // must be here for shen snake and quest objective is already done // set blech NC and don't bother prepping for the zone @@ -270,11 +282,11 @@ void prepareForSmutOrcs() } } - if(fastenerCount() < 30) + if(fastenerCount() < bridgeGoal()) { autoEquip($item[Loadstone]); } - if(lumberCount() < 30) + if(lumberCount() < bridgeGoal()) { autoEquip($item[Logging Hatchet]); } @@ -282,7 +294,7 @@ void prepareForSmutOrcs() return; } - int need = (30 - get_property("chasmBridgeProgress").to_int()) / 5; + int need = (bridgeGoal() - get_property("chasmBridgeProgress").to_int()) / 5; if(need > 0) { while((need > 0) && (item_amount($item[Snow Berries]) >= 2)) @@ -293,13 +305,13 @@ void prepareForSmutOrcs() } } - if (get_property("chasmBridgeProgress").to_int() < 30) + if (get_property("chasmBridgeProgress").to_int() < bridgeGoal()) { - if(fastenerCount() < 30) + if(fastenerCount() < bridgeGoal()) { autoEquip($item[Loadstone]); } - if(lumberCount() < 30) + if(lumberCount() < bridgeGoal()) { autoEquip($item[Logging Hatchet]); } @@ -310,7 +322,7 @@ void prepareForSmutOrcs() boolean L9_chasmBuild() { - if (internalQuestStatus("questL09Topping") != 0 || get_property("chasmBridgeProgress").to_int() >= 30) + if (internalQuestStatus("questL09Topping") != 0 || get_property("chasmBridgeProgress").to_int() >= bridgeGoal()) { return false; } @@ -330,7 +342,7 @@ boolean L9_chasmBuild() return false; //delay for You, Robot path } if(auto_hasAutumnaton() && !isAboutToPowerlevel() && $location[The Smut Orc Logging Camp].turns_spent > 0 - && (fastenerCount() < 30 || lumberCount() < 30)) + && (fastenerCount() < bridgeGoal() || lumberCount() < bridgeGoal())) { // delay zone to allow autumnaton to grab bridge parts // unless we have ran out of other stuff to do @@ -895,7 +907,7 @@ boolean L9_oilPeak() { return false; } - else if(item_amount($item[Bubblin' Crude]) >= 12) + else if(item_amount($item[Bubblin\' Crude]) >= 12) { if(in_glover()) { @@ -916,7 +928,7 @@ boolean L9_oilPeak() } } } - else if(auto_is_valid($item[Bubblin' Crude]) && creatable_amount($item[Jar Of Oil]) > 0) + else if(auto_is_valid($item[Bubblin\' Crude]) && creatable_amount($item[Jar Of Oil]) > 0) { create(1, $item[Jar Of Oil]); } @@ -989,7 +1001,7 @@ boolean L9_highLandlord() { return false; } - if(get_property("chasmBridgeProgress").to_int() < 30) + if(get_property("chasmBridgeProgress").to_int() < bridgeGoal()) { return false; } diff --git a/RELEASE/scripts/autoscend/quests/level_11.ash b/RELEASE/scripts/autoscend/quests/level_11.ash index d48e49842..638996d84 100644 --- a/RELEASE/scripts/autoscend/quests/level_11.ash +++ b/RELEASE/scripts/autoscend/quests/level_11.ash @@ -550,7 +550,7 @@ void hauntedBedroomChoiceHandler(int choice, string[int] options) else if(choice == 878) // One Ornate Nightstand (The Haunted Bedroom) { boolean needSpectacles = !possessEquipment($item[Lord Spookyraven\'s Spectacles]) && internalQuestStatus("questL11Manor") < 2; - if(is_boris() || in_wotsf() || (in_zombieSlayer() && in_hardcore()) || (in_nuclear() && in_hardcore())) + if(is_boris() || in_wotsf() || (in_nuclear() && in_hardcore())) { needSpectacles = false; } @@ -620,7 +620,7 @@ boolean LX_getLadySpookyravensFinestGown() { // Might not be worth it since we need to fight ornate nightstands for the spectacles and camera boolean needSpectacles = !possessEquipment($item[Lord Spookyraven\'s Spectacles]) && internalQuestStatus("questL11Manor") < 2; boolean needCamera = (item_amount($item[disposable instant camera]) == 0 && internalQuestStatus("questL11Palindome") < 1); - if (is_boris() || in_wotsf() || (in_zombieSlayer() && in_hardcore()) || (in_nuclear() && in_hardcore())) { + if (is_boris() || in_wotsf() || (in_nuclear() && in_hardcore())) { needSpectacles = false; } else if(needCamera && needSpectacles) { @@ -2316,7 +2316,7 @@ boolean L11_mauriceSpookyraven() } } - if(!possessEquipment($item[Lord Spookyraven\'s Spectacles]) || is_boris() || in_zombieSlayer() || in_wotsf() || in_bhy() || in_robot() || (in_nuclear() && !get_property("auto_haveoven").to_boolean())) + if(!possessEquipment($item[Lord Spookyraven\'s Spectacles]) || is_boris() || in_wotsf() || in_bhy() || in_robot() || (in_nuclear() && !get_property("auto_haveoven").to_boolean())) { auto_log_warning("Alternate fulminate pathway... how sad :(", "red"); # I suppose we can let anyone in without the Spectacles. diff --git a/RELEASE/scripts/autoscend/quests/level_12.ash b/RELEASE/scripts/autoscend/quests/level_12.ash index 584fea73d..7ac85fc9f 100644 --- a/RELEASE/scripts/autoscend/quests/level_12.ash +++ b/RELEASE/scripts/autoscend/quests/level_12.ash @@ -1183,7 +1183,14 @@ boolean L12_gremlins() { return false; } - if(in_glover()) + if (in_zombieSlayer()) + { + if(!auto_have_skill($skill[Plague Claws]) && item_amount($item[Seal Tooth]) == 0) + { + return false; + } + } + else if(in_glover()) { int need = 30 - item_amount($item[Doc Galaktik\'s Pungent Unguent]); if((need > 0) && (item_amount($item[Molybdenum Pliers]) == 0)) diff --git a/RELEASE/scripts/autoscend/quests/level_13.ash b/RELEASE/scripts/autoscend/quests/level_13.ash index 0eab99eeb..1e51f8a36 100644 --- a/RELEASE/scripts/autoscend/quests/level_13.ash +++ b/RELEASE/scripts/autoscend/quests/level_13.ash @@ -13,6 +13,10 @@ boolean needStarKey() boolean needDigitalKey() { + if(isActuallyEd()) + { + return false; + } if(contains_text(get_property("nsTowerDoorKeysUsed"),"digital key")) { return false; @@ -21,10 +25,19 @@ boolean needDigitalKey() { return false; } - + return true; } +boolean need8BitPoints() +{ + if(get_property("8BitScore").to_int() >= 10000) + { + return false; + } + return needDigitalKey(); +} + int towerKeyCount() { return towerKeyCount(true); @@ -1460,6 +1473,11 @@ boolean L13_towerNSTower() equipBaseline(); provideMeat(626, true, false); + if(in_zombieSlayer()) + { + acquireMP(30,0); + } + acquireHP(); autoAdvBypass("place.php?whichplace=nstower&action=ns_06_monster2", $location[Noob Cave]); return true; diff --git a/RELEASE/scripts/autoscend/quests/level_any.ash b/RELEASE/scripts/autoscend/quests/level_any.ash index 9bd3210d3..76b604b6d 100644 --- a/RELEASE/scripts/autoscend/quests/level_any.ash +++ b/RELEASE/scripts/autoscend/quests/level_any.ash @@ -260,7 +260,7 @@ boolean LX_islandAccess() return false; } - if(in_lowkeysummer() || in_zombieSlayer()) + if(in_lowkeysummer()) { return LX_hippyBoatman(); }