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.
This commit is contained in:
tralezab
2019-07-22 11:00:34 -07:00
committed by AnturK
parent 28f0a5a890
commit 3b49b5378d
37 changed files with 902 additions and 229 deletions

View 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
"}

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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."

View File

@@ -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,7 +51,8 @@
/obj/item/pinpointer/process()
if(!active)
return PROCESS_KILL
scan_for_target()
if(process_scan)
scan_for_target()
update_icon()
/obj/item/pinpointer/proc/scan_for_target()
@@ -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
. = ..()

View File

@@ -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

View File

@@ -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,8 +48,9 @@
/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>")
spark_system.start()
visible_message(flare_message)
if(sparks)
spark_system.start()
alpha = 200
last_trigger = world.time
charges--
@@ -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"

View File

@@ -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

View File

@@ -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>")

View File

@@ -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()

View File

@@ -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]

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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,27 +88,22 @@
/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")
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)
new /obj/item/autosurgeon(landing_turf)
//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)
new /obj/item/autosurgeon(landing_turf)
//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.")

View File

@@ -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

View File

@@ -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."

View File

@@ -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

View File

@@ -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

View File

@@ -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 ..()

View File

@@ -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)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 KiB

After

Width:  |  Height:  |  Size: 343 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -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"