From 6fa8e5f02da447e3dfa6a163eb5d153df6a5942a Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 11 Apr 2015 18:28:01 +0200 Subject: [PATCH] Adds Abduction Mode --- _maps/map_files/MetaStation/z2.dmm | 49 +- _maps/map_files/generic/z2.dmm | 50 +- code/__DEFINES/preferences.dm | 1 + code/_globalvars/configuration.dm | 3 +- code/controllers/configuration.dm | 3 + code/datums/helper_datums/icon_snapshot.dm | 15 + code/game/area/Space Station 13 areas.dm | 9 +- code/game/gamemodes/abduction/abduction.dm | 342 +++++++++++++ .../gamemodes/abduction/abduction_gear.dm | 295 +++++++++++ .../abduction/abduction_machinery.dm | 479 ++++++++++++++++++ .../gamemodes/abduction/abduction_surgery.dm | 46 ++ code/game/gamemodes/abduction/gland.dm | 163 ++++++ code/game/gamemodes/game_mode.dm | 1 + code/game/turfs/unsimulated/walls.dm | 3 + code/modules/admin/player_panel.dm | 12 + code/modules/admin/topic.dm | 5 + code/modules/admin/verbs/one_click_antag.dm | 56 ++ code/modules/client/preferences.dm | 5 +- .../mob/living/carbon/human/human_defines.dm | 4 +- .../mob/living/carbon/human/human_helpers.dm | 2 + .../mob/living/carbon/human/species.dm | 14 - .../mob/living/carbon/human/species_types.dm | 26 + .../mob/living/carbon/human/update_icons.dm | 8 + code/modules/mob/mob_helpers.dm | 3 + code/modules/surgery/helpers.dm | 6 + code/modules/surgery/surgery.dm | 3 +- html/changelogs/AnturK-Abductor.yml | 7 + icons/mob/human.dmi | Bin 67119 -> 68444 bytes icons/mob/suit.dmi | Bin 247550 -> 248314 bytes icons/obj/abductor.dmi | Bin 0 -> 11427 bytes tgstation.dme | 6 + 31 files changed, 1565 insertions(+), 51 deletions(-) create mode 100644 code/datums/helper_datums/icon_snapshot.dm create mode 100644 code/game/gamemodes/abduction/abduction.dm create mode 100644 code/game/gamemodes/abduction/abduction_gear.dm create mode 100644 code/game/gamemodes/abduction/abduction_machinery.dm create mode 100644 code/game/gamemodes/abduction/abduction_surgery.dm create mode 100644 code/game/gamemodes/abduction/gland.dm create mode 100644 html/changelogs/AnturK-Abductor.yml create mode 100644 icons/obj/abductor.dmi diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index e9ab0f0813f..724fd13145a 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -882,6 +882,26 @@ "qX" = (/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/holding) "qY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) "qZ" = (/obj/effect/landmark{name = "Holding Facility"},/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/holding) +"ra" = (/turf/unsimulated/wall/vault,/area/abductor_ship) +"rb" = (/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rc" = (/obj/effect/landmark/abductor/console,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rd" = (/obj/effect/landmark/abductor/console{team = 4},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"re" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel,/obj/item/weapon/surgicaldrill,/obj/item/weapon/paper/abductor,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rf" = (/obj/effect/landmark/abductor/scientist,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rg" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rh" = (/obj/effect/landmark/abductor/agent,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"ri" = (/obj/structure/optable,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rj" = (/obj/machinery/abductor/gland_dispenser,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rk" = (/obj/effect/landmark/abductor/scientist{team = 4},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rl" = (/obj/effect/landmark/abductor/agent{team = 4},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rm" = (/obj/structure/table,/obj/item/weapon/cautery,/obj/item/weapon/surgical_drapes,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rn" = (/obj/machinery/computer/security{name = "Human Observation Console"},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"ro" = (/obj/effect/landmark/abductor/console{team = 2},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rp" = (/obj/effect/landmark/abductor/console{team = 3},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rq" = (/obj/effect/landmark/abductor/scientist{team = 2},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rr" = (/obj/effect/landmark/abductor/agent{team = 2},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rs" = (/obj/effect/landmark/abductor/scientist{team = 3},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"rt" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababadaeaeaeaeaeafaeaeaeaeaeafaeaeaeaeaeafaeaeaeaeaeag @@ -1097,21 +1117,21 @@ abababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrararararaabababrararararaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrararbrcrbraraabrararbrdrbraraabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrarerbrbrbrbraabrarerbrbrbrbraabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrargrfrirhrjraabrargrkrirlrjraabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrarmrbrbrbrbraabrarmrbrbrbrbraabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrararbrnrbraraabrararbrnrbraraabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrararararaabababrararararaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrararararaabababrararararaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrararbrorbraraabrararbrprbraraabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrarerbrbrbrbraabrarerbrbrbrbraabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrargrqrirrrjraabrargrsrirtrjraabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrarmrbrbrbrbraabrarmrbrbrbrbraabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrararbrnrbraraabrararbrnrbraraabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrararararaabababrararararaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab @@ -1140,3 +1160,4 @@ abababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab "} + diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm index 2fe61ad1702..d8852568482 100644 --- a/_maps/map_files/generic/z2.dmm +++ b/_maps/map_files/generic/z2.dmm @@ -834,7 +834,27 @@ "qb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) "qc" = (/obj/effect/landmark{name = "Holding Facility"},/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/holding) "qd" = (/obj/docking_port/stationary/transit{dheight = 0; dir = 2; dwidth = 11; height = 22; id = "whiteship_transit"; width = 35},/turf/space/transit/horizontal,/area/space) - +"qe" = (/turf/unsimulated/wall/vault,/area/abductor_ship) +"qf" = (/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qg" = (/obj/effect/landmark/abductor/console,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qh" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel,/obj/item/weapon/surgicaldrill,/obj/item/weapon/paper/abductor,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qi" = (/obj/effect/landmark/abductor/scientist,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qj" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qk" = (/obj/effect/landmark/abductor/agent,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"ql" = (/obj/structure/optable,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qm" = (/obj/machinery/abductor/gland_dispenser,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qn" = (/obj/structure/table,/obj/item/weapon/cautery,/obj/item/weapon/surgical_drapes,/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qo" = (/obj/machinery/computer/security{name = "Human Observation Console"},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qp" = (/obj/effect/landmark/abductor/console{team = 2},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qq" = (/obj/effect/landmark/abductor/console{team = 3},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qr" = (/obj/effect/landmark/abductor/scientist{team = 2},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qs" = (/obj/effect/landmark/abductor/agent{team = 2},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qt" = (/obj/effect/landmark/abductor/scientist{team = 3},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qu" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qv" = (/obj/effect/landmark/abductor/console{team = 4},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qw" = (/obj/effect/landmark/abductor/scientist{team = 4},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) +"qx" = (/obj/effect/landmark/abductor/agent{team = 4},/turf/unsimulated/floor/bluegrid,/area/abductor_ship) + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababadaeaeaeaeaeafaeaeaeaeaeafaeaeaeaeaeafaeaeaeaeaeag aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahaiaiaiaiaiajakakakakakajalalalalalajamanananaoap @@ -1058,21 +1078,21 @@ abababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqeqeqeqeabababqeqeqeqeqeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqeqfqgqfqeqeabqeqeqfqvqfqeqeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqhqfqfqfqfqeabqeqhqfqfqfqfqeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqjqiqlqkqmqeabqeqjqwqlqxqmqeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqnqfqfqfqfqeabqeqnqfqfqfqfqeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqeqfqoqfqeqeabqeqeqfqoqfqeqeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqeqeqeqeabababqeqeqeqeqeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqeqeqeqeabababqeqeqeqeqeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqeqfqpqfqeqeabqeqeqfqqqfqeqeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqhqfqfqfqfqeabqeqhqfqfqfqfqeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqjqrqlqsqmqeabqeqjqtqlquqmqeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqnqfqfqfqfqeabqeqnqfqfqfqfqeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqeqfqoqfqeqeabqeqeqfqoqfqeqeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqeqeqeqeqeabababqeqeqeqeqeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 8f17fbaed20..cbb48c707c5 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -41,3 +41,4 @@ #define BE_MONKEY 2048 #define BE_GANG 4096 #define BE_SHADOWLING 8192 +#define BE_ABDUCTOR 16384 diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index 062be18c68d..fb04d0dd356 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -46,5 +46,6 @@ var/list/be_special_flags = list( "Blob" = BE_BLOB, "Ninja" = BE_NINJA, "Monkey" = BE_MONKEY, - "Gang" = BE_GANG + "Gang" = BE_GANG, + "Abductor" = BE_ABDUCTOR ) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 8b31f3a7c74..ec38e7265bb 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -92,6 +92,7 @@ var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors var/changeling_scaling_coeff = 6 //how much does the amount of players get divided by to determine changelings var/security_scaling_coeff = 8 //how much does the amount of players get divided by to determine open security officer positions + var/abductor_scaling_coeff = 15 //how many players per abductor team var/traitor_objectives_amount = 2 var/protect_roles_from_antagonist = 0 //If security and such can be traitor/cult/other @@ -421,6 +422,8 @@ config.changeling_scaling_coeff = text2num(value) if("security_scaling_coeff") config.security_scaling_coeff = text2num(value) + if("abductor_scaling_coeff") + config.abductor_scaling_coeff = text2num(value) if("traitor_objectives_amount") config.traitor_objectives_amount = text2num(value) if("probability") diff --git a/code/datums/helper_datums/icon_snapshot.dm b/code/datums/helper_datums/icon_snapshot.dm new file mode 100644 index 00000000000..22b402be446 --- /dev/null +++ b/code/datums/helper_datums/icon_snapshot.dm @@ -0,0 +1,15 @@ +/datum/icon_snapshot + var/name + var/icon + var/icon_state + var/list/overlays + +/datum/icon_snapshot/proc/makeImg() + if(!icon || !icon_state) + return + var/obj/temp = new + temp.icon = icon + temp.icon_state = icon_state + temp.overlays = overlays.Copy() + var/icon/tempicon = getFlatIcon(temp) // TODO Actually write something less heavy-handed for this + return tempicon diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index d9b12400f19..de1f395efb4 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -245,9 +245,12 @@ proc/process_ghost_teleport_locs() requires_power = 0 has_gravity = 1 - - - +//Abductors +/area/abductor_ship + name = "\improper Abductor Ship" + icon_state = "yellow" + requires_power = 0 + has_gravity = 1 //PRISON diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm new file mode 100644 index 00000000000..c934556f2b9 --- /dev/null +++ b/code/game/gamemodes/abduction/abduction.dm @@ -0,0 +1,342 @@ +/datum/game_mode + var/list/datum/mind/abductors = list() + +/datum/game_mode/abduction + name = "Abduction" + config_tag = "abduction" + antag_flag = BE_ABDUCTOR + pre_setup_before_jobs = 1 + recommended_enemies = 2 + required_players = 15 + var/max_teams = 4 + var/teams = 1 + var/list/datum/mind/scientists = list() + var/list/datum/mind/agents = list() + var/list/datum/objective/team_objectives = list() + var/list/team_names = list() + +/datum/game_mode/abduction/announce() + world << "The current game mode is - Abduction!" + +/datum/game_mode/abduction/pre_setup() + var/teams = max(1, min(max_teams,round(num_players()/config.abductor_scaling_coeff))) + var/possible_teams = max(1,round(antag_candidates.len / 2)) + teams = min(teams,possible_teams) + + abductors.len = 2*teams + scientists.len = teams + agents.len = teams + team_objectives.len = teams + team_names.len = teams + + for(var/i=1,i<=teams,i++) + if(!make_abductor_team(i)) + return 0 + + return 1 + +/datum/game_mode/abduction/proc/make_abductor_team(var/team_number) + //Team Name + team_names[team_number] = "Mothership [pick(possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names + //Team Objective + var/datum/objective/experiment/team_objective = new + team_objective.team = team_number + team_objectives[team_number] = team_objective + //Team Members + if(antag_candidates.len >=2) + var/datum/mind/scientist = pick(antag_candidates) + antag_candidates -= scientist + var/datum/mind/agent = pick(antag_candidates) + antag_candidates -= agent + + scientist.assigned_role = "MODE" + scientist.special_role = "Abductor" + log_game("[scientist.key] (ckey) has been selected as an abductor team [team_number] scientist.") + + agent.assigned_role = "MODE" + agent.special_role = "Abductor" + log_game("[agent.key] (ckey) has been selected as an abductor team [team_number] agent.") + + abductors += agent + abductors += scientist + scientists[team_number] = scientist + agents[team_number] = agent + return 1 + return 0 + +/datum/game_mode/abduction/post_setup() + //Spawn Team + var/list/obj/effect/landmark/abductor/agent_landmarks = new + var/list/obj/effect/landmark/abductor/scientist_landmarks = new + agent_landmarks.len = max_teams + scientist_landmarks.len = max_teams + for(var/obj/effect/landmark/abductor/A in landmarks_list) + if(istype(A,/obj/effect/landmark/abductor/agent)) + agent_landmarks[text2num(A.team)] = A + else if(istype(A,/obj/effect/landmark/abductor/scientist)) + scientist_landmarks[text2num(A.team)] = A + + var/datum/mind/agent + var/obj/effect/landmark/L + var/datum/mind/scientist + var/team_name + var/mob/living/carbon/human/H + var/datum/species/abductor/S + for(var/team_number=1,team_number<=teams,team_number++) + team_name = team_names[team_number] + agent = agents[team_number] + H = agent.current + L = agent_landmarks[team_number] + H.loc = L.loc + H.dna.species = new /datum/species/abductor() + S = H.dna.species + S.agent = 1 + S.team = team_number + H.real_name = team_name + " Agent" + equip_common(H,team_number) + equip_agent(H,team_number) + greet_agent(agent,team_number) + H.regenerate_icons() + + scientist = scientists[team_number] + H = scientist.current + L = scientist_landmarks[team_number] + H.loc = L.loc + H.dna.species = new /datum/species/abductor() + S = H.dna.species + S.scientist = 1 + S.team = team_number + H.real_name = team_name + " Scientist" + equip_common(H,team_number) + equip_scientist(H,team_number) + greet_scientist(scientist,team_number) + H.regenerate_icons() + return ..() + +//Used for create antag buttons +/datum/game_mode/abduction/proc/post_setup_team(var/team_number) + var/list/obj/effect/landmark/abductor/agent_landmarks = new + var/list/obj/effect/landmark/abductor/scientist_landmarks = new + agent_landmarks.len = max_teams + scientist_landmarks.len = max_teams + for(var/obj/effect/landmark/abductor/A in landmarks_list) + if(istype(A,/obj/effect/landmark/abductor/agent)) + agent_landmarks[text2num(A.team)] = A + else if(istype(A,/obj/effect/landmark/abductor/scientist)) + scientist_landmarks[text2num(A.team)] = A + + var/datum/mind/agent + var/obj/effect/landmark/L + var/datum/mind/scientist + var/team_name + var/mob/living/carbon/human/H + var/datum/species/abductor/S + + team_name = team_names[team_number] + agent = agents[team_number] + H = agent.current + L = agent_landmarks[team_number] + H.loc = L.loc + H.dna.species = new /datum/species/abductor() + S = H.dna.species + S.agent = 1 + S.team = team_number + H.real_name = team_name + " Agent" + equip_common(H,team_number) + equip_agent(H,team_number) + greet_agent(agent,team_number) + H.regenerate_icons() + + scientist = scientists[team_number] + H = scientist.current + L = scientist_landmarks[team_number] + H.loc = L.loc + H.dna.species = new /datum/species/abductor() + S = H.dna.species + S.scientist = 1 + S.team = team_number + H.real_name = team_name + " Scientist" + equip_common(H,team_number) + equip_scientist(H,team_number) + greet_scientist(scientist,team_number) + H.regenerate_icons() + + +/datum/game_mode/abduction/proc/greet_agent(var/datum/mind/abductor,var/team_number) + abductor.objectives += team_objectives[team_number] + var/team_name = team_names[team_number] + + abductor.current << "You are an Abductor Agent of [team_name]!" + abductor.current << "With the help of your teammate kidnap and experiment on station members!" + abductor.current << "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." + + var/obj_count = 1 + for(var/datum/objective/objective in abductor.objectives) + abductor.current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + return + +/datum/game_mode/abduction/proc/greet_scientist(var/datum/mind/abductor,var/team_number) + abductor.objectives += team_objectives[team_number] + var/team_name = team_names[team_number] + + abductor.current << "You are an Abductor Scientist of [team_name]!" + abductor.current << "With the help of your teammate kidnap and experiment on station members!" + abductor.current << "Use your tool and ship consoles to support the agent and retrieve human specimens." + + var/obj_count = 1 + for(var/datum/objective/objective in abductor.objectives) + abductor.current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + return + +/datum/game_mode/abduction/proc/equip_common(var/mob/living/carbon/human/agent,var/team_number) + var/radio_freq = SYND_FREQ + + var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(agent) + R.set_frequency(radio_freq) + agent.equip_to_slot_or_del(R, slot_ears) + agent.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(agent), slot_shoes) + agent.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(agent), slot_w_uniform) //they're greys gettit + agent.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(agent), slot_back) + +/datum/game_mode/abduction/proc/get_team_console(var/team) + var/obj/machinery/abductor/console/console + for(var/obj/machinery/abductor/console/c in machines) + if(c.team == team) + console = c + break + return console + +/datum/game_mode/abduction/proc/equip_agent(var/mob/living/carbon/human/agent,var/team_number) + var/obj/machinery/abductor/console/console = get_team_console(team_number) + var/obj/item/clothing/suit/armor/abductor/vest/V = new /obj/item/clothing/suit/armor/abductor/vest(agent) + if(console!=null) + console.vest = V + V.flags |= NODROP + agent.equip_to_slot_or_del(V, slot_wear_suit) + agent.equip_to_slot_or_del(new /obj/item/weapon/melee/baton/loaded(agent), slot_in_backpack) + agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/decloner/alien(agent), slot_belt) + agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack) + agent.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(agent), slot_in_backpack) + + +/datum/game_mode/abduction/proc/equip_scientist(var/mob/living/carbon/human/scientist,var/team_number) + var/obj/machinery/abductor/console/console = get_team_console(team_number) + var/obj/item/device/abductor/gizmo/G = new /obj/item/device/abductor/gizmo(scientist) + if(console!=null) + console.gizmo = G + G.console = console + scientist.equip_to_slot_or_del(G, slot_in_backpack) + + var/obj/item/weapon/implant/abductor/beamplant = new /obj/item/weapon/implant/abductor(scientist) + beamplant.imp_in = scientist + beamplant.implanted = 1 + beamplant.implanted(scientist) + beamplant.home = console.pad + + +/datum/game_mode/abduction/check_finished() + var/all_dead = 1 + for(var/team_number=1,team_number<=teams,team_number++) + var/datum/mind/smind = scientists[team_number] + if(smind.current) + var/mob/living/M = smind.current + if(M.stat != DEAD) + all_dead = 0 + var/obj/machinery/abductor/console/con = get_team_console(team_number) + var/datum/objective/objective = team_objectives[team_number] + if (con.experiment.points > objective.target_amount) + return 1 + if(all_dead) + return 1 + return ..() + +/datum/game_mode/abduction/declare_completion() + for(var/team_number=1,team_number<=teams,team_number++) + var/obj/machinery/abductor/console/console = get_team_console(team_number) + var/datum/objective/objective = team_objectives[team_number] + var/team_name = team_names[team_number] + var/datum/mind/amind = agents[team_number] + var/datum/mind/smind = scientists[team_number] + var/mob/living/carbon/human/agent = amind.current + var/mob/living/carbon/human/scientist = smind.current + if (console.experiment.points > objective.target_amount) + world << "[team_name] team fullfilled its mission! " + world << "Team Members : [agent.name]([agent.ckey]),[scientist.name]([scientist.ckey])" + else + world << "[team_name] team failed its mission! " + world << "Team Members : [agent.name]([agent.ckey]),[scientist.name]([scientist.ckey])" + ..() + return 1 + + +/datum/game_mode/proc/auto_declare_completion_abduction() + if(abductors.len) + world << "Abductors:" + for(var/datum/mind/M in abductors) + world << "Abductor [M.current ? M.current.name : "Abductor"]([M.key])" + return + +//Landmarks +// TODO: Split into seperate landmarks for prettier ships +/obj/effect/landmark/abductor + var/team = 1 +/obj/effect/landmark/abductor/console/New() + var/obj/machinery/abductor/console/c = new /obj/machinery/abductor/console(src.loc) + var/pad_loc = get_step(c,EAST) + var/obj/machinery/abductor/pad/p = new /obj/machinery/abductor/pad(pad_loc) + var/experiment_loc = get_step(c,WEST) + var/obj/machinery/abductor/experiment/e = new /obj/machinery/abductor/experiment(experiment_loc) + c.team = team + c.pad = p + c.experiment = e + e.console = c + qdel(src) + +/obj/effect/landmark/abductor/agent +/obj/effect/landmark/abductor/scientist + + +// OBJECTIVES +datum/objective/experiment + dangerrating = 10 + target_amount = 6 + var/team + +datum/objective/experiment/New() + explanation_text = "Experiment on [target_amount] humans" + +datum/objective/experiment/check_completion() + return 0 + +datum/objective/abductee + dangerrating = 5 + completed = 1 + +datum/objective/abductee/steal + explanation_text = "Steal all" + +datum/objective/abductee/steal/New() + var/target = pick(list("Pets","Lights","Monkeys","Fruits","Shoes","Soap Bars")) + explanation_text+=" [target]" + +datum/objective/abductee/capture + explanation_text = "Capture" + +datum/objective/abductee/capture/New() + var/list/jobs = SSjob.occupations + for(var/datum/job/J in jobs) + if(J.current_positions < 1) + jobs -= J + if(jobs.len > 0) + var/datum/job/target = pick(jobs) + explanation_text += " \a [target.title]." + else + explanation_text += " someone." + +datum/objective/abductee/shuttle + explanation_text = "You must escape the station! Get the shuttle called!" + +datum/objective/abductee/noclone + explanation_text = "Don't allow anyone to be cloned." \ No newline at end of file diff --git a/code/game/gamemodes/abduction/abduction_gear.dm b/code/game/gamemodes/abduction/abduction_gear.dm new file mode 100644 index 00000000000..761c670d5ed --- /dev/null +++ b/code/game/gamemodes/abduction/abduction_gear.dm @@ -0,0 +1,295 @@ +#define VEST_STEALTH 1 +#define VEST_COMBAT 2 +#define GIZMO_SCAN 1 +#define GIZMO_MARK 2 + +//AGENT VEST +/obj/item/clothing/suit/armor/abductor/vest + name = "Agent Vest" + desc = "Vest outfitted with alien stealth technology." + icon = 'icons/obj/abductor.dmi' + icon_state = "vest_stealth" + item_state = "armor" + blood_overlay_type = "armor" + armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) + action_button_name = "Activate" + action_button_is_hands_free = 1 + var/mode = VEST_STEALTH + var/stealth_active = 0 + var/combat_cooldown = 10 + var/datum/icon_snapshot/disguise + var/stealth_armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) + var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50) + +/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() + switch(mode) + if(VEST_STEALTH) + mode = VEST_COMBAT + DeactivateStealth() + armor = combat_armor + icon_state = "vest_combat" + return + if(VEST_COMBAT)// TO STEALTH + mode = VEST_STEALTH + armor = stealth_armor + icon_state = "vest_stealth" + return + +/obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(var/datum/icon_snapshot/entry) + disguise = entry + +/obj/item/clothing/suit/armor/abductor/vest/proc/ActivateStealth() + if(disguise == null) + return + stealth_active = 1 + if(istype(src.loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = src.loc + spawn(0) + anim(M.loc,M,'icons/mob/mob.dmi',,"cloak",,M.dir) + + M.name_override = disguise.name + M.icon = disguise.icon + M.icon_state = disguise.icon_state + M.overlays = disguise.overlays + M.update_inv_r_hand() + M.update_inv_l_hand() + return + +/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth() + if(!stealth_active) + return + stealth_active = 0 + if(istype(src.loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = src.loc + spawn(0) + anim(M.loc,M,'icons/mob/mob.dmi',,"uncloak",,M.dir) + M.name_override = null + M.overlays.Cut() + M.regenerate_icons() + return + +/obj/item/clothing/suit/armor/abductor/vest/IsShield() + DeactivateStealth() + return 0 +/obj/item/clothing/suit/armor/abductor/vest/IsReflect() + DeactivateStealth() + return 0 + +/obj/item/clothing/suit/armor/abductor/vest/ui_action_click() + switch(mode) + if(VEST_COMBAT) + Adrenaline() + if(VEST_STEALTH) + if(stealth_active) + DeactivateStealth() + else + ActivateStealth() + +/obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline() + if(istype(src.loc, /mob/living/carbon/human)) + if(combat_cooldown != initial(combat_cooldown)) + src.loc << "Combat injection is still recharging." + var/mob/living/carbon/human/M = src.loc + M.stat = 0 + M.SetParalysis(0) + M.SetStunned(0) + M.SetWeakened(0) + M.lying = 0 + M.update_canmove() + M.adjustStaminaLoss(-75) + combat_cooldown = 0 + SSobj.processing |= src + +/obj/item/clothing/suit/armor/abductor/vest/process() + combat_cooldown++ + if(combat_cooldown==initial(combat_cooldown)) + SSobj.processing.Remove(src) + +/obj/item/device/abductor/proc/AbductorCheck(var/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.dna.species.id != "abductor") + user << "You can't figure how this works." + return 0 + return 1 + return 0 + +/obj/item/device/abductor/proc/ScientistCheck(var/user) + var/mob/living/carbon/human/H = user + var/datum/species/abductor/S = H.dna.species + return S.scientist + +/obj/item/device/abductor/gizmo + name = "Science Tool" + desc = "Alien science is 90% dissections 10% probings." + icon = 'icons/obj/abductor.dmi' + icon_state = "gizmo_scan" + item_state = "pen" + var/mode = GIZMO_SCAN + var/mob/living/marked + var/prepared = 0 + var/obj/machinery/abductor/console/console + +/obj/item/device/abductor/gizmo/attack_self(mob/user) + if(!AbductorCheck(user)) + return + if(!ScientistCheck(user)) + user << "You're not trained to use this" + return + if(mode == GIZMO_SCAN) + mode = GIZMO_MARK + icon_state = "gizmo_mark" + else + mode = GIZMO_SCAN + icon_state = "gizmo_scan" + user << "You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE" + +/obj/item/device/abductor/gizmo/attack(mob/living/M, mob/user) + if(!AbductorCheck(user)) + return + if(!ScientistCheck(user)) + user << "You're not trained to use this" + return + switch(mode) + if(GIZMO_SCAN) + scan(M, user) + if(GIZMO_MARK) + if(marked == M && !prepared) + prepare(M,user) + mark(M, user) + + +/obj/item/device/abductor/gizmo/afterattack(var/atom/target, var/mob/living/user, flag, params) + if(flag) + return + if(!AbductorCheck(user)) + return + if(!ScientistCheck(user)) + user << "You're not trained to use this" + return + switch(mode) + if(GIZMO_SCAN) + scan(target, user) + if(GIZMO_MARK) + mark(target, user) + +/obj/item/device/abductor/gizmo/proc/scan(var/atom/target, var/mob/living/user) + if(istype(target,/mob/living/carbon/human)) + if(console!=null) + console.AddSnapshot(target) + user << "You scan and add the being to the database" + +/obj/item/device/abductor/gizmo/proc/mark(var/atom/target, var/mob/living/user) + if(marked != target) + prepared = 0 + else + user << "This specimen is already marked." + if(istype(target,/mob/living/carbon/human)) + marked = target + user << "You mark the target for future retrieval." + +/obj/item/device/abductor/gizmo/proc/prepare(var/atom/target, var/mob/living/user) + user << "You start preparing the specimen for transport " + if(do_after(user, 100)) + prepared = 1 + user << "You finish preparing the specimen for transport " + + +/obj/item/device/abductor/silencer + name = "Abductor Silencer" + desc = "Device used to break communication equipment" + icon = 'icons/obj/abductor.dmi' + icon_state = "silencer" + item_state = "pen" + +/obj/item/device/abductor/silencer/attack(mob/living/M, mob/user) + if(!AbductorCheck(user)) + return + radio_off(M, user) + +/obj/item/device/abductor/silencer/afterattack(var/atom/target, var/mob/living/user, flag, params) + if(flag) + return + if(!AbductorCheck(user)) + return + radio_off(target, user) + +/obj/item/device/abductor/silencer/proc/radio_off(var/atom/target, var/mob/living/user) + if( !(user in (viewers(7,target))) ) + return + + var/turf/targloc = get_turf(target) + + var/mob/living/carbon/human/M + for(M in view(2,targloc)) + user << "You silence [M.name] radio devices." + radio_off_mob(M) + +/obj/item/device/abductor/silencer/proc/radio_off_mob(var/mob/living/carbon/human/M) + var/list/all_items = M.GetAllContents() + + for(var/obj/I in all_items) + if(istype(I,/obj/item/device/radio/)) + var/obj/item/device/radio/r = I + r.listening = 0 + if(!istype(I,/obj/item/device/radio/headset)) + r.broadcasting = 0 //goddamned headset hacks + + +/obj/item/weapon/implant/abductor + name = "Emergency Beam" + desc = "Gets you back on the ship." + icon = 'icons/obj/abductor.dmi' + icon_state = "implant" + activated = 1 + var/obj/machinery/abductor/pad/home + var/cooldown = 30 + +/obj/item/weapon/implant/abductor/activate() + if(cooldown == initial(cooldown)) + home.Retrieve(imp_in,1) + cooldown = 0 + SSobj.processing |= src + else + imp_in << "The emergency beam is still recharging!" + return + +/obj/item/weapon/implant/abductor/process() + if(cooldown < initial(cooldown)) + cooldown++ + if(cooldown == initial(cooldown)) + SSobj.processing.Remove(src) + + +/obj/item/device/firing_pin/alien + name = "alien-looking pin" + desc = "Only non-humans can use this pin" + fail_message = "Human DNA detected! Authorization revoked!" + +/obj/item/device/firing_pin/alien/pin_auth(mob/living/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.dna.species.id == "human") //stealth lizard buff go + return 0 + return 1 + +/obj/item/weapon/gun/energy/decloner/alien + ammo_type = list(/obj/item/ammo_casing/energy/declone) + pin = /obj/item/device/firing_pin/alien + +/obj/item/weapon/paper/abductor + name = "Dissection Guide" + info = {""Dissection for Dummies
+
+1.Acquire fresh specimen.
+2.Put the specimen on operating table
+3.Apply surgical drapes preparing for dissection
+4.Apply scalpel to specimen torso
+5.Stop the bleeders and retract skin
+6.Cut out organs you find with a scalpel
+7.Use your hands to remove the remaining organs
+8.Insert replacement gland (Retrieve one from gland storage)
+9.Put the specimen in the experiment machinery
+8.Choose one of the machine options and follow displayed instructions
+
+Congratulations! You are now trained for xenobiology research!""} \ No newline at end of file diff --git a/code/game/gamemodes/abduction/abduction_machinery.dm b/code/game/gamemodes/abduction/abduction_machinery.dm new file mode 100644 index 00000000000..2a03326d690 --- /dev/null +++ b/code/game/gamemodes/abduction/abduction_machinery.dm @@ -0,0 +1,479 @@ +/obj/machinery/abductor/console + name = "Abductor console" + desc = "Ship command center." + icon = 'icons/obj/abductor.dmi' + icon_state = "console" + density = 1 + anchored = 1.0 + var/team = 0 + var/obj/item/device/abductor/gizmo/gizmo + var/obj/item/clothing/suit/armor/abductor/vest/vest + var/obj/machinery/abductor/experiment/experiment + var/obj/machinery/abductor/pad/pad + var/list/datum/icon_snapshot/disguises = list() + +/obj/machinery/abductor/console/attack_hand(var/mob/user as mob) + if(..()) + return + if(!IsAbductor(user)) + return + user.set_machine(src) + var/dat = "" + dat += "

Abductsoft 3000

" + + if(experiment != null) + var/points = experiment.points + dat += "Collected Samples : [points]
" + else + dat += "NO EXPERIMENT MACHINE DETECTED
" + + if(pad!=null) + dat += "Activate Teleporter
" + dat += "Set Teleporter
" + if(gizmo!=null && gizmo.marked!=null) + dat += "Retrieve Mark
" + else + dat += "Retrieve Mark
" + else + dat += "NO TELEPAD DETECTED
" + + if(vest!=null) + dat += "

Agent Vest Mode


" + var/mode = vest.mode + if(mode == VEST_STEALTH) + dat += "Combat" + dat += "Stealth" + else + dat += "Combat" + dat += "Stealth" + + dat+="
" + dat += "Select Agent Vest Disguise
" + else + dat += "NO AGENT VEST DETECTED" + var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/abductor/console/Topic(href, href_list) + if(..()) + return + if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + usr.set_machine(src) + if(href_list["teleporter_set"]) + TeleporterSet() + else if(href_list["teleporter_send"]) + TeleporterSend() + else if(href_list["teleporter_retrieve"]) + TeleporterRetrieve() + else if(href_list["flip_vest"]) + FlipVest() + else if(href_list["select_disguise"]) + SelectDisguise() + src.updateUsrDialog() + +/obj/machinery/abductor/console/proc/TeleporterSet() + var/A = null + A = input("Select area to teleport to", "Teleport", A) in teleportlocs + if(pad!=null) + pad.teleport_target = teleportlocs[A] + return + +/obj/machinery/abductor/console/proc/TeleporterRetrieve() + if(gizmo!=null && pad!=null) + pad.Retrieve(gizmo.marked,gizmo.prepared) + return + +/obj/machinery/abductor/console/proc/TeleporterSend() + if(pad!=null) + pad.Send() + return + +/obj/machinery/abductor/console/proc/FlipVest() + if(vest!=null) + vest.flip_mode() + return + +/obj/machinery/abductor/console/proc/SelectDisguise() + var/list/entries = list() + var/tempname + var/datum/icon_snapshot/temp + for(var/i = 1; i <= disguises.len; i++) + temp = disguises[i] + tempname = temp.name + entries["[tempname]"] = disguises[i] + var/entry_name = input( "Choose Disguise", "Disguise") in entries + var/datum/icon_snapshot/chosen = entries[entry_name] + if(chosen) + vest.SetDisguise(chosen) + return + +/obj/machinery/abductor/console/proc/AddSnapshot(var/mob/living/carbon/human/target) + var/datum/icon_snapshot/entry = new + entry.name = target.name + entry.icon = target.icon + entry.icon_state = target.icon_state + entry.overlays = target.get_overlays_copy(list(L_HAND_LAYER,R_HAND_LAYER)) + for(var/i=1,i<=disguises.len,i++) + var/datum/icon_snapshot/temp = disguises[i] + if(temp.name == entry.name) + disguises[i] = entry + return + disguises.Add(entry) + return + +/obj/machinery/abductor/pad + name = "Alien Telepad" + desc = "Use this to transport to and from human habitat" + icon = 'icons/obj/abductor.dmi' + icon_state = "alien-pad-idle" + anchored = 1 + var/area/teleport_target + +/obj/machinery/abductor/proc/IsAbductor(var/mob/living/carbon/human/H) + return H.dna.species.id == "abductor" + +/obj/machinery/abductor/proc/IsAgent(var/mob/living/carbon/human/H) + if(H.dna.species.id == "abductor") + var/datum/species/abductor/S = H.dna.species + return S.agent + return 0 + +/obj/machinery/abductor/proc/IsScientist(var/mob/living/carbon/human/H) + if(H.dna.species.id == "abductor") + var/datum/species/abductor/S = H.dna.species + return S.scientist + return 0 + +/obj/machinery/abductor/proc/TeleportToArea(var/mob/living/target,var/area/thearea) + var/list/L = list() + for(var/turf/T in get_area_turfs(thearea.type)) + if(!T.density) + var/clear = 1 + for(var/obj/O in T) + if(O.density) + clear = 0 + break + if(clear) + L+=T + if(!L.len) + return + + if(target && target.buckled) + target.buckled.unbuckle_mob() + + var/list/tempL = L + var/attempt = null + var/success = 0 + while(tempL.len) + attempt = pick(tempL) + target.Move(attempt) + if(get_turf(target) == attempt) + success = 1 + break + else + tempL.Remove(attempt) + if(!success) + target.loc = pick(L) + +/obj/machinery/abductor/pad/proc/Warp(var/mob/living/target) + target.Move(src.loc) + +/obj/machinery/abductor/pad/proc/Send() + flick("alien-pad", src) + for(var/mob/living/target in src.loc) + TeleportToArea(target,teleport_target) + spawn(0) + anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir) + +/obj/machinery/abductor/pad/proc/Retrieve(var/mob/living/carbon/human/target,var/forced) + flick("alien-pad", src) + if(IsAbductor(target) || forced) + spawn(0) + anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir) + Warp(target) + +/obj/machinery/abductor/experiment + name = "Experimental machinery" + desc = "A human-sized coffin sporting wide array of automatic surgery tools" + icon = 'icons/obj/abductor.dmi' + icon_state = "experiment-open" + density = 0 + anchored = 1 + state_open = 1 + var/team = 0 + var/points = 0 + var/list/history = new + var/flash = " - || - " + var/obj/machinery/abductor/console/console + +/obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user) + if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) + return + if(IsAbductor(target)) + return + close_machine(target) + +/obj/machinery/abductor/experiment/allow_drop() + return 0 + +/obj/machinery/abductor/experiment/attack_hand(mob/user) + if(..()) + return + + experimentUI(user) + +/obj/machinery/abductor/experiment/open_machine() + if(!state_open && !panel_open) + ..() + +/obj/machinery/abductor/experiment/close_machine(mob/target) + if(state_open && !panel_open && !IsAbductor(target)) + ..(target) + +/obj/machinery/abductor/experiment/proc/dissection_icon(var/mob/living/carbon/human/H) + var/icon/photo = null + var/g = (H.gender == FEMALE) ? "f" : "m" + if(!config.mutant_races || H.dna.species.use_skintones) + photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s") + else + photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s") + photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY) + + var/icon/eyes_s + if(EYECOLOR in H.dna.species.specflags) + eyes_s = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[H.dna.species.eyes]_s") + eyes_s.Blend("#[H.eye_color]", ICON_MULTIPLY) + + var/datum/sprite_accessory/S + S = hair_styles_list[H.hair_style] + if(S && (HAIR in H.dna.species.specflags)) + var/icon/hair_s = icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") + hair_s.Blend("#[H.hair_color]", ICON_MULTIPLY) + eyes_s.Blend(hair_s, ICON_OVERLAY) + + S = facial_hair_styles_list[H.facial_hair_style] + if(S && (FACEHAIR in H.dna.species.specflags)) + var/icon/facial_s = icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") + facial_s.Blend("#[H.facial_hair_color]", ICON_MULTIPLY) + eyes_s.Blend(facial_s, ICON_OVERLAY) + + if(eyes_s) + photo.Blend(eyes_s, ICON_OVERLAY) + + var/icon/splat = icon("icon" = 'icons/mob/dam_human.dmi',"icon_state" = "chest30") + photo.Blend(splat,ICON_OVERLAY) + + return photo + +/obj/machinery/abductor/experiment/proc/experimentUI(mob/user) + var/dat + dat += "

Experiment

" + if(occupant) + var/obj/item/weapon/photo/P = new + P.photocreate(null, icon(dissection_icon(occupant), dir = SOUTH)) + user << browse_rsc(P.img, "dissection_img") + dat += "
" + dat += "" //Avert your eyes + dat += "" + dat += "Probe
" + dat += "Dissect
" + dat += "Analyze
" + dat += "
" + else + dat += " Experiment " + + if(!occupant) + dat += "

Machine Unoccupied

" + else + dat += "

Subject Status :

" + dat += "[occupant.name] => " + switch(occupant.stat) + if(0) + dat += "Conscious" + if(1) + dat += "Unconscious" + else + dat += "DEAD" + dat += "
" + dat += "[flash]" + dat += "
" + dat += "Scan" + dat += "Close" : "open=1'>Open"]" + var/datum/browser/popup = new(user, "experiment", "Probing Console", 300, 300) + popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) + popup.set_content(dat) + popup.open() + +/obj/machinery/abductor/experiment/Topic(href, href_list) + if(..() || usr == occupant) + return + usr.set_machine(src) + if(href_list["refresh"]) + updateUsrDialog() + return + if(href_list["open"]) + open_machine() + return + if(href_list["close"]) + close_machine() + return + if(occupant && occupant.stat != DEAD) + if(href_list["experiment"]) + flash = Experiment(occupant,href_list["experiment"]) + updateUsrDialog() + add_fingerprint(usr) + +/obj/machinery/abductor/experiment/proc/Experiment(var/mob/occupant,var/type) + var/mob/living/carbon/human/H = occupant + var/point_reward = 0 + if(H in history) + return "Specimen already in the database" + if(H.stat == DEAD) + say("Specimen deceased - please provide fresh sample.") + return "Specimen Deceased" + if(H.mind != null || H.ckey != null) + history += H + say("Processing Specimen...") + sleep(5) + switch(text2num(type)) + if(1) + H << "You feel violated." + if(2) + H << "You feel being sliced and put back together." + if(3) + H << "You feel under intense scrutiny." + sleep(5) + H << "Your mind snaps!" + var/objtype = pick(typesof(/datum/objective/abductee/) - /datum/objective/abductee/) + var/datum/objective/abductee/O = new objtype() + H.mind.objectives += O + var/obj_count = 1 + H << "Your current objectives:" + for(var/datum/objective/objective in H.mind.objectives) + H << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + + for(var/obj/item/gland/G in H) + G.Start() + point_reward++ + if(point_reward > 0) + open_machine() + SendBack(H) + playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + points += point_reward + return "Experiment Successfull! [point_reward] new data-points collected." + else + playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) + return "Experiment Failed! No replacement organ detected." + else + say("Brain Activity Nonexistant - Disposing Sample...") + open_machine() + SendBack(H) + return "Specimen Braindead - Disposed" + return "ERROR" + + +/obj/machinery/abductor/experiment/proc/SendBack(var/mob/living/carbon/human/H) + H.Sleeping(8) + var/area/A + if(console && console.pad && console.pad.teleport_target) + A = console.pad.teleport_target + else + A = teleportlocs[pick(teleportlocs)] + TeleportToArea(H,A) + +/obj/machinery/abductor/experiment/update_icon() + if(state_open) + icon_state = "experiment-open" + else + icon_state = "experiment" + +/obj/machinery/abductor/experiment/say_quote(text) + return "beeps, \"[text]\"" + + +/obj/machinery/abductor/gland_dispenser + name = "Replacement Organ Storage" + desc = "A tank filled with replacement organs" + icon = 'icons/obj/abductor.dmi' + icon_state = "dispenser" + density = 1 + anchored = 1 + var/list/gland_types + var/list/gland_colors + var/list/amounts + +/obj/machinery/abductor/gland_dispenser/proc/random_color() + //TODO : replace with presets or spectrum + return rgb(rand(0,255),rand(0,255),rand(0,255)) + +/obj/machinery/abductor/gland_dispenser/New() + gland_types = typesof(/obj/item/gland) - /obj/item/gland + gland_types = shuffle(gland_types) + gland_colors = new/list(gland_types.len) + amounts = new/list(gland_types.len) + for(var/i=1,i<=gland_types.len,i++) + gland_colors[i] = random_color() + amounts[i] = rand(1,5) + +/obj/machinery/abductor/gland_dispenser/attack_hand(var/mob/user as mob) + if(..()) + return + if(!IsAbductor(user)) + return + user.set_machine(src) + var/box_css = {" + "} + var/dat = "" + var/item_count = 0 + for(var/i=1,i<=gland_colors.len,i++) + item_count++ + var/g_color = gland_colors[i] + var/amount = amounts[i] + dat += "[amount]" + if(item_count == 3) // Three boxes per line + dat +="

" + item_count = 0 + var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200) + popup.add_head_content(box_css) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/gland)) + user.drop_item() + W.loc = src + for(var/i=1,i<=gland_colors.len,i++) + if(gland_types[i] == W.type) + amounts[i]++ + +/obj/machinery/abductor/gland_dispenser/Topic(href, href_list) + if(..()) + return + if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + usr.set_machine(src) + if(href_list["dispense"]) + Dispense(text2num(href_list["dispense"])) + src.updateUsrDialog() + +/obj/machinery/abductor/gland_dispenser/proc/Dispense(var/count) + if(amounts[count]>0) + amounts[count]-- + var/T = gland_types[count] + new T(get_turf(src)) \ No newline at end of file diff --git a/code/game/gamemodes/abduction/abduction_surgery.dm b/code/game/gamemodes/abduction/abduction_surgery.dm new file mode 100644 index 00000000000..62308897062 --- /dev/null +++ b/code/game/gamemodes/abduction/abduction_surgery.dm @@ -0,0 +1,46 @@ +/datum/surgery/organ_extraction + name = "experimental dissection" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin,/datum/surgery_step/incise, /datum/surgery_step/extract_organ ,/datum/surgery_step/gland_insert) + species = list(/mob/living/carbon/human) + location = "chest" + user_species_restricted = 1 + user_species_ids = list("abductor") + +/datum/surgery_step/extract_organ + accept_hand = 1 + time = 32 + var/obj/item/IC = null + var/list/organ_types = list(/obj/item/organ/heart) + +/datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + for(var/obj/item/I in target.internal_organs) + if(I.type in organ_types) + IC = I + break + user.visible_message("[user] starts to remove [target]'s organs.") + +/datum/surgery_step/extract_organ/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(IC) + user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!") + user.put_in_hands(IC) + target.internal_organs -= IC + return 1 + else + user.visible_message("[user] doesn't find anything in [target]'s [target_zone].") + return 0 + +/datum/surgery_step/gland_insert + implements = list(/obj/item/gland = 100) + time = 32 + +/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] starts to insert [tool] into [target].") + +/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] inserts [tool] into [target].") + user.drop_item() + var/obj/item/gland/gland = tool + gland.Inject(target) + return 1 + + diff --git a/code/game/gamemodes/abduction/gland.dm b/code/game/gamemodes/abduction/gland.dm new file mode 100644 index 00000000000..0b93c7f29c7 --- /dev/null +++ b/code/game/gamemodes/abduction/gland.dm @@ -0,0 +1,163 @@ +/obj/item/gland/ + name = "Fleshy mass" + desc = "Eww" + icon = 'icons/obj/abductor.dmi' + icon_state = "gland" + var/cooldown_low = 30 + var/cooldown_high = 30 + var/cooldown_current = 0 + var/cooldown = 0 + var/uses // -1 For inifinite + var/active = 0 + var/mob/living/carbon/human/host + +/obj/item/gland/proc/HostCheck() + if(ishuman(host) && host == src.loc) + if(host.stat != DEAD) + return 1 + return 0 + +/obj/item/gland/proc/Start() + active = 1 + SSobj.processing |= src + +/obj/item/gland/proc/Inject(var/mob/living/carbon/human/target) + host = target + target.internal_organs += src + src.loc = target + +/obj/item/gland/process() + if(!active) + SSobj.processing.Remove(src) + return + cooldown++ + if(cooldown >= cooldown_current) + //This gives a chance to transplant the gland active into someone else if you're fast + if(!HostCheck()) + active = 0 + return + activate() + uses-- + cooldown = 0 + cooldown_current = rand(cooldown_low,cooldown_high) + if(uses == 0) + active = 0 + +/obj/item/gland/proc/activate() + return + +/obj/item/gland/heals + cooldown_low = 20 + cooldown_high = 40 + uses = -1 + +obj/item/gland/heals/activate() + host << "You feel weird." + host.adjustBruteLoss(-20) + host.adjustOxyLoss(-20) + host.adjustFireLoss(-20) + +/obj/item/gland/slime + cooldown_low = 60 + cooldown_high = 120 + uses = -1 + +obj/item/gland/slime/activate() + host << "You feel weird." + + host.visible_message("[host] vomits on the floor!", \ + "You throw up on the floor!") + + host.nutrition -= 20 + host.adjustToxLoss(-3) + + var/turf/pos = get_turf(host) + pos.add_vomit_floor(host) + playsound(pos, 'sound/effects/splat.ogg', 50, 1) + + var/mob/living/simple_animal/slime/Slime = new/mob/living/simple_animal/slime(pos) + Slime.Friends = list(host) + Slime.Leader = host + +/obj/item/gland/mindshock + cooldown_low = 30 + cooldown_high = 30 + uses = -1 + +/obj/item/gland/mindshock/activate() + host << "You feel weird." + + var/turf/T = get_turf(host) + for(var/mob/living/carbon/human/H in orange(4,T)) + if(H == host) + continue + H << " You hear a buzz in your head " + H.confused += 20 + +/obj/item/gland/pop + cooldown_low = 120 + cooldown_high = 180 + uses = 5 + +/obj/item/gland/pop/activate() + host << "You feel weird." + var/species = pick(list(/datum/species/lizard,/datum/species/slime,/datum/species/plant/pod,/datum/species/fly)) + host.dna.species = new species() + host.regenerate_icons() + return + +/obj/item/gland/ventcrawling + cooldown_low = 180 + cooldown_high = 240 + uses = 1 + +/obj/item/gland/ventcrawling/activate() + host << "You feel weird." + host << "You feel very stretchy." + host.ventcrawler = 2 + return + + +/obj/item/gland/viral + cooldown_low = 180 + cooldown_high = 240 + uses = 1 + +/obj/item/gland/viral/activate() + var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis) + var/datum/disease/D = new virus_type() + D.carrier = 1 + host.viruses += D + D.affected_mob = host + D.holder = host + host.med_hud_set_status() + + +/obj/item/gland/emp //TODO : Replace with something more interesting + cooldown_low = 90 + cooldown_high = 160 + uses = 5 + +/obj/item/gland/emp/activate() + empulse(get_turf(host), 2, 5, 1) + + +/obj/item/gland/spiderman + cooldown_low = 90 + cooldown_high = 160 + uses = 10 + +/obj/item/gland/spiderman/activate() + if(uses == initial(uses)) + host.faction += "spiders" + new /obj/effect/spider/spiderling(host.loc) + +/obj/item/gland/egg + cooldown_low = 60 + cooldown_high = 90 + uses = -1 + +/obj/item/gland/egg/activate() + var/obj/item/weapon/reagent_containers/food/snacks/egg/egg = new(host.loc) + egg.reagents.add_reagent("sacid",20) + egg.desc += " It smells bad." \ No newline at end of file diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 7be427bcb97..6096836308c 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -229,6 +229,7 @@ if(BE_GANG) roletext="gangster" if(BE_CULTIST) roletext="cultist" if(BE_MONKEY) roletext="monkey" + if(BE_ABDUCTOR) roletext="abductor" // Ultimate randomizing code right here diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index 7244345c7d1..e22ce3dd5fb 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -29,6 +29,9 @@ turf/unsimulated/wall/splashscreen icon_state = "r_wall" name = "reinforced wall" +/turf/unsimulated/wall/vault + icon_state = "rockvault" + /turf/unsimulated/shuttle name = "shuttle" icon = 'icons/turf/shuttle.dmi' diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 87739126ba9..087901ec941 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -480,6 +480,18 @@ dat += "PM" dat += "" + if(ticker.mode.abductors.len) + dat += "
" + for(var/datum/mind/abductor in ticker.mode.abductors) + var/mob/M = abductor.current + if(M) + dat += "" + dat += "" + dat += "" + else + dat += "" + dat += "
Abductors
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]PMShow Objective
Abductor not found!
" + if(istype(ticker.mode, /datum/game_mode/blob)) var/datum/game_mode/blob/mode = ticker.mode dat += "
" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 44d926d1764..0f2fff1cc51 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -74,6 +74,11 @@ log_admin("[key_name(usr)] created a emergency response team.") if(!src.makeEmergencyresponseteam()) usr << "Unfortunatly there were not enough candidates available." + if("14") + message_admins("[key_name(usr)] created abductor team.") + log_admin("[key_name(usr)] created abductor team.") + if(!src.makeAbductorTeam()) + usr << "Unfortunatly there were not enough candidates available." else if(href_list["forceevent"]) var/datum/round_event_control/E = locate(href_list["forceevent"]) in SSevent.control diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index be22d3a4e25..f0a118ac9b7 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -22,6 +22,7 @@ client/proc/one_click_antag() Make Nuke Team (Requires Ghosts)
Make Deathsquad (Requires Ghosts)
Make Emergency Response Team (Requires Ghosts)
+ Make Abductor Team (Requires Ghosts)
"} /* These dont work just yet Ninja, aliens and deathsquad I have not looked into yet @@ -541,6 +542,61 @@ client/proc/one_click_antag() return +//Abductors +/datum/admins/proc/makeAbductorTeam() + var/list/mob/dead/observer/candidates = list() + var/time_passed = world.time + + for(var/mob/dead/observer/G in player_list) + spawn(0) + switch(alert(G,"Do you wish to be considered for Abductor Team?","Please answer in 30 seconds!","Yes","No")) + if("Yes") + if((world.time-time_passed)>300)//If more than 30 game seconds passed. + return + candidates += G + if("No") + return + else + return + sleep(300) + + for(var/mob/dead/observer/G in candidates) + if(!G.key) + candidates.Remove(G) + + if(candidates.len >= 2) + //Oh god why we can't have static functions + var/teams_finished = round(ticker.mode.abductors.len / 2) + var/number = teams_finished + 1 + var/datum/game_mode/abduction/temp = new + + var/agent_mind = pick(candidates) + candidates -= agent_mind + var/scientist_mind = pick(candidates) + + var/mob/living/carbon/human/agent=makeBody(agent_mind) + var/mob/living/carbon/human/scientist=makeBody(scientist_mind) + + agent_mind = agent.mind + scientist_mind = scientist.mind + + temp.scientists.len = number + temp.agents.len = number + temp.abductors.len = 2*number + temp.team_objectives.len = number + temp.team_names.len = number + temp.scientists[number] = scientist_mind + temp.agents[number] = agent_mind + temp.abductors = list(agent_mind,scientist_mind) + temp.make_abductor_team(number) + temp.post_setup_team(number) + ticker.mode.abductors += temp.abductors + return 1 + else + return + + + /datum/admins/proc/makeBody(var/mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character if(!G_found || !G_found.key) return diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index cb3556a8990..bd3044071c4 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -17,7 +17,8 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set "ninja", //10 "monkey" = /datum/game_mode/monkey, //11 "gangster" = /datum/game_mode/gang, //12 - "shadowling" = /datum/game_mode/shadowling //13 + "shadowling" = /datum/game_mode/shadowling, //13 + "abductor" = /datum/game_mode/abduction //14 ) @@ -888,4 +889,4 @@ datum/preferences character.backbag = backbag character.update_body() - character.update_hair() \ No newline at end of file + character.update_hair() diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 1fd440c4b91..9b373ba72f4 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -49,4 +49,6 @@ var/list/organs = list() //Gets filled up in the constructor (human.dm, New() proc. - var/datum/martial_art/martial_art = null \ No newline at end of file + var/datum/martial_art/martial_art = null + + var/name_override //For temporary visible name changes \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 03ce28905fe..ecc7c49649e 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -39,6 +39,8 @@ /mob/living/carbon/human/get_visible_name() var/face_name = get_face_name("") var/id_name = get_id_name("") + if(name_override) + return name_override if(face_name) if(id_name && (id_name != face_name)) return "[face_name] (as [id_name])" diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index e571ae3258d..123151b8772 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1,12 +1,5 @@ // This code handles different species in the game. -#define SPECIES_LAYER 26 -#define BODY_BEHIND_LAYER 25 -#define BODY_LAYER 24 -#define BODY_ADJ_LAYER 23 -#define HAIR_LAYER 9 -#define BODY_FRONT_LAYER 2 - #define TINT_IMPAIR 2 #define TINT_BLIND 3 @@ -1279,13 +1272,6 @@ H.AddLuminosity(-3) H.update_fire() -#undef SPECIES_LAYER -#undef BODY_BEHIND_LAYER -#undef BODY_LAYER -#undef BODY_ADJ_LAYER -#undef HAIR_LAYER -#undef BODY_FRONT_LAYER - #undef HUMAN_MAX_OXYLOSS #undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index b0ecbb39986..574681f48b4 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -317,3 +317,29 @@ id = "zombie" sexes = 0 meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie + + +/datum/species/abductor + name = "Abductor" + id = "abductor" + darksight = 3 + say_mod = "gibbers" + sexes = 0 + invis_sight = SEE_INVISIBLE_LEVEL_ONE + specflags = list(NOBLOOD,NOBREATH) + var/scientist = 0 // vars to not pollute spieces list with castes + var/agent = 0 + var/team = 1 + +/datum/species/abductor/handle_speech(message) + //Hacks + var/mob/living/carbon/human/user = usr + for(var/mob/living/carbon/human/H in mob_list) + if(H.dna.species.id != "abductor") + continue + else + var/datum/species/abductor/target_spec = H.dna.species + if(target_spec.team == team) + H << "[user.name]: [message]" + //return - technically you can add more aliens to a team + return "" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8d1c801472a..7647ed26d70 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -626,6 +626,14 @@ Please contact me on #coderbus IRC. ~Carnie x var/standing = image("icon"=female_clothing_icons["[t_color]_s"], "layer"=-layer) return(standing) +/mob/living/carbon/human/proc/get_overlays_copy(var/list/unwantedLayers) + var/list/out = new + for(var/i=1;i<=TOTAL_LAYERS;i++) + if(overlays_standing[i]) + if(i in unwantedLayers) + continue + out += overlays_standing[i] + return out //Human Overlays Indexes///////// #undef SPECIES_LAYER diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 5b9be5c61c9..8af2864c0b1 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -442,6 +442,9 @@ proc/is_special_character(mob/M) // returns 1 for special characters and 2 for h if("monkey") if(M.viruses && (locate(/datum/disease/transformation/jungle_fever) in M.viruses)) return 2 + if("abductor") + if(M.mind in ticker.mode.abductors) + return 2 return 1 return 0 diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index 9b42d32cb5d..360e4607720 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -8,6 +8,12 @@ if(locate(S.type) in M.surgeries) continue + if(S.user_species_restricted) + if(!istype(user, /mob/living/carbon/human)) + continue + var/mob/living/carbon/human/doc = user + if(!(doc.dna.species.id in S.user_species_ids)) + continue if(S.target_must_be_dead && M.stat != DEAD) continue if(S.target_must_be_fat && !(M.disabilities & FAT)) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 0ade9193386..88e590ca8dc 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -9,7 +9,8 @@ var/target_must_be_fat = 0 //Needs to be fat var/requires_organic_chest = 0 //Prevents you from performing an operation on Robotic chests*** var/has_multi_loc = 0 //Multiple locations - RR - + var/user_species_restricted = 0 //Surgery only performable BY species + var/list/user_species_ids /datum/surgery/proc/next_step(mob/user, mob/living/carbon/target) if(step_in_progress) return diff --git a/html/changelogs/AnturK-Abductor.yml b/html/changelogs/AnturK-Abductor.yml new file mode 100644 index 00000000000..ac66a71c207 --- /dev/null +++ b/html/changelogs/AnturK-Abductor.yml @@ -0,0 +1,7 @@ +author: AnturK + +delete-after: True + +changes: + - rscadd: "Nanotrasen authorities are reporting sightings of unidentified space craft near space station 13. Report any strange sightnings or mental breakdowns to central command." + - rscadd: "PS : Abductions are not covered by health insurance" \ No newline at end of file diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index c56f9815abd11ddf7ca5bac0410eecbce43ddf19..f9b17b4aa3a72f66d4506998797bf1c294ee3e76 100644 GIT binary patch delta 3129 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 diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index af783f10da5b4318c172e85d3017059e0eadbc95..f31133f7e5ed73c62ae816a94074f98430e723f5 100644 GIT binary patch delta 11972 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 a_2Y?rk)zjzc^m}%k(E-C{QllB;Qs*}KFKox delta 11203 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 V{`vhZNDM^!gTfQ>pYQek{tueJKmq^& diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4a093efd38c2316161e05f968d2367ec319d0975 GIT binary patch literal 11427 zcmXYXcRbtQ_kV0^)~HoQ?HN^DiPhSp_9{x%UbP8{QmR&q*o3ORcdghIwO8%E_YNX{ zd4ImYKa#v2ugAUT-t)ZodG7O^+(;cQWzt6sj{pDwsj7;SF6OuWzYifk=395cnE(L5 zq6yG9_ENI-wE5)V?&aX-3IONf)FDEIIKxu9OiR|%9I?oDk`~?1PfsMCGLt2m!!+333;ERE=y#>K z#-%7JtW+}AR(?{B)Mv$xh>wqBAz8YWrh&bgxA_zD!HXv#8LD{GSsX7=+gdZ`fHJ#P zic}Ingedx3U79E2w(#=J1ZvRf(NaCi>>bMEiZ0sE^rv-5Fz9u9-_R(3Pd7vVSoR^Z z*W#b1e(}y&Z${fljVg`V)GG!1FZCzS6E@d7?F_5Z3k>b0dxdW+v_0c- zW72OpBjiN9{laPJnN~7>nx{Gh3yK&nn+oGA1prt8s!H>#bVNgZg#t#_)%0i~u+ouJtAA#;?wK-*)HS)VdA=j=2)_1VNWS_Ynafi=xo5|r7 zNpd{#WN7u}>-Mh-jAdcX%*885i^HeP@|)Vk=;%FMx5ZBt-;q+YQa9X}EAx<)ZG7e4 z`cyX1Tgk(y&!~*6JUQ^}oiGvP4M)4a?sH@aQ3vE-syoz8MI!W%Km23*>?0qPCi`wC;q=>D7J%HRVUs3Os2QO5Nn zm2^XtJu;}D2kX~LT$e|+XF;yLs*abf+0`$n&z_0a9LCRdf8pvu;S(5prRpqwvJn8E z11ObM1y$htH)Z*8)dGQ>PM^s$1|F695hZajQww&St!&o<^-gLWv7Sz2MnCKxK?jB$ z4t%^bA3anKy!omaJX`2h^h3aMx0=fgF@6{SCpi-k$q^d_l(>$yowaaS<=4XHP|pr5 zU)dBT1&8vd4N;!a06RV*ANWi^=bhB>h8&Pfc*yc4$@=X6eSrRE-S%luADaF&5d=qg zj=xk+mB&)y=|!*1*7+>puk%#t)`_;OA}<&i0B!{ z)&@SqKFi|0&TH3YxB}2W|2ISNS=4Yc9N^NJPl~h9ebpTAwqv+`f`mK1x#G}=2y3erkZ{oK9za#R~>G2GZ6y>VO?R? z{H8Rh6v%@AOM-WE*H_Q* zx^dECmdwl4=Z43qx}0xbRSy2}q0`w+js;3%Wk^&>A4*VZb^CBhWDfr%{ZejW6gAX>2*+Mgqh#0}UruE&b$uV-6 zC1tQ-=E`F7@w9|Hp-=mf*V@y4q*SIBw-t7+v&)zS+Iz3)2{FXBUjXU(TPn3K_Ui0i zgrb#Z=m7i;s#H0|v_&8-^C}Zti|gu8E5pVplvsvju3B`+&!f10t8!7KVO#PkS;#xG ze^UyB|56pCJT<(voqAoE4l{p0U7I($$y?nPVG6hoY8I8wBnxR>_x$`#lB4N+JlWr{ z5gWVM$u_&(WGYapL&`~RA!_aXyqRO1Cl-H}SOV8nL-H4=@M(mqOZ9~4YJx+xOA#vm z+*1p>*lZ>u?JI?Qhoj|lob)zJ!?Wj5LU%;XVOUpk-~JdGSGkUlT!`Xr>qfPhLT4$E zs<$1S63If;1si|DYRhm6FhNRi=sSD>C}rvWB}HSf*lHx_^rdorMQX4;4CI2W*~|BP zU0dpiTFz2jlTRf3SYHuH#^L5>G9|(FK1>m_upp=CsxyNeftz@*THnsNiZk^tBXt&4 zHJ|!?ow=77%S4tgSo%W_ML_@qPg6(i!nBFBQGygF^vOg_g<95AvWV~Xz#n<>l-YFX zgIMJT!n}(J_%PU@$EbzsmC^lb0kI_v{2#Dg5%2GBFWA&f>=lSaW>BjIjFtu-uzISD z<2X=9Nh=}xB*8KK)PP2NS2?8m!cH3u>S*Qb65}#>hMK&78DGJhyS7Q*zS`x#$P5sU zkS{pHG&x488@m}zj|ejc@7>L|8;QQ1r)eTEsw$$mVvZ#UDhgWnl_6>V=ug2ZOZe;G zhR{htsX_3=-qxK78*08|$>h@3a zH{sOMNpN1C3Xw?80ncX;IRCmiE8I;;l~~6rcrTCx8UHM3L%s8IrUK8(-Cbz+@^*hl zcZY>v6jX#xPP7BDR1{G(2Gnh@lfzXb?NCJnaD|hXhf(9Gt1IHuYu%GPLEta79&M6O zMQH5$z(Z6&`(Zs2vXyiD^ce4mUa{H(Fv8Pgv6iTn3;+Bc^o-6H*!XC3pjQ3 z7yYUmvIxbm@Eg4mbbK%RiKRGk-Z8G-2?iSYC7UDlNyNxS@XUmqbzj3Dlyyc?*%O`PILO@_3aufcpvp=xXLoegO_%KSs zY4!BMJe!X1*&iEuxWgou$IVieH`D%%-NjQigRLiW;RVeH)m%mpB)^EmtR8Og&-_Pd z^IGr0Rt3c_@YVCQlSXq328ONmPySVG0kq;Ge~nNts*1pY_=tC`!F%)&X`fletW)nA z`^WKSP{|!~P#IFVcB`U1r?vhG#mJw!y1H7(rA;Z1E>Ug0H&Y!C%1nDXUxg@fvVSpZ z=l7K}8Djw81sj!Vm`0hrF81Ho5aez*T#e6=KQ}+0fkHZyl=K|S-qBP+Z-UaiJjc() zf{-R{d3^k*N2w){v*VvCfPR4m!rMk*ymy%1;q02yHwh2QeW(d7rG9oo1Jm zmBqkAmIL+)<>W)#j8VVX=@J&$RUQRPSAUFhG@fA5!daS%U(V9bOJshy%57!8?HVya zEL5nAN>Bjh@d*eLmO|;mzWf$8a}I8K`ib&E+=Oz267@X=@Wt>Os9A&=K_{N0VHYf> zMxsCwDsbt^TEIb_4iqQ)L>l}ZLoTVg!Nc}Jo26(~EQyGlS;y+PN!EY+dBh;a?0>kB ztf2yG@~BzgI(9th29BNx1WDg*1S{20{qA<6*p$AuodQC6t(T+~YA~&XLz#8mzQIE= z434betr_Q#M|6-A5efYtS*Iq`zT^7igMKB+d5$s%o1PkI7X4!94&zgb--3crwOb`> zd^|*nbaE*Y^scctUE0zJUK8EDe;kZ9H0l$7n1h>63}A28IYyseM!?0u1{^%#uJuH%gFa&p7|=Fu<)i>L z3TKgnaYPUgbh^?|U;puPk(5!a(thlDczC!zT4b$6K#mNf;b!0gTGO}7;EP~WGqe8d zzjzIJC_G>P)67Bk&3zQbw{3zmD4$b%I{ z1C3PEXfMLnA<7f3mc;sy35X3M3yE=GZ02h`T7*@;HQ!?1nWoO==MjYnn=lGoEPJx@ zAfx>8HIkt{kJ@z`pp9oW%y@I$o+df^R*0@u3Ng2(SMM9A969uu0uZf0n`{A>;s}0g zR$4@NJ!WvX7AS1N3~r93Yz`$Kj}6nb3pONT$qagVe|V@Y`}d=#Ny#WUqKkFGy^GYm z#qaI(Ee6yd$d9Zhc#Uh|FNxx9Sjg^wcTZ!Ld62VpfP_qksIf=X-+`LtX$NX~Q;so~ zVf{YlfyL?%ylo;VRVu4(L}usFosW}TX(I;_T-8GR{Goehf9aj-;CK?z@{mC)@~MWu z;biZn|M{lI-*~~E=0#U$F-F&hbR)|kST|?j1N#1SBywMq2JoLn9y4g>U3UTfT-Ex5 z1p1)NExJ`UtFrt)J2R8}?xIHn1-~}|Km{Hg1i3AB^FztkM;I7Z;=F93Jg3Y;__0MlIg~6aNr!APZ?LRI1DZOr@EMZ?D zgx69Mae(`MxD>N>Sl_kN-2OFlM6hGl@Ym9K@?5DJ{J&;pP~J8nRH<}F&!gJiKgnq$ zlcC((%CKpZ7QYumLqn&muV9v@=x8Q9UYKsgVl{oLy^Bj;W25Bm9dBDLSQP6lasDvB ztV}?*lO@wZ7s3q#$=qO=&(bi@1X-S*e&gx+QVu2R?O#l(%%LCba8vxk@JYPmC^+%Z zKnG@NjF`jzkONj0Vgaek!75(;f4L$6Ep{lVj!Ps06i8|Uci{^!J5^9Y959C&hwKoV zQh?P3d9H)mvnd*dsSHC4fp+JU2%{TMGs$bLk5QnO0eCR)N1{YM?7y54KN#p<|1a*J zCfqa^^a(G-m9GRhCFcL03bam~&;GAt9QM!?h#vM4fw0?yU|$wS>sDe6qfPcHcnz1NH6c-2MMV}Qmb|mvycEd?q zHsR*wTPjMc{M#<|I~`sKIPaIp12_bT;Xwz>Tb`p4DUl~zIle-}6S?9H_HM^4lgz8VjO9ZPW~aC*B^d8P zfvvwEB!`Ck+PEZqEjtnCk9;8Oe6L;bTw7L6W8c}c>C^T|ShWXt&1E#uXhR$K$Sck~ zCsGp%vJXk@v@G&>d^UM0A1O*Gu#2S4_H-mn zn{K_Q=%pXE_cR!U)9+Ue5QUoQ$Fxbn@|F5@qnZadAk-Hu+3q45P8YYl?ZGBymSvvbyQtY3 z4+6uRp4H=jRf-a4n{1=b1$$TTRE+I)>6>!o#6Ne*& z`b1MJX>zw=dUY_HaQYx{n(m4q9ZU#ztZ1mReB`rl{$CQUzJEHF79 zu(B2yN`lzzeXu1ytauQ_Bw<7%W*9VrtHqfAbq8B~K-x;zO3p6x;{yTWoj-oCtye^> z+!;wFBzr2EH_Vc`*!5auI?Gl@`bZTl7)6fQ9g2LJBbs8g@{>d5k`hK$)EAPPQvepk zFkk}kvx{R9y*_hB2A%tEA2$Zopk8)S&iAu7*|_?(N$M@yGIlGb8KVy6SfB4#poC1_&t#L@dj#U{ zZBIQW`SOCE6j$;6#UTGhieP0s2tG$#ce=@$8-hS%In!+N%XpJcZ_8#R!YA~OAmJ<9c|!Fu{mieE&<5+ zX>P@r$jonVmu&Obr#usVQ%{&kb(U<`%=hsYu*5UnuGs}>XI@fC)3Du|`l$s^>#=@J z|KAqQk_i-%_Bo(PV@PJhv(a1sgn7UycjZ83uEWFrTsgN_Cal4d^{<|xB9~!QDEga` z$oayK@O`8exOwR~P`=?Q!#sUJA=hwm$D71T=iuoErOt!@!b~cR;cuiVW(UNAO%DF4 zshI=c@qI7jTn7f(@@#{~`p1ou);eJ?LHkdv>TkMAP#0<>`RQWj1nqVEJp`0T{#y_n zcD#pJU@#Wcmn@1L2+qAc_UgVFfk8a$|UVWD5u-cB9QP| z?NPmws_Ns1jI;ay-hLX$wm$b%gU)VXIGq3!RMAaV#cEuSviwT0^r1tb0S&|h@!6El z?)*pj1nRKw@1T4fc}NouIax*D_%lf)Chnv3`vsgHad03_U~+l&<9as}69ev?d@jT% za_a=eW;l5`-H$zG!n)M@_6hjp7p~tB$s~&UU=-cYEP_WQF zqKxVpb*xJX8PLvT=jZS7qyVDLD~Dmeqw%qWACkrA1p zK35bsU~G&qWI~bucw*ciNy6Ij1gax}E4K}7HU9+jyd4S_kw48(SCRO;OKevo2>I6k zKLd3wCqM=Yr&DjE($xsiQe5DlsIs|%=0RE96?oPnQTtqVTX(6ruE+GBrhJB^(yYD& zkU#hK%1Cz{(t2mGF2k8x69;h#B*#9fD((|X)6~CU@Gy7E4pt>yUb>bv`OhuQq6)|+ z{c{A};jnA??V@?$9WTCAEBG>G(R}Zy;}@-q{cy{K`Y(RDXo^7eDi;`q@cwqvb~y#X zSy^~X81#B`)zMt`yY>bG>v>acQ0*HBYDFn?%eeG{FrRa*8|$Sh4<}LKn&;5?P}u6 z5je!`w(`$u+aBbTHLSO|Q)TsX+De4M9+8`cuwez4Q~Yq(pRS)OP%2K-rEPAK3@VJn zOEx;2Q+IQ}+VFQppO=gZFl~fJY2Ch}C5%vb8gNR@=jPfjv(rbbGpux=yUlV~7BpE_ z>%LQ9Co$s@OVcn%D3-CFIc)TMLspTSI{#2Si2wIocr%|8JNJlyf+oN~Z(xzO^O%ex z8cBa}R&~0>hwLG)Sh>74sc*_6E}!trUGq-O21YM4u?tbBTbG=Pj#G6W6X|~Z_F{u+ zWpAGLG>X=uL-dv0{pOQ7!PXe*jc*mqQ(=U+iq-XHoX}#P&1Vry8B2PuRe~@j1%*+(w+d9qtageYFZen;w8#-1go-j)Ci8}O z7|as`N8^^c@Qt~j{)AWwp&OQnLsRO+L;|WdzWQ~`C$A2lbdzotW=m_Z3oZRbzFW7u z#z7*z9lKI&6do~H7z_NzZ z##Q)qnTnnI(L`VoZQF>pzlp#Rnu4v1Err)>(u9_xLz|nO^Bp$@`&P1ef&!*6q{(ya zPT}Si_P8O*b6eWj+8D|uB1=0+v-9SJVASES(ktQ@$&8VS{e1Ep+(LwpGvj`+k}6AC z7A)Db?!-Z#e9q!d#?SQoELd(#67yA?{j71LP7YIKiqBJ#=Nr`MeYd7*~`fAAIaDq34ehDMBY)6k3 zqLx>qcelTtb{VzEcWK`H{ajPg7TSn9r`n7odnqiUaQxZw#0TkMGC$0tNrht>P%%dB zR$mp5K4~nRL?e4P+*sHe#kH$i<83dSM^9)V^W)R*hK$ zQKMFbN}o961PGBk^%)4MlX1OHiX_BU zeJHUMO+pK-C56#n2kWpc^W;X z;HQ?u4~Fybs$99BAg~HpAVdiQEIYZvdP4*pJhGg1%tsWk{V)E(Q+c3O(1pfZq2N7x3ids z`fOKeV=#?nV6db1xF0tAZH;nqFHnjdCS^}Su~w0qRB%Q7+~9?4vwy&CSHXJn9CI5r zs{cc#os~tVM2o#}>I>p^U+X+hEV*C&UmMlZNv(BZGrJB#z&`UAYV1}@1yfX!ctVT< zswg=YrO;tQR-svv1ZNNPQ%V&n?z?0E$I$YqQ_I66Mm#ou7Lp(-se<4B*lc+wVpLuMKo71E|3v4*TTr$p5X_=|sQ2YrCOK zm!Zo#Dm5zQP0x!fH7A;KIdMQh*^hvGDaYcy!s5r3Q-j2ElEsD9IwlsHUA8duSIePV zY_4X-cUS|Luu>BrV)ebG$5o9*S#C*nhqbwK;dg_W;x@E+*@ARxP1s?B3vHU@zQs(# ziDCj^4KH8FProVZ!IY7s|8Ew0w)H81D(Z2E?w76o*3X4yv8Y-*R17plG1xf4h-^|@ zh~HKtr%W}(a5z203(J{2vFMxsl}_ySY)(sQa8h|kZHRwT&6O)cAD|Ci!&tH2tFSE4 z=Kn2wKPk$K=b%3OJ8qMubNU}5vuFuYLB z(EfNEB9RXGz0JDe#Cw#-%n}WO5!8bG2VnsyfI-FFZ423@-Cxj+M!w!En6R%Pb+HAF z<$Q9aO=i;h0}eqa z@*ikGKzCBkO%taUvkZ9(wQU@J?T)6D;8XgK_nCaid*%`Aq8F6Z&CI8iJ7?+J6P}$B z7F?jm!kq2;=mQtuT8=W1-u);A`Oq52V-G$!AhBwB~O4_gX_cb-3X+DJ8Wn{#X9N=MhGp z2+E9sHkU)%?sRj0d8r6A-=S|33)#xz0&lZA%CzI5um1z z*Pxbk=9;+)$z~pGiYk3bgLi2g`#p%S zLm0i9t6hmOWk7%746jl3O^iB@>LXYB?DZ_xp1@bfpVg)@e-EJ>3(hdt!`o-=2z6#!ygMQ!sYf_mvcoOKE8j7^!EEI}W@b9dTXcT=2WRL=BR|x0n-1pv(K%w;3Pc&+T;pMYfY8|385wi%NY|NJY0JYN z1(R~%Z@+qG=dWW6GDeTR8&_A16q5;G59$Q`S^TXg%0pB?fWBdy0)CRRA` z#@GjD?Pq|OSW5i9^_bu{GAm+$13&hV`B(0~2x$ZUPK~6b-xkRJSQ@`QqJp%_-UTm9 z{ft?MMLAiDVAu7yz{mgf0&{R<*Vlqo>SHfNr&VE;4)@;(fqRVp(3YzQwLHy~9#fw0 zIOjJJjq`L#_IoHJCbW-LD3<=YBKFhyE9OWMK%d z{bt#6@~HJlkoO6L#PpQHvWgM-9wVRIEF0f@J-Cy=`83$+H229Nzs|iESZQ;=9sxo# z<8N{Zd%4X|$_Y^-(2`@Z5@ ztD+BVx9Gai9?b_GKBrq>vy~g4v~NFJ_4rcQ6+g`^OYua2`gsW5QB^z11+Tbb`%AhH zzkn)>-&knp!;74R^=1;mBfIVY9-8kC0AtX0mAEv(OZjR_mbJ*obdlEdHBBlPcFYH7 zy0%3<_8OG~bdhUE2IaV4Z}8qkQe5?ozVA+0BL~iU?hlzhAFDF7a#wkQ7@>Kd&4itk z)EN@z0-aN_EN_(H*-3W?qZGRlsamshA&lu))_KS)Q~pa?cfH@O9|4 zB^NRVND=sNId~|kl#KO+T8>|51w2Q~W?K;#V!)ch#(nb>SJd@q6(9nL#$W#_gq9zJ z%kYLt_#BO|CN@IWTfIXYqGL^WR5|}c(JY7ADEPS4n3bo4tLB2-dxAV_4Tf|-joIaQu<}2oo zQBFrTyr0AMK+YI(ra>Olx6z6|;V<)U;q}K5?mmW~&^b)64Mgx&o>t@KpS3MYoTF!g z`VUE?m7jtD%V(f!cgb2b!l-two`KV^D|Cna*q1=U?v{KkO@Wm@Z9av3)Kb-W+j=qW zjZo~_()_kuD3ac9zcrz|6T73Q3`}7dA#e9NKjYD9`ZhTszGt+%oH{q%*61MZs7b

l*&OjH#TWRqLxCnzxYip|&?)(y6$ zLd`l2yuMzs%}-xjHWXPf4 zr#=DR=t7IhV>kzqs4TfZaZWn5`05uC6{Uq6NyQQVNUCL{XvlF{Toq=Vx2{wXhN6+G zLSmODW}IUA_)$rqve}MpR}@zdviK2~36WL#L>2f(S7Ql}F1i=_rC@Sf^mTZjctM5E zFypwPlkLq}o@(&-kGZzkAPTzUR5S0XZ>O4u?_MFX-h`doi>}+o8s^ff|HL&I)|+P1 zGoxrVg#rWl>^BNn!S%asHiD2ox zjrpg!$VDu{+W;ZPQsY4ZeWxd5V?e3NU1iNlLlO6>xe_`l>-OKqjUIkBU&zd0Fdde! zW)rWyGm}``qJCtDkG;j>*KsMzY4H7ymptXZizB{yS-jk?@x9ctUq2_esfkQIHz~^Q zF7jreayrtxO@tOP{X4~$l<#+Gd6s%U-L%wZdADhC?WDo94MIbC*t|KY z#9n0Y^F+pyB0l&?e3Px!<$F;B?p|@T=#;WIj!O%xl!&CG245f{Txcea4W|(}Bu$6wgW^Xh-F%Xcqap_t# zZY?OTYe%zxXKZv9uw^Rbz)$D=tmhw#k8@qVaA{qypB=5$A2zMu6S}m=bm_cxiAE`7 z^i!1foGMop>{Ay8QJN&Z(a;|{YS?uAb4Y5UJdT?#qe%v$RKC+@g~XV&uf5Mtg-O~M zShCx)Q4%d5k@}H#GJ6Y=J}OTXoB3_@G-Bvn8htOmW;+ z+-PD(*27-J67Qb%f|Kdq?!NS#*AKgznL$u&dWIUUO06}R;GOh zz4`-r#yXW2rht?AK4L_`o%qJ%Is#AtA#$Oocw zOnKve6~^D;^(NErig{|x^JCaM?PJ`4_~~8rsNBpQ&dy~(=Z`U>vM|yUXYkLpWh|_AJ{kkmDH=`}162U?^xmUqOIIC*Sc!KGb=$#!4uCTX~I!u>3$**pFFVMdDXxf5@3 zRZ_AiYJ~`C`x_2}$G5(NR_GK$`ZJjw#UGSrBu@=|_un zXD@2@{yj#!ALPGETV?HbQ)WFHDK{rIe}s5b^7xP}M9%mCGC4E(QfOlhtZmeLJT>bm zC#n3z0MD?OJCzT8LVwdGh#&WR9DN9O+rrfmt+{x>!X9sS^2I_2VJ;s7R9|Z;l`B|% F{(ma&zLx+1 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 59f1cc28062..21d4257cfbe 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -215,6 +215,7 @@ #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\global_iterator.dm" +#include "code\datums\helper_datums\icon_snapshot.dm" #include "code\datums\helper_datums\teleport.dm" #include "code\datums\helper_datums\topic_input.dm" #include "code\datums\spells\area_teleport.dm" @@ -281,6 +282,11 @@ #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\objective_items.dm" #include "code\game\gamemodes\setupgame.dm" +#include "code\game\gamemodes\abduction\abduction.dm" +#include "code\game\gamemodes\abduction\abduction_gear.dm" +#include "code\game\gamemodes\abduction\abduction_machinery.dm" +#include "code\game\gamemodes\abduction\abduction_surgery.dm" +#include "code\game\gamemodes\abduction\gland.dm" #include "code\game\gamemodes\blob\blob.dm" #include "code\game\gamemodes\blob\blob_finish.dm" #include "code\game\gamemodes\blob\blob_report.dm"

Blob