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, /turf/open/floor/mineral/plastitanium/red,
/area/shuttle/hunter) /area/shuttle/hunter)
"j" = ( "j" = (
/obj/structure/reagent_dispensers/fueltank,
/obj/effect/turf_decal/bot, /obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating, /turf/open/floor/plating,
@@ -49,11 +48,6 @@
"k" = ( "k" = (
/turf/open/floor/mineral/plastitanium/red, /turf/open/floor/mineral/plastitanium/red,
/area/shuttle/hunter) /area/shuttle/hunter)
"l" = (
/obj/structure/reagent_dispensers/fueltank,
/obj/effect/turf_decal/bot,
/turf/open/floor/plating,
/area/shuttle/hunter)
"m" = ( "m" = (
/obj/structure/reagent_dispensers/fueltank, /obj/structure/reagent_dispensers/fueltank,
/obj/item/weldingtool/largetank, /obj/item/weldingtool/largetank,
@@ -187,7 +181,7 @@
/area/shuttle/hunter) /area/shuttle/hunter)
"I" = ( "I" = (
/obj/effect/turf_decal/bot, /obj/effect/turf_decal/bot,
/obj/mecha/working/ripley, /obj/structure/mecha_wreckage/ripley,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/shuttle/hunter) /area/shuttle/hunter)
"J" = ( "J" = (
@@ -222,6 +216,21 @@
}, },
/turf/open/floor/plating, /turf/open/floor/plating,
/area/shuttle/hunter) /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) = {" (1,1,1) = {"
a a
@@ -336,13 +345,13 @@ b
f f
g g
b b
l x
k
u
u
q
u
k k
Y
Y
Y
Y
Q
I I
b b
g g
@@ -379,7 +388,7 @@ y
y y
b b
k k
q N
b b
b b
b b

View File

@@ -8,6 +8,17 @@
}, },
/turf/closed/wall/mineral/titanium/survival/pod, /turf/closed/wall/mineral/titanium/survival/pod,
/area/survivalpod) /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" = ( "d" = (
/obj/structure/sign/mining/survival{ /obj/structure/sign/mining/survival{
dir = 8 dir = 8
@@ -26,17 +37,6 @@
/obj/item/gps/computer, /obj/item/gps/computer,
/turf/open/floor/pod, /turf/open/floor/pod,
/area/survivalpod) /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" = ( "i" = (
/obj/structure/toilet/secret{ /obj/structure/toilet/secret{
secret_type = /obj/item/kitchen/knife/combat/survival secret_type = /obj/item/kitchen/knife/combat/survival
@@ -237,7 +237,7 @@ D
"} "}
(5,1,1) = {" (5,1,1) = {"
a a
h c
n n
r r
w w

View File

@@ -591,6 +591,10 @@
suffix = "russian" suffix = "russian"
name = "Russian Cargo Ship" name = "Russian Cargo Ship"
/datum/map_template/shuttle/hunter/bounty
suffix = "bounty"
name = "Bounty Hunter Ship"
/datum/map_template/shuttle/ruin/caravan_victim /datum/map_template/shuttle/ruin/caravan_victim
suffix = "caravan_victim" suffix = "caravan_victim"
name = "Small Freighter" name = "Small Freighter"

View File

@@ -408,11 +408,18 @@
desc = "A poster advertising a movie about some masked men." desc = "A poster advertising a movie about some masked men."
icon_state = "poster44" icon_state = "poster44"
//annoyingly, poster45 is in another file.
/obj/structure/sign/poster/contraband/free_key /obj/structure/sign/poster/contraband/free_key
name = "Free Syndicate Encryption Key" name = "Free Syndicate Encryption Key"
desc = "A poster about traitors begging for more." desc = "A poster about traitors begging for more."
icon_state = "poster46" 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 /obj/structure/sign/poster/official
poster_item_name = "motivational poster" 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." 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/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/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/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() /obj/item/pinpointer/Initialize()
. = ..() . = ..()
@@ -31,6 +33,8 @@
return ..() return ..()
/obj/item/pinpointer/attack_self(mob/living/user) /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() 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>") 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() /obj/item/pinpointer/process()
if(!active) if(!active)
return PROCESS_KILL return PROCESS_KILL
scan_for_target() if(process_scan)
scan_for_target()
update_icon() update_icon()
/obj/item/pinpointer/proc/scan_for_target() /obj/item/pinpointer/proc/scan_for_target()
@@ -58,24 +63,24 @@
if(!active) if(!active)
return return
if(!target) if(!target)
add_overlay("pinon[alert ? "alert" : ""]null") add_overlay("pinon[alert ? "alert" : ""]null[icon_suffix]")
return return
var/turf/here = get_turf(src) var/turf/here = get_turf(src)
var/turf/there = get_turf(target) var/turf/there = get_turf(target)
if(here.z != there.z) if(here.z != there.z)
add_overlay("pinon[alert ? "alert" : ""]null") add_overlay("pinon[alert ? "alert" : ""]null[icon_suffix]")
return return
if(get_dist_euclidian(here,there) <= minimum_range) if(get_dist_euclidian(here,there) <= minimum_range)
add_overlay("pinon[alert ? "alert" : ""]direct") add_overlay("pinon[alert ? "alert" : ""]direct[icon_suffix]")
else else
setDir(get_dir(here, there)) setDir(get_dir(here, there))
switch(get_dist(here, there)) switch(get_dist(here, there))
if(1 to 8) if(1 to 8)
add_overlay("pinon[alert ? "alert" : "close"]") add_overlay("pinon[alert ? "alert" : "close"][icon_suffix]")
if(9 to 16) if(9 to 16)
add_overlay("pinon[alert ? "alert" : "medium"]") add_overlay("pinon[alert ? "alert" : "medium"][icon_suffix]")
if(16 to INFINITY) 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 /obj/item/pinpointer/crew // A replacement for the old crew monitoring consoles
name = "crew pinpointer" name = "crew pinpointer"
@@ -183,3 +188,21 @@
A.other_pair = B A.other_pair = B
B.other_pair = A 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" back_story = "russian"
desc = "A small sleeper typically used to make long distance travel a bit more bearable." desc = "A small sleeper typically used to make long distance travel a bit more bearable."
mob_name = "russian" mob_name = "russian"
outfit = /datum/outfit/russiancorpse outfit = /datum/outfit/russiancorpse/hunter
icon = 'icons/obj/machines/sleeper.dmi' icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper" 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 density = FALSE
anchored = TRUE anchored = TRUE
alpha = 30 //initially quite hidden when not "recharging" alpha = 30 //initially quite hidden when not "recharging"
var/flare_message = "<span class='warning'>the trap flares brightly!</span>"
var/last_trigger = 0 var/last_trigger = 0
var/time_between_triggers = 600 //takes a minute to recharge var/time_between_triggers = 600 //takes a minute to recharge
var/charges = INFINITY var/charges = INFINITY
var/checks_antimagic = TRUE
var/list/static/ignore_typecache var/list/static/ignore_typecache
var/list/mob/immune_minds = list() var/list/mob/immune_minds = list()
var/sparks = TRUE
var/datum/effect_system/spark_spread/spark_system var/datum/effect_system/spark_spread/spark_system
/obj/structure/trap/Initialize(mapload) /obj/structure/trap/Initialize(mapload)
. = ..() . = ..()
flare_message = "<span class='warning'>[src] flares brightly!</span>"
spark_system = new spark_system = new
spark_system.set_up(4,1,src) spark_system.set_up(4,1,src)
spark_system.attach(src) spark_system.attach(src)
@@ -44,8 +48,9 @@
/obj/structure/trap/proc/flare() /obj/structure/trap/proc/flare()
// Makes the trap visible, and starts the cooldown until it's // Makes the trap visible, and starts the cooldown until it's
// able to be triggered again. // able to be triggered again.
visible_message("<span class='warning'>[src] flares brightly!</span>") visible_message(flare_message)
spark_system.start() if(sparks)
spark_system.start()
alpha = 200 alpha = 200
last_trigger = world.time last_trigger = world.time
charges-- charges--
@@ -65,7 +70,7 @@
var/mob/M = AM var/mob/M = AM
if(M.mind in immune_minds) if(M.mind in immune_minds)
return return
if(M.anti_magic_check()) if(checks_antimagic && M.anti_magic_check())
flare() flare()
return return
if(charges <= 0) if(charges <= 0)
@@ -81,10 +86,85 @@
name = "shock trap" name = "shock trap"
desc = "A trap that will shock and render you immobile. You'd better avoid it." desc = "A trap that will shock and render you immobile. You'd better avoid it."
icon_state = "trap-shock" icon_state = "trap-shock"
var/stun_time = 100
/obj/structure/trap/stun/trap_effect(mob/living/L) /obj/structure/trap/stun/trap_effect(mob/living/L)
L.electrocute_act(30, src, safety=1) // electrocute act does a message. 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 /obj/structure/trap/fire
name = "flame trap" name = "flame trap"

View File

@@ -370,7 +370,8 @@
name = "curtain" name = "curtain"
desc = "Contains less than 1% mercury." desc = "Contains less than 1% mercury."
icon = 'icons/obj/watercloset.dmi' 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. 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 alpha = 200 //Mappers can also just set this to 255 if they want curtains that can't be seen through
layer = SIGN_LAYER layer = SIGN_LAYER
@@ -385,13 +386,13 @@
/obj/structure/curtain/update_icon() /obj/structure/curtain/update_icon()
if(!open) if(!open)
icon_state = "closed" icon_state = "[icon_type]-closed"
layer = WALL_OBJ_LAYER layer = WALL_OBJ_LAYER
density = TRUE density = TRUE
open = FALSE open = FALSE
else else
icon_state = "open" icon_state = "[icon_type]-open"
layer = SIGN_LAYER layer = SIGN_LAYER
density = FALSE density = FALSE
open = TRUE open = TRUE
@@ -441,3 +442,9 @@
playsound(loc, 'sound/weapons/tap.ogg', 50, 1) playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
if(BURN) if(BURN)
playsound(loc, 'sound/items/welder.ogg', 80, 1) 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") 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>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>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") if("waldo")
to_chat(owner, "<B>Hi, Friends!</B>") 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>") 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.facial_hair_style = "Shaved"
H.hair_color = "000" H.hair_color = "000"
H.facial_hair_color = H.hair_color H.facial_hair_color = H.hair_color
H.update_body()
if(H.mind) if(H.mind)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
var/list/no_drops = list() var/list/no_drops = list()
@@ -70,8 +71,9 @@
shoes = /obj/item/clothing/shoes/jackboots shoes = /obj/item/clothing/shoes/jackboots
mask = /obj/item/clothing/mask/gas/sechailer/swat/spacepol mask = /obj/item/clothing/mask/gas/sechailer/swat/spacepol
glasses = /obj/item/clothing/glasses/sunglasses glasses = /obj/item/clothing/glasses/sunglasses
ears = /obj/item/radio/headset
l_pocket = /obj/item/ammo_box/magazine/m45 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 id = /obj/item/card/id
/datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) /datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
@@ -81,3 +83,88 @@
W.assignment = "Police Officer" W.assignment = "Police Officer"
W.registered_name = H.real_name W.registered_name = H.real_name
W.update_label() 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) /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] var/datum/atom_hud/antag/fughud = GLOB.huds[ANTAG_HUD_FUGITIVE]
fughud.join_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) /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] 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) 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 /obj/item/clothing/head/cone
desc = "This cone is trying to warn you of something!" desc = "This cone is trying to warn you of something!"
name = "warning cone" name = "warning cone"

