From 43113cd9b54ae383cb2de0a79161413541383ec9 Mon Sep 17 00:00:00 2001 From: oranges Date: Mon, 13 Nov 2017 22:18:37 +1300 Subject: [PATCH] Merge pull request #31947 from AnturK/yarr How does this work: Station receives a communication extorting current cargo point, if they answer yes the points are just gone and nothing of interest happens. If station refuses to pay or is silent for 3 minutes, pirate shuttle spawns somewhere in space. There's an internal GPS onboard so crew will always be able to follow the shuttle. Crew of 3, moderately armed. (Balance pending) Shuttle engines have 3 minute cooldown between jumps. Special shuttle equipment will block cargo and emergency shuttles from leaving and slowly steal the points. --- _maps/templates/pirate_ship.dmm | 2371 +++++++++++++++++ code/__DEFINES/machines.dm | 3 + code/__HELPERS/priority_announce.dm | 32 +- code/_globalvars/lists/names.dm | 1 - code/controllers/subsystem/communications.dm | 14 + code/controllers/subsystem/shuttle.dm | 28 +- code/datums/antagonists/pirate.dm | 135 + code/game/area/areas/shuttles.dm | 9 + .../game/machinery/computer/communications.dm | 17 + .../objects/structures/ghost_role_spawners.dm | 44 +- code/modules/admin/player_panel.dm | 14 + code/modules/awaymissions/corpse.dm | 9 +- code/modules/cargo/console.dm | 15 +- code/modules/clothing/outfits/standard.dm | 26 +- .../clothing/spacesuits/miscellaneous.dm | 6 + code/modules/events/mice_migration.dm | 2 +- code/modules/events/pirates.dm | 280 ++ code/modules/mob/mob_helpers.dm | 4 +- code/modules/power/turbine.dm | 11 +- code/modules/research/rdconsole.dm | 3 +- code/modules/research/research.dm | 6 + code/modules/shuttle/computer.dm | 3 +- strings/pirates.json | 31 + tgstation.dme | 2 + 24 files changed, 3029 insertions(+), 37 deletions(-) create mode 100644 _maps/templates/pirate_ship.dmm create mode 100644 code/datums/antagonists/pirate.dm create mode 100644 code/modules/events/pirates.dm create mode 100644 strings/pirates.json diff --git a/_maps/templates/pirate_ship.dmm b/_maps/templates/pirate_ship.dmm new file mode 100644 index 0000000000..9ead86e75a --- /dev/null +++ b/_maps/templates/pirate_ship.dmm @@ -0,0 +1,2371 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "piratebridge" + }, +/obj/structure/grille, +/obj/structure/window/plastitanium, +/turf/open/floor/plating, +/area/shuttle/pirate) +"ac" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"ad" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/shuttle/pirate, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"ae" = ( +/obj/structure/table, +/obj/machinery/button/door{ + id = "piratebridge"; + name = "Bridge Shutters Control"; + pixel_x = 0; + pixel_y = -5; + req_access_txt = "0" + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/device/radio/intercom{ + pixel_y = 5 + }, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"af" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"ag" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"ah" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/monitor, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"ai" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/pirate) +"aj" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"ak" = ( +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/shuttle_scrambler, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"al" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -24; + req_access = null + }, +/obj/structure/chair{ + tag = "icon-chair (WEST)"; + icon_state = "chair"; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"am" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"an" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"ao" = ( +/obj/machinery/light/small, +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"ap" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/pirate{ + dir = 4 + }, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"aq" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = null + }, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"ar" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/pirate/gunner{ + dir = 8 + }, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"as" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/command{ + name = "Bridge" + }, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"at" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/shuttle/pirate) +"au" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = null + }, +/obj/machinery/sleeper, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/white, +/area/shuttle/pirate) +"av" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, +/area/shuttle/pirate) +"aw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/pirate/captain, +/turf/open/floor/wood, +/area/shuttle/pirate) +"ax" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Crew Cabin"; + req_access_txt = "0" + }, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"ay" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/emergency, +/obj/item/extinguisher, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"az" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"aA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"aB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = null + }, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"aC" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 6 + }, +/obj/item/folder, +/obj/item/pen, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"aD" = ( +/obj/structure/sign/bluecross_2, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"aE" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/side{ + dir = 9 + }, +/area/shuttle/pirate) +"aF" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/shuttle/pirate) +"aG" = ( +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/shuttle/pirate) +"aH" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/shuttle/pirate) +"aI" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/surgical_drapes, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/side{ + dir = 5 + }, +/area/shuttle/pirate) +"aJ" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + dir = 4; + icon_state = "alarm0"; + pixel_x = -24; + req_access = null + }, +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/wood, +/area/shuttle/pirate) +"aK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/wood, +/area/shuttle/pirate) +"aL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Captain's Quarters"; + req_access_txt = "0" + }, +/turf/open/floor/wood, +/area/shuttle/pirate) +"aM" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = null + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"aN" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"aO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"aP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/command{ + name = "Bridge" + }, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"aQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"aR" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"aS" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"aT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"aU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/command{ + name = "Bridge" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/black, +/area/shuttle/pirate) +"aV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/shuttle/pirate) +"aW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"aX" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"aY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"aZ" = ( +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/shuttle/pirate) +"ba" = ( +/obj/structure/table, +/obj/item/circular_saw, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/cautery{ + pixel_x = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/shuttle/pirate) +"bb" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/matches, +/obj/item/clothing/mask/cigarette/cigar, +/turf/open/floor/wood, +/area/shuttle/pirate) +"bc" = ( +/obj/machinery/button/door{ + id = "piratevault"; + name = "Vault Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -8; + pixel_y = -24; + req_access_txt = "0"; + specialfunctions = 4 + }, +/obj/machinery/turretid{ + icon_state = "control_kill"; + lethal = 1; + locked = 0; + pixel_x = 4; + pixel_y = -24; + req_access = null + }, +/obj/structure/chair{ + tag = "icon-chair (WEST)"; + icon_state = "chair"; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/shuttle/pirate) +"bd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"be" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"bf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"bg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/vault{ + id_tag = "piratevault"; + locked = 1; + name = "Vault" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) +"bh" = ( +/obj/structure/table, +/obj/item/storage/firstaid/brute{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/firstaid/fire, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/side{ + dir = 10 + }, +/area/shuttle/pirate) +"bi" = ( +/obj/machinery/light/small, +/obj/structure/table, +/obj/item/storage/box/syringes, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 3 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/side, +/area/shuttle/pirate) +"bj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white/side, +/area/shuttle/pirate) +"bk" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/side, +/area/shuttle/pirate) +"bl" = ( +/obj/structure/table/optable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/side{ + dir = 6 + }, +/area/shuttle/pirate) +"bm" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/item/hemostat, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/shuttle/pirate) +"bn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Crew Quarters"; + req_access_txt = "0" + }, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"bo" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/pirate/vault) +"bp" = ( +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = null + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate/vault) +"bq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/pod/dark, +/area/shuttle/pirate/vault) +"br" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 0; + pixel_y = 28 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate/vault) +"bs" = ( +/obj/machinery/door/airlock/glass_medical{ + name = "Medbay" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"bt" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; + icon_state = "space"; + layer = 4; + name = "EXTERNAL AIRLOCK"; + pixel_x = -32; + pixel_y = 0 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/pirate, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/pirate) +"bu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"bv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"bw" = ( +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/storage/belt/utility, +/obj/item/device/radio/off, +/obj/item/device/radio/off, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"bx" = ( +/obj/structure/closet/crate, +/obj/item/grenade/smokebomb{ + pixel_x = -4 + }, +/obj/item/grenade/smokebomb{ + pixel_x = 2 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"by" = ( +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/shield/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/shield/riot, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"bz" = ( +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/gun/energy/laser{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/laser, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"bA" = ( +/obj/structure/closet/crate, +/obj/item/storage/bag/money, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"bB" = ( +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/storage/belt/utility, +/obj/item/device/radio/off, +/obj/item/device/radio/off, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"bC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"bD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"bE" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; + icon_state = "space"; + layer = 4; + name = "EXTERNAL AIRLOCK"; + pixel_x = 32; + pixel_y = 0 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/pirate, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/pirate) +"bF" = ( +/obj/machinery/door/airlock/external{ + id_tag = "pirateportexternal"; + locked = 1 + }, +/obj/docking_port/mobile/pirate{ + callTime = 100; + dheight = 0; + dir = 4; + dwidth = 11; + height = 21; + id = "pirateship"; + launch_status = 0; + movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); + name = "Pirate Ship"; + port_direction = 8; + preferred_direction = 1; + roundstart_move = "pirateship_home"; + width = 23 + }, +/obj/docking_port/stationary{ + dir = 4; + dwidth = 11; + height = 21; + id = "pirateship_home"; + name = "Deep Space"; + width = 23 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"bG" = ( +/turf/open/floor/plating, +/area/shuttle/pirate) +"bH" = ( +/obj/machinery/door/airlock/external, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/pirate) +"bI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"bJ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"bK" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 8; + icon_state = "alarm0"; + pixel_x = 24; + req_access = 152 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/device/multitool, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"bL" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/structure/closet/crate, +/obj/item/storage/box/lethalshot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"bM" = ( +/turf/open/floor/pod/dark, +/area/shuttle/pirate/vault) +"bN" = ( +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/gun/ballistic/shotgun/automatic/combat, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"bO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate/vault) +"bP" = ( +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/gun/energy/laser{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/laser, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"bQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/stack/sheet/mineral/gold{ + amount = 3; + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/stack/sheet/mineral/silver{ + amount = 8; + pixel_x = 2; + pixel_y = -1 + }, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"bR" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + icon_state = "alarm0"; + pixel_x = -24; + req_access = null + }, +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/weldingtool/largetank, +/obj/item/storage/toolbox/electrical, +/obj/item/clothing/head/welding{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"bS" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"bT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"bU" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/shuttle/pirate) +"bV" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/pirate) +"bW" = ( +/obj/machinery/door/airlock/external{ + id_tag = "piratestarboardexternal"; + locked = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/pirate) +"bX" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/button/door{ + id = "pirateportexternal"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -24; + pixel_y = 0; + req_access_txt = "0"; + specialfunctions = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/pirate) +"bY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"bZ" = ( +/obj/structure/closet/crate, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"ca" = ( +/obj/structure/closet/crate, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/silver, +/obj/item/coin/silver, +/obj/item/coin/silver, +/obj/item/coin/silver, +/obj/item/coin/silver, +/obj/item/coin/gold, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"cb" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/bot, +/obj/item/mop, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"cc" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"cd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"ce" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/button/door{ + id = "piratestarboardexternal"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = 0; + req_access_txt = "0"; + specialfunctions = 4 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) +"cf" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 1; + faction = "pirate" + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"cg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/glass{ + name = "Bar" + }, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"ch" = ( +/obj/structure/table, +/obj/machinery/door/window/southleft{ + base_state = "left"; + dir = 1; + icon_state = "left"; + name = "Explosive Ordinance"; + req_access_txt = "0" + }, +/obj/item/grenade/plastic/x4{ + pixel_x = -5 + }, +/obj/item/grenade/plastic/x4{ + pixel_x = 3 + }, +/obj/item/grenade/plastic/x4{ + pixel_x = 11 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"ci" = ( +/obj/structure/table, +/obj/item/melee/transforming/energy/sword/pirate, +/obj/item/melee/transforming/energy/sword/pirate{ + pixel_y = 12 + }, +/obj/item/melee/transforming/energy/sword/pirate{ + pixel_x = 12; + pixel_y = 7; + pixel_z = 0 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"cj" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/loot_locator, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"ck" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"cl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/telecomms/relay, +/turf/open/floor/pod/light, +/area/shuttle/pirate/vault) +"cm" = ( +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"cn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"co" = ( +/obj/structure/toilet{ + pixel_y = 20 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/shuttle/pirate) +"cp" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms"; + req_access_txt = "0" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/shuttle/pirate) +"cq" = ( +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = null + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"cr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"cs" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"ct" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"cu" = ( +/obj/machinery/atmospherics/components/unary/tank/nitrogen{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"cv" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "N2 Out"; + on = 1; + target_pressure = 4500 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"cw" = ( +/obj/machinery/atmospherics/components/trinary/mixer/flipped{ + name = "Air Mixer"; + node1_concentration = 0.8; + node2_concentration = 0.2; + on = 1; + target_pressure = 4500 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"cx" = ( +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = null + }, +/obj/structure/table, +/obj/item/storage/box/lights/mixed{ + pixel_x = -4 + }, +/obj/item/storage/belt/utility{ + pixel_x = 4 + }, +/obj/item/device/analyzer{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"cy" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"cz" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"cA" = ( +/obj/structure/table/reinforced, +/obj/item/lighter, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"cB" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"cC" = ( +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"cD" = ( +/obj/structure/closet/crate, +/obj/item/storage/box/donkpockets{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets, +/obj/item/storage/fancy/donut_box, +/obj/item/reagent_containers/food/snacks/cookie, +/obj/item/reagent_containers/food/snacks/cookie{ + pixel_x = -6; + pixel_y = -6 + }, +/obj/item/reagent_containers/food/snacks/chocolatebar, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"cE" = ( +/obj/machinery/computer/turbine_computer{ + id = "pirateturbine" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, +/area/shuttle/pirate) +"cF" = ( +/obj/structure/chair/stool, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = null + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/shuttle/pirate) +"cG" = ( +/obj/machinery/power/smes{ + capacity = 9e+006; + charge = 10000 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/shuttle/pirate) +"cH" = ( +/obj/structure/chair/stool, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + dir = 1; + name = "Pirate Ship APC"; + pixel_y = 26; + req_access = null + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/shuttle/pirate) +"cI" = ( +/obj/machinery/computer/monitor, +/obj/structure/cable/yellow{ + d2 = 8; + icon_state = "0-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/yellow/side{ + dir = 5 + }, +/area/shuttle/pirate) +"cJ" = ( +/obj/machinery/atmospherics/components/unary/tank/oxygen{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"cK" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "O2 Out"; + on = 1; + target_pressure = 4500 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"cL" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general{ + level = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"cM" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"cN" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Port Out"; + target_pressure = 4500 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"cO" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"cP" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks/beer, +/obj/item/storage/fancy/cigarettes{ + pixel_x = -6; + pixel_y = -8 + }, +/obj/item/storage/fancy/cigarettes/cigpack_carp{ + pixel_x = 1; + pixel_y = -8 + }, +/obj/item/storage/fancy/cigarettes/cigpack_midori{ + pixel_x = 8; + pixel_y = -8 + }, +/obj/item/storage/fancy/cigarettes/cigpack_robust{ + pixel_x = -6; + pixel_y = -14 + }, +/obj/item/storage/fancy/cigarettes/cigpack_shadyjims{ + pixel_x = 1; + pixel_y = -14 + }, +/obj/item/storage/fancy/cigarettes/cigpack_uplift{ + pixel_x = 8; + pixel_y = -14 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"cQ" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/barman_recipes{ + pixel_x = -4; + pixel_y = 0 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"cR" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"cS" = ( +/obj/structure/sign/engineering{ + pixel_x = 32 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"cT" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/wrench, +/obj/item/crowbar, +/obj/item/clothing/glasses/meson/engine, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/yellow/corner{ + dir = 1 + }, +/area/shuttle/pirate) +"cU" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-2"; + d2 = 2 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"cV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"cW" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/item/stack/cable_coil/red{ + pixel_x = -1; + pixel_y = 3 + }, +/obj/item/stack/cable_coil/red{ + pixel_x = 2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/yellow/corner{ + dir = 4 + }, +/area/shuttle/pirate) +"cX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"cY" = ( +/obj/structure/sign/engineering{ + pixel_x = -32 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"cZ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 2; + name = "O2 to Incinerator"; + target_pressure = 4500 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"da" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"db" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"dc" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 25; + pixel_y = 0 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/space_heater, +/turf/open/floor/plasteel/caution{ + dir = 4 + }, +/area/shuttle/pirate) +"dd" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"de" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"df" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"dg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"dh" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"di" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/nosmoking_2{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"dj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"dk" = ( +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"dl" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"dm" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"dn" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"do" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering" + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"dp" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"dq" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold4w/general{ + level = 2 + }, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"dr" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"ds" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Plasma to Incinerator"; + target_pressure = 4500 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"dt" = ( +/obj/machinery/atmospherics/components/unary/tank/toxins{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"du" = ( +/obj/machinery/vending/boozeomat{ + req_access_txt = "0" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"dv" = ( +/obj/machinery/door/window/southleft{ + base_state = "right"; + dir = 4; + icon_state = "right"; + name = "Bar"; + req_access_txt = "0" + }, +/turf/open/floor/plasteel/bar, +/area/shuttle/pirate) +"dw" = ( +/obj/structure/closet/firecloset/full{ + anchored = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/yellow/side, +/area/shuttle/pirate) +"dx" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/light/small, +/turf/open/floor/plasteel/yellow/corner{ + tag = "icon-yellowcorner (WEST)"; + icon_state = "yellowcorner"; + dir = 8 + }, +/area/shuttle/pirate) +"dy" = ( +/obj/machinery/button/door{ + id = "pirateturbinevent"; + name = "Turbine Vent Control"; + pixel_x = -6; + pixel_y = -24; + req_access_txt = "0" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/door{ + id = "pirateturbineauxvent"; + name = "Turbine Auxiliary Vent Control"; + pixel_x = 6; + pixel_y = -24; + req_access_txt = "0" + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"dz" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"dA" = ( +/obj/machinery/button/ignition{ + id = "pirateincinerator"; + pixel_x = -6; + pixel_y = -24 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 2; + on = 1; + target_pressure = 4500 + }, +/obj/machinery/button/door{ + id = "pirateturbinebolt"; + name = "Turbine Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 6; + pixel_y = -24; + req_access_txt = "0"; + specialfunctions = 4 + }, +/turf/open/floor/plasteel/floorgrime, +/area/shuttle/pirate) +"dB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/head/welding{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/device/multitool, +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/yellow/corner, +/area/shuttle/pirate) +"dC" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal{ + pixel_x = -1 + }, +/obj/item/stack/sheet/glass{ + amount = 50; + pixel_x = 0; + pixel_y = 5 + }, +/obj/item/stack/sheet/mineral/plastitanium{ + amount = 30; + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/stack/rods/fifty, +/turf/open/floor/plasteel/yellow/side, +/area/shuttle/pirate) +"dD" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/caution, +/area/shuttle/pirate) +"dE" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/caution, +/area/shuttle/pirate) +"dF" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/caution, +/area/shuttle/pirate) +"dG" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Port to Incinerator"; + target_pressure = 4500 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/caution, +/area/shuttle/pirate) +"dH" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plasteel, +/area/shuttle/pirate) +"dI" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"dJ" = ( +/obj/structure/sign/fire, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"dK" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/machinery/door/airlock/glass{ + heat_proof = 1; + id_tag = "pirateturbinebolt"; + locked = 1; + name = "Turbine Access" + }, +/turf/open/floor/engine, +/area/shuttle/pirate) +"dL" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 2 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) +"dM" = ( +/obj/structure/shuttle/engine/propulsion/burst, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) +"dN" = ( +/obj/machinery/igniter{ + icon_state = "igniter0"; + id = "pirateincinerator"; + luminosity = 2; + on = 0 + }, +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; + icon_state = "space"; + layer = 4; + name = "EXTERNAL AIRLOCK"; + pixel_y = -32 + }, +/turf/open/floor/engine/vacuum, +/area/shuttle/pirate) +"dO" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/engine/vacuum, +/area/shuttle/pirate) +"dP" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1; + frequency = 1441; + id = "inc_in" + }, +/turf/open/floor/engine/vacuum, +/area/shuttle/pirate) +"dQ" = ( +/obj/machinery/door/poddoor{ + id = "pirateturbineauxvent"; + name = "Turbine Auxiliary Vent" + }, +/turf/open/floor/engine/vacuum, +/area/shuttle/pirate) +"dR" = ( +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2"; + d2 = 2 + }, +/obj/machinery/power/compressor{ + comp_id = "pirateturbine"; + dir = 1; + luminosity = 2 + }, +/turf/open/floor/engine/vacuum, +/area/shuttle/pirate) +"dS" = ( +/obj/structure/cable, +/obj/machinery/power/turbine{ + luminosity = 2 + }, +/turf/open/floor/engine/vacuum, +/area/shuttle/pirate) +"dT" = ( +/obj/structure/sign/fire, +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/pirate) +"dU" = ( +/obj/machinery/door/poddoor{ + id = "pirateturbinevent"; + name = "Turbine Vent" + }, +/turf/open/floor/engine/vacuum, +/area/shuttle/pirate) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +ai +aj +aj +aj +aj +bF +aj +cf +aj +aj +aj +aj +aj +ai +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +ai +aj +aJ +bb +aj +bt +bG +bX +aj +co +aj +cP +dd +du +aj +ai +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aj +aw +aK +bc +aj +aj +bH +aj +aj +cp +aj +cs +cC +cs +dI +dM +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +ai +aj +aj +aL +aj +aj +bu +bI +bu +aj +cq +cA +cQ +de +dv +dI +dM +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aj +ap +aj +aM +bd +bn +bv +bJ +bC +cg +cr +cB +cR +df +cC +dI +dM +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aj +aq +ax +aN +be +aj +bw +bK +bY +aj +cs +cC +cS +dg +cs +dI +dM +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aj +ar +aj +aO +bf +aj +aj +aj +aj +aj +ct +cD +aj +dh +aj +aj +ai +aa +aa +aa +"} +(8,1,1) = {" +aa +aa +ab +ab +aj +aj +aj +aP +aj +aj +bx +bL +bZ +aj +aj +aj +aj +di +dw +aj +aa +aa +aa +aa +"} +(9,1,1) = {" +aa +ab +ab +af +ak +aj +ay +aQ +aj +bo +bo +bM +bM +ch +aj +cE +cT +dj +dx +dJ +aj +ai +aa +aa +"} +(10,1,1) = {" +aa +ab +ac +af +al +aj +az +aR +aj +bp +by +bN +bo +ci +aj +cF +aW +dk +dy +aj +dN +aj +aj +dT +"} +(11,1,1) = {" +aa +ab +ad +ag +am +as +aA +aS +bg +bq +bq +bO +bM +cj +aj +cG +cU +dl +dz +dK +dO +dR +dS +dU +"} +(12,1,1) = {" +aa +ab +ae +af +an +aj +aB +aQ +aj +br +bz +bP +bo +ck +aj +cH +cV +dm +dA +dL +dP +aj +aj +dT +"} +(13,1,1) = {" +aa +ab +ab +ah +ao +aj +aC +aT +aj +bo +bo +bo +bM +cl +aj +cI +cW +dn +dB +dJ +dQ +ai +aa +aa +"} +(14,1,1) = {" +aa +aa +ab +ab +aj +aj +aD +aU +aj +aj +bA +bQ +ca +aj +aj +aj +cX +dn +dC +aj +aa +aa +aa +aa +"} +(15,1,1) = {" +aa +aa +aa +aa +aj +at +aE +aV +bh +aj +aj +aj +aj +aj +cu +cJ +cX +do +aj +aj +ai +aa +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aj +au +aF +aW +bi +aD +bB +bR +cb +aj +cv +cK +cY +dp +dD +dI +dM +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aj +av +aG +aX +bj +bs +bC +bS +cc +cm +cw +cL +cZ +dq +dE +dI +dM +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +ai +aj +aH +aY +bk +aj +bD +bT +cd +cn +cx +cM +da +dr +dF +dI +dM +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aj +aI +aZ +bl +aj +aj +bU +aj +aj +cy +cN +db +ds +dG +dI +dM +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +ai +ai +ba +bm +aj +bE +bV +ce +aj +cz +cO +dc +dt +dH +aj +ai +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +ai +aj +aj +aj +aj +bW +aj +cf +aj +aj +aj +aj +aj +ai +aa +aa +aa +aa +"} diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 9f92ea7619..4ac48b7d4f 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -84,3 +84,6 @@ #define SUPERMATTER_DANGER 4 // Integrity < 50% #define SUPERMATTER_EMERGENCY 5 // Integrity < 25% #define SUPERMATTER_DELAMINATING 6 // Pretty obvious. + +//R&D Snowflakes +#define RD_CONSOLE_LOCKED_SCREEN 0.2 \ No newline at end of file diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index abda33b136..021dc55347 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -1,4 +1,4 @@ -/proc/priority_announce(text, title = "", sound = 'sound/ai/attention.ogg', type) +/proc/priority_announce(text, title = "", sound = 'sound/ai/attention.ogg', type , sender_override) if(!text) return @@ -13,13 +13,18 @@ GLOB.news_network.SubmitArticle(text, "Captain's Announcement", "Station Announcements", null) else - announcement += "

