From 4831c0624fabce204515a03ec1dd8db4b42d2862 Mon Sep 17 00:00:00 2001 From: Faron <171642577+FaronCD@users.noreply.github.com> Date: Sun, 4 Aug 2024 05:09:08 -0500 Subject: [PATCH] Adds an abandoned security shuttle space ruin (#25922) * Update cell.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update medbeam.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update crates.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update mob_spawn.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update undead.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update space_ruins.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update space_areas.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Add files via upload Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Add files via upload Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update medbeam.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update space_ruins.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update undead.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update mob_spawn.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update abandoned_sec_shuttle.dmm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update space_ruins.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update cell.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update code/modules/projectiles/guns/medbeam.dm Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com> Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update code/game/objects/structures/crates_lockers/crates.dm Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com> Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com> Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update crates.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update medbeam.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update medbeam.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update abandoned_sec_shuttle.dmm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update config.toml Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update effects.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update particles.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Add files via upload Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update medbeam.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update effects.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update space_ruins.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update space_ruins.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update code/modules/projectiles/guns/medbeam.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update code/modules/projectiles/guns/medbeam.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update code/modules/projectiles/guns/medbeam.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Update space_areas.dm Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Add files via upload Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Add files via upload Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> * Add files via upload Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> --------- Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com> Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> --- .../SpaceRuins/abandoned_sec_shuttle.dmm | 327 ++++++++++++++++++ code/datums/particles.dm | 18 + code/datums/ruins/space_ruins.dm | 7 + code/game/area/areas/ruins/space_areas.dm | 4 + code/game/objects/effects/effects.dm | 5 +- .../structures/crates_lockers/crates.dm | 21 ++ code/modules/awaymissions/mob_spawn.dm | 14 + .../simple_animal/hostile/retaliate/undead.dm | 37 ++ code/modules/power/cell.dm | 68 ++-- code/modules/projectiles/guns/medbeam.dm | 225 +++++++++++- config/example/config.toml | 1 + icons/effects/particles/generic_particles.dmi | Bin 782 -> 1493 bytes icons/mob/simple_human.dmi | Bin 122872 -> 126911 bytes 13 files changed, 686 insertions(+), 41 deletions(-) create mode 100644 _maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm new file mode 100644 index 00000000000..fbdf10f74a1 --- /dev/null +++ b/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm @@ -0,0 +1,327 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"c" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "109" + }, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) +"d" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/mob/living/simple_animal/hostile/retaliate/skeleton/warden{ + dir = 4 + }, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) +"e" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "burst_r" + }, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"f" = ( +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) +"g" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) +"h" = ( +/turf/simulated/wall/mineral/plastitanium, +/area/ruin/space/sec_shuttle) +"j" = ( +/obj/machinery/computer/nonfunctional{ + dir = 1 + }, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) +"m" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood, +/obj/effect/mob_spawn/human/corpse/skeleton/security_officer, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"n" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"o" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/turf/space, +/area/ruin/space/sec_shuttle) +"t" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/footprints, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"w" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) +"y" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"z" = ( +/turf/space, +/area/template_noop) +"B" = ( +/obj/machinery/recharge_station/upgraded, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) +"D" = ( +/obj/machinery/computer/nonfunctional, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) +"E" = ( +/obj/structure/closet/crate/secure/sec_shuttle_ruin{ + name = "emergency supplies crate" + }, +/obj/item/gun/medbeam/damaged, +/obj/item/gun/projectile/automatic/pistol/enforcer, +/obj/item/grenade/flashbang, +/obj/item/storage/firstaid/regular, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"F" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/footprints, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) +"G" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"H" = ( +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"J" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/footprints, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"N" = ( +/obj/effect/mob_spawn/human/corpse/skeleton/prisoner, +/turf/space, +/area/space/nearstation) +"Q" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/mob_spawn/human/corpse/skeleton/security_officer, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) +"R" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"S" = ( +/obj/machinery/computer/security{ + dir = 1; + network = list("SS13") + }, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) +"T" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "109" + }, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"U" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8 + }, +/turf/space, +/area/ruin/space/sec_shuttle) +"V" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"X" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/footprints, +/turf/simulated/floor/plating/airless, +/area/ruin/space/sec_shuttle) +"Y" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "burst_l" + }, +/turf/space, +/area/ruin/space/sec_shuttle) +"Z" = ( +/obj/structure/computerframe, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/sec_shuttle) + +(1,1,1) = {" +z +z +z +Y +U +V +V +e +"} +(2,1,1) = {" +z +z +z +h +o +g +a +h +"} +(3,1,1) = {" +z +z +z +h +D +d +j +h +"} +(4,1,1) = {" +z +z +z +h +Z +f +S +h +"} +(5,1,1) = {" +z +z +z +h +B +f +Q +h +"} +(6,1,1) = {" +z +z +z +c +H +H +w +h +"} +(7,1,1) = {" +z +z +z +c +G +J +F +h +"} +(8,1,1) = {" +N +z +z +t +X +J +R +h +"} +(9,1,1) = {" +z +z +z +y +m +n +E +h +"} +(10,1,1) = {" +z +z +z +h +h +H +h +h +"} +(11,1,1) = {" +z +z +z +z +h +T +h +z +"} diff --git a/code/datums/particles.dm b/code/datums/particles.dm index 01206630faa..2b2dca7e396 100644 --- a/code/datums/particles.dm +++ b/code/datums/particles.dm @@ -107,3 +107,21 @@ velocity = generator(GEN_CIRCLE, 30, 30) scale = 0.1 friction = 0.1 + +/particles/fire_particles + icon = 'icons/effects/particles/generic_particles.dmi' + icon_state = "bonfire" + width = 100 + height = 100 + count = 1000 + spawning = 8 + lifespan = 0.7 SECONDS + fade = 1 SECONDS + grow = -0.01 + velocity = list(0, 0) + position = generator("box", list(-16, -16), list(16, 16), NORMAL_RAND) + drift = generator("vector", list(0, -0.2), list(0, 0.2)) + gravity = list(0, 0.95) + scale = generator("vector", list(0.3, 0.3), list(1,1), NORMAL_RAND) + rotation = 30 + spin = generator("num", -20, 20) diff --git a/code/datums/ruins/space_ruins.dm b/code/datums/ruins/space_ruins.dm index 41d93e14769..03e494504d8 100644 --- a/code/datums/ruins/space_ruins.dm +++ b/code/datums/ruins/space_ruins.dm @@ -360,3 +360,10 @@ name = "Dorian Casino" description = "A swanky space casino." allow_duplicates = FALSE + +/datum/map_template/ruin/space/abandoned_security_shuttle + id = "abandoned_sec_shuttle" + suffix = "abandoned_sec_shuttle.dmm" + name = "Abandoned Security Shuttle" + description = "A security shuttle that has been floating in space." + allow_duplicates = FALSE diff --git a/code/game/area/areas/ruins/space_areas.dm b/code/game/area/areas/ruins/space_areas.dm index af8b7c6f9eb..24c22722040 100644 --- a/code/game/area/areas/ruins/space_areas.dm +++ b/code/game/area/areas/ruins/space_areas.dm @@ -244,3 +244,7 @@ /area/ruin/space/deepstorage name = "Derelict Facility" apc_starts_off = TRUE + +/area/ruin/space/sec_shuttle + name = "Abandoned Security Shuttle" + apc_starts_off = TRUE diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 60107130674..4a9e2500c02 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -181,6 +181,7 @@ if(parent) UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) QDEL_NULL(particles) + holding_parent = null parent.vis_contents -= src return ..() @@ -206,9 +207,9 @@ // Add new if(isitem(attached_to) && ismob(attached_to.loc)) //special case we want to also be emitting from the mob - var/mob/particle_mob = attached_to.loc + holding_parent = attached_to.loc last_attached_location_type = attached_to.loc - particle_mob.vis_contents += src + holding_parent.vis_contents += src // Readd to ourselves attached_to.vis_contents |= src diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index bf36273ab16..733cb21fbd6 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -678,3 +678,24 @@ log_admin(msg) #undef RECURSION_PANIC_AMOUNT + +/obj/structure/closet/crate/secure/sec_shuttle_ruin + name = "locked crate" + desc = "The side of the crate has a slot for a keycard to be swiped." + can_be_emaged = FALSE + +/obj/structure/closet/crate/secure/sec_shuttle_ruin/allowed(mob/user) + if(!user) + return + + var/obj/item/card/sec_shuttle_ruin/keycard = user.get_active_hand() + if(!istype(keycard)) + return + + to_chat(user, "You swipe [keycard] in [src]'s keycard slot.") + return TRUE + +/obj/item/card/sec_shuttle_ruin + name = "warden's card" + desc = "A card used by the warden to unlock their crate." + icon_state = "data" diff --git a/code/modules/awaymissions/mob_spawn.dm b/code/modules/awaymissions/mob_spawn.dm index ea51fed28d8..1741cdb69f1 100644 --- a/code/modules/awaymissions/mob_spawn.dm +++ b/code/modules/awaymissions/mob_spawn.dm @@ -379,6 +379,20 @@ flavour_text = "By unknown powers, your skeletal remains have been reanimated! Walk this mortal plain and terrorize all living adventurers who dare cross your path." assignedrole = "Skeleton" +/obj/effect/mob_spawn/human/corpse/skeleton/security_officer + outfit = /datum/outfit/job/officer + id_access = "Assistant" //no brig access for explorers + +/obj/effect/mob_spawn/human/corpse/skeleton/prisoner + uniform = /obj/item/clothing/under/color/orange/prison + shoes = /obj/item/clothing/shoes/orange + +/obj/effect/mob_spawn/human/corpse/skeleton/prisoner/equip(mob/living/carbon/human/prisoner) //put cuffs on the corpse + . = ..() + var/obj/item/restraints/handcuffs/cuffs = new(prisoner) + prisoner.handcuffed = cuffs + prisoner.update_handcuffed() + //////////Corpses, they can be used for "decoration" purpose.////////// //Default Abductor corpse. diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm index 063ac6b55ea..2807b0860ee 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm @@ -76,6 +76,43 @@ del_on_death = TRUE footstep_type = FOOTSTEP_MOB_SHOE +/mob/living/simple_animal/hostile/retaliate/skeleton/warden + name = "skeleton warden" + desc = "The remains of a warden." + icon = 'icons/mob/simple_human.dmi' + icon_state = "skeleton_warden" + icon_living = "skeleton_warden" + wander = FALSE + loot = list(/obj/effect/decal/cleanable/shreds, /mob/living/simple_animal/hostile/skeleton/angered_warden) + maxHealth = 300 + health = 300 + melee_damage_lower = 15 + melee_damage_upper = 15 + deathmessage = null + +/mob/living/simple_animal/hostile/retaliate/skeleton/warden/Process_Spacemove(movement_dir) + return TRUE + +/mob/living/simple_animal/hostile/skeleton/angered_warden + name = "angered skeleton warden" //round 2 + desc = "An angry skeleton." + icon = 'icons/mob/simple_human.dmi' + icon_state = "skeleton_warden_alt" + icon_living = "skeleton_warden_alt" + + attacktext = "claws" + attack_sound = 'sound/hallucinations/growl1.ogg' + + maxHealth = 200 + health = 200 + speed = -1 + melee_damage_lower = 30 + melee_damage_upper = 30 + loot = list(/obj/effect/decal/remains/human, /obj/item/clothing/head/warden, /obj/item/card/sec_shuttle_ruin) + +/mob/living/simple_animal/hostile/skeleton/angered_warden/Process_Spacemove(movement_dir) + return TRUE + /mob/living/simple_animal/hostile/retaliate/zombie name = "zombie" icon = 'icons/mob/human.dmi' diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index d8f6535a23b..ba949775de1 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -10,14 +10,23 @@ throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_SMALL - var/charge = 0 // note %age conveted to actual charge in New + ///How much charge the battery currently has + var/charge = 0 + ///How much charge the battery can hold var/maxcharge = 1000 + ///How much charge the battery should start with + var/starting_charge materials = list(MAT_METAL = 700, MAT_GLASS = 50) - var/rigged = FALSE // true if rigged to explode - var/chargerate = 100 //how much power is given every tick in a recharger - var/self_recharge = 0 //does it self recharge, over time, or not? + ///If the battery will explode + var/rigged = FALSE + ///How much charge is given every tick when recharging + var/chargerate = 100 + ///Whether it will recharge automatically + var/self_recharge = TRUE + ///Whether the description will include the maxcharge var/ratingdesc = TRUE - var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it. + ///Additional overlay to signify battery being organic + var/grown_battery = FALSE /obj/item/stock_parts/cell/get_cell() return src @@ -25,7 +34,7 @@ /obj/item/stock_parts/cell/New() ..() START_PROCESSING(SSobj, src) - charge = maxcharge + charge = !isnull(starting_charge) ? starting_charge : maxcharge if(ratingdesc) desc += " This one has a power rating of [DisplayPower(maxcharge)], and you should not swallow it." update_icon(UPDATE_OVERLAYS) @@ -164,9 +173,8 @@ return 0 // Cell variants -/obj/item/stock_parts/cell/empty/New() - ..() - charge = 0 +/obj/item/stock_parts/cell/empty + starting_charge = 0 /obj/item/stock_parts/cell/crap name = "\improper Nanotrasen brand rechargeable AA battery" @@ -175,10 +183,8 @@ materials = list(MAT_GLASS = 40) rating = 2 -/obj/item/stock_parts/cell/crap/empty/New() - ..() - charge = 0 - update_icon(UPDATE_OVERLAYS) +/obj/item/stock_parts/cell/crap/empty + starting_charge = 0 /obj/item/stock_parts/cell/upgraded name = "upgraded power cell" @@ -200,10 +206,8 @@ materials = list(MAT_GLASS = 40) rating = 2.5 -/obj/item/stock_parts/cell/secborg/empty/New() - ..() - charge = 0 - update_icon(UPDATE_OVERLAYS) +/obj/item/stock_parts/cell/secborg/empty + starting_charge = 0 /obj/item/stock_parts/cell/hos_gun name = "\improper X-01 multiphase energy gun power cell" @@ -242,10 +246,8 @@ maxcharge = 15000 chargerate = 2250 -/obj/item/stock_parts/cell/high/empty/New() - ..() - charge = 0 - update_icon(UPDATE_OVERLAYS) +/obj/item/stock_parts/cell/high/empty + starting_charge = 0 /obj/item/stock_parts/cell/super name = "super-capacity power cell" @@ -256,10 +258,8 @@ rating = 4 chargerate = 2000 -/obj/item/stock_parts/cell/super/empty/New() - ..() - charge = 0 - update_icon(UPDATE_OVERLAYS) +/obj/item/stock_parts/cell/super/empty + starting_charge = 0 /obj/item/stock_parts/cell/hyper name = "hyper-capacity power cell" @@ -270,10 +270,8 @@ rating = 5 chargerate = 3000 -/obj/item/stock_parts/cell/hyper/empty/New() - ..() - charge = 0 - update_icon(UPDATE_OVERLAYS) +/obj/item/stock_parts/cell/hyper/empty + starting_charge = 0 /obj/item/stock_parts/cell/bluespace name = "bluespace power cell" @@ -285,10 +283,8 @@ rating = 6 chargerate = 4000 -/obj/item/stock_parts/cell/bluespace/empty/New() - ..() - charge = 0 - update_icon(UPDATE_OVERLAYS) +/obj/item/stock_parts/cell/bluespace/empty + starting_charge = 0 /obj/item/stock_parts/cell/bluespace/charging name = "self-charging bluespace power cell" @@ -352,10 +348,8 @@ maxcharge = 500 rating = 3 -/obj/item/stock_parts/cell/emproof/empty/New() - ..() - charge = 0 - update_icon(UPDATE_OVERLAYS) +/obj/item/stock_parts/cell/emproof/empty + starting_charge = 0 /obj/item/stock_parts/cell/emproof/emp_act(severity) return diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index 945960fbb94..6c5836846ce 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -79,7 +79,7 @@ return if(current_target) - on_beam_tick(current_target) + on_beam_tick(source, current_target) /obj/item/gun/medbeam/proc/los_check(mob/user,mob/target) var/turf/user_turf = user.loc @@ -105,7 +105,7 @@ qdel(dummy) return TRUE -/obj/item/gun/medbeam/proc/on_beam_tick(mob/living/target) +/obj/item/gun/medbeam/proc/on_beam_tick(mob/living/user, mob/living/target) if(ishuman(target)) var/mob/living/carbon/human/H = target H.adjustBruteLoss(-4, robotic = TRUE) @@ -124,3 +124,224 @@ /obj/effect/ebeam/medical name = "medical beam" + +//Damaged beamgun loot, DO NOT let it break +#define SCREWDRIVER_OPEN 8 +#define REMOVE_OLD_PARTS 7 +#define WELD_SHELL 6 +#define INSTALL_LENS 5 +#define INSTALL_ELECTRONICS 4 +#define INSTALL_CELL 3 +#define MULTITOOL_ELECTRONICS 2 +#define SCREWDRIVER_CLOSED 1 + +/obj/item/gun/medbeam/damaged + name = "damaged beamgun" + desc = "Delivers volatile medical nanites in a focused beam. Don't cross the beams! It is damaged and will rapidly overheat." + ///How hot the beamgun is, if it hits max heat it will break + var/current_heat = 0 + ///How much heat the beamgun needs to break + var/max_heat = 50 + ///when current_heat / max_heat > damaging_heat_percent, it will burn the wielders hands + var/damaging_heat_percent = 0.6 + ///If the gun has overheated and broke down + var/broken = FALSE + ///If the gun is still too hot to repair + var/overheated = FALSE + var/obj/effect/abstract/particle_holder/fire_particles + +/obj/item/gun/medbeam/damaged/Destroy() + . = ..() + if(fire_particles) + QDEL_NULL(fire_particles) + +/obj/item/gun/medbeam/damaged/examine(mob/user) //The 8 Trials of Asclepius + . = ..() + if(!broken) + return + + . += "It is broken, and will not function without repairs." + switch(broken) + if(SCREWDRIVER_OPEN) + . += "The panel can be screwed open to access the internals." + if(REMOVE_OLD_PARTS) + . += "The old fried electronics and melted lens have to be pried out." + if(WELD_SHELL) + . += "The distorted shell needs to be welded back to form." + if(INSTALL_LENS) + . += "It needs a new glass lens." + if(INSTALL_ELECTRONICS) + . += "It needs new cabling for the electronics." + if(INSTALL_CELL) + . += "It needs a fully charged specialized battery to function." + if(MULTITOOL_ELECTRONICS) + . += "The electronics need to be tested and reactivated with a multitool." + if(SCREWDRIVER_CLOSED) + . += "The panel needs to be screwed shut before it is usable." + +/obj/item/gun/medbeam/damaged/process() + . = ..() + if(current_target) + return + + current_heat = max(current_heat - 1, 0) + +/obj/item/gun/medbeam/damaged/can_trigger_gun(mob/living/user) + if(broken) + to_chat(user, "[src] fails to start! It's broken!") + return FALSE + return ..() + +/obj/item/gun/medbeam/damaged/on_beam_tick(mob/living/user, mob/living/target) + . = ..() + if(current_heat >= max_heat) + user.visible_message("[src] pops as it shuts off!", "[src] pops and hisses as it shuts off. It is broken.") + broken = SCREWDRIVER_OPEN + user.adjust_fire_stacks(20) + user.IgniteMob() + LoseTarget() + update_fire_overlay(COLOR_ORANGE) + overheated = TRUE + return + + if(current_heat / max_heat > damaging_heat_percent) + to_chat(user, "[src] burns to hold!") + user.adjustFireLoss(0.1 * (current_heat / max_heat)) + + current_heat = min(current_heat + 1, max_heat) + +/obj/item/gun/medbeam/damaged/attackby(obj/item/attacking_item, mob/user, params) + . = ..() + + if(broken == INSTALL_CELL) + if(istype(attacking_item, /obj/item/stock_parts/cell/medbeam)) + var/obj/item/stock_parts/cell/medbeam/battery = attacking_item + if(battery.charge != battery.maxcharge) + to_chat(user, "[src] won't function without a fully charged [battery].") + return + to_chat(user, "You start replacing [src]'s battery.") + attempt_repair(user, attacking_item, MULTITOOL_ELECTRONICS) + return + + if(broken == INSTALL_ELECTRONICS) + if(istype(attacking_item, /obj/item/stack/cable_coil)) + to_chat(user, "You start replacing the fried electronics in [src].") + attempt_repair(user, attacking_item, INSTALL_CELL) + return + + if(broken == INSTALL_LENS) + if(istype(attacking_item, /obj/item/stack/sheet/glass)) + to_chat(user, "You start replacing the broken lens in [src].") + attempt_repair(user, attacking_item, INSTALL_ELECTRONICS) + return + +/obj/item/gun/medbeam/damaged/screwdriver_act(mob/user, obj/item/screwdriver) + if(broken == SCREWDRIVER_OPEN) + if(overheated) + to_chat(user, "[src] is still too hot for the screws to be safely removed from it.") + return + to_chat(user, "You start removing the screws from [src]'s shell.") + attempt_repair(user, screwdriver, REMOVE_OLD_PARTS) + return TRUE + + if(broken == SCREWDRIVER_CLOSED) + to_chat(user, "You start replacing the screws on [src]'s shell.") + attempt_repair(user, screwdriver, FALSE) + return TRUE + +/obj/item/gun/medbeam/damaged/crowbar_act(mob/living/user, obj/item/crowbar) + if(broken == REMOVE_OLD_PARTS) + to_chat(user, "You start prying out the old electronics and lens from [src].") + attempt_repair(user, crowbar, WELD_SHELL) + return TRUE + +/obj/item/gun/medbeam/damaged/welder_act(mob/living/user, obj/item/welder) + . = ..() + if(broken == WELD_SHELL) + if(!welder.tool_start_check(src, user, 1)) + to_chat(user, "[welder] isn't functioning.") + return + to_chat(user, "You start welding [src] back to form.") + attempt_repair(user, welder, INSTALL_LENS) + return TRUE + +/obj/item/gun/medbeam/damaged/multitool_act(mob/living/user, obj/item/multitool) + if(broken == MULTITOOL_ELECTRONICS) + if(user.electrocute_act(rand(1, 10), src)) + do_sparks(6, FALSE, user) + return TRUE + to_chat(user, "You start to activate the electronics in [src].") + attempt_repair(user, multitool, SCREWDRIVER_CLOSED) + return TRUE + +/obj/item/gun/medbeam/damaged/proc/update_fire_overlay(new_color) + if(!fire_particles) + fire_particles = new(src, /particles/fire_particles) + fire_particles.color = COLOR_RED + + animate(fire_particles, 20 SECONDS, color = COLOR_ORANGE) + animate(fire_particles, 10 SECONDS, color = COLOR_GRAY, delay = 20 SECONDS) + addtimer(VARSET_CALLBACK(src, overheated, FALSE), 30 SECONDS) + +/obj/item/gun/medbeam/damaged/proc/attempt_repair(mob/living/user, obj/item/tool_used, next_broken_state) + if(!do_after_once(user, 5 SECONDS, TRUE, src)) + to_chat(user, "You stop repairing [src].") + return + + if(!user.Adjacent(src)) + return + + if(!user.get_active_hand() == tool_used) + return + + switch(broken) + if(REMOVE_OLD_PARTS) + user.put_in_hands(new /obj/item/stock_parts/cell/medbeam) + + if(WELD_SHELL) + if(!tool_used.tool_use_check(user, 1)) + return + + if(INSTALL_LENS) + var/obj/item/stack/sheet/glass/lens = tool_used + if(!istype(lens)) + return + if(!lens.use(5)) + to_chat(user, "You need [5 - lens.get_amount()] more [lens] to repair [src]'s electronics.") + return + + if(INSTALL_ELECTRONICS) + var/obj/item/stack/cable_coil/cable = tool_used + if(!istype(cable)) + return + if(!cable.use(10)) + to_chat(user, "You need [10 - cable.get_amount()] more [cable] to repair [src]'s electronics.") + return + + if(INSTALL_CELL) + var/obj/item/stock_parts/cell/medbeam/battery = tool_used + if(!istype(battery)) + return + if(!user.get_active_hand() == battery) + to_chat(user, "You lost [src]'s battery.") + return + qdel(battery) + + if(SCREWDRIVER_CLOSED) + QDEL_NULL(fire_particles) + + broken = next_broken_state + +#undef SCREWDRIVER_OPEN +#undef REMOVE_OLD_PARTS +#undef WELD_SHELL +#undef INSTALL_LENS +#undef INSTALL_ELECTRONICS +#undef INSTALL_CELL +#undef MULTITOOL_ELECTRONICS +#undef SCREWDRIVER_CLOSED + +/obj/item/stock_parts/cell/medbeam + name = "beamgun cell" + desc = "A cell that fell out of a beamgun. It cannot be reused until fully charged. Only this brand of battery is compatible with medical beamguns." + starting_charge = 0 diff --git a/config/example/config.toml b/config/example/config.toml index 0ed2c1da0de..83d590b8759 100644 --- a/config/example/config.toml +++ b/config/example/config.toml @@ -682,6 +682,7 @@ active_space_ruins = [ "_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm", "_maps/map_files/RandomRuins/SpaceRuins/casino.dmm", "_maps/map_files/RandomRuins/SpaceRuins/rocky_motel.dmm", + "_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm", ### The following ruins are based from past pre-spawned Zlevel content ### "_maps/map_files/RandomRuins/SpaceRuins/abandonedtele.dmm", diff --git a/icons/effects/particles/generic_particles.dmi b/icons/effects/particles/generic_particles.dmi index e322afcebbe9e462578fef3cc8dd880626c1581c..0eda2ecc2d6c27ffe61d08d6518795dd8ffc9c84 100644 GIT binary patch literal 1493 zcmeAS@N?(olHy`uVBq!ia0vp^3xK$RgAGXbBqvD&sdH5!5hX6E#mPmP1tppJc?=8{ zb9yJ8=Q?D-bL{-<;3<`&g}YXZ2OeqO*K|bpc2}(N<EJ zc-iFIvIF81Uv+v3ZsM5AaaHVC%yh1sQ_7X~O4YvCAD=nv#oNNqKOc)fJ$&-0kAD0Y z1_qWxo-U3d6?5L+*_f@8D%1Y4+@wX@smFz1L?wF863^+U4&7cdq2a&l1CLxmmf6Y~ ziXK_r3T$uIZ0~BiX*+ebm=2TB4kbau2e|@ffdzY$=iDz6o@V-{@V)iE`+Ka?)dDT&#z6|a`qozpRcajefOMN9rLnV-mjP)_6jO2;SdO7 z;m~Ai5n*)dVo)^wT>pRG`^x_JJL1*rWH0whqR6^7bY`2)7Ji@BWmtB?P(?mr@x=*o z4F?kxr0>^#%iFGP&Axp3^1Qq}z3pq)>pcCZG|f-To{8>aT3*B`SlpH)#-9hIA#yL0be+wFVyyxHpG8PKpz=f=sCo@uLHZaO(C{{AGp|N3j*|8m8pI=dP6 zsqb0!@%VrJYae@#Uw>J$DQUKN^!m?2A`6bDXFs{=*z!jG$g5YYvbRQU^9a0B=&tW_ zM&kJ6%^W_4+)oYrm&#n9a{Ye#n*|KHg-+5jTkY;1J=$t*Wz}W-M)c}YdD-0}**VhB zcS+t5H(#=E!KWwv>;YXLvl5OM+~t{~WXGzWQL-)gSol#Nj|P2@pAR1|TlpyFL-q`= zqjP$L>Tb#&<$3XNSNgv#EP~RERZ_ftKmL5wln6S5;%j(RqXq`1@Fczsr&N^|2+Azb zVv;UTPIi`i`0$~ke-lF-<23Qw63cZn6sLUD)z#fOTOe_6?a!C&j?eE^v&qDBuj}&; zyYVLd^x?Pf-d+2}DIl~kyrHy*_kZfczkjdWJO2IQ;H@{?H*YTfnm?O$`}XaN z=S_b0n*Y|SyHuIqcgPki#oMeP5VEF^ zbW%zwRPs>$E!6YU0bhWq)*3S%TDx|w=katlXr{msQlcUc{_=0n-m4{YsFFS79u-lKr^J^dZ&-u=i@$v31TjM)g5jFSc+`Yu}@65k{`@V1*+^z|? z`loMid&2jG-K4()Nguz~z1#V_pKVfi!be>lofAr1e%#a4n{RYz`T9Mgd-&f=2mSxC zcLwX-$q&OGJ}i&lx&3}c{f^S|cdqjF#l^;(f8g(b z_g4{5e;-i)yZqhb^JRL^dwP2sJRYs**cYvV$s>OT;FKiV) oDu!&5cQTMgEfr7$U}ZgH!^RD#1ix`)1IuX!Pgg&ebxsLQ0K5LI3jhEB delta 769 zcmV+c1OEKg3yubm8Gi!+006tak|_WH09Q~fFDZ*Bkp zc$|&W%?^Sv3uFGs`SlR91kLBP}Pl}3+KV(7{gEmr6M=Ry$C9T7U%o}1zG1< zMOb(+wMJI<-G2>;?7+g(4rV2NvBEuiAbz+?EunbqqK5aky_wGcmd4f^{yn5Re$Ec) z&Z@!Ml0_P!Vo|MO&30|U59Q4ArXrc<$@D)z3$4CFG^d`%0004zNklOKW3Fm;~-$1EF<7x)Hd|lu`G4oJwbM(6DL&qqoZPP!1r9{#pT{uaj=&(70C0%IebLcCL;KjLI8bp2JTvzMR^{3^=~hh& z@ps1$tQ#Ci(7?)CT=+sxXxhfR>O1z3RJN>O;Cd@LplMs*rd#Y0DJvYvv?ef+S+B!B zgOT$@L_|bHL_{82mpXvxHp?#THa#ia&Qvm?>)(19xZRN*_GEtW3mT(=yCW{#zvIG# z4J)K?@#%QNJ4F5o(ud?k`r=#mLo6a9BD4Dd9iI=Qw0SP800000NkvXXu0mjfum5s! diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi index dd33948a4ca19a4f0b17ca9d9575b0f32fbc187a..16eb74972297f9c45f1cf33d7946564f1cd0fc39 100644 GIT binary patch delta 14582 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 delta 10497 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