View File

@@ -197,3 +197,11 @@
/obj/item/clothing/mask/gas/tiki_mask/yalp_elor /obj/item/clothing/mask/gas/tiki_mask/yalp_elor
icon_state = "tiki_yalp" icon_state = "tiki_yalp"
actions_types = list() 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 - EVA spacesuit
- Freedom's spacesuit (freedom from vacuum's oppression) - Freedom's spacesuit (freedom from vacuum's oppression)
- Carp hardsuit - Carp hardsuit
- Bounty hunter hardsuit
*/ */
//Death squad armored space suits, not hardsuits! //Death squad armored space suits, not hardsuits!
@@ -397,3 +398,13 @@ Contains:
torn = TRUE torn = TRUE
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1) playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1)
playsound(loc, 'sound/effects/refill.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/possible_backstories = list()
var/list/candidates = get_candidates(ROLE_TRAITOR, null, ROLE_TRAITOR) var/list/candidates = get_candidates(ROLE_TRAITOR, null, ROLE_TRAITOR)
if(candidates.len >= 1) //solo refugees 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 if(candidates.len >= 4)//group refugees
possible_backstories.Add("prisoner", "cultist", "synth") possible_backstories.Add("prisoner", "cultist", "synth")
if(!possible_backstories.len) if(!possible_backstories.len)
@@ -33,7 +34,7 @@
var/member_size = 3 var/member_size = 3
var/leader var/leader
switch(backstory) switch(backstory)
if("cultist" || "synth") if("synth")
leader = pick_n_take(candidates) leader = pick_n_take(candidates)
if("waldo") if("waldo")
member_size = 0 //solo refugees have no leader so the member_size gets bumped to one a bit later 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) /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) var/datum/mind/player_mind = new /datum/mind(leader.key)
player_mind.active = TRUE player_mind.active = TRUE
switch(backstory) //if you want to add a fugitive with a special leader in the future, make this switch with the backstory
if("cultist") var/mob/living/carbon/human/S = gear_fugitive(leader, landing_turf, backstory)
var/mob/camera/yalp_elor/yalp = new(landing_turf) var/obj/item/choice_beacon/augments/A = new(S)
player_mind.transfer_to(yalp) S.put_in_hands(A)
player_mind.assigned_role = "Yalp Elor" new /obj/item/autosurgeon(landing_turf)
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)
//security team gets called in after 10 minutes of prep to find the refugees //security team gets called in after 10 minutes of prep to find the refugees
/datum/round_event/ghost_role/fugitives/proc/spawn_hunters() /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 var/datum/map_template/shuttle/ship
if(backstory == "space cop") if(backstory == "space cop")
ship = new /datum/map_template/shuttle/hunter/space_cop ship = new /datum/map_template/shuttle/hunter/space_cop
else else if (backstory == "russian")
ship = new /datum/map_template/shuttle/hunter/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/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width)
var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height) var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height)
var/z = SSmapping.empty_space.z_value var/z = SSmapping.empty_space.z_value
@@ -115,5 +111,5 @@
if(!T) if(!T)
CRASH("Fugitive Hunters (Created from fugitive event) found no turf to load in") CRASH("Fugitive Hunters (Created from fugitive event) found no turf to load in")
if(!ship.load(T)) if(!ship.load(T))
CRASH("Loading hunter ship failed!") CRASH("Loading [backstory] ship failed!")
priority_announce("Unidentified armed ship detected near the station.") priority_announce("Unidentified ship detected near the station.")

