numeric_modifier()

me259259

Member
Hello! I'm currently writting some logic for when my pastamancer fights. I think I'm close to where I want to be, but I'm running into a little problem when I use numeric_modifier.

Here's what I have (for calculating damage from Ravioli Shurikens)

PHP:
int ravioliDamage()
	{
	untypedSpellDamageBonus = numeric_modifier("Spell Damage") ;
		if (my_buffedstat($stat[mysticality]) < 215 )
			ravioliShurikensDamage = (my_buffedstat($stat[mysticality])*.07)+3 ;
		else if (my_buffedstat($stat[mysticality]) >= 215 )
			ravioliShurikensDamage = 18 ;
		if (untypedSpellDamageBonus > 25 && my_class() == $class[pastamancer])
			ravioliShurikensDamage += 25 ;
		else if (untypedSpellDamageBonus > 20)
			ravioliShurikensDamage += 20 ;
		else 
			ravioliShurikensDamage += untypedSpellDamageBonus ;
//problem starts here
		print ("before cookbook = " + ravioliShurikensDamage) ;
		if (have_equipped($item[Codex of Capsaicin Conjuration]) == True || have_effect($effect[hotform]) > 0 || have_effect($effect[Spirit of Cayenne]) > 0 )
			{
			ravioliShurikensDamage += numeric_modifier("Hot Spell Damage");
			if (monster_element() == $element[spooky] || monster_element() == $element[cold])
				ravioliShurikensDamage += ravioliShurikensDamage ;
			}
		else if (have_equipped($item[Necrotelicomnicon]) == True || have_effect($effect[Spookyform]) > 0 || have_effect($effect[Spirit of Wormwood]) > 0 )
			{
			ravioliShurikensDamage += numeric_modifier( "Spooky Spell Damage" );
			if (monster_element() == $element[cold] || monster_element() == $element[sleaze])
				ravioliShurikensDamage += ravioliShurikensDamage ;
			}
//note: next line should have the item "Gazpacho's Glacial Grimoire", the apostrophe was removed for legibility
		else if (have_equipped($item[Gazpachos Glacial Grimoire]) == True || have_effect($effect[coldform]) > 0 || have_effect($effect[Spirit of Peppermint]) > 0 )
			{
			ravioliShurikensDamage += numeric_modifier( "Cold Spell Damage" );
			if (monster_element() == $element[sleaze] || monster_element() == $element[stench])
				ravioliShurikensDamage += ravioliShurikensDamage ;
			}
		else if (have_equipped($item[Sinful Desires]) == True || have_effect($effect[sleazeform]) > 0 || have_effect($effect[Spirit of Bacon Grease]) > 0 )
			{
			ravioliShurikensDamage += numeric_modifier( "Sleaze Spell Damage" );
			if (monster_element() == $element[stench] || monster_element() == $element[hot])
				ravioliShurikensDamage += ravioliShurikensDamage ;
			}
		else if (have_equipped($item[Cookbook of the Damned]) == True || have_effect($effect[stenchform]) > 0 || have_effect($effect[Spirit of Garlic]) > 0 )
			{
			ravioliShurikensDamage += numeric_modifier( "Stench Spell Damage" );
			if (monster_element() == $element[hot] || monster_element() == $element[spooky])
				ravioliShurikensDamage += ravioliShurikensDamage ;
			}
		print ("after cookbook = " + ravioliShurikensDamage) ; 
//problem (hopefully) ends here
		ravioliShurikensDamage += ravioliShurikensDamage*(numeric_modifier( "Spell Damage Percent" )*.01) ;
		print ("total ravioli = " + ravioliShurikensDamage) ;
		return ravioliShurikensDamage;
	}

The problem that I have is when I use numeric_modifier to calculate (element) spell damage. It works fine with type-less bonus spell damage, and when calculating bonus spell damage %. After looking it up on the wiki, and looking up the old forum post that explained numeric_modifier when it was first introduced... I am thoroughly stumped. I thought those were the keywords for bonus elemental spell damage, but it keeps returning +0 damage. Since I have an elemental cookbook equipped, it should return at least +10 damage...

Anyone know what I'm doing wrong?
 

slyz

Developer
Since I have an elemental cookbook equipped, it should return at least +10 damage...
For the Codex of Capsaicin Conjuration, from the KoL Wiki:
Code:
Enchantment:
[COLOR="#0000ff"]Spell Damage +10
All Spells Cast Are Hot[/COLOR]
It doesn't say +10 Hot Spell Damage.

EDIT: apparently Mafia doesn't track "All Spells Cast Are <element>", so you need to check if an elemental cookbook is equipped.
 
