Files
vgstation13/code/modules/power/treadmill.dm
kane-f c49d69431a New mime uplink spell: Invisible Un-wall (#29706)
* 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>
2021-06-24 10:11:27 -05:00

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)