[command_name()] Update

" + if(!sender_override) + announcement += "

[command_name()] Update

" + else + announcement += "

[sender_override]

" if (title && length(title) > 0) announcement += "

[html_encode(title)]

" - if(title == "") - GLOB.news_network.SubmitArticle(text, "Central Command Update", "Station Announcements", null) - else - GLOB.news_network.SubmitArticle(title + "

" + text, "Central Command", "Station Announcements", null) + + if(!sender_override) + if(title == "") + GLOB.news_network.SubmitArticle(text, "Central Command Update", "Station Announcements", null) + else + GLOB.news_network.SubmitArticle(title + "

" + text, "Central Command", "Station Announcements", null) announcement += "
[html_encode(text)]
" announcement += "
" @@ -38,16 +43,11 @@ if(announce) priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && (C.z in GLOB.station_z_levels)) - var/obj/item/paper/P = new /obj/item/paper(C.loc) - P.name = "paper - '[title]'" - P.info = text - var/datum/comm_message/message = new - message.title = title - message.content = text - C.add_message(message) - P.update_icon() + var/datum/comm_message/M = new + M.title = title + M.content = text + + SScommunications.send_message(M) /proc/minor_announce(message, title = "Attention:", alert) if(!message) diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index c6cc5d7330..d5b2d222dd 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -19,7 +19,6 @@ GLOBAL_LIST_INIT(nightmare_names, world.file2list("strings/names/nightmare.txt") GLOBAL_LIST_INIT(megacarp_first_names, world.file2list("strings/names/megacarp1.txt")) GLOBAL_LIST_INIT(megacarp_last_names, world.file2list("strings/names/megacarp2.txt")) - GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt")) GLOBAL_LIST_INIT(adjectives, world.file2list("strings/names/adjectives.txt")) GLOBAL_LIST_INIT(dream_strings, world.file2list("strings/dreamstrings.txt")) diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm index 7a8748c20f..e86d32f76b 100644 --- a/code/controllers/subsystem/communications.dm +++ b/code/controllers/subsystem/communications.dm @@ -28,5 +28,19 @@ SUBSYSTEM_DEF(communications) log_talk(user,"[key_name(user)] has made a priority announcement: [input]",LOGSAY) message_admins("[key_name_admin(user)] has made a priority announcement.") +/datum/controller/subsystem/communications/proc/send_message(datum/comm_message/sending,print = TRUE,unique = FALSE) + for(var/obj/machinery/computer/communications/C in GLOB.machines) + if(!(C.stat & (BROKEN|NOPOWER)) && (C.z in GLOB.station_z_levels)) + if(unique) + C.add_message(sending) + else //We copy the message for each console, answers and deletions won't be shared + var/datum/comm_message/M = new(sending.title,sending.content,sending.possible_answers.Copy()) + C.add_message(M) + if(print) + var/obj/item/paper/P = new /obj/item/paper(C.loc) + P.name = "paper - '[sending.title]'" + P.info = sending.content + P.update_icon() + #undef COMMUNICATION_COOLDOWN #undef COMMUNICATION_COOLDOWN_AI diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index da43766fb8..5fa770179e 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -28,7 +28,9 @@ SUBSYSTEM_DEF(shuttle) var/emergencyCallAmount = 0 //how many times the escape shuttle was called var/emergencyNoEscape var/emergencyNoRecall = FALSE - var/list/hostileEnvironments = list() + var/list/hostileEnvironments = list() //Things blocking escape shuttle from leaving + var/list/tradeBlockade = list() //Things blocking cargo from leaving. + var/supplyBlocked = FALSE //supply shuttle stuff var/obj/docking_port/mobile/supply/supply @@ -335,6 +337,30 @@ SUBSYSTEM_DEF(shuttle) hostileEnvironments -= bad checkHostileEnvironment() + +/datum/controller/subsystem/shuttle/proc/registerTradeBlockade(datum/bad) + tradeBlockade[bad] = TRUE + checkTradeBlockade() + +/datum/controller/subsystem/shuttle/proc/clearTradeBlockade(datum/bad) + tradeBlockade -= bad + checkTradeBlockade() + + +/datum/controller/subsystem/shuttle/proc/checkTradeBlockade() + for(var/datum/d in tradeBlockade) + if(!istype(d) || QDELETED(d)) + tradeBlockade -= d + supplyBlocked = tradeBlockade.len + + if(supplyBlocked && (supply.mode == SHUTTLE_IGNITING)) + supply.mode = SHUTTLE_STRANDED + supply.timer = null + //Make all cargo consoles speak up + if(!supplyBlocked && (supply.mode == SHUTTLE_STRANDED)) + supply.mode = SHUTTLE_DOCKED + //Make all cargo consoles speak up + /datum/controller/subsystem/shuttle/proc/checkHostileEnvironment() for(var/datum/d in hostileEnvironments) if(!istype(d) || QDELETED(d)) diff --git a/code/datums/antagonists/pirate.dm b/code/datums/antagonists/pirate.dm new file mode 100644 index 0000000000..ad32e09151 --- /dev/null +++ b/code/datums/antagonists/pirate.dm @@ -0,0 +1,135 @@ +/datum/antagonist/pirate + name = "Space Pirate" + job_rank = ROLE_TRAITOR + var/datum/objective_team/pirate/crew + +/datum/antagonist/pirate/greet() + to_chat(owner, "You are a Space Pirate!") + to_chat(owner, "The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot.") + owner.announce_objectives() + +/datum/antagonist/pirate/get_team() + return crew + +/datum/antagonist/pirate/create_team(datum/objective_team/pirate/new_team) + if(!new_team) + for(var/datum/antagonist/pirate/P in GLOB.antagonists) + if(P.crew) + new_team = P.crew + if(!new_team) + crew = new /datum/objective_team/pirate + crew.forge_objectives() + return + if(!istype(new_team)) + stack_trace("Wrong team type passed to [type] initialization.") + crew = new_team + +/datum/antagonist/pirate/on_gain() + if(crew) + owner.objectives |= crew.objectives + . = ..() + +/datum/antagonist/pirate/on_removal() + if(crew) + owner.objectives -= crew.objectives + . = ..() + +/datum/objective_team/pirate + name = "Pirate crew" + var/list/objectives = list() + +/datum/objective_team/pirate/proc/forge_objectives() + var/datum/objective/loot/getbooty = new() + getbooty.team = src + getbooty.storage_area = locate(/area/shuttle/pirate/vault) in GLOB.sortedAreas + getbooty.update_initial_value() + getbooty.update_explanation_text() + objectives += getbooty + for(var/datum/mind/M in members) + M.objectives |= objectives + + +GLOBAL_LIST_INIT(pirate_loot_cache, typecacheof(list( + /obj/structure/reagent_dispensers/beerkeg, + /mob/living/simple_animal/parrot, + /obj/item/stack/sheet/mineral/gold, + /obj/item/stack/sheet/mineral/diamond, + /obj/item/stack/spacecash, + /obj/item/melee/sabre,))) + +/datum/objective/loot + var/area/storage_area //Place where we we will look for the loot. + explanation_text = "Acquire valuable loot and store it in designated area." + var/target_value = 50000 + var/initial_value = 0 //Things in the vault at spawn time do not count + +/datum/objective/loot/update_explanation_text() + if(storage_area) + explanation_text = "Acquire loot and store [target_value] of credits worth in [storage_area.name]." + +/datum/objective/loot/proc/loot_listing() + //Lists notable loot. + if(!storage_area) + return "Nothing" + var/list/loot_table = list() + for(var/atom/movable/AM in storage_area.GetAllContents()) + if(is_type_in_typecache(AM,GLOB.pirate_loot_cache)) + var/lootname = AM.name + var/count = 1 + if(istype(AM,/obj/item/stack)) //Ugh. + var/obj/item/stack/S = AM + lootname = S.singular_name + count = S.amount + if(!loot_table[lootname]) + loot_table[lootname] = count + else + loot_table[lootname] += count + var/text = "" + for(var/key in loot_table) + var/amount = loot_table[key] + text += "[amount] [key][amount > 1 ? "s":""], " + return text + +/datum/objective/loot/proc/get_loot_value() + if(!storage_area) + return 0 + var/value = 0 + for(var/turf/T in storage_area.contents) + value += export_item_and_contents(T,TRUE, TRUE, dry_run = TRUE) + return value - initial_value + +/datum/objective/loot/proc/update_initial_value() + initial_value = get_loot_value() + +/datum/objective/loot/check_completion() + return ..() || get_loot_value() >= target_value + + +//These need removal ASAP as everything is converted to datum antags. +/datum/game_mode/proc/auto_declare_completion_pirates() + var/list/datum/mind/pirates = get_antagonists(/datum/antagonist/pirate) + var/datum/objective_team/pirate/crew + var/text = "" + if(pirates.len) + text += "
Space Pirates were:" + for(var/datum/mind/M in pirates) + text += printplayer(M) + if(!crew) + var/datum/antagonist/pirate/P = M.has_antag_datum(/datum/antagonist/pirate) + crew = P.crew + if(crew) + text += "
Loot stolen: " + var/datum/objective/loot/L = locate() in crew.objectives + text += L.loot_listing() + text += "
Total loot value : [L.get_loot_value()]/[L.target_value] credits" + + var/all_dead = TRUE + for(var/datum/mind/M in crew.members) + if(considered_alive(M)) + all_dead = FALSE + break + if(L.check_completion() && !all_dead) + text += "
The pirate crew was successful!" + else + text += "
The pirate crew has failed." + to_chat(world, text) \ No newline at end of file diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index dd9e1f766f..07cea55254 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -108,3 +108,12 @@ /area/shuttle/syndicate_scout name = "Syndicate Scout" blob_allowed = FALSE + +/area/shuttle/pirate + name = "Pirate Shuttle" + blob_allowed = FALSE + requires_power = TRUE + +/area/shuttle/pirate/vault + name = "Pirate Shuttle Vault" + requires_power = FALSE \ No newline at end of file diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 0ca59c45bc..ed8a2f3aec 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -230,6 +230,10 @@ if(!currmsg || !answer || currmsg.possible_answers.len < answer) state = STATE_MESSAGELIST currmsg.answered = answer + log_game("[key_name(usr)] answered [currmsg.title] comm message. Answer : [currmsg.answered]") + if(currmsg) + currmsg.answer_callback.Invoke() + state = STATE_VIEWMESSAGE if("status") state = STATE_STATUSDISPLAY @@ -359,6 +363,9 @@ if(!aicurrmsg || !answer || aicurrmsg.possible_answers.len < answer) aistate = STATE_MESSAGELIST aicurrmsg.answered = answer + log_game("[key_name(usr)] answered [currmsg.title] comm message. Answer : [currmsg.answered]") + if(aicurrmsg.answer_callback) + aicurrmsg.answer_callback.Invoke() aistate = STATE_VIEWMESSAGE if("ai-status") aistate = STATE_STATUSDISPLAY @@ -733,3 +740,13 @@ var/content var/list/possible_answers = list() var/answered + var/datum/callback/answer_callback + +/datum/comm_message/New(new_title,new_content,new_possible_answers) + ..() + if(title) + title = new_title + if(content) + content = new_content + if(new_possible_answers) + possible_answers = new_possible_answers \ No newline at end of file diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index ea7ba25118..9a2798eacc 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -168,7 +168,8 @@ return log_game("[user.ckey] golem-swapped into [src]") user.visible_message("A faint light leaves [user], moving to [src] and animating it!","You leave your old body behind, and transfer into [src]!") - create(ckey = user.ckey, flavour = FALSE, name = user.real_name) + show_flavour = FALSE + create(ckey = user.ckey,name = user.real_name) user.death() return ..() @@ -526,3 +527,44 @@ /obj/effect/mob_spawn/human/oldsci/Destroy() new/obj/structure/showcase/machinery/oldpod/used(drop_location()) return ..() + + +#define PIRATE_NAMES_FILE "pirates.json" + +/obj/effect/mob_spawn/human/pirate + name = "space pirate sleeper" + desc = "A cryo sleeper smelling faintly of rum." + random = TRUE + icon = 'icons/obj/cryogenic2.dmi' + icon_state = "sleeper" + mob_name = "a space pirate" + mob_species = /datum/species/human + outfit = /datum/outfit/pirate/space + roundstart = FALSE + death = FALSE + anchored = TRUE + density = FALSE + show_flavour = FALSE //Flavour only exists for spawners menu + flavour_text = "You are a space pirate. The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot." + assignedrole = "Space Pirate" + var/rank = "Mate" + +/obj/effect/mob_spawn/human/pirate/special(mob/living/new_spawn) + new_spawn.fully_replace_character_name(new_spawn.real_name,generate_pirate_name()) + new_spawn.mind.add_antag_datum(/datum/antagonist/pirate) + +/obj/effect/mob_spawn/human/pirate/proc/generate_pirate_name() + var/beggings = strings(PIRATE_NAMES_FILE, "beginnings") + var/endings = strings(PIRATE_NAMES_FILE, "endings") + return "[rank] [pick(beggings)][pick(endings)]" + +/obj/effect/mob_spawn/human/pirate/Destroy() + new/obj/structure/showcase/machinery/oldpod/used(drop_location()) + return ..() + +/obj/effect/mob_spawn/human/pirate/captain + rank = "Captain" + outfit = /datum/outfit/pirate/space/captain + +/obj/effect/mob_spawn/human/pirate/gunner + rank = "Gunner" \ No newline at end of file diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 072b5dab37..26bfb80860 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -607,6 +607,20 @@ dat += "PM" dat += "" + + var/list/pirates = get_antagonists(/datum/antagonist/pirate) + if(pirates.len > 0) + dat += "
" + for(var/datum/mind/N in pirates) + var/mob/M = N.current + if(!M) + dat += "" + dat += "" + else + dat += "" + dat += "" + dat += "" + dat += "
Pirates
[N.name]([N.key])No body.PM
[M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""]PMFLW
" if(istype(SSticker.mode, /datum/game_mode/monkey)) var/datum/game_mode/monkey/mode = SSticker.mode diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 105fc9f570..9a156d6b62 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -4,6 +4,8 @@ /obj/effect/mob_spawn name = "Unknown" + density = TRUE + anchored = TRUE var/mob_type = null var/mob_name = "" var/mob_gender = null @@ -21,8 +23,7 @@ var/burn_damage = 0 var/mob_color //Change the mob's color var/assignedrole - density = TRUE - anchored = TRUE + var/show_flavour = TRUE var/banType = "lavaland" /obj/effect/mob_spawn/attack_ghost(mob/user) @@ -60,7 +61,7 @@ /obj/effect/mob_spawn/proc/equip(mob/M) return -/obj/effect/mob_spawn/proc/create(ckey, flavour = TRUE, name) +/obj/effect/mob_spawn/proc/create(ckey, name) var/mob/living/M = new mob_type(get_turf(src)) //living mobs only if(!random) M.real_name = mob_name ? mob_name : M.name @@ -80,7 +81,7 @@ if(ckey) M.ckey = ckey - if(flavour) + if(show_flavour) to_chat(M, "[flavour_text]") var/datum/mind/MM = M.mind if(objectives) diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 5a7a471e16..3fcb0648a1 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -8,6 +8,7 @@ var/safety_warning = "For safety reasons the automated supply shuttle \ cannot transport live organisms, classified nuclear weaponry or \ homing beacons." + var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible." light_color = "#E2853D"//orange @@ -54,8 +55,12 @@ data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE data["loan"] = !!SSshuttle.shuttle_loan data["loan_dispatched"] = SSshuttle.shuttle_loan && SSshuttle.shuttle_loan.dispatched - data["message"] = SSshuttle.centcom_message || "Remember to stamp and send back the supply manifests." - + var/message = "Remember to stamp and send back the supply manifests." + if(SSshuttle.centcom_message) + message = SSshuttle.centcom_message + if(SSshuttle.supplyBlocked) + message = blockade_warning + data["message"] = message data["supplies"] = list() for(var/pack in SSshuttle.supply_packs) var/datum/supply_pack/P = SSshuttle.supply_packs[pack] @@ -102,6 +107,9 @@ if(!SSshuttle.supply.canMove()) say(safety_warning) return + if(SSshuttle.supplyBlocked) + say(blockade_warning) + return if(SSshuttle.supply.getDockedId() == "supply_home") SSshuttle.supply.emagged = emagged SSshuttle.supply.contraband = contraband @@ -116,6 +124,9 @@ if("loan") if(!SSshuttle.shuttle_loan) return + if(SSshuttle.supplyBlocked) + say(blockade_warning) + return else if(SSshuttle.supply.mode != SHUTTLE_IDLE) return else if(SSshuttle.supply.getDockedId() != "supply_away") diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 0552c1b4b3..e16dd2a782 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -78,20 +78,38 @@ suit_store = /obj/item/gun/energy/laser/bluetag /datum/outfit/pirate - name = "Pirate" + name = "Space Pirate" uniform = /obj/item/clothing/under/pirate shoes = /obj/item/clothing/shoes/sneakers/brown + suit = /obj/item/clothing/suit/pirate head = /obj/item/clothing/head/bandana glasses = /obj/item/clothing/glasses/eyepatch - r_hand = /obj/item/melee/transforming/energy/sword/pirate /datum/outfit/pirate/space - name = "Space Pirate" - suit = /obj/item/clothing/suit/space/pirate + head = /obj/item/clothing/head/helmet/space/pirate/bandana + mask = /obj/item/clothing/mask/breath + suit_store = /obj/item/tank/internals/oxygen + ears = /obj/item/device/radio/headset/syndicate + id = /obj/item/card/id + +/datum/outfit/pirate/space/captain head = /obj/item/clothing/head/helmet/space/pirate +/datum/outfit/pirate/post_equip(mob/living/carbon/human/H) + H.faction |= "pirate" + + var/obj/item/device/radio/R = H.ears + if(R) + R.set_frequency(GLOB.SYND_FREQ) + R.freqlock = 1 + + var/obj/item/card/id/W = H.wear_id + if(W) + W.registered_name = H.real_name + W.update_label(H.real_name) + /datum/outfit/tunnel_clown name = "Tunnel Clown" diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 87f12aa679..e88b33e993 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -137,10 +137,16 @@ Contains: item_state = "pirate" armor = list(melee = 30, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 60, acid = 75) flags_1 = STOPSPRESSUREDMAGE_1 + flags_inv = HIDEHAIR strip_delay = 40 equip_delay_other = 20 flags_cover = HEADCOVERSEYES +/obj/item/clothing/head/helmet/space/pirate/bandana + name = "pirate bandana" + icon_state = "bandana" + item_state = "bandana" + /obj/item/clothing/suit/space/pirate name = "pirate coat" desc = "Yarr." diff --git a/code/modules/events/mice_migration.dm b/code/modules/events/mice_migration.dm index 6345dd53a7..372e00a0eb 100644 --- a/code/modules/events/mice_migration.dm +++ b/code/modules/events/mice_migration.dm @@ -22,7 +22,7 @@ priority_announce("Due to [cause], [plural] [name] have [movement] \ into the [location].", "Migration Alert", - 'sound/effects/mousesqueek.ogg', 100, 1) + 'sound/effects/mousesqueek.ogg') /datum/round_event/mice_migration/start() SSsqueak.trigger_migration(rand(minimum_mice, maximum_mice)) diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm new file mode 100644 index 0000000000..e1e605526d --- /dev/null +++ b/code/modules/events/pirates.dm @@ -0,0 +1,280 @@ +#define LOOT_LOCATOR_COOLDOWN 150 + +/datum/round_event_control/pirates + name = "Space Pirates" + typepath = /datum/round_event/pirates + weight = 8 + max_occurrences = 1 + min_players = 10 + earliest_start = 30 MINUTES + gamemode_blacklist = list("nuclear") + +/datum/round_event/pirates + startWhen = 60 //2 minutes to answer + var/datum/comm_message/threat + var/payoff = 0 + var/paid_off = FALSE + var/ship_name = "Space Privateers Association" + var/shuttle_spawned = FALSE + +/datum/round_event/pirates/setup() + ship_name = pick(strings(PIRATE_NAMES_FILE, "ship_names")) + +/datum/round_event/pirates/announce() + priority_announce("Incoming subspace communication. Secure channel opened at all communication consoles.", "Incoming Message", 'sound/ai/commandreport.ogg') + + if(!control) //Means this is false alarm, todo : explicit checks instead of using announceWhen + return + threat = new + payoff = round(SSshuttle.points * 0.80) + threat.title = "Business proposition" + threat.content = "This is [ship_name]. Pay up [payoff] credits or you'll walk the plank." + threat.possible_answers = list("We'll pay.","No way.") + threat.answer_callback = CALLBACK(src,.proc/answered) + SScommunications.send_message(threat,unique = TRUE) + +/datum/round_event/pirates/proc/answered() + if(threat && threat.answered == 1) + if(SSshuttle.points >= payoff) + SSshuttle.points -= payoff + priority_announce("Thanks for the credits, landlubbers.",sender_override = ship_name) + paid_off = TRUE + return + else + priority_announce("Trying to cheat us ? You'll regret this!",sender_override = ship_name) + if(!shuttle_spawned) + spawn_shuttle() + + + +/datum/round_event/pirates/start() + if(!paid_off && !shuttle_spawned) + spawn_shuttle() + +/datum/round_event/pirates/proc/spawn_shuttle() + shuttle_spawned = TRUE + + var/list/candidates = pollGhostCandidates("Do you wish to be considered for pirate crew ?", ROLE_TRAITOR) + shuffle_inplace(candidates) + + var/datum/map_template/pirate_event_ship/ship = new + var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width) + var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height) + var/z = ZLEVEL_EMPTY_SPACE + var/turf/T = locate(x,y,z) + if(!T) + CRASH("Pirate event found no turf to load in") + + if(!ship.load(T)) + CRASH("Loading pirate ship failed!") + for(var/turf/A in ship.get_affected_turfs(T)) + for(var/obj/effect/mob_spawn/human/pirate/spawner in A) + if(candidates.len > 0) + var/mob/M = candidates[1] + spawner.create(M.ckey) + candidates -= M + else + notify_ghosts("Space pirates are waking up!", source = spawner, action=NOTIFY_ATTACK, flashwindow = FALSE) + + priority_announce("Unidentified armed ship detected near the station.") + +//Shuttle equipment + +/obj/machinery/shuttle_scrambler + name = "Data Siphon" + desc = "This heap of machinery steals credits and data from unprotected systems and locks down cargo shuttles." + icon = 'icons/obj/machines/dominator.dmi' + icon_state = "dominator" + density = TRUE + anchored = TRUE + var/active = FALSE + var/obj/item/device/gps/gps + var/credits_stored = 0 + var/siphon_per_tick = 5 + +/obj/machinery/shuttle_scrambler/Initialize(mapload) + . = ..() + gps = new/obj/item/device/gps/internal/pirate(src) + gps.tracking = FALSE + update_icon() + +/obj/machinery/shuttle_scrambler/process() + if(active) + if(z in GLOB.station_z_levels) + var/siphoned = min(SSshuttle.points,siphon_per_tick) + SSshuttle.points -= siphoned + credits_stored += siphoned + steal_tech() + else + return + else + STOP_PROCESSING(SSobj,src) + +/obj/machinery/shuttle_scrambler/proc/toggle_on(mob/user) + SSshuttle.registerTradeBlockade(src) + gps.tracking = TRUE + active = TRUE + to_chat(user,"You toggle [src] [active ? "on":"off"].") + to_chat(user,"The scrambling signal can be now tracked by gps.") + START_PROCESSING(SSobj,src) + +/obj/machinery/shuttle_scrambler/interact(mob/user) + if(!active) + if(alert(user, "Turning the scrambler on will make the shuttle trackable by GPS. Are you sure you want to do it ?", "Scrambler", "Yes", "Cancel") == "Cancel") + return + if(active || !user.canUseTopic(src)) + return + toggle_on(user) + update_icon() + send_notification() + else + dump_loot(user) + +//20% to sap tech levels on unlocked consoles +/obj/machinery/shuttle_scrambler/proc/steal_tech() + if(!prob(20)) + return + var/datum/tech/target_tech = pick(subtypesof(/datum/tech)) + var/target_id = initial(target_tech.id) + for(var/obj/machinery/computer/rdconsole/C in GLOB.machines) + if(C.screen == RD_CONSOLE_LOCKED_SCREEN || C.stat & (NOPOWER|BROKEN)) + continue + var/datum/research/files = C.files + files.LowerTech(target_id,1) + new /obj/effect/temp_visual/emp(get_turf(C)) + for(var/obj/machinery/r_n_d/server/S in GLOB.machines) + if(S.stat & (NOPOWER|BROKEN)) + continue + var/datum/research/files = S.files + files.LowerTech(target_id,1) + new /obj/effect/temp_visual/emp(get_turf(S)) + +/obj/machinery/shuttle_scrambler/proc/dump_loot(mob/user) + if(credits_stored < 200) + to_chat(user,"Not enough credits to retrieve.") + return + while(credits_stored >= 200) + new /obj/item/stack/spacecash/c200(drop_location()) + credits_stored -= 200 + to_chat(user,"You retrieve the siphoned credits!") + + +/obj/machinery/shuttle_scrambler/proc/send_notification() + priority_announce("Data theft signal detected, source registered on local gps units.") + +/obj/machinery/shuttle_scrambler/proc/toggle_off(mob/user) + SSshuttle.clearTradeBlockade(src) + gps.tracking = FALSE + active = FALSE + STOP_PROCESSING(SSobj,src) + +/obj/machinery/shuttle_scrambler/update_icon() + if(active) + icon_state = "dominator-blue" + else + icon_state = "dominator" + +/obj/machinery/shuttle_scrambler/Destroy() + toggle_off() + QDEL_NULL(gps) + return ..() + +/datum/map_template/pirate_event_ship + name = "Pirate Ship" + mappath = "_maps/templates/pirate_ship.dmm" + +/obj/item/device/gps/internal/pirate + gpstag = "Nautical Signal" + desc = "You can hear shanties over the static." + +/obj/machinery/computer/shuttle/pirate + name = "pirate shuttle console" + shuttleId = "pirateship" + icon_screen = "syndishuttle" + icon_keyboard = "syndie_key" + light_color = LIGHT_COLOR_RED + possible_destinations = "pirateship_away;pirateship_home;pirateship_custom" + +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate + name = "pirate shuttle navigation computer" + desc = "Used to designate a precise transit location for the pirate shuttle." + shuttleId = "pirateship" + station_lock_override = TRUE + shuttlePortId = "pirateship_custom" + shuttlePortName = "custom location" + x_offset = 9 + y_offset = 0 + +/obj/docking_port/mobile/pirate + name = "pirate shuttle" + id = "pirateship" + var/engines_cooling = FALSE + var/engine_cooldown = 3 MINUTES + +/obj/docking_port/mobile/pirate/getStatusText() + . = ..() + if(engines_cooling) + return "[.] - Engines cooling." + +/obj/docking_port/mobile/pirate/dock(obj/docking_port/stationary/new_dock, movement_direction, force=FALSE) + . = ..() + if(. == DOCKING_SUCCESS && new_dock.z != ZLEVEL_TRANSIT) + engines_cooling = TRUE + addtimer(CALLBACK(src,.proc/reset_cooldown),engine_cooldown,TIMER_UNIQUE) + +/obj/docking_port/mobile/pirate/proc/reset_cooldown() + engines_cooling = FALSE + +/obj/docking_port/mobile/pirate/canMove() + if(engines_cooling) + return FALSE + return ..() + +/obj/machinery/suit_storage_unit/pirate + suit_type = /obj/item/clothing/suit/space + helmet_type = /obj/item/clothing/head/helmet/space + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/tank/internals/oxygen + +/obj/machinery/loot_locator + name = "Booty Locator" + desc = "This sophisticated machine scans the nearby space for items of value." + icon = 'icons/obj/machines/research.dmi' + icon_state = "tdoppler" + density = TRUE + anchored = TRUE + var/cooldown = 0 + var/result_count = 3 //Show X results. + +/obj/machinery/proc/display_current_value() + var/area/current = get_area(src) + var/value = 0 + for(var/turf/T in current.contents) + value += export_item_and_contents(T,TRUE, TRUE, dry_run = TRUE) + say("Current vault value : [value] credits.") + +/obj/machinery/loot_locator/interact(mob/user) + if(world.time <= cooldown) + to_chat(user,"[src] is recharging.") + return + cooldown = world.time + LOOT_LOCATOR_COOLDOWN + display_current_value() + var/list/results = list() + for(var/atom/movable/AM in world) + if(is_type_in_typecache(AM,GLOB.pirate_loot_cache)) + if(AM.z in GLOB.station_z_levels) + if(get_area(AM) == get_area(src)) //Should this be variable ? + continue + results += AM + CHECK_TICK + if(!results.len) + say("No valuables located. Try again later.") + else + for(var/i in 1 to result_count) + if(!results.len) + return + var/atom/movable/AM = pick_n_take(results) + var/area/loot_area = get_area(AM) + say("Located: [AM.name] at [loot_area.name]") + +#undef LOOT_LOCATOR_COOLDOWN \ No newline at end of file diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 2b397e4eda..1aa162d92e 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -387,8 +387,8 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /mob/proc/reagent_check(datum/reagent/R) // utilized in the species code return 1 -/proc/notify_ghosts(var/message, var/ghost_sound = null, var/enter_link = null, var/atom/source = null, var/mutable_appearance/alert_overlay = null, var/action = NOTIFY_JUMP, flashwindow = TRUE) //Easy notification of ghosts. - if(SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load +/proc/notify_ghosts(var/message, var/ghost_sound = null, var/enter_link = null, var/atom/source = null, var/mutable_appearance/alert_overlay = null, var/action = NOTIFY_JUMP, flashwindow = TRUE, ignore_mapload = TRUE) //Easy notification of ghosts. + if(ignore_mapload && SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load return for(var/mob/dead/observer/O in GLOB.player_list) if(O.client) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 76145466da..0d1a8904f4 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -315,10 +315,19 @@ /obj/machinery/computer/turbine_computer/Initialize() . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/computer/turbine_computer/LateInitialize() locate_machinery() /obj/machinery/computer/turbine_computer/locate_machinery() - compressor = locate(/obj/machinery/power/compressor) in range(5, src) + if(id) + for(var/obj/machinery/power/compressor/C in GLOB.machines) + if(C.comp_id == id) + compressor = C + return + else + compressor = locate(/obj/machinery/power/compressor) in range(5, src) /obj/machinery/computer/turbine_computer/attack_hand(var/mob/user as mob) if(..()) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index e02eb4a970..d67e899cdd 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -28,7 +28,6 @@ won't update every console in existence) but it's more of a hassle to do. Also, */ - /obj/machinery/computer/rdconsole name = "R&D Console" icon_screen = "rdcomp" @@ -660,7 +659,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(0.1) dat += "
Processing and Updating Database...
" - if(0.2) + if(RD_CONSOLE_LOCKED_SCREEN) dat += "
SYSTEM LOCKED
" dat += "Unlock" diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 89c0607060..12024c4265 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -134,6 +134,12 @@ research holder datum. /datum/research/proc/FindDesignByID(id) return known_designs[id] +/datum/research/proc/LowerTech(tech_id,value) + var/datum/tech/T = known_tech[tech_id] + T.level = max(initial(T.level),T.level - value) + known_designs.Cut() + RefreshResearch() + //Autolathe files /datum/research/autolathe/New() diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index 94cf55e0a0..3c40996029 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -13,8 +13,7 @@ /obj/machinery/computer/shuttle/attack_hand(mob/user) if(..(user)) return - src.add_fingerprint(usr) - + add_fingerprint(usr) var/list/options = params2list(possible_destinations) var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) var/dat = "Status: [M ? M.getStatusText() : "*Missing*"]

