EDIT: I didn't check to see if this works, but I'm pretty sure it does work fine.
mob/var/Charging = 0
mob/verb
Charge_Punch()
var/Damage = 5
src.Charging = 1
while(src)
if(!src.Charging || Damage >= 30) //user isn't charging || Damage is greater or equal to 30.
src.Charging = 0
for(var/atom/A in get_step(src, src.dir))
src.Deal_Damage(A, Damage)
break
Damage += rand(3, 6)
sleep(10) //Don't want it to raise too fast.
mob/proc
Deal_Damage(mob/Enemy, Damage)
Enemy.dir = get_dir(Enemy, src)
src.dir = get_dir(src, Enemy)
Enemy.Health = round(Enemy.Health - Damage)
src.Death(Enemy)
Death(mob/Enemy)
if(Enemy.Health <= 0)
if(Enemy.client)
world << text("[] has died to [].", src, Enemy)
// Enemy is a player
else
del(Enemy)
// Enemy is a NPC