Last edited:

slyz

Developer
I think you misunderstood how elemental spell damage enters the calculation.

Here is an example that uses the same names for all the terms of the KoLwiki formula:
PHP:
element PastaSpellElement()
{
	// elemental form has priority
	foreach e in $elements[]
		if ( have_effect( to_effect( e + "form" ) ) > 0 ) return e;

	// then cookbook
	if ( have_equipped( $item[ Codex of Capsaicin Conjuration] ) )
		return $element[ hot ];
	if ( have_equipped( $item[ Necrotelicomnicon ] ) )
		return $element[ spooky ];
	if ( have_equipped( $item[ Gazpachos Glacial Grimoire ] ) )
		return $element[ cold ];
	if ( have_equipped( $item[ Sinful Desires ] ) )
		return $element[ sleaze ];
	if ( have_equipped( $item[ Cookbook of the Damned ] ) )
		return $element[ stench ];

	// then flavor
	if ( have_effect( $effect[ Spirit of Cayenne ] ) > 0 )
		return $element[ hot ];
	if ( have_effect( $effect[ Spirit of Wormwood ] ) > 0 )
		return $element[ spooky ];
	if ( have_effect( $effect[ Spirit of Peppermint ] ) > 0 )
		return $element[ cold ];
	if ( have_effect( $effect[ Spirit of Bacon Grease ] ) > 0 )
		return $element[ sleaze ];
	if ( have_effect( $effect[ Spirit of Garlic ] ) > 0 )
		return $element[ stench ];

	return $element[ none ];
}

boolean is_weak( monster m, element e )
{
	switch( monster_element( m ) )
	{
		case $element[ hot ]: return ( e == $element[ stench ] || e == $element[ sleaze ] );
		case $element[ spooky ]: return ( e == $element[ hot ] || e == $element[ stench ] );
		case $element[ cold ]: return ( e == $element[ spooky ] || e == $element[ hot ] );
		case $element[ sleaze ]: return ( e == $element[ cold ] || e == $element[ spooky ] );
		case $element[ stench ]: return ( e == $element[ sleaze ] || e == $element[ cold ] );
	}
	return false;
}

int ravioliDamage( monster m )
{
	float Base = 3.0;
	float MystBonus = min( 15, my_buffedstat( $stat[ mysticality] ) * 0.07 );
	float Multiplier = 1.0 + numeric_modifier( "Spell Damage Percent" ) / 100.0 ;
	float Cap = 20.0 + 5.0 * to_float( my_class() == $class[ pastamancer ] );
	float GenericBonus =  numeric_modifier( "Spell Damage" ) - ( have_skill( $skill[ intrinsic spiciness ] ) ? min( my_level(), 10 ) : 0 ); 
	float CapGenericBonus = min( GenericBonus, Cap ); 
	float ElementalBonus;
	foreach e in $elements[]
	{
		ElementalBonus += numeric_modifier( e + " Spell Damage" );
	}
	// KoLwiki formula:
	int Damage = ceil( Multiplier * ( ( Base + floor( MystBonus ) ) + CapGenericBonus + ElementalBonus ) );
	// account for monster element:
	if ( PastaSpellElement() != $element[ none ] && PastaSpellElement() == monster_element( m ) ) return 1;
	if ( m.is_weak( PastaSpellElement() ) ) Damage = 2 * Damage;

	return Damage;
}
 
Last edited:

StDoodle

Minion
Slzy, keep in mind that in terms of sauce-alignment and bonus elemental spell damage, phial-forms are ignored. They only act at the very end.
 

slyz

Developer
Isn't that what my code does? It calculates damage, without taking into account spell element tuning, then checks if the spell is tuned to the monster's element at the end.

If that's not how it works, I would be glad to learn: I only recently permed a sauce synergy suit, and started working (lazily) on flavour + cannon, but I haven't really used those spells except in my latest sauceror runs.
 

StDoodle

Minion
It's been such a long week, I can't wrap my head around it, honestly. For my original post, I failed to notice the "hidden" code that required scrolling, so that may account for it.
 

slyz

Developer
Code:
> ashq boolean a = true; if ( a == True ) print("OK");

OK

me259259: since have_equipped() returns a boolean, "if ( have_equipped() )" is enough
 

Winterbay

Active member
Also remember that numeric_modifier("spell damage") returns the value including Intrinsic Spiciness even if you are not casting sauceror spells meaning that you need to do:
PHP:
float GenericBonus = numeric_modifier( "Spell Damage" ) - (have_skill($skill[intrinsic spiciness]) ? min(my_level(),10) : 0);
(at least when casting pastaspells)
 
Top