" diff --git a/strings/pirates.json b/strings/pirates.json new file mode 100644 index 0000000000..5c90fa5d5d --- /dev/null +++ b/strings/pirates.json @@ -0,0 +1,31 @@ +{ + "beginnings":[ + "Star", + "Oort", + "Comet", + "Pulsar", + "Plasma", + "Void", + "Space", + "Solar", + "Laser", + "Ion" + ], + "endings":[ + "keel", + "beard", + "bilge", + "hull", + "hook", + "flag", + "deck", + "salt", + "knot", + "fish", + "helm" + ], + "ship_names":[ + "Space Queen's Revenge", + "Syndicate Privateer" + ] +} \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 038a896bc3..7bacfae036 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -317,6 +317,7 @@ #include "code\datums\antagonists\devil.dm" #include "code\datums\antagonists\internal_affairs.dm" #include "code\datums\antagonists\ninja.dm" +#include "code\datums\antagonists\pirate.dm" #include "code\datums\antagonists\revolution.dm" #include "code\datums\antagonists\wizard.dm" #include "code\datums\components\_component.dm" @@ -1389,6 +1390,7 @@ #include "code\modules\events\mice_migration.dm" #include "code\modules\events\nightmare.dm" #include "code\modules\events\operative.dm" +#include "code\modules\events\pirates.dm" #include "code\modules\events\portal_storm.dm" #include "code\modules\events\prison_break.dm" #include "code\modules\events\processor_overload.dm"