From c3592c898519dbae83829dceda77eeb8879f4ecd Mon Sep 17 00:00:00 2001 From: Chris Midgley Date: Thu, 17 Oct 2024 17:05:10 +0100 Subject: [PATCH 1/5] feat: wereprof improvements (#1509) * feat: hunt is now tracked by Mafia * feat: buy hunt if possible * feat: don't use spikes / research in hospital * fix: don't get the monolith if no campground --------- Co-authored-by: Joe Kirchoff --- RELEASE/scripts/autoscend/auto_equipment.ash | 3 +- RELEASE/scripts/autoscend/auto_util.ash | 2 +- .../autoscend/combat/auto_combat_util.ash | 53 ++++++------------- RELEASE/scripts/autoscend/iotms/mr2023.ash | 2 +- .../scripts/autoscend/paths/wereprofessor.ash | 4 +- 5 files changed, 21 insertions(+), 43 deletions(-) diff --git a/RELEASE/scripts/autoscend/auto_equipment.ash b/RELEASE/scripts/autoscend/auto_equipment.ash index b1a483639..dba8097e1 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])) diff --git a/RELEASE/scripts/autoscend/auto_util.ash b/RELEASE/scripts/autoscend/auto_util.ash index 22f361365..5329a5b6f 100644 --- a/RELEASE/scripts/autoscend/auto_util.ash +++ b/RELEASE/scripts/autoscend/auto_util.ash @@ -4128,7 +4128,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/combat/auto_combat_util.ash b/RELEASE/scripts/autoscend/combat/auto_combat_util.ash index 28bb68882..c557fc122 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]; diff --git a/RELEASE/scripts/autoscend/iotms/mr2023.ash b/RELEASE/scripts/autoscend/iotms/mr2023.ash index cfdd239df..0203cc7e1 100644 --- a/RELEASE/scripts/autoscend/iotms/mr2023.ash +++ b/RELEASE/scripts/autoscend/iotms/mr2023.ash @@ -458,7 +458,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/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)) { From 64de5344347d645d589e59c6a0234aa81bb4a356 Mon Sep 17 00:00:00 2001 From: nasurte <111531909+nasurte@users.noreply.github.com> Date: Thu, 17 Oct 2024 19:07:14 +0300 Subject: [PATCH 2/5] ZS fixes (#1508) * misc ZS stuff * missed a bracket * jesus christ * don't remove thrice-cursed in the middle of the quest, don't abort on crackpot mystic * restore MP? * no real reason not to cast infectious bite every time +try to handle the wall of meat --------- Co-authored-by: Chris Midgley --- RELEASE/scripts/autoscend/auto_util.ash | 13 ++++++------- .../scripts/autoscend/combat/auto_combat_quest.ash | 6 ++++++ .../autoscend/combat/auto_combat_zombie_slayer.ash | 7 ++++++- RELEASE/scripts/autoscend/paths/zombie_slayer.ash | 6 +++--- RELEASE/scripts/autoscend/quests/level_11.ash | 6 +++--- RELEASE/scripts/autoscend/quests/level_12.ash | 9 ++++++++- RELEASE/scripts/autoscend/quests/level_13.ash | 5 +++++ RELEASE/scripts/autoscend/quests/level_any.ash | 2 +- 8 files changed, 38 insertions(+), 16 deletions(-) diff --git a/RELEASE/scripts/autoscend/auto_util.ash b/RELEASE/scripts/autoscend/auto_util.ash index 5329a5b6f..683a7fc66 100644 --- a/RELEASE/scripts/autoscend/auto_util.ash +++ b/RELEASE/scripts/autoscend/auto_util.ash @@ -1449,10 +1449,6 @@ boolean isGeneralStoreAvailable() { return false; } - if(in_zombieSlayer()) - { - return false; - } if(is_werewolf()) { return false; @@ -2579,9 +2575,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"); 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_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/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_11.ash b/RELEASE/scripts/autoscend/quests/level_11.ash index 08a37c5c8..c09e1a0dc 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) { @@ -2315,7 +2315,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 ca70308c0..92572057b 100644 --- a/RELEASE/scripts/autoscend/quests/level_12.ash +++ b/RELEASE/scripts/autoscend/quests/level_12.ash @@ -1179,7 +1179,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..3d7872829 100644 --- a/RELEASE/scripts/autoscend/quests/level_13.ash +++ b/RELEASE/scripts/autoscend/quests/level_13.ash @@ -1460,6 +1460,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 bcbebb639..6fe93ccf7 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(); } From 53b9e91b01b7666342f920f06284ae6c618d0af3 Mon Sep 17 00:00:00 2001 From: HippoKingKoL <83581028+HippoKingKoL@users.noreply.github.com> Date: Thu, 17 Oct 2024 17:09:07 +0100 Subject: [PATCH 3/5] Ed modernisation, free run expansion and other small fixes (#1507) * add speakeasy free fight function * several Ed path changes. 1) liver prioritised over stomach now we don't need fortune cookies. Drunk helps pool 2) Use speakeasy free fights when ka farming 3) Only prioritise pool unlock while under level 11 * copy/paste over new features from regular combat to Ed combat. 1) Free runaways 2) Darts 3) Spikolodon 4) just change a few variable names in banishing, so it's identical to the main one. No functional change here * expand list of free-run monsters * Ed doesn't need a digital key, don't delay in 8-bit * use polar vortex/mild evil to take warehouse pages in Ed * turn on shadow brick/mild evil/polar vortex use for Ed * don't drop force as Ed if we've already been beaten up twice * add bowling ball as free run source * add function to check if we still need 8-bit realm points, make delay dependent on it --------- Co-authored-by: Chris Midgley --- BUILD/monsters/freerun.dat | 11 ++ RELEASE/data/autoscend_monsters.txt | 11 ++ RELEASE/scripts/autoscend/auto_util.ash | 7 + RELEASE/scripts/autoscend/auto_zone.ash | 8 +- .../scripts/autoscend/autoscend_header.ash | 2 + .../autoscend/combat/auto_combat_ed.ash | 133 +++++++++++++++--- .../autoscend/combat/auto_combat_util.ash | 23 +++ RELEASE/scripts/autoscend/iotms/mr2022.ash | 14 ++ .../paths/actually_ed_the_undying.ash | 23 ++- RELEASE/scripts/autoscend/quests/level_13.ash | 15 +- 10 files changed, 218 insertions(+), 29 deletions(-) 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/RELEASE/data/autoscend_monsters.txt b/RELEASE/data/autoscend_monsters.txt index a52cf59cc..be3c7f0ad 100644 --- a/RELEASE/data/autoscend_monsters.txt +++ b/RELEASE/data/autoscend_monsters.txt @@ -89,6 +89,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 diff --git a/RELEASE/scripts/autoscend/auto_util.ash b/RELEASE/scripts/autoscend/auto_util.ash index 683a7fc66..ddb3eb410 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()) diff --git a/RELEASE/scripts/autoscend/auto_zone.ash b/RELEASE/scripts/autoscend/auto_zone.ash index 058310df7..8e97e8ef8 100644 --- a/RELEASE/scripts/autoscend/auto_zone.ash +++ b/RELEASE/scripts/autoscend/auto_zone.ash @@ -906,25 +906,25 @@ generic_t zone_delay(location loc) } break; case $location[Vanya\'s Castle]: - if (possessEquipment($item[Continuum Transfunctioner]) && (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]) && 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]) && 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]) && 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 dcb6a2b97..2e65af303 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(); @@ -1198,6 +1199,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_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_util.ash b/RELEASE/scripts/autoscend/combat/auto_combat_util.ash index c557fc122..1240df5f9 100644 --- a/RELEASE/scripts/autoscend/combat/auto_combat_util.ash +++ b/RELEASE/scripts/autoscend/combat/auto_combat_util.ash @@ -988,6 +988,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/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/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/quests/level_13.ash b/RELEASE/scripts/autoscend/quests/level_13.ash index 3d7872829..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); From 95bdbf56ac9d6de86f1bf3ed5a4d3b70ef0db822 Mon Sep 17 00:00:00 2001 From: VuvuzelaVirtuoso <54866751+VuvuzelaVirtuoso@users.noreply.github.com> Date: Thu, 17 Oct 2024 09:10:52 -0700 Subject: [PATCH 4/5] Bedtime reminder for unused August Scepter casts (#1472) * Update auto_bedtime.ash Not sure what the thoughts are toward the bedtime "resources are still available!" messages in this file; most are for stuff from back in 2015. But in that context, I've been running non-Standard runs and seeing reminders for Deck and Chateau use, I was considering the daily resources that are available that might be worth reminding users are available for manual intervention. A lot of these resources, even though they seem a bit wasted are also a bit trickier and maybe-not-advisable to tell a user to make use of (Carto mapping, making decisions about a random monster to reminisce about/fax, forcing NCs, clover uses), but I feel like August Scepter casts are a pretty fair one to remind users of? * Update RELEASE/scripts/autoscend/auto_bedtime.ash Co-authored-by: Malibu Stacey <50261170+Malibu-Stacey@users.noreply.github.com> --------- Co-authored-by: Malibu Stacey <50261170+Malibu-Stacey@users.noreply.github.com> Co-authored-by: Chris Midgley --- RELEASE/scripts/autoscend/auto_bedtime.ash | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/RELEASE/scripts/autoscend/auto_bedtime.ash b/RELEASE/scripts/autoscend/auto_bedtime.ash index 59d37ab2e..80b72a62b 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"); From e48010217039c832b2b45000586b4f4e92908e5c Mon Sep 17 00:00:00 2001 From: Alium58 Date: Thu, 17 Oct 2024 11:37:35 -0500 Subject: [PATCH 5/5] More Bat Wings Support (#1511) * free fights * use new has function in lvl4 quest * leap bridge * restore skill * start on airship support * airship support * fix how to force not equipping wings * fix to leaping bridge * fix L9 * pickpocket support * free fights no longer swallow bat wings free fights * name fix * minor cleanup * only sniff goat if need cheese * bump mafia verison * function for bridge goal * more spots for bridgeGoal() * account for skills that cost mp and have a daily limit --------- Co-authored-by: Chris Midgley --- BUILD/monsters/sniff.dat | 2 +- BUILD/restoration/skill.dat | 1 + RELEASE/data/autoscend_monsters.txt | 2 +- RELEASE/data/autoscend_restoration.txt | 1 + RELEASE/scripts/autoscend.ash | 2 +- RELEASE/scripts/autoscend/auto_acquire.ash | 6 +-- RELEASE/scripts/autoscend/auto_choice_adv.ash | 4 ++ RELEASE/scripts/autoscend/auto_equipment.ash | 6 +++ RELEASE/scripts/autoscend/auto_pre_adv.ash | 6 +++ RELEASE/scripts/autoscend/auto_restore.ash | 19 +++++++++- RELEASE/scripts/autoscend/auto_zone.ash | 4 +- .../scripts/autoscend/autoscend_header.ash | 3 ++ .../combat/auto_combat_default_stage2.ash | 2 +- .../combat/auto_combat_default_stage3.ash | 11 +++++- .../autoscend/combat/auto_combat_util.ash | 3 +- RELEASE/scripts/autoscend/iotms/mr2014.ash | 6 +-- RELEASE/scripts/autoscend/iotms/mr2021.ash | 2 +- RELEASE/scripts/autoscend/iotms/mr2024.ash | 23 +++++++++++ .../autoscend/paths/license_to_adventure.ash | 2 +- .../autoscend/paths/low_key_summer.ash | 2 +- RELEASE/scripts/autoscend/paths/you_robot.ash | 2 +- RELEASE/scripts/autoscend/quests/level_04.ash | 2 +- RELEASE/scripts/autoscend/quests/level_09.ash | 38 ++++++++++++------- 23 files changed, 115 insertions(+), 34 deletions(-) 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 be3c7f0ad..24ccab7a8 100644 --- a/RELEASE/data/autoscend_monsters.txt +++ b/RELEASE/data/autoscend_monsters.txt @@ -142,7 +142,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 91da36d36..611758cfc 100644 --- a/RELEASE/scripts/autoscend.ash +++ b/RELEASE/scripts/autoscend.ash @@ -1,4 +1,4 @@ -since r28077; // feat: various iotm improvements +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_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 dba8097e1..2967c662c 100644 --- a/RELEASE/scripts/autoscend/auto_equipment.ash +++ b/RELEASE/scripts/autoscend/auto_equipment.ash @@ -811,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 c7b7a9d84..0e89bf18b 100644 --- a/RELEASE/scripts/autoscend/auto_pre_adv.ash +++ b/RELEASE/scripts/autoscend/auto_pre_adv.ash @@ -517,6 +517,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_zone.ash b/RELEASE/scripts/autoscend/auto_zone.ash index 8e97e8ef8..39de85888 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]); } diff --git a/RELEASE/scripts/autoscend/autoscend_header.ash b/RELEASE/scripts/autoscend/autoscend_header.ash index 2e65af303..45d1f627d 100644 --- a/RELEASE/scripts/autoscend/autoscend_header.ash +++ b/RELEASE/scripts/autoscend/autoscend_header.ash @@ -569,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 @@ -1081,6 +1083,7 @@ boolean L8_trapperQuest(); boolean LX_loggingHatchet(); boolean L9_leafletQuest(); void L9_chasmMaximizeForNoncombat(); +int bridgeGoal(); int fastenerCount(); int lumberCount(); boolean finishBuildingSmutOrcBridge(); diff --git a/RELEASE/scripts/autoscend/combat/auto_combat_default_stage2.ash b/RELEASE/scripts/autoscend/combat/auto_combat_default_stage2.ash index 0638c62d6..aa76ca068 100644 --- a/RELEASE/scripts/autoscend/combat/auto_combat_default_stage2.ash +++ b/RELEASE/scripts/autoscend/combat/auto_combat_default_stage2.ash @@ -284,7 +284,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 cc704d122..e2ec3d583 100644 --- a/RELEASE/scripts/autoscend/combat/auto_combat_default_stage3.ash +++ b/RELEASE/scripts/autoscend/combat/auto_combat_default_stage3.ash @@ -177,7 +177,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"); @@ -349,7 +356,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_util.ash b/RELEASE/scripts/autoscend/combat/auto_combat_util.ash index 1240df5f9..797409198 100644 --- a/RELEASE/scripts/autoscend/combat/auto_combat_util.ash +++ b/RELEASE/scripts/autoscend/combat/auto_combat_util.ash @@ -933,6 +933,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; @@ -956,7 +957,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")) 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/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/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/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/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 2e68d4bef..801b69dfe 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; }