mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-09 16:14:13 +00:00
* Basis of spell * Spellbook and uplink entry * Only mimes can read it * Spell rework * Indent fix * Table hotfix * Checks to prevent players breaking some maps and whatnot * Reimplementation as requested * Movables... * Further reimplementation * Typo * Duration handle fix * Documenting spell * Duration has to be defined itself * Description fix * Allowing turfs to be targeted * Trying this to include turfs * Annoying workaround but it'll do * Removing from bundle * New recoil * Fix * Fix * Works better in uncross * Here too * Oh wow * Performance tweak * This is redundant * Requested fixes Co-authored-by: kanef <kanef9x@protonmail.com>
142 lines
4.6 KiB
Plaintext
142 lines
4.6 KiB
Plaintext
//The ultimate in green energy, a treadmill generates very low power each time it is bumped, which also updates its icon
|
|
//to move. You can still optimize this, though, by making yourself a workout machine -- be full, have sugar,
|
|
//have sports drink, have a high movespeed, have HULK as a mutation.
|
|
//Doesn't consume any idle power, you must to_bump() it from its own square. Bump works like a window.
|
|
//Using a treadmill uses up hunger faster
|
|
|
|
#define DEFAULT_BUMP_ENERGY 400
|
|
|
|
/obj/machinery/power/treadmill
|
|
name = "treadmill generator"
|
|
desc = "A low-power device that generates power based on how quickly someone walks."
|
|
icon_state = "treadmill"
|
|
density = 1
|
|
flow_flags = ON_BORDER
|
|
machine_flags = SCREWTOGGLE | WRENCHMOVE | EMAGGABLE
|
|
anchored = 1
|
|
use_power = 0
|
|
idle_power_usage = 0
|
|
var/count_power = 0 //How much power have we produced SO FAR this count?
|
|
var/tick_power = 0 //How much power did we produce last count?
|
|
var/power_efficiency = 1 //Based on parts
|
|
component_parts = newlist(
|
|
/obj/item/weapon/circuitboard/treadmill,
|
|
/obj/item/weapon/stock_parts/capacitor,
|
|
/obj/item/weapon/stock_parts/capacitor,
|
|
/obj/item/weapon/stock_parts/capacitor,
|
|
/obj/item/weapon/stock_parts/capacitor,
|
|
/obj/item/weapon/stock_parts/console_screen
|
|
)
|
|
|
|
/obj/machinery/power/treadmill/New()
|
|
if(anchored)
|
|
connect_to_network()
|
|
RefreshParts()
|
|
..()
|
|
|
|
/obj/machinery/power/treadmill/RefreshParts()
|
|
var/calc = 0
|
|
for(var/obj/item/weapon/stock_parts/SP in component_parts)
|
|
if(istype(SP, /obj/item/weapon/stock_parts/capacitor))
|
|
calc+=SP.rating
|
|
power_efficiency = calc/4 //Possible results 1, 2, and 3 -- basically, what tier we have
|
|
|
|
/obj/machinery/power/treadmill/examine(mob/user as mob)
|
|
..()
|
|
to_chat(user, "<span class='info'>During the last cycle, it produced [tick_power] watts.</span>")
|
|
|
|
/obj/machinery/power/treadmill/process()
|
|
tick_power = count_power
|
|
count_power = 0
|
|
add_avail(tick_power)
|
|
|
|
/obj/machinery/power/treadmill/proc/powerwalk(atom/movable/AM as mob)
|
|
if(!ismob(AM))
|
|
return //Can't walk on a treadmill if you aren't animated
|
|
if(get_turf(AM) != loc)
|
|
return //Can't bump from the outside
|
|
var/mob/living/runner = AM
|
|
var/cached_temp = runner.bodytemperature
|
|
if(runner.burn_calories(HUNGER_FACTOR*2))
|
|
flick("treadmill-running", src)
|
|
playsound(src, 'sound/machines/click.ogg', 50, 1)
|
|
var/calc = DEFAULT_BUMP_ENERGY * power_efficiency * runner.treadmill_speed
|
|
if(runner.reagents) //Sanity
|
|
calc *= runner.reagents.get_sportiness()
|
|
if(M_HULK in runner.mutations)
|
|
calc *= 5
|
|
count_power += calc
|
|
if(emagged && ishuman(runner))
|
|
runner.bodytemperature += 1
|
|
if(runner.bodytemperature > T0C + 100)
|
|
switch(rand(1,100))
|
|
if(1 to 5)
|
|
runner.emote("collapse")
|
|
if(5 to 10)
|
|
to_chat(runner,"<span class='warning'>You really should take a rest!</span>")
|
|
if(10 to 20)
|
|
to_chat(runner,"<span class='warning'>Your legs really hurt!</span>")
|
|
runner.apply_damage(5, BRUTE, LIMB_LEFT_LEG)
|
|
runner.apply_damage(5, BRUTE, LIMB_RIGHT_LEG)
|
|
runner.bodytemperature = max(T0C + 100,cached_temp)
|
|
else
|
|
to_chat(runner,"<span class='warning'>You're exhausted! You can't run anymore!</span>")
|
|
|
|
/obj/machinery/power/treadmill/Uncross(var/atom/movable/mover, var/turf/target)
|
|
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
|
|
return 1
|
|
if(istype(mover) && mover.checkpass(PASSGLASS))
|
|
return 1
|
|
if((flow_flags & ON_BORDER) && (mover.dir == dir))
|
|
powerwalk(mover)
|
|
return !density
|
|
return 1
|
|
|
|
/obj/machinery/power/treadmill/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0)
|
|
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
|
|
return 1
|
|
if(istype(mover) && mover.checkpass(PASSGLASS))
|
|
return 1
|
|
if(get_dir(loc, target) == dir || get_dir(loc, mover) == dir)
|
|
if(air_group)
|
|
return 1
|
|
return 0
|
|
else
|
|
return 1
|
|
|
|
/obj/machinery/power/treadmill/wrenchAnchor(var/mob/user, var/obj/item/I)
|
|
. = ..()
|
|
if(!.)
|
|
return
|
|
if(anchored)
|
|
connect_to_network()
|
|
else
|
|
disconnect_from_network()
|
|
|
|
/obj/machinery/power/treadmill/emag()
|
|
..()
|
|
emagged = 1
|
|
name = "\improper DREADMILL"
|
|
desc = "FEEL THE BURN"
|
|
|
|
/obj/machinery/power/treadmill/verb/rotate_clock()
|
|
set category = "Object"
|
|
set name = "Rotate Treadmill (Clockwise)"
|
|
set src in view(1)
|
|
|
|
if (usr.isUnconscious() || usr.restrained() || anchored)
|
|
return
|
|
|
|
src.dir = turn(src.dir, -90)
|
|
|
|
/obj/machinery/power/treadmill/verb/rotate_anticlock()
|
|
set category = "Object"
|
|
set name = "Rotate Treadmill (Counterclockwise)"
|
|
set src in view(1)
|
|
|
|
if (usr.isUnconscious() || usr.restrained() || anchored)
|
|
to_chat(usr, "It is fastened to the floor!")
|
|
return
|
|
|
|
src.dir = turn(src.dir, 90)
|