bumcheekcend.ash - A zero setup semi-automated ascension script!

Something I noticed, the script changes your familiar to what I guess it's assuming is optimal. I've got a Hunchbacked Minion, but a few times it swapped that out for a Blood-Faced Volleyball, or a Leprechaun (both were around 14 pounds lighter as well). I see that it goes through a check for what familiars you have, but I guess Hunchbacked Minion was left out of this.

Just thought I'd point it out. I modified the script a bit myself, but I don't know much about this stuff.
 
Meat familiars can be set in the data file bcs_fam_meatboss.txt, you can add in the one you want to use there. When it comes to the Volleyball you have to edit the script yourself. Do a search for "volleyball" and you will find the one point where it is actually mentioned and can change that to whatever familiar you want it to use instead.
 
... my version of spamattack which is basically the standard combats from BCCascend taken into a consult script that generates a macro. ... and builds a macro of up to 6 skills if your a myst class

Isn't spellcasting a bit wasteful if your moxie and/or muscle (depending on equipped weapon and possession of Hero) are enough to weaponplink?
(unless you can do saucesynergy, but that's kind of iffy - checking that you have enough +spell damage (possibly with saucestorm), that the monster has enough HP to survive until after wave, ensuring that all spells will be the same element (with immaculate, that means elemental monster or saucestorm or elementform or proper cookbook or +hotSpellDamage != +coldSpellDamage) ...
But I digress.
If my defense_stat > monster attack && my attack_stat > monster defense, spamact("attack")?
(else try using spells if I have them even when not myst class?)
((this wanders a lot batmanwards ...))
 
Last edited:
Meat familiars can be set in the data file bcs_fam_meatboss.txt, you can add in the one you want to use there. When it comes to the Volleyball you have to edit the script yourself. Do a search for "volleyball" and you will find the one point where it is actually mentioned and can change that to whatever familiar you want it to use instead.

Yeah, I did that for the volleyball.
Could I not just edit the script myself, look for the lines where it does a familiar test and either comment out the lines I don't want or recode it? It's not that big of a deal to me, I just thought I'd point it out that, even though it checks for familiars that are best at meat/stats/items, when it did stats and meat, Hunchbacked Minion wasn't even in the code. I'm not sure if more Mr. Store familiars are excluded, but that's at least one.
Thanks for the advice though, I hope to start coding for this myself soon, though it'll probably be awhile before I can do anything near this comprehensive.
 
Isn't spellcasting a bit wasteful if your moxie and/or muscle (depending on equipped weapon and possession of Hero) are enough to weaponplink?
(unless you can do saucesynergy, but that's kind of iffy - checking that you have enough +spell damage (possibly with saucestorm), that the monster has enough HP to survive until after wave, ensuring that all spells will be the same element (with immaculate, that means elemental monster or saucestorm or elementform or proper cookbook or +hotSpellDamage != +coldSpellDamage) ...
But I digress.
If my defense_stat > monster attack && my attack_stat > monster defense, spamact("attack")?
(else try using spells if I have them even when not myst class?)
((this wanders a lot batmanwards ...))

It only uses spells for mystclasses, for everyone else it just attacks just like the original spamattack. It currently attacks if I can kill the monster in 10 rounds, and it cannot kill me in the same amount of rounds even if you're a myst class. No need to waste MP when you are backfarming.
 
Ack! Just curious, perming a pastamancer skill for the sake of future BCC runs...

Should I perm flavor of magic, for the +10 spell damage assuming that the script is going to start casting it, at the very least just setting it to a cold default for the entire run...

Or should i go ahead and just perm one of the higher level spells (Stuffed Mortar Shell even though Cannon with proper +spell damage should be enough for most monsters?)
 
The script does not currently tune you to a certain element, you have to do that yourself. But +10 spell damage is never bad thing I guess and going from higher to lower level of skill is probably a good idea :)
 
I'd definitely perm flavour first. Flavour will also give you +10 spell damage on Sauce spells. It won't tune them, but it helps with sauce synergy. It also lets you run shurikens a lot longer before switching to cannon, and I've rarely used stuffed mortar shell since I've permed flavour. ;)
 
If you're looking to script upcoming myst ascensions, then flavour is awesome. Version .23 will use it automatically. Though I'm not quite decided on the best way of implementing it. Else cast it manually in .22
 
The script has been running great for me. I think I'm up to ascension 8 that I've used the ascension script on most of or all of the ascension.

But I have a question: What skills help the script run better? I know combat modifiers are key for speeding up ascensions in general. So besides + and - combat modifiers, what other skills should I be looking for? Is there a baseline set of skills that make a huge difference in speed?

