Yet Another Fugitives PR: Bounty Hunters, Features, Fixes, Treason, Removals! (#44802)
* mostly fixes in this commit * removes old_god from the dme * russian shuttle improvements * TODO: fix the hook gun * shotgun finished, next commit shuttle * bounty hunting shuttle * back up to speed on the dmis * readds poster 46 and adds the shuttle finally * dmi fixes * traps need fixing, work out whatever is happening with synths * super final touches, see desc map ports + proper spawners, pinpointer and traps functional. other misc changes * removes verb stuff from non verb stuff * review (see desc) antimagic checks and it now the two objects move inside each other instead * dmi conflicts * PLUNGERS. BEGONE.
487
_maps/shuttles/hunter_bounty.dmm
Normal file
@@ -0,0 +1,487 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/closed/wall/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"c" = (
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
|
||||
/obj/machinery/door/airlock/external,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"d" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"e" = (
|
||||
/obj/structure/shuttle/engine/propulsion{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/hunter)
|
||||
"f" = (
|
||||
/obj/structure/shuttle/engine/heater{
|
||||
icon_state = "heater";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/hunter)
|
||||
"g" = (
|
||||
/obj/structure/sign/warning/vacuum/external,
|
||||
/turf/closed/wall/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"h" = (
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"i" = (
|
||||
/obj/structure/grille,
|
||||
/obj/structure/window/plastitanium,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"j" = (
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"k" = (
|
||||
/obj/structure/sign/poster/contraband/bountyhunters,
|
||||
/turf/closed/wall/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"l" = (
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/door/airlock/external,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"m" = (
|
||||
/obj/structure/chair/office{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/hunter)
|
||||
"n" = (
|
||||
/obj/structure/table,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/hunter)
|
||||
"o" = (
|
||||
/obj/structure/chair/office{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/hunter)
|
||||
"p" = (
|
||||
/obj/effect/mob_spawn/human/fugitive/bounty/hook,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/hunter)
|
||||
"q" = (
|
||||
/obj/structure/shuttle/engine/heater{
|
||||
icon_state = "heater";
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/hunter)
|
||||
"r" = (
|
||||
/obj/machinery/computer/launchpad{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"s" = (
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"t" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 9
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"u" = (
|
||||
/obj/structure/curtain/bounty,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"v" = (
|
||||
/obj/structure/chair/office{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"w" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/phone,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"x" = (
|
||||
/obj/structure/table,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"y" = (
|
||||
/obj/structure/chair/office{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"z" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"A" = (
|
||||
/obj/machinery/computer/shuttle/hunter{
|
||||
icon_state = "computer";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"B" = (
|
||||
/obj/machinery/launchpad,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"C" = (
|
||||
/obj/item/multitool,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"D" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"E" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/twohanded/binoculars,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"F" = (
|
||||
/obj/machinery/power/smes,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"G" = (
|
||||
/obj/machinery/fugitive_capture,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"H" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 10
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"I" = (
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{
|
||||
icon_state = "computer";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/hunter)
|
||||
"J" = (
|
||||
/obj/machinery/suit_storage_unit/standard_unit,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/hunter)
|
||||
"K" = (
|
||||
/obj/machinery/suit_storage_unit/open,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/hunter)
|
||||
"M" = (
|
||||
/obj/effect/mob_spawn/human/fugitive/bounty/armor{
|
||||
icon_state = "sleeper";
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/hunter)
|
||||
"N" = (
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/door/airlock/external,
|
||||
/obj/docking_port/stationary{
|
||||
dwidth = 11;
|
||||
height = 16;
|
||||
id = "pirateship_home";
|
||||
name = "Deep Space";
|
||||
width = 17
|
||||
},
|
||||
/obj/docking_port/mobile{
|
||||
dheight = 3;
|
||||
dwidth = 3;
|
||||
height = 13;
|
||||
id = "huntership";
|
||||
movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
|
||||
name = "hunter shuttle";
|
||||
rechargeTime = 1800;
|
||||
width = 15
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"P" = (
|
||||
/obj/structure/fluff/empty_sleeper{
|
||||
icon_state = "sleeper-open";
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/hunter)
|
||||
"Z" = (
|
||||
/obj/effect/mob_spawn/human/fugitive/bounty/synth,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/hunter)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
b
|
||||
a
|
||||
a
|
||||
b
|
||||
a
|
||||
e
|
||||
a
|
||||
e
|
||||
a
|
||||
b
|
||||
a
|
||||
a
|
||||
b
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
b
|
||||
a
|
||||
e
|
||||
b
|
||||
b
|
||||
q
|
||||
i
|
||||
q
|
||||
b
|
||||
b
|
||||
e
|
||||
a
|
||||
b
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
b
|
||||
b
|
||||
f
|
||||
b
|
||||
b
|
||||
r
|
||||
B
|
||||
F
|
||||
b
|
||||
b
|
||||
f
|
||||
b
|
||||
b
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
b
|
||||
b
|
||||
g
|
||||
b
|
||||
b
|
||||
s
|
||||
C
|
||||
G
|
||||
b
|
||||
b
|
||||
g
|
||||
b
|
||||
b
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
c
|
||||
d
|
||||
h
|
||||
j
|
||||
l
|
||||
t
|
||||
D
|
||||
H
|
||||
c
|
||||
d
|
||||
h
|
||||
j
|
||||
N
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
b
|
||||
b
|
||||
i
|
||||
b
|
||||
b
|
||||
u
|
||||
u
|
||||
u
|
||||
b
|
||||
b
|
||||
i
|
||||
b
|
||||
b
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
a
|
||||
b
|
||||
i
|
||||
b
|
||||
m
|
||||
v
|
||||
s
|
||||
s
|
||||
J
|
||||
b
|
||||
i
|
||||
b
|
||||
a
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
a
|
||||
a
|
||||
i
|
||||
k
|
||||
n
|
||||
w
|
||||
x
|
||||
s
|
||||
J
|
||||
b
|
||||
i
|
||||
a
|
||||
a
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
n
|
||||
x
|
||||
E
|
||||
s
|
||||
K
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
o
|
||||
y
|
||||
s
|
||||
s
|
||||
J
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(13,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
i
|
||||
b
|
||||
u
|
||||
u
|
||||
u
|
||||
b
|
||||
i
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(14,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
i
|
||||
p
|
||||
s
|
||||
s
|
||||
s
|
||||
P
|
||||
i
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(15,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
i
|
||||
Z
|
||||
z
|
||||
s
|
||||
z
|
||||
M
|
||||
i
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(16,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
i
|
||||
A
|
||||
n
|
||||
I
|
||||
i
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(17,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
i
|
||||
i
|
||||
i
|
||||
i
|
||||
i
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
@@ -41,7 +41,6 @@
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"j" = (
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plating,
|
||||
@@ -49,11 +48,6 @@
|
||||
"k" = (
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"l" = (
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"m" = (
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/obj/item/weldingtool/largetank,
|
||||
@@ -187,7 +181,7 @@
|
||||
/area/shuttle/hunter)
|
||||
"I" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/mecha/working/ripley,
|
||||
/obj/structure/mecha_wreckage/ripley,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"J" = (
|
||||
@@ -222,6 +216,21 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"N" = (
|
||||
/obj/machinery/suit_storage_unit/standard_unit,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 2
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"Q" = (
|
||||
/obj/item/book/manual/ripley_build_and_repair,
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"Y" = (
|
||||
/obj/machinery/suit_storage_unit/standard_unit,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
@@ -336,13 +345,13 @@ b
|
||||
f
|
||||
g
|
||||
b
|
||||
l
|
||||
k
|
||||
u
|
||||
u
|
||||
q
|
||||
u
|
||||
x
|
||||
k
|
||||
Y
|
||||
Y
|
||||
Y
|
||||
Y
|
||||
Q
|
||||
I
|
||||
b
|
||||
g
|
||||
@@ -379,7 +388,7 @@ y
|
||||
y
|
||||
b
|
||||
k
|
||||
q
|
||||
N
|
||||
b
|
||||
b
|
||||
b
|
||||
|
||||
@@ -8,6 +8,17 @@
|
||||
},
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"c" = (
|
||||
/obj/machinery/shower,
|
||||
/obj/item/soap/deluxe,
|
||||
/obj/structure/curtain{
|
||||
alpha = 240;
|
||||
color = "#454545";
|
||||
icon_state = "bathroom-closed";
|
||||
open = 0
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"d" = (
|
||||
/obj/structure/sign/mining/survival{
|
||||
dir = 8
|
||||
@@ -26,17 +37,6 @@
|
||||
/obj/item/gps/computer,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"h" = (
|
||||
/obj/machinery/shower,
|
||||
/obj/item/soap/deluxe,
|
||||
/obj/structure/curtain{
|
||||
alpha = 240;
|
||||
color = "#454545";
|
||||
icon_state = "closed";
|
||||
open = 0
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"i" = (
|
||||
/obj/structure/toilet/secret{
|
||||
secret_type = /obj/item/kitchen/knife/combat/survival
|
||||
@@ -237,7 +237,7 @@ D
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
a
|
||||
h
|
||||
c
|
||||
n
|
||||
r
|
||||
w
|
||||
|
||||
@@ -591,6 +591,10 @@
|
||||
suffix = "russian"
|
||||
name = "Russian Cargo Ship"
|
||||
|
||||
/datum/map_template/shuttle/hunter/bounty
|
||||
suffix = "bounty"
|
||||
name = "Bounty Hunter Ship"
|
||||
|
||||
/datum/map_template/shuttle/ruin/caravan_victim
|
||||
suffix = "caravan_victim"
|
||||
name = "Small Freighter"
|
||||
|
||||
@@ -408,11 +408,18 @@
|
||||
desc = "A poster advertising a movie about some masked men."
|
||||
icon_state = "poster44"
|
||||
|
||||
//annoyingly, poster45 is in another file.
|
||||
|
||||
/obj/structure/sign/poster/contraband/free_key
|
||||
name = "Free Syndicate Encryption Key"
|
||||
desc = "A poster about traitors begging for more."
|
||||
icon_state = "poster46"
|
||||
|
||||
/obj/structure/sign/poster/contraband/bountyhunters
|
||||
name = "Bounty Hunters"
|
||||
desc = "A poster advertising bounty hunting services. \"I hear you got a problem.\""
|
||||
icon_state = "poster47"
|
||||
|
||||
/obj/structure/sign/poster/official
|
||||
poster_item_name = "motivational poster"
|
||||
poster_item_desc = "An official Nanotrasen-issued poster to foster a compliant and obedient workforce. It comes with state-of-the-art adhesive backing, for easy pinning to any vertical surface."
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination
|
||||
var/ignore_suit_sensor_level = FALSE // Do we find people even if their suit sensors are turned off
|
||||
var/alert = FALSE // TRUE to display things more seriously
|
||||
var/process_scan = TRUE // some pinpointers change target every time they scan, which means we can't have it change very process but instead when it turns on.
|
||||
var/icon_suffix = "" // for special pinpointer icons
|
||||
|
||||
/obj/item/pinpointer/Initialize()
|
||||
. = ..()
|
||||
@@ -31,6 +33,8 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/pinpointer/attack_self(mob/living/user)
|
||||
if(!process_scan) //since it's not scanning on process, it scans here.
|
||||
scan_for_target()
|
||||
toggle_on()
|
||||
user.visible_message("<span class='notice'>[user] [active ? "" : "de"]activates [user.p_their()] pinpointer.</span>", "<span class='notice'>You [active ? "" : "de"]activate your pinpointer.</span>")
|
||||
|
||||
@@ -47,6 +51,7 @@
|
||||
/obj/item/pinpointer/process()
|
||||
if(!active)
|
||||
return PROCESS_KILL
|
||||
if(process_scan)
|
||||
scan_for_target()
|
||||
update_icon()
|
||||
|
||||
@@ -58,24 +63,24 @@
|
||||
if(!active)
|
||||
return
|
||||
if(!target)
|
||||
add_overlay("pinon[alert ? "alert" : ""]null")
|
||||
add_overlay("pinon[alert ? "alert" : ""]null[icon_suffix]")
|
||||
return
|
||||
var/turf/here = get_turf(src)
|
||||
var/turf/there = get_turf(target)
|
||||
if(here.z != there.z)
|
||||
add_overlay("pinon[alert ? "alert" : ""]null")
|
||||
add_overlay("pinon[alert ? "alert" : ""]null[icon_suffix]")
|
||||
return
|
||||
if(get_dist_euclidian(here,there) <= minimum_range)
|
||||
add_overlay("pinon[alert ? "alert" : ""]direct")
|
||||
add_overlay("pinon[alert ? "alert" : ""]direct[icon_suffix]")
|
||||
else
|
||||
setDir(get_dir(here, there))
|
||||
switch(get_dist(here, there))
|
||||
if(1 to 8)
|
||||
add_overlay("pinon[alert ? "alert" : "close"]")
|
||||
add_overlay("pinon[alert ? "alert" : "close"][icon_suffix]")
|
||||
if(9 to 16)
|
||||
add_overlay("pinon[alert ? "alert" : "medium"]")
|
||||
add_overlay("pinon[alert ? "alert" : "medium"][icon_suffix]")
|
||||
if(16 to INFINITY)
|
||||
add_overlay("pinon[alert ? "alert" : "far"]")
|
||||
add_overlay("pinon[alert ? "alert" : "far"][icon_suffix]")
|
||||
|
||||
/obj/item/pinpointer/crew // A replacement for the old crew monitoring consoles
|
||||
name = "crew pinpointer"
|
||||
@@ -183,3 +188,21 @@
|
||||
|
||||
A.other_pair = B
|
||||
B.other_pair = A
|
||||
|
||||
/obj/item/pinpointer/shuttle
|
||||
name = "fugitive pinpointer"
|
||||
desc = "A handheld tracking device that locates the bounty hunter shuttle for quick escapes."
|
||||
icon_state = "pinpointer_hunter"
|
||||
icon_suffix = "_hunter"
|
||||
var/obj/shuttleport
|
||||
|
||||
/obj/item/pinpointer/shuttle/Initialize(mapload)
|
||||
. = ..()
|
||||
shuttleport = SSshuttle.getShuttle("huntership")
|
||||
|
||||
/obj/item/pinpointer/shuttle/scan_for_target()
|
||||
target = shuttleport
|
||||
|
||||
/obj/item/pinpointer/shuttle/Destroy()
|
||||
shuttleport = null
|
||||
. = ..()
|
||||
|
||||
@@ -38,6 +38,29 @@
|
||||
back_story = "russian"
|
||||
desc = "A small sleeper typically used to make long distance travel a bit more bearable."
|
||||
mob_name = "russian"
|
||||
outfit = /datum/outfit/russiancorpse
|
||||
outfit = /datum/outfit/russiancorpse/hunter
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
|
||||
/obj/effect/mob_spawn/human/fugitive/bounty
|
||||
name = "bounty hunter pod"
|
||||
flavour_text = "We got a new bounty on some fugitives, dead or alive."
|
||||
back_story = "bounty hunters"
|
||||
desc = "A small sleeper typically used to make long distance travel a bit more bearable."
|
||||
mob_name = "bounty hunter"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
|
||||
/obj/effect/mob_spawn/human/fugitive/bounty/Destroy()
|
||||
var/obj/structure/fluff/empty_sleeper/S = new(drop_location())
|
||||
S.setDir(dir)
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/fugitive/bounty/armor
|
||||
outfit = /datum/outfit/bountyarmor
|
||||
|
||||
/obj/effect/mob_spawn/human/fugitive/bounty/hook
|
||||
outfit = /datum/outfit/bountyhook
|
||||
|
||||
/obj/effect/mob_spawn/human/fugitive/bounty/synth
|
||||
outfit = /datum/outfit/bountysynth
|
||||
|
||||
@@ -6,17 +6,21 @@
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
alpha = 30 //initially quite hidden when not "recharging"
|
||||
var/flare_message = "<span class='warning'>the trap flares brightly!</span>"
|
||||
var/last_trigger = 0
|
||||
var/time_between_triggers = 600 //takes a minute to recharge
|
||||
var/charges = INFINITY
|
||||
var/checks_antimagic = TRUE
|
||||
|
||||
var/list/static/ignore_typecache
|
||||
var/list/mob/immune_minds = list()
|
||||
|
||||
var/sparks = TRUE
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
|
||||
/obj/structure/trap/Initialize(mapload)
|
||||
. = ..()
|
||||
flare_message = "<span class='warning'>[src] flares brightly!</span>"
|
||||
spark_system = new
|
||||
spark_system.set_up(4,1,src)
|
||||
spark_system.attach(src)
|
||||
@@ -44,7 +48,8 @@
|
||||
/obj/structure/trap/proc/flare()
|
||||
// Makes the trap visible, and starts the cooldown until it's
|
||||
// able to be triggered again.
|
||||
visible_message("<span class='warning'>[src] flares brightly!</span>")
|
||||
visible_message(flare_message)
|
||||
if(sparks)
|
||||
spark_system.start()
|
||||
alpha = 200
|
||||
last_trigger = world.time
|
||||
@@ -65,7 +70,7 @@
|
||||
var/mob/M = AM
|
||||
if(M.mind in immune_minds)
|
||||
return
|
||||
if(M.anti_magic_check())
|
||||
if(checks_antimagic && M.anti_magic_check())
|
||||
flare()
|
||||
return
|
||||
if(charges <= 0)
|
||||
@@ -81,10 +86,85 @@
|
||||
name = "shock trap"
|
||||
desc = "A trap that will shock and render you immobile. You'd better avoid it."
|
||||
icon_state = "trap-shock"
|
||||
var/stun_time = 100
|
||||
|
||||
/obj/structure/trap/stun/trap_effect(mob/living/L)
|
||||
L.electrocute_act(30, src, safety=1) // electrocute act does a message.
|
||||
L.Paralyze(100)
|
||||
L.Paralyze(stun_time)
|
||||
|
||||
/obj/structure/trap/stun/hunter
|
||||
name = "bounty trap"
|
||||
desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. You'd better avoid it."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "bounty_trap_on"
|
||||
stun_time = 200
|
||||
sparks = FALSE //the item version gives them off to prevent runtimes (see Destroy())
|
||||
checks_antimagic = FALSE
|
||||
var/obj/item/bountytrap/stored_item
|
||||
var/caught = FALSE
|
||||
|
||||
/obj/structure/trap/stun/hunter/Initialize(mapload)
|
||||
. = ..()
|
||||
time_between_triggers = 10
|
||||
flare_message = "<span class='warning'>[src] snaps shut!</span>"
|
||||
|
||||
/obj/structure/trap/stun/hunter/Crossed(atom/movable/AM)
|
||||
if(isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
if(!L.mind?.has_antag_datum(/datum/antagonist/fugitive))
|
||||
return
|
||||
caught = TRUE
|
||||
. = ..()
|
||||
|
||||
/obj/structure/trap/stun/hunter/flare()
|
||||
..()
|
||||
stored_item.forceMove(get_turf(src))
|
||||
forceMove(stored_item)
|
||||
if(caught)
|
||||
stored_item.announce_fugitive()
|
||||
caught = FALSE
|
||||
|
||||
/obj/item/bountytrap
|
||||
name = "bounty trap"
|
||||
desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. It's currently inactive."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "bounty_trap_off"
|
||||
var/obj/structure/trap/stun/hunter/stored_trap
|
||||
var/obj/item/radio/radio
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
|
||||
/obj/item/bountytrap/Initialize(mapload)
|
||||
. = ..()
|
||||
radio = new(src)
|
||||
radio.subspace_transmission = TRUE
|
||||
radio.canhear_range = 0
|
||||
radio.recalculateChannels()
|
||||
spark_system = new
|
||||
spark_system.set_up(4,1,src)
|
||||
spark_system.attach(src)
|
||||
name = "[name] #[rand(1, 999)]"
|
||||
stored_trap = new(src)
|
||||
stored_trap.name = name
|
||||
stored_trap.stored_item = src
|
||||
|
||||
/obj/item/bountytrap/proc/announce_fugitive()
|
||||
spark_system.start()
|
||||
playsound(src, 'sound/machines/ding.ogg', 50, 1)
|
||||
radio.talk_into(src, "Fugitive has triggered this trap in the [get_area_name(src)]!", RADIO_CHANNEL_COMMON)
|
||||
|
||||
/obj/item/bountytrap/attack_self(mob/living/user)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!user || !user.transferItemToLoc(src, T))//visibly unequips
|
||||
return
|
||||
to_chat(user, "<span class=notice>You set up [src]. Examine while close to disarm it.</span>")
|
||||
stored_trap.forceMove(T)//moves trap to ground
|
||||
forceMove(stored_trap)//moves item into trap
|
||||
|
||||
/obj/item/bountytrap/Destroy()
|
||||
qdel(stored_trap)
|
||||
QDEL_NULL(radio)
|
||||
QDEL_NULL(spark_system)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/trap/fire
|
||||
name = "flame trap"
|
||||
|
||||
@@ -370,7 +370,8 @@
|
||||
name = "curtain"
|
||||
desc = "Contains less than 1% mercury."
|
||||
icon = 'icons/obj/watercloset.dmi'
|
||||
icon_state = "open"
|
||||
icon_state = "bathroom-open"
|
||||
var/icon_type = "bathroom"//used in making the icon state
|
||||
color = "#ACD1E9" //Default color, didn't bother hardcoding other colors, mappers can and should easily change it.
|
||||
alpha = 200 //Mappers can also just set this to 255 if they want curtains that can't be seen through
|
||||
layer = SIGN_LAYER
|
||||
@@ -385,13 +386,13 @@
|
||||
|
||||
/obj/structure/curtain/update_icon()
|
||||
if(!open)
|
||||
icon_state = "closed"
|
||||
icon_state = "[icon_type]-closed"
|
||||
layer = WALL_OBJ_LAYER
|
||||
density = TRUE
|
||||
open = FALSE
|
||||
|
||||
else
|
||||
icon_state = "open"
|
||||
icon_state = "[icon_type]-open"
|
||||
layer = SIGN_LAYER
|
||||
density = FALSE
|
||||
open = TRUE
|
||||
@@ -441,3 +442,9 @@
|
||||
playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
|
||||
if(BURN)
|
||||
playsound(loc, 'sound/items/welder.ogg', 80, 1)
|
||||
|
||||
/obj/structure/curtain/bounty
|
||||
icon_type = "bounty"
|
||||
icon_state = "bounty-open"
|
||||
color = null
|
||||
alpha = 255
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
if("cultist")
|
||||
to_chat(owner, "<B>Blessed be our journey so far, but I fear the worst has come to our doorstep, and only those with the strongest faith will survive.</B>")
|
||||
to_chat(owner, "<B>Our religion has been repeatedly culled by Nanotrasen because it is categorized as an \"Enemy of the Corporation\", whatever that means.</B>")
|
||||
to_chat(owner, "<B>Now there are only three of us left, and Nanotrasen is coming. But we have a secret weapon: Our weakened god, Yalp Elor, will help us survive.</B>")
|
||||
to_chat(owner, "<B>Now there are only four of us left, and Nanotrasen is coming. When will our god show itself to save us from this hellish station?!</B>")
|
||||
if("waldo")
|
||||
to_chat(owner, "<B>Hi, Friends!</B>")
|
||||
to_chat(owner, "<B>My name is Waldo. I'm just setting off on a galaxywide hike. You can come too. All you have to do is find me.</B>")
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
H.facial_hair_style = "Shaved"
|
||||
H.hair_color = "000"
|
||||
H.facial_hair_color = H.hair_color
|
||||
H.update_body()
|
||||
if(H.mind)
|
||||
H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
|
||||
var/list/no_drops = list()
|
||||
@@ -70,8 +71,9 @@
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
mask = /obj/item/clothing/mask/gas/sechailer/swat/spacepol
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
ears = /obj/item/radio/headset
|
||||
l_pocket = /obj/item/ammo_box/magazine/m45
|
||||
r_pocket = /obj/item/ammo_box/magazine/m45
|
||||
r_pocket = /obj/item/restraints/handcuffs
|
||||
id = /obj/item/card/id
|
||||
|
||||
/datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
@@ -81,3 +83,88 @@
|
||||
W.assignment = "Police Officer"
|
||||
W.registered_name = H.real_name
|
||||
W.update_label()
|
||||
|
||||
/datum/outfit/russiancorpse/hunter
|
||||
ears = /obj/item/radio/headset
|
||||
r_hand = /obj/item/gun/ballistic/rifle/boltaction
|
||||
|
||||
/datum/outfit/russiancorpse/hunter/pre_equip(mob/living/carbon/human/H)
|
||||
if(prob(50))
|
||||
head = /obj/item/clothing/head/ushanka
|
||||
|
||||
/datum/outfit/bountyarmor
|
||||
name = "Bounty Hunter - Armored"
|
||||
uniform = /obj/item/clothing/under/rank/prisoner
|
||||
head = /obj/item/clothing/head/hunter
|
||||
suit = /obj/item/clothing/suit/space/hunter
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
mask = /obj/item/clothing/mask/gas/hunter
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/garb
|
||||
ears = /obj/item/radio/headset
|
||||
l_pocket = /obj/item/tank/internals/plasma/full
|
||||
r_pocket = /obj/item/restraints/handcuffs/cable
|
||||
id = /obj/item/card/id
|
||||
r_hand = /obj/item/flamethrower/full/tank
|
||||
|
||||
/datum/outfit/bountyarmor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
if(visualsOnly)
|
||||
return
|
||||
var/obj/item/card/id/W = H.wear_id
|
||||
W.assignment = "Bounty Hunter"
|
||||
W.registered_name = H.real_name
|
||||
W.update_label()
|
||||
|
||||
/datum/outfit/bountyhook
|
||||
name = "Bounty Hunter - Hook"
|
||||
uniform = /obj/item/clothing/under/rank/prisoner
|
||||
back = /obj/item/storage/backpack
|
||||
head = /obj/item/clothing/head/scarecrow_hat
|
||||
gloves = /obj/item/clothing/gloves/botanic_leather
|
||||
ears = /obj/item/radio/headset
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
mask = /obj/item/clothing/mask/scarecrow
|
||||
r_pocket = /obj/item/restraints/handcuffs/cable
|
||||
id = /obj/item/card/id
|
||||
r_hand = /obj/item/gun/ballistic/shotgun/doublebarrel/hook
|
||||
|
||||
backpack_contents = list(
|
||||
/obj/item/ammo_casing/shotgun/incapacitate = 6
|
||||
)
|
||||
|
||||
/datum/outfit/bountygrapple/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
if(visualsOnly)
|
||||
return
|
||||
var/obj/item/card/id/W = H.wear_id
|
||||
W.assignment = "Bounty Hunter"
|
||||
W.registered_name = H.real_name
|
||||
W.update_label()
|
||||
|
||||
/datum/outfit/bountysynth
|
||||
name = "Bounty Hunter - Synth"
|
||||
uniform = /obj/item/clothing/under/rank/prisoner
|
||||
back = /obj/item/storage/backpack
|
||||
suit = /obj/item/clothing/suit/armor/riot
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
glasses = /obj/item/clothing/glasses/eyepatch
|
||||
r_pocket = /obj/item/restraints/handcuffs/cable
|
||||
ears = /obj/item/radio/headset
|
||||
id = /obj/item/card/id
|
||||
r_hand = /obj/item/storage/firstaid/regular
|
||||
l_hand = /obj/item/pinpointer/shuttle
|
||||
|
||||
backpack_contents = list(
|
||||
/obj/item/bountytrap = 4
|
||||
)
|
||||
|
||||
/datum/outfit/bountysynth/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
if(visualsOnly)
|
||||
return
|
||||
var/datum/species/synth/synthetic_appearance = new()
|
||||
H.set_species(synthetic_appearance)
|
||||
synthetic_appearance.assume_disguise(synthetic_appearance, H)
|
||||
H.update_hair()
|
||||
var/obj/item/card/id/W = H.wear_id
|
||||
W.assignment = "Bounty Hunter"
|
||||
W.registered_name = H.real_name
|
||||
W.update_label()
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
/datum/antagonist/fugitive_hunter/proc/update_fugitive_icons_added(var/mob/living/carbon/human/fugitive)
|
||||
var/datum/atom_hud/antag/fughud = GLOB.huds[ANTAG_HUD_FUGITIVE]
|
||||
fughud.join_hud(fugitive)
|
||||
set_antag_hud(fugitive, "fugitive")
|
||||
set_antag_hud(fugitive, "fugitive_hunter")
|
||||
|
||||
/datum/antagonist/fugitive_hunter/proc/update_fugitive_icons_removed(var/mob/living/carbon/human/fugitive)
|
||||
var/datum/atom_hud/antag/fughud = GLOB.huds[ANTAG_HUD_FUGITIVE]
|
||||
|
||||
@@ -1,165 +0,0 @@
|
||||
|
||||
/mob/camera/yalp_elor
|
||||
name = "Yalp Elor"
|
||||
real_name = "Yalp Elor"
|
||||
desc = "An old, dying god. Its power has been severely sapped ever since it has lost its standing in the world."
|
||||
icon = 'icons/mob/cameramob.dmi'
|
||||
icon_state = "yalp_elor"
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
var/lastWarning = 0
|
||||
var/datum/action/innate/yalp_transmit/transmit
|
||||
var/datum/action/innate/yalp_transport/transport
|
||||
|
||||
/mob/camera/yalp_elor/Initialize()
|
||||
. = ..()
|
||||
transmit = new
|
||||
transport = new
|
||||
transmit.Grant(src)
|
||||
transport.Grant(src)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/mob/camera/yalp_elor/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/mob/camera/yalp_elor/Destroy()
|
||||
QDEL_NULL(transmit)
|
||||
QDEL_NULL(transport)
|
||||
. = ..()
|
||||
|
||||
/mob/camera/yalp_elor/CanPass(atom/movable/mover, turf/target)
|
||||
return TRUE
|
||||
|
||||
/mob/camera/yalp_elor/Process_Spacemove(movement_dir = 0)
|
||||
return TRUE
|
||||
|
||||
/mob/camera/yalp_elor/Login()
|
||||
..()
|
||||
to_chat(src, "<B>You must protect your followers from Nanotrasen!</B>")
|
||||
to_chat(src, "<B>Only your followers can hear you, and you can speak to send messages to all of them, wherever they are. You can also locally whisper to anyone.</B>")
|
||||
to_chat(src, "<B>Nanotrasen will reach you and your followers in about 10 minutes. Make sure they are ready when the time is up.</B>")
|
||||
|
||||
/mob/camera/yalp_elor/Move(NewLoc, direct)
|
||||
if(!NewLoc)
|
||||
return
|
||||
var/OldLoc = loc
|
||||
var/turf/T = get_turf(NewLoc)
|
||||
if(locate(/obj/effect/blessing, T))
|
||||
if((world.time - lastWarning) >= 30)
|
||||
lastWarning = world.time
|
||||
to_chat(src, "<span class='warning'>This turf is consecrated and can't be crossed!</span>")
|
||||
return
|
||||
if(istype(get_area(T), /area/chapel))
|
||||
if((world.time - lastWarning) >= 30)
|
||||
lastWarning = world.time
|
||||
to_chat(src, "<span class='warning'>The Chapel is hallowed ground under a much, MUCH stronger deity, and can't be accessed!</span>")
|
||||
return
|
||||
forceMove(T)
|
||||
Moved(OldLoc, direct)
|
||||
|
||||
/mob/camera/yalp_elor/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
|
||||
if(client)
|
||||
if(client.prefs.muted & MUTE_IC)
|
||||
to_chat(src, "You cannot send IC messages (muted).")
|
||||
return
|
||||
if(client.handle_spam_prevention(message,MUTE_IC))
|
||||
return
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
if(!message)
|
||||
return
|
||||
src.log_talk(message, LOG_SAY, tag="fugitive god")
|
||||
message = "<span class='cultitalic'><b>[name]:</b> \"[capitalize(message)]\"</span>"
|
||||
for(var/mob/V in GLOB.player_list)
|
||||
if(V.mind.has_antag_datum(/datum/antagonist/fugitive))
|
||||
to_chat(V, "[message]")
|
||||
else if(isobserver(V))
|
||||
to_chat(V, "[FOLLOW_LINK(V, src)] [message]")
|
||||
|
||||
/mob/camera/yalp_elor/process()
|
||||
var/safe = FALSE
|
||||
for(var/mob/V in GLOB.player_list)
|
||||
if(!V.mind)
|
||||
continue
|
||||
var/datum/antagonist/fugitive/fug = V.mind.has_antag_datum(/datum/antagonist/fugitive)
|
||||
if(!fug || V == src)
|
||||
continue
|
||||
if(!fug.is_captured) //they can still be revived
|
||||
safe = TRUE
|
||||
break
|
||||
if(!safe)
|
||||
to_chat(src, "<span class='userdanger'>All of your followers are gone. That means you cease to exist.</span>")
|
||||
qdel(src)
|
||||
|
||||
/datum/action/innate/yalp_transmit
|
||||
name = "Divine Oration"
|
||||
desc = "Transmits a message to the target."
|
||||
icon_icon = 'icons/mob/actions/actions_animal.dmi'
|
||||
background_icon_state = "bg_spell"
|
||||
button_icon_state = "god_transmit"
|
||||
|
||||
/datum/action/innate/yalp_transmit/Trigger()
|
||||
var/list/possible_targets = list()
|
||||
for(var/mob/living/M in range(7, owner))
|
||||
if(istype(M))
|
||||
possible_targets += M
|
||||
if(!possible_targets.len)
|
||||
to_chat(owner, "<span class='warning'>Nobody in range to talk to!</span>")
|
||||
return FALSE
|
||||
|
||||
var/mob/living/target
|
||||
if(possible_targets.len == 1)
|
||||
target = possible_targets[1]
|
||||
else
|
||||
target = input("Who do you wish to transmit to?", "Targeting") as null|mob in possible_targets
|
||||
|
||||
var/input = stripped_input(owner, "What do you wish to tell [target]?", null, "")
|
||||
if(QDELETED(src) || !input || !IsAvailable())
|
||||
return FALSE
|
||||
|
||||
transmit(owner, target, input)
|
||||
return TRUE
|
||||
|
||||
/datum/action/innate/yalp_transmit/proc/transmit(mob/user, mob/living/target, message)
|
||||
if(!message)
|
||||
return
|
||||
log_directed_talk(user, target, message, LOG_SAY, "[name]")
|
||||
to_chat(user, "<span class='boldnotice'>You transmit to [target]:</span> <span class='notice'>[message]</span>")
|
||||
to_chat(target, "<span class='boldnotice'>You hear something behind you talking...</span> <span class='notice'>[message]</span>")
|
||||
for(var/ded in GLOB.dead_mob_list)
|
||||
if(!isobserver(ded))
|
||||
continue
|
||||
var/follow_rev = FOLLOW_LINK(ded, user)
|
||||
var/follow_whispee = FOLLOW_LINK(ded, target)
|
||||
to_chat(ded, "[follow_rev] <span class='boldnotice'>[user] [name]:</span> <span class='notice'>\"[message]\" to</span> [follow_whispee] <span class='name'>[target]</span>")
|
||||
|
||||
/datum/action/innate/yalp_transport
|
||||
name = "Guidance"
|
||||
desc = "Transports you to a follower."
|
||||
icon_icon = 'icons/mob/actions/actions_animal.dmi'
|
||||
background_icon_state = "bg_spell"
|
||||
button_icon_state = "god_transport"
|
||||
|
||||
/datum/action/innate/yalp_transport/Trigger()
|
||||
var/list/faithful = list()
|
||||
var/mob/living/target
|
||||
for(var/mob/V in GLOB.player_list)
|
||||
var/datum/antagonist/fugitive/fug = V.mind.has_antag_datum(/datum/antagonist/fugitive)
|
||||
if(!fug || V == src)
|
||||
continue
|
||||
if(fug.is_captured)
|
||||
continue
|
||||
faithful += V
|
||||
if(!faithful.len)
|
||||
to_chat(owner, "<span class='warning'>You have nobody to jump to!</span>")
|
||||
return FALSE
|
||||
if(faithful.len == 1)
|
||||
target = faithful[1]
|
||||
else
|
||||
target = input("Which of your followers do you wish to jump to?", "Targeting") as null|mob in faithful
|
||||
|
||||
var/turf/T = get_turf(target)
|
||||
if(target && T)
|
||||
owner.forceMove(T)
|
||||
return TRUE
|
||||
to_chat(owner, "<span class='warning'>Something horrible just happened to your target!</span>")
|
||||
return FALSE
|
||||
@@ -245,6 +245,20 @@
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT)
|
||||
|
||||
/obj/item/clothing/head/flatcap
|
||||
name = "flat cap"
|
||||
desc = "A working man's cap."
|
||||
icon_state = "flat_cap"
|
||||
item_state = "detective"
|
||||
|
||||
/obj/item/clothing/head/hunter
|
||||
name = "bounty hunting hat"
|
||||
desc = "Ain't nobody gonna cheat the hangman in my town."
|
||||
icon_state = "hunter"
|
||||
item_state = "hunter"
|
||||
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/clothing/head/cone
|
||||
desc = "This cone is trying to warn you of something!"
|
||||
name = "warning cone"
|
||||
|
||||
@@ -197,3 +197,11 @@
|
||||
/obj/item/clothing/mask/gas/tiki_mask/yalp_elor
|
||||
icon_state = "tiki_yalp"
|
||||
actions_types = list()
|
||||
|
||||
/obj/item/clothing/mask/gas/hunter
|
||||
name = "bounty hunting mask"
|
||||
desc = "A custom tactical mask with decals added."
|
||||
icon_state = "hunter"
|
||||
item_state = "hunter"
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
flags_inv = HIDEFACIALHAIR|HIDEFACE|HIDEEYES|HIDEEARS|HIDEHAIR
|
||||
|
||||
@@ -12,6 +12,7 @@ Contains:
|
||||
- EVA spacesuit
|
||||
- Freedom's spacesuit (freedom from vacuum's oppression)
|
||||
- Carp hardsuit
|
||||
- Bounty hunter hardsuit
|
||||
*/
|
||||
|
||||
//Death squad armored space suits, not hardsuits!
|
||||
@@ -397,3 +398,13 @@ Contains:
|
||||
torn = TRUE
|
||||
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1)
|
||||
playsound(loc, 'sound/effects/refill.ogg', 50, 1)
|
||||
|
||||
/obj/item/clothing/suit/space/hunter
|
||||
name = "bounty hunting suit"
|
||||
desc = "A custom version of the MK.II SWAT suit, modified to look rugged and tough. Works as a space suit, if you can find a helmet."
|
||||
icon_state = "hunter"
|
||||
item_state = "swat_suit"
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/kitchen/knife/combat)
|
||||
armor = list(melee = 60, bullet = 40, laser = 40, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
|
||||
strip_delay = 130
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
var/list/possible_backstories = list()
|
||||
var/list/candidates = get_candidates(ROLE_TRAITOR, null, ROLE_TRAITOR)
|
||||
if(candidates.len >= 1) //solo refugees
|
||||
possible_backstories.Add("waldo")
|
||||
if(prob(30))
|
||||
possible_backstories.Add("waldo") //less common as it comes with magicks and is kind of immershun shattering
|
||||
if(candidates.len >= 4)//group refugees
|
||||
possible_backstories.Add("prisoner", "cultist", "synth")
|
||||
if(!possible_backstories.len)
|
||||
@@ -33,7 +34,7 @@
|
||||
var/member_size = 3
|
||||
var/leader
|
||||
switch(backstory)
|
||||
if("cultist" || "synth")
|
||||
if("synth")
|
||||
leader = pick_n_take(candidates)
|
||||
if("waldo")
|
||||
member_size = 0 //solo refugees have no leader so the member_size gets bumped to one a bit later
|
||||
@@ -87,14 +88,7 @@
|
||||
/datum/round_event/ghost_role/fugitives/proc/gear_fugitive_leader(var/mob/dead/leader, var/turf/landing_turf, backstory)
|
||||
var/datum/mind/player_mind = new /datum/mind(leader.key)
|
||||
player_mind.active = TRUE
|
||||
switch(backstory)
|
||||
if("cultist")
|
||||
var/mob/camera/yalp_elor/yalp = new(landing_turf)
|
||||
player_mind.transfer_to(yalp)
|
||||
player_mind.assigned_role = "Yalp Elor"
|
||||
player_mind.special_role = "Old God"
|
||||
player_mind.add_antag_datum(/datum/antagonist/fugitive)
|
||||
if("synth")
|
||||
//if you want to add a fugitive with a special leader in the future, make this switch with the backstory
|
||||
var/mob/living/carbon/human/S = gear_fugitive(leader, landing_turf, backstory)
|
||||
var/obj/item/choice_beacon/augments/A = new(S)
|
||||
S.put_in_hands(A)
|
||||
@@ -102,12 +96,14 @@
|
||||
|
||||
//security team gets called in after 10 minutes of prep to find the refugees
|
||||
/datum/round_event/ghost_role/fugitives/proc/spawn_hunters()
|
||||
var/backstory = pick("space cop", "russian")
|
||||
var/backstory = pick("space cop", "russian", "bounty hunter")
|
||||
var/datum/map_template/shuttle/ship
|
||||
if(backstory == "space cop")
|
||||
ship = new /datum/map_template/shuttle/hunter/space_cop
|
||||
else
|
||||
else if (backstory == "russian")
|
||||
ship = new /datum/map_template/shuttle/hunter/russian
|
||||
else
|
||||
ship = new /datum/map_template/shuttle/hunter/bounty
|
||||
var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width)
|
||||
var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height)
|
||||
var/z = SSmapping.empty_space.z_value
|
||||
@@ -115,5 +111,5 @@
|
||||
if(!T)
|
||||
CRASH("Fugitive Hunters (Created from fugitive event) found no turf to load in")
|
||||
if(!ship.load(T))
|
||||
CRASH("Loading hunter ship failed!")
|
||||
priority_announce("Unidentified armed ship detected near the station.")
|
||||
CRASH("Loading [backstory] ship failed!")
|
||||
priority_announce("Unidentified ship detected near the station.")
|
||||
|
||||
@@ -442,6 +442,20 @@
|
||||
qdel(chain)
|
||||
return ..()
|
||||
|
||||
//just a nerfed version of the real thing for the bounty hunters.
|
||||
/obj/item/gun/magic/hook/bounty
|
||||
name = "hook"
|
||||
ammo_type = /obj/item/ammo_casing/magic/hook/bounty
|
||||
|
||||
/obj/item/gun/magic/hook/bounty/shoot_with_empty_chamber(mob/living/user)
|
||||
to_chat(user, "<span class='warning'>The [src] isn't ready to fire yet!</span>")
|
||||
|
||||
/obj/item/ammo_casing/magic/hook/bounty
|
||||
projectile_type = /obj/item/projectile/hook/bounty
|
||||
|
||||
/obj/item/projectile/hook/bounty
|
||||
damage = 0
|
||||
paralyze = 20
|
||||
|
||||
//Immortality Talisman
|
||||
/obj/item/immortality_talisman
|
||||
|
||||
@@ -73,6 +73,15 @@
|
||||
variance = 25
|
||||
materials = list(MAT_METAL=4000)
|
||||
|
||||
/obj/item/ammo_casing/shotgun/incapacitate
|
||||
name = "custom incapacitating shot"
|
||||
desc = "A shotgun casing filled with... something. used to incapacitate targets."
|
||||
icon_state = "bountyshell"
|
||||
projectile_type = /obj/item/projectile/bullet/pellet/shotgun_incapacitate
|
||||
pellets = 12//double the pellets, but half the stun power of each, which makes this best for just dumping right in someone's face.
|
||||
variance = 25
|
||||
materials = list(MAT_METAL=4000)
|
||||
|
||||
/obj/item/ammo_casing/shotgun/improvised
|
||||
name = "improvised shell"
|
||||
desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
|
||||
|
||||
@@ -3,3 +3,9 @@
|
||||
ammo_type = /obj/item/ammo_casing/caseless/laser/gatling
|
||||
caliber = "gatling"
|
||||
max_ammo = 5000
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/hook
|
||||
name = "hook internal tube"
|
||||
ammo_type = /obj/item/ammo_casing/magic/hook
|
||||
caliber = "hook"
|
||||
max_ammo = 1
|
||||
|
||||
@@ -36,3 +36,8 @@
|
||||
name = "riot shotgun internal magazine"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
|
||||
max_ammo = 6
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shot/bounty
|
||||
name = "triple-barrel shotgun internal magazine"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/incapacitate
|
||||
max_ammo = 3
|
||||
|
||||
@@ -162,7 +162,6 @@
|
||||
. = ..()
|
||||
if(unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
|
||||
reskin_obj(user)
|
||||
|
||||
// IMPROVISED SHOTGUN //
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/doublebarrel/improvised
|
||||
@@ -210,3 +209,48 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
sawn_off = TRUE
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/doublebarrel/hook
|
||||
name = "hook modified sawn-off shotgun"
|
||||
desc = "Range isn't an issue when you can bring your victim to you."
|
||||
icon_state = "hookshotgun"
|
||||
item_state = "shotgun"
|
||||
load_sound = "sound/weapons/shotguninsert.ogg"
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/shot/bounty
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
weapon_weight = WEAPON_MEDIUM
|
||||
can_be_sawn_off = FALSE
|
||||
force = 10 //it has a hook on it
|
||||
attack_verb = list("slashed", "hooked", "stabbed")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
//our hook gun!
|
||||
var/obj/item/gun/magic/hook/bounty/hook
|
||||
var/toggled = FALSE
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/doublebarrel/hook/Initialize()
|
||||
. = ..()
|
||||
hook = new /obj/item/gun/magic/hook/bounty(src)
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/doublebarrel/hook/AltClick(mob/user)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
return
|
||||
if(toggled)
|
||||
to_chat(user,"<span class='notice'>You switch to the shotgun.</span>")
|
||||
fire_sound = initial(fire_sound)
|
||||
else
|
||||
to_chat(user,"<span class='notice'>You switch to the hook.</span>")
|
||||
fire_sound = 'sound/weapons/batonextend.ogg'
|
||||
toggled = !toggled
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/doublebarrel/hook/examine(mob/user)
|
||||
. = ..()
|
||||
if(toggled)
|
||||
. += "<span class='notice'>Alt-click to switch to the shotgun.</span>"
|
||||
else
|
||||
. += "<span class='notice'>Alt-click to switch to the hook.</span>"
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/doublebarrel/hook/afterattack(atom/target, mob/living/user, flag, params)
|
||||
if(toggled)
|
||||
hook.afterattack(target, user, flag, params)
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -67,6 +67,11 @@
|
||||
damage = 3
|
||||
stamina = 11
|
||||
|
||||
/obj/item/projectile/bullet/pellet/shotgun_incapacitate
|
||||
name = "incapacitating pellet"
|
||||
damage = 1
|
||||
stamina = 6
|
||||
|
||||
/obj/item/projectile/bullet/pellet/Range()
|
||||
..()
|
||||
if(damage > 0)
|
||||
|
||||
|
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 189 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 343 KiB After Width: | Height: | Size: 343 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 17 KiB |
@@ -1366,7 +1366,6 @@
|
||||
#include "code\modules\antagonists\fugitive\fugitive_outfits.dm"
|
||||
#include "code\modules\antagonists\fugitive\fugitive_ship.dm"
|
||||
#include "code\modules\antagonists\fugitive\hunter.dm"
|
||||
#include "code\modules\antagonists\fugitive\old_god.dm"
|
||||
#include "code\modules\antagonists\greentext\greentext.dm"
|
||||
#include "code\modules\antagonists\highlander\highlander.dm"
|
||||
#include "code\modules\antagonists\hivemind\hivemind.dm"
|
||||
|
||||