ID:1283254
 
(See the best response by Stephen001.)
Code:
mob
players
var/tmp
firebolt_damage
witherbolt_damage
novabolt_damage
icesquirt_damage
icebolt_damage
lightningbolt_damage
flashbolt_damage
flame_damage
arcticwind_damage
flashboom_damage
shadowwind_damage
consecutivenova_damage
chainlightning_damage
dark_damage
list/spell_picked = list()

/**************************Add new spells spot*************************/
list/missile_spell_list = list(/obj/spells/firebolt, /obj/spells/witherbolt)
list/spell_effect_list = list(/obj/spells/fireboltburn, /obj/spells/withering)
list/mp_required = list (2, 2)
/****************************************************************************/


list/pick_damage = list ()
list/resistances = list ()
list/weaknesses = list ()

proc
cast(spell_number)

if (istype(usr, /mob/players))

usr.check_spell_damage()

var/mob/players/caster = usr
var/damage = caster.pick_damage[spell_number]

if(caster.MP < (caster.spell_picked[spell_number] * caster.mp_required[spell_number]))
caster << output("You do not have enough MP.", "GameInfo.GameInfo")

else

var/mob/mobs_found
var/mob/players/player
var/mob/enemies/enemy
var/list/foundmobs = new()

for (mobs_found in view(3, caster))

if (istype(mobs_found, /mob/players))

var/mob/players/select_player = mobs_found

if (!select_player.PVP)
continue

if (mobs_found == src)
continue

foundmobs.Add(mobs_found)

if (foundmobs.len < 1)
return

mobs_found = foundmobs[1]


if (caster.char_class == "Mage" && caster.level >= 80 && prob(9))
caster.HP -= 1 + (caster.spell_picked[spell_number] * 1)
else
caster.MP -= 1 + (caster.spell_picked[spell_number] * 2)


missile(caster.missile_spell_list[spell_number], caster, mobs_found)

sleep(get_dist(caster, mobs_found))

if(!mobs_found)
return

mobs_found.overlays += caster.spell_effect_list[spell_number]

spawn(5)

if(!mobs_found)
return

mobs_found.overlays -= caster.spell_effect_list[spell_number]

if(caster.char_class == "Wizard" && caster.level >= 40 && prob(1))
damage = round(damage * 2)
caster.HP -= round(damage / 100)

if(caster.HP < 1)
caster.HP = 1

/*if(istype(mobs_found, /mob/players) & caster.PVP == TRUE)
player = mobs_found

if(player.Fireres>0)
damage-=round(damage*(player.Fireres/100),1)*/


player.HP -= damage
damage_numbers(player, damage)
usr.Dead_Mob(player)

else if (istype(mobs_found, /mob/enemies))
enemy = mobs_found

damage = enemy_damage_change("weakness", spell_number, enemy)

damage -= enemy_damage_change("resist", spell_number, enemy)

var/finish_damage = round(damage)
enemy.HP -= finish_damage
damage_numbers(enemy, finish_damage)
usr.Dead_Mob(enemy)

return

enemy_stats(atom/A)

var/mob/players/caster
var/mob/enemies/enemy

if (!istype(usr, /mob/players)) return

if (!istype(A, /mob/enemies)) return

caster = usr
enemy = A

caster.resistances = list()
caster.weaknesses = list()
/*Add new resistances and weaknesses spot*/
caster.resistances.Add(enemy.fireres, enemy.darkres)
caster.weaknesses.Add(enemy.firewk, enemy.darkwk)
/*******************************************/

return

enemy_damage_change(type, spell_number, atom/A)

var/mob/players/caster
var/mob/enemies/enemy
var/change_damage = 0

if (!istype(usr, /mob/players)) return

if (!istype(A, /mob/enemies)) return

caster = usr
enemy = A
enemy_stats(enemy)

if(findtext(type, "weakness") && caster.weaknesses[spell_number] > 0)
change_damage = round(caster.pick_damage[spell_number] * (1 + (caster.weaknesses[spell_number] / 100)), 1)
if(findtext(type, "resist") && caster.resistances[spell_number] > 0)
change_damage = round(caster.pick_damage[spell_number] * (caster.resistances[spell_number] / 100), 1)
caster << output(change_damage, "GameInfo.GameInfo")
return change_damage

check_spell_damage()

if(istype(usr, /mob/players))
var/mob/players/determiner = usr
determiner.spell_picked = list()
determiner.pick_damage = list()

/*****************************************************************Add new spells spot***************************************************************************/
determiner.firebolt_damage = round(((rand(2 + (determiner.fireboltlevel * 2), 4 + (determiner.fireboltlevel * 3))) * ((determiner.Intelligence / 100) + 1)), 1)
determiner.witherbolt_damage = round(((rand(2 + (determiner.witherboltlevel * 1),4 + (determiner.witherboltlevel * 2))) * ((determiner.Strength / 100) + 1)), 1)

determiner.spell_picked.Add(determiner.fireboltlevel, determiner.witherboltlevel)
determiner.pick_damage.Add(determiner.firebolt_damage, determiner.witherbolt_damage)
/**************************************************************************************/

return


Problem description:
resistances or weaknesses causing negative numbers
Can you explain the issue you have in some more detail, please? What exactly has gone negative (when presumably you don't want it to)?
enemy_damage_change area is making the damage a negative number. I do not understand why.

damage = enemy_damage_change("weakness", spell_number, enemy)

damage -= enemy_damage_change("resist", spell_number, enemy)


when those are called I get negative.
Best response
Well, presumably because change_damage can be allowed to exceed the total amount of damage already? Should you not be restricting it?

damage -= min(damage, enemy_damage_change("resist", spell_number, enemy))


That is what I was looking for, thanks a bunch Stephen001.

never noticed the proc min before.