If this isn't the place for a question like this, let me know.
FYI http://bumcheekcity.com/kol/profile.php?u=IceColdFever
 
I have a question: What skills help the script run better? I know combat modifiers are key for speeding up ascensions in general. So besides + and - combat modifiers, what other skills should I be looking for? Is there a baseline set of skills that make a huge difference in speed?

Skills for speed and skills to make the script more convenient are not exactly the same thing. I've been perming skills specifically for the script lately though. There are a few core skills that the script uses regularly, and there are several passive ones that help a lot for various classes.

First thing first. With the new Valhalla revamp you have a choice of Astral gear. As far as the script is concerned my recommendations are:

  • Astral Shirt*
  • Astral Hot dogs

* Make sure you have torso awareness HC Permed!!

The Astral Shirt is the best fire and forget item you can take with you. It will help every class, and won't ever compete with other equipment during the run. The +stats make the run go faster and the +damage make the combats easier. The equipment changer in the script is likely to leave it alone as well.

Hot dogs are a huge stat boost early game, and a decent amount of fullness filler when your scraping around for food. If your scripting day 1, eat 1 right away. Manual day 1, try to hold off as long as you can. Otherwise save the rest for level 11 if you can. Alternatively, if you have the clip art tome you can eat a ur-donut turn 1, some pumpkin juice at level 2, ect for an early boost that will allow the script to progress easier.


Core skills the script uses regularly:
These are skills the script will attempt to cast or set to your mood during the run. The basic three +10 stat AT songs are really important in adventuring in the most recently available zone and help reduce a lot of the 'temple' leveling the script might attempt to do.

  • The Moxious Madrigal
  • The Magical Mojomuscular Melody
  • The Power Ballad of the Arrowsmith
  • Fat Leon's Phat Loot Lyric
  • The Sonata of Sneakiness
  • Carlweather's Cantata of Confrontation
  • Smooth Movement
  • Musk of the Moose

Skills that are really nice to have for turn gen / convenience:
Your basic Dinning and other self cast skills

  • The Ode to Booze
  • Advanced Cocktailcrafting
  • Superhuman Cocktailcrafting
  • Advanced Saucecrafting
  • Pastamastery
  • Lunch Break (Summon each day but do not open them until level 11)
  • Transcendent Olfaction
  • Tongue of the Walrus
  • Cannelloni Cocoon*
  • Mad Looting Skillz
  • Torso Awaregness

*Healing skill helps you save SOOOO much money in self heals, specialy for muscle/myst runs with the script. Had Thousands of more meat during the level 11/12 quest after getting it.