View File

@@ -442,6 +442,20 @@
qdel(chain) qdel(chain)
return ..() 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 //Immortality Talisman
/obj/item/immortality_talisman /obj/item/immortality_talisman

View File

@@ -73,6 +73,15 @@
variance = 25 variance = 25
materials = list(MAT_METAL=4000) 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 /obj/item/ammo_casing/shotgun/improvised
name = "improvised shell" name = "improvised shell"
desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards." 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 ammo_type = /obj/item/ammo_casing/caseless/laser/gatling
caliber = "gatling" caliber = "gatling"
max_ammo = 5000 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" name = "riot shotgun internal magazine"
ammo_type = /obj/item/ammo_casing/shotgun/rubbershot ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
max_ammo = 6 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)) if(unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
reskin_obj(user) reskin_obj(user)
// IMPROVISED SHOTGUN // // IMPROVISED SHOTGUN //
/obj/item/gun/ballistic/shotgun/doublebarrel/improvised /obj/item/gun/ballistic/shotgun/doublebarrel/improvised
@@ -210,3 +209,48 @@
w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_NORMAL
sawn_off = TRUE sawn_off = TRUE
slot_flags = ITEM_SLOT_BELT 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 damage = 3
stamina = 11 stamina = 11
/obj/item/projectile/bullet/pellet/shotgun_incapacitate
name = "incapacitating pellet"
damage = 1
stamina = 6
/obj/item/projectile/bullet/pellet/Range() /obj/item/projectile/bullet/pellet/Range()
..() ..()
if(damage > 0) 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_outfits.dm"
#include "code\modules\antagonists\fugitive\fugitive_ship.dm" #include "code\modules\antagonists\fugitive\fugitive_ship.dm"
#include "code\modules\antagonists\fugitive\hunter.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\greentext\greentext.dm"
#include "code\modules\antagonists\highlander\highlander.dm" #include "code\modules\antagonists\highlander\highlander.dm"
#include "code\modules\antagonists\hivemind\hivemind.dm" #include "code\modules\antagonists\hivemind\hivemind.dm"