diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 13d08dd5..69e4e65f 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1003,6 +1003,15 @@ contains = list(/obj/item/circuitboard/computer/sat_control) crate_name= "shield control board crate" +/datum/supply_pack/engine/energy_harvester + name = "Energy Harvesting Module" + desc = "A Device which upon connection to a node, will harvest the energy and send it to engineerless stations in return for credits, derived from a syndicate powersink model." + cost = 7500 + access = ACCESS_CE + contains = list(/obj/item/energy_harvester) + crate_name = "energy harvesting module crate" + crate_type = /obj/structure/closet/crate/secure/engineering + ////////////////////////////////////////////////////////////////////////////// //////////////////////// Engine Construction ///////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 6c051a0e..2a3170f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -106,5 +106,24 @@ obj_damage = 70 melee_damage_lower = 15 melee_damage_upper = 18 + var/held_icon = "carp" + +/mob/living/simple_animal/hostile/carp/cayenne/ComponentInitialize() + . = ..() + AddElement(/datum/element/wuv, "bloops happily!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "gnashes!", EMOTE_AUDIBLE) + AddElement(/datum/element/mob_holder, held_icon) + +/mob/living/simple_animal/hostile/carp/cayenne/lia + name = "Lia" + real_name = "Lia" + desc = "A failed experiment of Nanotrasen to create weaponised carp technology, now acquired by Kinaris. This less than intimidating carp now serves as the Head of Security's pet." + faction = list("neutral", "carp") + health = 200 + icon_dead = "magicarp_dead" + icon_gib = "magicarp_gib" + icon_living = "magicarp" + icon_state = "magicarp" + maxHealth = 200 + held_icon = "magicarp" #undef REGENERATION_DELAY diff --git a/tgstation.dme b/tgstation.dme index a3faaffe..47b06f80 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3214,4 +3214,5 @@ #include "modular_citadel\code\modules\vore\eating\voreitems.dm" #include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm" #include "modular_citadel\interface\skin.dmf" +#include "yogstation\code\modules\power\energyharvester.dm" // END_INCLUDE diff --git a/yogstation/code/modules/power/energyharvester.dm b/yogstation/code/modules/power/energyharvester.dm new file mode 100644 index 00000000..cffffa9b --- /dev/null +++ b/yogstation/code/modules/power/energyharvester.dm @@ -0,0 +1,88 @@ +/obj/item/energy_harvester + desc = "A Device which upon connection to a node, will harvest the energy and send it to engineerless stations in return for credits, derived from a syndicate powersink model." + name = "Energy Harvesting Module" + icon_state = "powersink0" + icon = 'icons/obj/device.dmi' + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + w_class= WEIGHT_CLASS_BULKY + flags_1 = CONDUCT_1 + throwforce = 1 + throw_speed = 1 + throw_range = 1 + materials = list(MAT_METAL=750) + var/drain_rate = 100000000 + var/power_drained = 0 + var/obj/structure/cable/attached + var/datum/looping_sound/generator/soundloop + var/active = 0 + var/lastprocessed = 0 + + +/obj/item/energy_harvester/attackby(obj/item/I, mob/user, params) + if(I.tool_behaviour == TOOL_SCREWDRIVER) + if(!anchored) + var/turf/T = loc + if(isturf(T) && !T.intact) + attached = locate() in T + if(!attached) + to_chat(user, "This device must be placed over an exposed, powered cable node!") + else + I.play_tool_sound(src) + START_PROCESSING(SSobj, src) + anchored = 1 + density = 1 + user.visible_message( \ + "[user] attaches \the [src] to the cable.", \ + "You attach \the [src] to the cable.", + "You hear some wires being connected to something.") + else + to_chat(user, "This device must be placed over an exposed, powered cable node!") + else + I.play_tool_sound(src) + STOP_PROCESSING(SSobj, src) + anchored = 0 + density = 0 + user.visible_message( \ + "[user] detaches \the [src] from the cable.", \ + "You detach \the [src] from the cable.", + "You hear some wires being disconnected from something.") + +/obj/item/energy_harvester/process() + if(!attached || !anchored) + return PROCESS_KILL + + var/datum/powernet/PN = attached.powernet + if(PN) + set_light(1,1,LIGHT_COLOR_ORANGE) + var/power_avaliable = PN.netexcess + if(power_avaliable <= 0) + soundloop.stop() + active = 0 + return + soundloop.start() + active = 1 + power_avaliable = min(power_avaliable, drain_rate) + attached.add_delayedload(power_avaliable) + lastprocessed = (power_avaliable * 0.00001) + SSshuttle.points += lastprocessed + +/obj/item/energy_harvester/Initialize() + . = ..() + new /obj/item/gps/internal/energy_harvester(src) + soundloop = new(list(src), FALSE) + +/obj/item/energy_harvester/Destroy() + QDEL_NULL(soundloop) + return ..() + +/obj/item/energy_harvester/examine(mob/user) + . = ..() + if(active) + . += "The [src]'s display states that it is processing approximately [lastprocessed*60] credits per minute." + else + . += "The [src]'s display is currently offline." + +/obj/item/gps/internal/energy_harvester + gpstag = "Energy Harvester"