Skills that make the auto combat a LOT easier:
For Moxie runs, having the extra HP and more passive +damage helps make combats go a lot faster and reduce the chance for incidental damage or accidentally deaths (which aren't uncommon in early day moxie runs due to fumble or monster crit hits). Muscle of course requires Hero currently.

  • Hero of the Half-Shell
  • Tao of the Terrapin (Less damage overall)
  • Slimy Sinews (+20 hp)
  • Slimy Synapses (+10 MP)
  • Eye of the Stoat (less fumbles \ damage)
  • Slimy Shoulders (+20 init)
  • Overdeveloped Sense of Self Preservation (+20 init)
  • Wisdom of the Elder Tortoises
  • Claws of the Walrus \ Otter


Skills that make spell sling a LOT easier:
It isn't hard to afford the damage spells you need as a myst class in run. The more important thing you need is reliable spell damage. After that the initiative buff will help reduce damage/healing cost, and then noodles for use as a SS (and other classes). Perming Cannon/Wave and the other damage spells after that is a convenience in saving meat in run. Also of note is that the May 2011 IotM effectively gives you a +20 spell damage 1 hander on day 2.

  • Entangling Noodles
  • Flavour of Magic* (+10 spell damage, tune to element)
  • Intrinsic Spiciness (+x spell damage, where x is your level)
  • Springy Fusilli
  • Cannelloni Cannon
  • Wave of Sauce

*Flavor of Magic you can always tune to cold damage. You will never encounter a cold resistant monster in normal questing, and the level 6 and 12 quest are weak vs cold at a time when your worried about if you need to upgrade spells or not. For the spooky monster quest you can switch to Hot if you want, but cold won't hurt you.


Niche and Marginal skills that still help:
At this point, the only thing that can still help the script are passive skills that will make thing's easier. +Meat, +hp/mp% and so on. Afterwards you just pick the skill's you'd want when your doing parts of the script manually, or that you want for when your not using the script as well. There are a few skills that have some interesting uses of note however.

Clobber: I Picked this up to kill Fax'ed Arrowed Ghost on day 1 turn 1 as a Moxie class. All the classes level 0 skill's cost 0 MP for that class. But Clobber, and to an extent Toss are the ones that do a significant enough amount of damage and always hit.

Ambidextrous Funkslinging: Used mainly for your Shadow in the lair (the script doesn't red potion...) Also to use love songs/divines to defeat the Goblin King earlier then the script would. (His +stat items help you get into the bed room earlier, and reduces the script wanting to temple level)

Elemental Saucesphere/Astral Shell: The script wont cast it last time i checked, but I rather use this then mucking about for an Air freshener. Also works for cold resistance for lvl 8 quest

Unaccompanied Miner: The script has an option in the settings manager to only mine for ore when you have free turns of Unaccompanied Miner left. Can save you 5-10 turns.

Transcendent Olfaction: The script won't try to use this so it needs to be set up in your custom combat. The key monsters to set it up for are Bloopers, Dairy goats, Gaudy Pirates, hellions, and Zombie Waltzers.
 
Last edited:
Data point: I just completed a BCC Myst run in 6 days 1260 turns*

*With a healthy dose of manual adventuring, plus manual day 1.
** I forgot how annoying myst NS was... took several attempts, and only had 4 adventures left... ug
 
I have mostly sauce spells permed, so I changed wtfpwnageExpected to this (which still has some inaccuracies):
Code:
	float wtfpwnageExpected(skill s) {
		float bAbs = numeric_modifier("Spell Damage");
        float bIntr = 0;
        if(have_skill($skill[Intrinsic Spiciness]))
        {
            bIntr = min(10, my_level());
            bAbs -= bIntr;
        }
		float bPer = numeric_modifier("Spell Damage Percent")/100 + 1;
		//Should multiply the bonuses below by bonus spell damage. 
		float bCol = numeric_modifier("Cold Spell Damage")*isWeak($element[cold]);
		float bHot = numeric_modifier("Hot Spell Damage")*isWeak($element[hot]);
		float bSte = numeric_modifier("Stench Spell Damage")*isWeak($element[stench]);
		float bSle = numeric_modifier("Sleaze Spell Damage")*isWeak($element[sleaze]);
		float bSpo = numeric_modifier("Spooky Spell Damage")*isWeak($element[spooky]);
		float bElm = bCol+bHot+bSte+bSle+bSpo;
		float myst = my_buffedstat($stat[Mysticality]);
		print("BCC: These are the figures for "+to_string(s)+": Bonus: "+bAbs+"+"+bIntr+" and "+bPer+"%//"+bCol+"/"+bHot+"/"+bSte+"/"+bSle+"/"+bSPo+"/El: "+bElm+"/Myst: "+myst, "purple");
		
        boolean isPasta = (my_class() == $class[Pastamancer]);
		boolean isSauce = (my_class() == $class[Sauceror]);

		//Uses the above three functions to estimate the wtfpwnage from a given skill. 
        // Sauce Damage = ceil(Multiplier × ( (Base + floor(Myst Bonus)) × Crit + Cap[Generic Bonus + Elemental Bonus] ))
        // Pasta Damage = ceil(Multiplier × ( (Base + floor(Myst Bonus)) × Crit + Cap[Generic Bonus] + Elemental Bonus ))
		switch (s) {
			case $skill[Spaghetti Spear] :
            case $skill[Salsaball] :
				return (2.5*bPer + min(5, bAbs) + bElm)*isWeak();
			break;
			case $skill[Ravioli Shurikens] :
				return (5.5 + 0.07*myst + min(isPasta? 25 : 20, bAbs) + bElm)*bPer*isWeak();
			break;
			case $skill[Cannelloni Cannon] :
				return (12 + 0.15*myst + min(isPasta? 40 : 35, bAbs) + bElm)*bPer*isWeak();
			break;
			case $skill[Stuffed Mortar Shell] :
				return (40 + 0.35*myst + min(isPasta? 60 : 50, bAbs) + bElm)*bPer*isWeak();
			break;
			case $skill[Weapon of the Pastalord] :
				return (48 + 0.35*myst + bAbs + bElm)*bPer*isWeak();
			break;
			case $skill[Fearful Fettucini] :
				return (48 + 0.35*myst + bAbs + bElm)*bPer*isWeak($element[spooky]);
			break;
            case $skill[Stream of Sauce] :
                if(!isSauce && (bAbs + bElm + bIntr) > 10)
                    return -1; // splashback = bad
				return (3.5 + min(10, 0.10*myst) + min(10, bAbs + bElm + bIntr))*bPer*isWeak();
			break;
            case $skill[Saucestorm] :
                if(!isSauce && (bAbs + bElm + bIntr) > 15)
                    return -1; // splashback = bad
				return (16 + min(25, 0.20*myst) + min(15, bAbs + bElm + bIntr))*bPer*isWeak();
			break;
            case $skill[Wave of Sauce] :
                if(!isSauce && (bAbs + bElm + bIntr) > 25)
                    return -1; // splashback = bad
				return (22 + min(30, 0.30*myst) + min(25, bAbs + bElm + bIntr))*bPer*isWeak();
			break;
            case $skill[Saucegeyser] :
				return (40 + 0.35*myst + bAbs + bElm)*bPer*isWeak();
			break;
		}
		return -1;
	}
 
Mine have been modifiied to look like this (and extracted to a consult script):
PHP:
float wtfpwnageExpected(skill s, monster mob)
{
	//Define variables
	float bAbsS, bAbsP, bElm;
	spread bElemental;
	float myst = my_buffedstat($stat[Mysticality]);	
	float bPer = numeric_modifier("Spell Damage Percent")/100 + 1;
	int wtfpwn;
	
	bAbsS = numeric_modifier("Spell Damage");
	if(have_skill($skill[intrinsic spiciness]) && my_class() != $class[sauceror])
	{
		bAbsP = bAbsS - min(my_level(),10);
	}

	//Should multiply the bonuses below by bonus spell damage. 
	if(my_class() == $class[Pastamancer] && have_skill($skill[Flavour of Magic]))
	{
		foreach e in $elements[]
		{
			bElemental[e] = numeric_modifier(to_string(e) + " Spell Damage");
			if(bElemental[e] > 0)
				bElemental[e] = min(1,bElemental[e] * (1 - mres[e]));
			bElm = bElm + bElemental[e];
		}
		
	}
	else if(my_class() == $class[sauceror])
	{
		foreach e in $elements[cold, hot]
		{
			bElemental[e] = numeric_modifier(to_string(e) + " Spell Damage");
			if(bElemental[e] > 0)
				bElemental[e] = min(1,bElemental[e] * (1 - mres[e]));
			bElm = bElm + bElemental[e];
		}
	}

	if(my_class() == $class[Pastamancer])
		vprint("SpamAttack: These are the figures for "+to_string(s)+": Bonus: "+bAbsP+" and "+bPer+"%//"+bElemental[$element[cold]]+"/"+bElemental[$element[hot]]+"/"+bElemental[$element[stench]]+"/"+bElemental[$element[sleaze]]+"/"+bElemental[$element[spooky]]+"/El: "+bElm+"/Myst: "+myst, "purple",11);
	else
		vprint("SpamAttack: These are the figures for "+to_string(s)+": Bonus: "+bAbsS+" and "+bPer+"%//"+bElemental[$element[cold]]+"/"+bElemental[$element[hot]]+"/El: "+bElm+"/Myst: "+myst, "purple",11);
	
	//Uses the above three functions to estimate the wtfpwnage from a given skill. 
	switch (s)
	{
		//Pastamancer spells
		case $skill[Spaghetti Spear] :
			wtfpwn = max(1,(2 + min(5, bAbsP)) * bPer * isWeak(mob, s)); //2-3
			vprint("SpamAttack: I expect "+wtfpwn+" damage from "+to_string(s), "purple",11);
			return wtfpwn;
			break;
		case $skill[Ravioli Shurikens] :
			wtfpwn = max(1,(4.5 + min(0.07 * myst, 15) + min((my_class() == $class[Pastamancer] ? 25 : 20), bAbsP) + bElm) * bPer * isWeak(mob, s)); //3-8
			vprint("SpamAttack: I expect "+wtfpwn+" damage from "+to_string(s), "purple",11);
			return wtfpwn;
			break;
		case $skill[Cannelloni Cannon] :
			wtfpwn = max(1,(11 + min(0.15 * myst, 20) + min((my_class() == $class[Pastamancer] ? 40 : 35), bAbsP) + bElm) * bPer * isWeak(mob, s)); //8-16
			vprint("SpamAttack: I expect "+wtfpwn+" damage from "+to_string(s), "purple",11);
			return wtfpwn;
			break;
		case $skill[Stuffed Mortar Shell] :
			wtfpwn = max(1,(24 + min(0.25 * myst, 30) + min((my_class() == $class[Pastamancer] ? 60 : 50), bAbsP) + bElm) * bPer * isWeak(mob, s)); //16-40
			vprint("SpamAttack: I expect "+wtfpwn+" damage from "+to_string(s), "purple",11);
			return wtfpwn;
			break;
		case $skill[Weapon of the Pastalord] :
			wtfpwn = max(1,(45 + 0.35 * myst + bAbsP + bElm) * bPer * isWeak(mob, s)); //32-64
			vprint("SpamAttack: I expect "+wtfpwn+" damage from "+to_string(s), "purple",11);
			return wtfpwn;
			break;
		case $skill[Fearful Fettucini] :
			wtfpwn = max(1,(45 + 0.35 * myst + bAbsP + bElemental[$element[spooky]]) * bPer * isWeak($element[spooky],mob)); //32-64
			vprint("SpamAttack: I expect "+wtfpwn+" damage from "+to_string(s), "purple",11);
			return wtfpwn;
			break;
		//Sauceror spells
		case $skill[Salsaball] :
			wtfpwn = max(1,(2 + min(5, bAbsS)) * bPer * isWeak($element[hot], mob));
			vprint("SpamAttack: I expect "+wtfpwn+" damage from "+to_string(s), "purple",11);
			return wtfpwn;
			break;
		case $skill[Stream of Sauce] :
			//3-4 damage+10% of myst (capped at 100), cold or hot, splashback if bAbs+bElm > 10
			wtfpwn = max(1,(3 + min(0.10 * myst, 10) + min(bAbsS + bElm, 10)) * bPer * isWeak(mob, s));
			vprint("SpamAttack: I expect "+wtfpwn+" damage from "+to_string(s), "purple",11);
			return wtfpwn;
			break;
		case $skill[Saucestorm] :
			//14-18 damage+20% of myst (capped at 125), cold or hot, splashback if bAbs+bElm > 15
			wtfpwn = max(1,(15.5 + min(0.20 * myst, 25) + min(bAbsS + bElm, 15)) * bPer * isWeak(mob, s));
			vprint("SpamAttack: I expect "+wtfpwn+" damage from "+to_string(s), "purple",11);
			return wtfpwn;
			break;
		case $skill[Wave of Sauce] :
			//20-24 damage+30% of myst (capped at 100), cold or hot, splashback if bAbs+bElm > 25
			wtfpwn = max(1,(21.5 + min(0.30 * myst, 30) + min(bAbsS + bElm, 25)) * bPer * isWeak(mob, s));
			vprint("SpamAttack: I expect "+wtfpwn+" damage from "+to_string(s), "purple",11);
			return wtfpwn;
			break;
		case $skill[Saucegeyser] :
			//35-45 damage+35% of myst (uncapped), cold or hot
			wtfpwn = max(1,(39 + 0.35 * myst + bAbsS + bElm) * bPer * isWeak(mob, s));
			vprint("SpamAttack: I expect "+wtfpwn+" damage from "+to_string(s), "purple",11);
			return wtfpwn;
			break;
	}
	return -1;
}

This is slightly modified to use BatBrain's mres[element]-variable but should otherwise be usable just as it is.

Also, the allmyskills, have been modified to:
PHP:
skill [int] allMySkills()
{
	skill [int] allmyskills;
	
	foreach s in $skills[Spaghetti Spear, Ravioli Shurikens, Cannelloni Cannon, Stuffed Mortar Shell, Weapon of the Pastalord, Fearful Fettucini, Salsaball, Stream of Sauce, Saucestorm, Wave of Sauce, Saucegeyser]
	{
		if (have_skill(s))
		{
			allmyskills[count(allmyskills)] = s;
		}
	}
	sort allmyskills by -value.mp_cost();
	return allmyskills;
}
 
Or change the default familiar in the relay script.

There is at least one place in the script where, if you change the default familiar, it still chooses a bloody-faced volleyball. Probably because it wants to make sure we use a stat familiar at that point? Which is a bit odd, since the default familiar only ever seems to pop up in areas where I'd use a stat familiar in anyway, so I expect most everyone is already using a stat familiar as their default . . .
 
Just a quick note: v0.22 broke appropriate spanglerack use on a muscle run. I.e. it would take out the hatrack, but regularly equip different hats on it (chef hat, mesh cap, etc.) Going back to v0.21 has temporarily solved the issue, since I don't plan on doing any more myst runs for a while.

Thanks! :)
 
In bumAdv(), setFamiliar() should be called after buMax(), and the "-familiar" switch should be added to buMax() for the correct cases.
 
There is at least one place in the script where, if you change the default familiar, it still chooses a bloody-faced volleyball. Probably because it wants to make sure we use a stat familiar at that point? Which is a bit odd, since the default familiar only ever seems to pop up in areas where I'd use a stat familiar in anyway, so I expect most everyone is already using a stat familiar as their default . . .

I suppose I'll just ask the crazy question - what is that point?
 
Back
Top