dfhack/scripts/starvingdead.rb

93 lines
2.5 KiB
Ruby

# Make undead units weaken after one month, and vanish after six
=begin
starvingdead
============
Somewhere between a "mod" and a "fps booster", with a small impact on
vanilla gameplay. It mostly helps prevent undead cascades in the caverns,
where constant combat leads to hundreds of undead roaming the
caverns and destroying your FPS.
With this script running, all undead that have been on the map for
one month gradually decay, losing strength, speed, and toughness.
After six months, they collapse upon themselves, never to be reanimated.
Usage: ``starvingdead (start|stop)``
=end
class StarvingDead
def initialize
@threshold = 1
@die_threshold = 6
end
def process
return false unless @running
month_length = 67200
if (@undead_count >= 25)
month_length *= 25 / @undead_count
end
@undead_count = 0
df.world.units.active.each { |u|
if (u.enemy.undead and not u.flags1.dead)
@undead_count += 1
if (u.curse.time_on_site > month_length * @threshold)
u.body.physical_attrs.each { |att|
att.value = att.value - (att.value * 0.02)
}
end
if (u.curse.time_on_site > month_length * @die_threshold)
u.flags1.dead = true
u.curse.rem_tags2.FIT_FOR_ANIMATION = true
end
end
}
end
def start
@onupdate = df.onupdate_register('starvingdead', 1200, 1200) { process }
@running = true
@undead_count = 0
if ($script_args[1] and $script_args[1].gsub(/[^0-9\.]/,'').to_f > 0)
@threshold = $script_args[1].gsub(/[^0-9\.]/,'').to_f
end
if ($script_args[2] and $script_args[2].gsub(/[^0-9\.]/,'').to_f > 0)
@die_threshold = $script_args[2].gsub(/[^0-9\.]/,'').to_f
end
puts "Starving Dead starting...weakness starts at #{@threshold} months, true death at #{@die_threshold} months"
end
def stop
df.onupdate_unregister(@onupdate)
@running = false
end
def status
@running ? 'Running.' : 'Stopped.'
end
end
case $script_args[0]
when 'start'
if ($StarvingDead)
$StarvingDead.stop
end
$StarvingDead = StarvingDead.new
$StarvingDead.start
when 'end', 'stop'
$StarvingDead.stop
else
if $StarvingDead
puts $StarvingDead.status
else
puts 'Not loaded.'
end
end