diff --git a/_maps/doppler/automapper/templates/deltastation/deltastation_shipbreaking.dmm b/_maps/doppler/automapper/templates/deltastation/deltastation_shipbreaking.dmm index 941259cf8d951d..be5675c34ae960 100644 --- a/_maps/doppler/automapper/templates/deltastation/deltastation_shipbreaking.dmm +++ b/_maps/doppler/automapper/templates/deltastation/deltastation_shipbreaking.dmm @@ -117,6 +117,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/side, /area/station/salvage_bay) +"jS" = ( +/obj/effect/wind/shipbreaking_collector{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) "kd" = ( /obj/structure/girder/reinforced, /obj/structure/shuttle_decoration/wall_plate/armor, @@ -209,6 +215,13 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"rV" = ( +/obj/effect/wind/shipbreaking_collector/scrap{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "sw" = ( /obj/structure/lattice, /obj/structure/marker_beacon/yellow, @@ -491,6 +504,13 @@ /obj/structure/railing/eva_handhold/directional/west, /turf/open/space/basic, /area/space/nearstation) +"MY" = ( +/obj/effect/wind/shipbreaking_collector{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "MZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -555,6 +575,18 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/north, /obj/machinery/light/dim/directional/north, +/obj/structure/shelf, +/obj/item/storage/bag/construction{ + pixel_y = -4; + pixel_x = -4 + }, +/obj/item/storage/bag/construction{ + pixel_x = 2 + }, +/obj/item/storage/bag/construction{ + pixel_x = -1; + pixel_y = 7 + }, /turf/open/floor/plating, /area/station/salvage_bay) "PN" = ( @@ -635,6 +667,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, /area/station/salvage_bay) +"UW" = ( +/obj/effect/wind/shipbreaking_collector/scrap{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) "Vd" = ( /obj/machinery/conveyor{ dir = 1; @@ -981,10 +1019,10 @@ Pb Vd iA ul -yB -yB -Ir -wA +jS +jS +MY +jS wA wA wA @@ -1024,10 +1062,10 @@ oW GU LO iA -Ir -Ir -Ir -wA +jS +jS +MY +jS wA wA wA @@ -1067,10 +1105,10 @@ Er GU YA nZ -yB -yB -Ir -wA +jS +jS +MY +jS wA wA wA @@ -1153,10 +1191,10 @@ GU vX OC ul -yB -yB -Ir -wA +UW +UW +rV +UW wA wA wA @@ -1196,10 +1234,10 @@ GU tR OC iA -Ir -Ir -Ir -wA +UW +UW +rV +UW wA wA wA @@ -1239,10 +1277,10 @@ Vd iA OC nZ -yB -yB -Ir -wA +UW +UW +rV +UW wA wA wA diff --git a/_maps/doppler/automapper/templates/metastation/metastation_shipbreaking.dmm b/_maps/doppler/automapper/templates/metastation/metastation_shipbreaking.dmm index 964f07c98d30c2..16aff7dc14af99 100644 --- a/_maps/doppler/automapper/templates/metastation/metastation_shipbreaking.dmm +++ b/_maps/doppler/automapper/templates/metastation/metastation_shipbreaking.dmm @@ -575,6 +575,10 @@ }, /turf/open/space/basic, /area/space/nearstation) +"Fr" = ( +/obj/effect/wind/shipbreaking_collector/scrap, +/turf/open/space/basic, +/area/space) "FL" = ( /obj/effect/spawner/random/salvage/container_or_crate_or_cargo/salvage, /obj/effect/decal/cleanable/dirt, @@ -758,6 +762,7 @@ "OK" = ( /obj/effect/turf_decal/loading_area/red, /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/wind/shipbreaking_collector/scrap, /turf/open/floor/plating/reinforced/airless, /area/space/nearstation) "OO" = ( @@ -805,6 +810,10 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/plating, /area/station/salvage_bay) +"Rh" = ( +/obj/effect/wind/shipbreaking_collector, +/turf/open/space/basic, +/area/space) "Rj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -822,6 +831,7 @@ "Rv" = ( /obj/effect/turf_decal/loading_area/white, /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/wind/shipbreaking_collector, /turf/open/floor/plating/reinforced/airless, /area/space/nearstation) "RY" = ( @@ -839,11 +849,22 @@ /turf/open/floor/iron/smooth, /area/station/salvage_bay) "Tu" = ( -/obj/structure/closet/secure_closet/engineering_electrical, /obj/structure/railing{ dir = 10 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/shelf, +/obj/item/storage/bag/construction{ + pixel_y = -4; + pixel_x = -4 + }, +/obj/item/storage/bag/construction{ + pixel_x = 2 + }, +/obj/item/storage/bag/construction{ + pixel_x = -1; + pixel_y = 7 + }, /turf/open/floor/iron/smooth, /area/station/salvage_bay) "TC" = ( @@ -1454,8 +1475,8 @@ Oq Oq Oq Oq -Oq -Oq +Fr +Fr OK xn Zc @@ -1486,8 +1507,8 @@ Oq Oq Oq Oq -Oq -Oq +Fr +Fr OK fi Zc @@ -1742,8 +1763,8 @@ Oq Oq Oq Oq -Oq -Oq +Rh +Rh Rv xn TU @@ -1774,8 +1795,8 @@ Oq Oq Oq Oq -Oq -Oq +Rh +Rh Rv fi vC diff --git a/_maps/doppler/automapper/templates/nebulastation/nebulastation_shipbreaking.dmm b/_maps/doppler/automapper/templates/nebulastation/nebulastation_shipbreaking.dmm index aaa951df5167c4..df1dfc5b7a8ec1 100644 --- a/_maps/doppler/automapper/templates/nebulastation/nebulastation_shipbreaking.dmm +++ b/_maps/doppler/automapper/templates/nebulastation/nebulastation_shipbreaking.dmm @@ -15,6 +15,18 @@ "ap" = ( /obj/structure/sign/poster/random/directional/south, /obj/effect/decal/cleanable/dirt, +/obj/structure/shelf, +/obj/item/storage/bag/construction{ + pixel_y = -4; + pixel_x = -4 + }, +/obj/item/storage/bag/construction{ + pixel_x = 2 + }, +/obj/item/storage/bag/construction{ + pixel_x = -1; + pixel_y = 7 + }, /turf/open/floor/iron/smooth, /area/station/salvage_bay) "ar" = ( @@ -233,6 +245,10 @@ }, /turf/open/floor/plating, /area/station/salvage_bay) +"lw" = ( +/obj/effect/wind/shipbreaking_collector/scrap, +/turf/open/space/openspace, +/area/space) "ml" = ( /obj/machinery/computer/salvage_bay_controller{ dir = 8 @@ -339,6 +355,7 @@ "rJ" = ( /obj/effect/turf_decal/loading_area/red, /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/wind/shipbreaking_collector/scrap, /turf/open/floor/plating/reinforced/airless, /area/space/nearstation) "ss" = ( @@ -499,6 +516,10 @@ /obj/structure/sign/poster/random/directional/north, /turf/open/floor/plating/aluminum, /area/station/salvage_bay) +"CZ" = ( +/obj/effect/wind/shipbreaking_collector, +/turf/open/space/openspace, +/area/space) "EF" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/teal, @@ -670,6 +691,7 @@ "Sf" = ( /obj/effect/turf_decal/loading_area/white, /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/wind/shipbreaking_collector, /turf/open/floor/plating/reinforced/airless, /area/space/nearstation) "Sr" = ( @@ -1023,7 +1045,7 @@ xU xU xU xU -Ad +xU xh Nq Nq @@ -1061,9 +1083,9 @@ xU xU xU xU -xU -xU -Ad +CZ +CZ +CZ Sf re iM @@ -1101,9 +1123,9 @@ xU xU xU xU -xU -xU -Ad +CZ +CZ +CZ Sf HY WW @@ -1143,7 +1165,7 @@ xU xU xU xU -Ad +xU xh Nq Kp @@ -1343,7 +1365,7 @@ xU xU xU xU -Ad +xU Nc Nq Nq @@ -1381,9 +1403,9 @@ xU xU xU xU -xU -xU -Ad +lw +lw +lw rJ re ak @@ -1421,9 +1443,9 @@ xU xU xU xU -xU -xU -Ad +lw +lw +lw rJ HY ak @@ -1463,7 +1485,7 @@ xU xU xU xU -Ad +xU Nc Nq Nq diff --git a/_maps/doppler/automapper/templates/tramstation/tramstation_shipbreaking.dmm b/_maps/doppler/automapper/templates/tramstation/tramstation_shipbreaking.dmm index bf3f4bff83d73c..1ea14cedf45a7c 100644 --- a/_maps/doppler/automapper/templates/tramstation/tramstation_shipbreaking.dmm +++ b/_maps/doppler/automapper/templates/tramstation/tramstation_shipbreaking.dmm @@ -80,6 +80,12 @@ "eP" = ( /turf/template_noop, /area/template_noop) +"eS" = ( +/obj/effect/wind/shipbreaking_collector/scrap{ + dir = 8 + }, +/turf/open/space/openspace, +/area/space) "fz" = ( /obj/structure/railing{ dir = 9 @@ -224,6 +230,12 @@ "ll" = ( /turf/open/floor/iron/grimy, /area/station/salvage_bay) +"lr" = ( +/obj/effect/wind/shipbreaking_collector{ + dir = 8 + }, +/turf/open/space/openspace, +/area/space) "lt" = ( /obj/structure/lattice/catwalk, /turf/open/space/openspace, @@ -313,6 +325,9 @@ /obj/effect/turf_decal/loading_area/red{ dir = 8 }, +/obj/effect/wind/shipbreaking_collector/scrap{ + dir = 8 + }, /turf/open/floor/plating/airless, /area/station/asteroid) "pT" = ( @@ -507,6 +522,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/salvage_bay) +"yN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/wind/shipbreaking_collector/scrap{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/station/asteroid) "yO" = ( /obj/structure/railing{ dir = 8 @@ -613,6 +635,14 @@ }, /turf/open/floor/iron, /area/station/salvage_bay) +"Gs" = ( +/obj/effect/wind/shipbreaking_collector/scrap{ + dir = 8 + }, +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/space/openspace, +/area/space/nearstation) "Gu" = ( /obj/machinery/atmospherics/components/unary/passive_vent/layer2{ dir = 8 @@ -634,6 +664,11 @@ }, /turf/open/misc/asteroid, /area/station/salvage_bay) +"Hm" = ( +/obj/structure/lattice/catwalk, +/obj/structure/lattice, +/turf/open/space/openspace, +/area/space/nearstation) "Ij" = ( /obj/structure/girder/reinforced, /obj/effect/decal/cleanable/dirt/dust, @@ -779,6 +814,18 @@ /turf/open/floor/iron, /area/station/salvage_bay) "Pp" = ( +/obj/structure/shelf, +/obj/item/storage/bag/construction{ + pixel_y = -4; + pixel_x = -4 + }, +/obj/item/storage/bag/construction{ + pixel_x = 2 + }, +/obj/item/storage/bag/construction{ + pixel_x = -1; + pixel_y = 7 + }, /obj/structure/railing{ dir = 8 }, @@ -837,6 +884,9 @@ /obj/effect/turf_decal/loading_area/white{ dir = 8 }, +/obj/effect/wind/shipbreaking_collector{ + dir = 8 + }, /turf/open/floor/plating/airless, /area/station/asteroid) "SQ" = ( @@ -851,6 +901,11 @@ dir = 1 }, /area/station/salvage_bay) +"TK" = ( +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/space/openspace, +/area/space/nearstation) "TN" = ( /obj/machinery/camera/autoname/directional/south, /turf/open/misc/asteroid, @@ -914,6 +969,14 @@ /obj/structure/shuttle_decoration/headlight/directional/east, /turf/closed/wall/r_wall, /area/space/nearstation) +"Xd" = ( +/obj/effect/wind/shipbreaking_collector{ + dir = 8 + }, +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/space/openspace, +/area/space/nearstation) "XK" = ( /obj/structure/railing{ dir = 1 @@ -940,6 +1003,9 @@ /area/station/salvage_bay) "Yx" = ( /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/wind/shipbreaking_collector{ + dir = 8 + }, /turf/open/floor/plating/airless, /area/station/asteroid) "YG" = ( @@ -1882,9 +1948,9 @@ Yx Yx Yx pB -Yx -Yx -Yx +yN +yN +yN yn fU fU @@ -1937,15 +2003,15 @@ vv vv WN lt -Wu -Wu -Wu -Wu -Wu -Wu -Wu -Wu -Wu +So +lr +lr +lr +TK +eS +eS +eS +So Wu Wu VD @@ -1997,15 +2063,15 @@ Sl lt lt lt -lt -lt -lt -lt -lt -lt -lt -lt -lt +TK +Xd +Xd +Xd +Hm +Gs +Gs +Gs +TK lt lt WA @@ -2058,13 +2124,13 @@ lt So So So +lr +lr +lr So -So -So -So -So -So -So +eS +eS +eS So So So diff --git a/_maps/map_files/Pubbystation/pubbystation.dmm b/_maps/map_files/Pubbystation/pubbystation.dmm index 2ced4d27ae99ce..e2fc1857eaa6eb 100644 --- a/_maps/map_files/Pubbystation/pubbystation.dmm +++ b/_maps/map_files/Pubbystation/pubbystation.dmm @@ -40069,6 +40069,13 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/science/xenobiology) +"msC" = ( +/obj/effect/wind/shipbreaking_collector/scrap{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "msO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -44840,6 +44847,18 @@ }, /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/decal/cleanable/dirt, +/obj/structure/shelf, +/obj/item/storage/bag/construction{ + pixel_y = -4; + pixel_x = -4 + }, +/obj/item/storage/bag/construction{ + pixel_x = 2 + }, +/obj/item/storage/bag/construction{ + pixel_x = -1; + pixel_y = 7 + }, /turf/open/floor/plating, /area/station/salvage_bay) "pWb" = ( @@ -45759,6 +45778,12 @@ }, /turf/open/floor/iron/terracotta/small, /area/station/service/kitchen) +"qyV" = ( +/obj/effect/wind/shipbreaking_collector{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) "qze" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/firealarm/directional/south, @@ -48958,6 +48983,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"sOd" = ( +/obj/effect/wind/shipbreaking_collector{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "sOm" = ( /obj/structure/shuttle_decoration/wall_plate/armor{ dir = 4 @@ -49761,6 +49793,12 @@ dir = 8 }, /area/station/engineering/atmos/hfr_room) +"tmV" = ( +/obj/effect/wind/shipbreaking_collector/scrap{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) "tmY" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -80554,10 +80592,10 @@ abI qos eTg gZu -aht -aht -cdm -aaa +qyV +qyV +sOd +qyV aaa aaa aaa @@ -80811,10 +80849,10 @@ abI fLG eTg eTg -cdm -cdm -cdm -aaa +qyV +qyV +sOd +qyV aaa aaa aaa @@ -81068,10 +81106,10 @@ fEk dYG eTg qnM -aht -aht -cdm -aaa +qyV +qyV +sOd +qyV aaa aaa aaa @@ -81582,10 +81620,10 @@ wwa sww nYb gZu -aht -aht -cdm -aaa +tmV +tmV +msC +tmV aaa aaa aaa @@ -81839,10 +81877,10 @@ abI tFr nYb eTg -cdm -cdm -cdm -aaa +tmV +tmV +msC +tmV aaa aaa aaa @@ -82096,10 +82134,10 @@ abI rlk nYb qnM -aht -aht -cdm -aaa +tmV +tmV +msC +tmV aaa aaa aaa diff --git a/code/datums/storage/subtypes/bags.dm b/code/datums/storage/subtypes/bags.dm index 73e6670e56749f..d0904692874196 100644 --- a/code/datums/storage/subtypes/bags.dm +++ b/code/datums/storage/subtypes/bags.dm @@ -204,7 +204,7 @@ /datum/storage/bag/construction max_total_storage = 100 max_slots = 50 - max_specific_storage = WEIGHT_CLASS_SMALL + max_specific_storage = WEIGHT_CLASS_NORMAL // DOPPLER EDIT - Construction bags hold shipbreaking scrap items - max_specific_storage = WEIGHT_CLASS_SMALL /datum/storage/bag/construction/New(atom/parent, max_slots, max_specific_storage, max_total_storage, rustle_sound, remove_rustle_sound) . = ..() @@ -220,6 +220,12 @@ /obj/item/stack/sheet, /obj/item/rcd_ammo, /obj/item/stack/rods, + // DOPPLER ADDITION START - Construction bags hold shipbreaking scrap items + /obj/item/epic_loot, + /obj/item/nanocarbon_shard, + /obj/item/demo_charge_detonator, + /obj/item/grenade/c4/demo_charge, + // DOPPLER ADDITION END )) ///Harpoon quiver bag diff --git a/modular_doppler/shipbreaking/code/shuttle_parts/wall_plating.dm b/modular_doppler/shipbreaking/code/shuttle_parts/wall_plating.dm index cf350af98f53db..aeedcb161c678c 100644 --- a/modular_doppler/shipbreaking/code/shuttle_parts/wall_plating.dm +++ b/modular_doppler/shipbreaking/code/shuttle_parts/wall_plating.dm @@ -40,11 +40,11 @@ SIGNAL_HANDLER if(leaving == src) return // Let's not block ourselves. - if(!(direction & dir)) + if(!(direction & dir) && (dir in GLOB.cardinals)) return if (!density) return - if (leaving.movement_type & (PHASING)) + if (leaving.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) return if (leaving.move_force >= MOVE_FORCE_EXTREMELY_STRONG) return diff --git a/modular_doppler/shipbreaking/code/tools/collector_vacuum.dm b/modular_doppler/shipbreaking/code/tools/collector_vacuum.dm new file mode 100644 index 00000000000000..e5e4652dcc0bf8 --- /dev/null +++ b/modular_doppler/shipbreaking/code/tools/collector_vacuum.dm @@ -0,0 +1,22 @@ +/obj/effect/wind/shipbreaking_collector + name = "salvage inlet collector field" + desc = "Creates an artificial pull in the direction it moves, typically towards a nearby salvage collector inlet." + icon = 'modular_doppler/shipbreaking/icons/inlet.dmi' + icon_state = "inlet" + invisibility = 0 + color = "#4699a6" + light_range = 1 + light_power = 2 + light_on = TRUE + +/obj/effect/wind/shipbreaking_collector/Initialize(mapload) + . = ..() + update_appearance(UPDATE_OVERLAYS) + light_color = color + +/obj/effect/wind/shipbreaking_collector/update_overlays() + . = ..() + . += emissive_appearance(icon, icon_state, src) + +/obj/effect/wind/shipbreaking_collector/scrap + color = "#d99f3a" diff --git a/modular_doppler/shipbreaking/code/tools/demo_charge.dm b/modular_doppler/shipbreaking/code/tools/demo_charge.dm new file mode 100644 index 00000000000000..0f0d1eedd5eea2 --- /dev/null +++ b/modular_doppler/shipbreaking/code/tools/demo_charge.dm @@ -0,0 +1,160 @@ +GLOBAL_LIST_EMPTY(demolition_charges) + +/obj/item/demo_charge_detonator + name = "demolition vac-charge clacker" + desc = "A big scary remote controller that makes a satisfying click when the lever on the side is pressed. \ + As a safety measure, the remote needs to be used multiple times in order to detonate any charges." + icon = 'modular_doppler/shipbreaking/icons/tools.dmi' + icon_state = "detonator" + inhand_icon_state = "signaler" + lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL + +/obj/item/demo_charge_detonator/attack_self(mob/user) + user.balloon_alert_to_viewers("clack") + playsound(src, 'sound/items/pen_click.ogg', 40, TRUE) + for(var/obj/item/grenade/c4/demo_charge/charge as anything in GLOB.demolition_charges) + charge.clack() + +/obj/item/grenade/c4/demo_charge + name = "low-pyrotechnic shaped demolition vac-charge" + desc = "A special demolition charge for the rapid deconstruction of salvaged ships. Uses a special process to make use of minimal explosive mass \ + vaporizing a precision formed strip of material, which then reflects off of the sturdy casing of the explosive to direct the full force into \ + whatever surface the charge is attached to. Involves minimal risk to any operators standing near the charge." + icon = 'modular_doppler/shipbreaking/icons/tools.dmi' + icon_state = "charge0" + base_icon_state = "charge" + inhand_icon_state = "ninja-explosive" + worn_icon_state = "electronic" + lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi' + directional = TRUE + directional_arc = 90 + boom_sizes = list(0, 3, 5) + full_damage_on_mobs = FALSE + /// How many times the detonator has pulsed on this demo charge + var/clacks = 0 + /// How many times the detonator needs to be pulsed to detonate the charge + var/clacks_needed = 3 + /// If the charge has more explosive than normal + var/more_explosive = FALSE + +/obj/item/grenade/c4/demo_charge/Initialize(mapload) + . = ..() + randomize_explosives() + plastic_overlay = mutable_appearance(icon, "[base_icon_state]2", HIGH_OBJ_LAYER) + if(prob(20)) + clacks_needed += rand(1, 3) + +/obj/item/grenade/c4/demo_charge/examine(mob/user) + . = ..() + if(more_explosive) + . += span_notice("It feels heavier than it should. This one probably has more explosives in it than usual.") + if(!directional) + . += span_notice("The casing feels pretty thing. It seems like a good idea to be nowhere in line of sight of this when it goes off.") + if(obj_flags & EMAGGED) + . += span_notice("It keeps trying to stick to everything around it, looks like the safety is fried.") + +/obj/item/grenade/c4/demo_charge/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + do_sparks(3, cardinal_only = FALSE, source = src) + obj_flags |= EMAGGED + return TRUE + +/obj/item/grenade/c4/demo_charge/emp_act(severity) + . = ..() + if(prob(5)) + detonate() + return + emag_act() + +/// Randomizes the explosive power of the charge and gives it a really low chance to not be directional just for fun +/obj/item/grenade/c4/demo_charge/proc/randomize_explosives() + if(prob(5)) + directional = FALSE + var/random_explosive_mass = rand(1,10) + switch(random_explosive_mass) + if(1) + boom_sizes = list(1, 4, 6) + directional_arc = 60 + if(2) + boom_sizes = list(1, 3, 5) + directional_arc = 200 + if(3) + boom_sizes = list(0, 5, 7) + directional_arc = 160 + else + return + more_explosive = TRUE + +/// Decides on random effects to play when the detonator has been clicked but nothing happens yet +/obj/item/grenade/c4/demo_charge/proc/clack() + clacks++ + if(prob(25)) + do_sparks(3, FALSE, target) + if(clacks_needed > clacks) + return + if(obj_flags & EMAGGED) + detonate() + return + if(istype(get_area(target), /area/shuttle/salvaged_shuttle)) + detonate() + return + +/obj/item/grenade/c4/demo_charge/Destroy() + if(src in GLOB.demolition_charges) + GLOB.demolition_charges -= src + return ..() + +/obj/item/grenade/c4/demo_charge/attack_self(mob/user) + return + +/obj/item/grenade/c4/demo_charge/plant_c4(atom/bomb_target, mob/living/user) + if(!(obj_flags & EMAGGED)) + if(isliving(bomb_target)) + to_chat(user, span_warning("The demolition charge refuses to latch onto something living!")) + return FALSE + var/area/target_area = get_area(bomb_target) + if(!istype(target_area, /area/shuttle/salvaged_shuttle)) + to_chat(user, span_warning("The charge refuses to latch onto anything other than inactive salvage shuttles!")) + return FALSE + if(bomb_target != user && HAS_TRAIT(user, TRAIT_PACIFISM) && isliving(bomb_target)) + to_chat(user, span_warning("You don't want to harm other living beings!")) + return FALSE + balloon_alert(user, "planting...") + if(!do_after(user, 3 SECONDS, target = bomb_target)) + return FALSE + if(!user.temporarilyRemoveItemFromInventory(src)) + return FALSE + target = bomb_target + active = TRUE + + if(obj_flags & EMAGGED) + message_admins("[ADMIN_LOOKUPFLW(user)] planted a hacked demolition charge on [target.name] at [ADMIN_VERBOSEJMP(target)]") + var/icon/target_icon = icon(bomb_target.icon, bomb_target.icon_state) + target_icon.Blend(icon(icon, icon_state), ICON_OVERLAY) + var/mutable_appearance/bomb_target_image = mutable_appearance(target_icon) + notify_ghosts( + "[user.real_name] has planted a hacked demolition charge on [target]!", + source = bomb_target, + header = "Explosive Planted", + alert_overlay = bomb_target_image, + notify_flags = NOTIFY_CATEGORY_NOFLASH, + ) + user.log_message("planted [name] on [target.name].", LOG_ATTACK) + + moveToNullspace() + if(isitem(bomb_target)) //your crappy throwing star can't fly so good with a giant brick of c4 on it. + var/obj/item/thrown_weapon = bomb_target + thrown_weapon.throw_speed = max(1, (thrown_weapon.throw_speed - 3)) + thrown_weapon.throw_range = max(1, (thrown_weapon.throw_range - 3)) + thrown_weapon.get_embed()?.embed_chance = 0 + else if(isliving(bomb_target)) + plastic_overlay.layer = FLOAT_LAYER + target.add_overlay(plastic_overlay) + to_chat(user, span_notice("You plant the charge, red light on the shell blinking ominously.")) + GLOB.demolition_charges += src + return TRUE diff --git a/modular_doppler/shipbreaking/code/tools/rnd.dm b/modular_doppler/shipbreaking/code/tools/rnd.dm new file mode 100644 index 00000000000000..df13adfdeb2e1c --- /dev/null +++ b/modular_doppler/shipbreaking/code/tools/rnd.dm @@ -0,0 +1,36 @@ +/datum/design/demo_remote + name = "Demolition Vac-Charge Clacker" + id = "demo_remote" + build_type = PROTOLATHE | AWAY_LATHE | COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 4.75, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.8, + /datum/material/nanocarbon = HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/demo_charge_detonator + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MINING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_CARGO + +/datum/design/demo_charge + name = "Low-Pyrotechnic Shaped Demolition Vac-Charge" + id = "demo_charge" + build_type = PROTOLATHE | AWAY_LATHE | COLONY_FABRICATOR + materials = list( + /datum/material/titanium = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/aluminum = HALF_SHEET_MATERIAL_AMOUNT / 2, + /datum/material/plasma = SMALL_MATERIAL_AMOUNT, + ) + build_path = /obj/item/grenade/c4/demo_charge + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MINING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_CARGO + +/datum/techweb_node/plasma_mining/New() + design_ids |= list( + "demo_remote", + "demo_charge", + ) + return ..() diff --git a/modular_doppler/shipbreaking/icons/inlet.dmi b/modular_doppler/shipbreaking/icons/inlet.dmi new file mode 100644 index 00000000000000..5ed3f11e89deaa Binary files /dev/null and b/modular_doppler/shipbreaking/icons/inlet.dmi differ diff --git a/modular_doppler/shipbreaking/icons/tools.dmi b/modular_doppler/shipbreaking/icons/tools.dmi new file mode 100644 index 00000000000000..e099103f29c671 Binary files /dev/null and b/modular_doppler/shipbreaking/icons/tools.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 8ca1e32ee4c9d2..ac39ea0cf9826e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7855,6 +7855,9 @@ #include "modular_doppler\shipbreaking\code\shuttle_parts\wall_plating.dm" #include "modular_doppler\shipbreaking\code\shuttle_parts\water_cycler.dm" #include "modular_doppler\shipbreaking\code\shuttle_parts\windows.dm" +#include "modular_doppler\shipbreaking\code\tools\collector_vacuum.dm" +#include "modular_doppler\shipbreaking\code\tools\demo_charge.dm" +#include "modular_doppler\shipbreaking\code\tools\rnd.dm" #include "modular_doppler\ships_r_us\code\buyable_shuttle_template.dm" #include "modular_doppler\ships_r_us\code\machine_flatpacks.dm" #include "modular_doppler\ships_r_us\code\micro_reactor.dm"