Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.

Commit a35188c

Browse files
authored
New Traitor Item: The Gasharpoon (#21365)
* yes gasharpoon * Revert "yes" This reverts commit f01197f. * where did these go who knows * bye bye * yeah this is going well remember to update the rope * ok its done remind me to change basemap * let my people go * stupid map dependency * minecraft update 1.3 adds sex * sprite updates yippie * meaninggless change
1 parent daeee33 commit a35188c

File tree

14 files changed

+217
-0
lines changed

14 files changed

+217
-0
lines changed

code/__DEFINES/status_effects.dm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@
116116

117117
#define STATUS_EFFECT_EXPOSED /datum/status_effect/exposed //increases incoming damage
118118

119+
#define STATUS_EFFECT_EXPOSED_HARPOONED /datum/status_effect/exposed/harpooned //increases incoming damage when hit by a gasharpoon
120+
119121
#define STATUS_EFFECT_TAMING /datum/status_effect/taming //tames the target after enough tame stacks
120122

121123
#define STATUS_EFFECT_NECROPOLIS_CURSE /datum/status_effect/necropolis_curse

code/datums/status_effects/debuffs/debuffs.dm

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1301,6 +1301,45 @@
13011301
for(var/i in S.damage_coeff)
13021302
S.damage_coeff[i] /= power
13031303

1304+
/datum/status_effect/exposed/harpooned
1305+
id = "harpooned"
1306+
duration = 2 SECONDS
1307+
///damage multiplier
1308+
power = 1.3
1309+
1310+
/datum/status_effect/exposed/harpooned/on_apply()
1311+
. = ..()
1312+
if(.)
1313+
owner.add_filter("exposed", 2, list("type" = "outline", "color" = COLOR_RED, "size" = 1))
1314+
1315+
if(ishuman(owner))
1316+
var/mob/living/carbon/human/H = owner
1317+
H.physiology.brute_mod *= power
1318+
H.physiology.burn_mod *= power
1319+
H.physiology.tox_mod *= power
1320+
H.physiology.oxy_mod *= power
1321+
H.physiology.clone_mod *= power
1322+
H.physiology.stamina_mod *= power
1323+
else if(isanimal(owner))
1324+
var/mob/living/simple_animal/S = owner
1325+
for(var/i in S.damage_coeff)
1326+
S.damage_coeff[i] *= power
1327+
1328+
/datum/status_effect/exposed/harpooned/on_remove()
1329+
owner.remove_filter("exposed")
1330+
if(ishuman(owner))
1331+
var/mob/living/carbon/human/H = owner
1332+
H.physiology.brute_mod /= power
1333+
H.physiology.burn_mod /= power
1334+
H.physiology.tox_mod /= power
1335+
H.physiology.oxy_mod /= power
1336+
H.physiology.clone_mod /= power
1337+
H.physiology.stamina_mod /= power
1338+
else if(isanimal(owner))
1339+
var/mob/living/simple_animal/S = owner
1340+
for(var/i in S.damage_coeff)
1341+
S.damage_coeff[i] /= power
1342+
13041343
/datum/status_effect/knuckled
13051344
id = "knuckle_wound"
13061345
duration = 10 SECONDS
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/datum/action/cooldown/buster/megabuster/megaharpoon
2+
name = "gasharpoon"
3+
desc = "Charge up your harpoon and ready it to be fired, if it makes contact with a person it will drag them to you and immobilize them."
4+
cooldown_time = 10 SECONDS
5+
button_icon_state = "harpoonhead"
6+
7+
8+
/obj/item/gun/magic/wire/harpoon
9+
name = "Harpoon Head"
10+
desc = "A harpoon head made of pure plasteel, hits like a freighter."
11+
ammo_type = /obj/item/ammo_casing/magic/wire/harpoon
12+
icon_state = "gasharpoon"
13+
item_state = "chain"
14+
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
15+
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
16+
fire_sound = 'sound/weapons/batonextend.ogg'
17+
max_charges = 1
18+
item_flags = NEEDS_PERMIT | DROPDEL
19+
force = 0
20+
can_charge = FALSE
21+
22+
/obj/item/ammo_casing/magic/wire/harpoon
23+
name = "harpoon"
24+
desc = "A harpoon."
25+
projectile_type = /obj/projectile/wire/harpoon
26+
caliber = CALIBER_HOOK
27+
icon_state = "harpoonhead"
28+
29+
/obj/projectile/wire/harpoon/fire(setAngle)
30+
if(firer)
31+
wire = firer.Beam(src, icon_state = "harpoonrope", time = INFINITY, maxdistance = INFINITY)
32+
..()
33+
34+
/obj/projectile/wire/harpoon
35+
name = "harpoon"
36+
icon_state = "harpoonhead"
37+
icon = 'icons/obj/lavaland/artefacts.dmi'
38+
pass_flags = PASSTABLE
39+
damage = 10
40+
armour_penetration = 100
41+
damage_type = BRUTE
42+
nodamage = TRUE
43+
range = 8
44+
hitsound = 'sound/effects/splat.ogg'
45+
immobilize = 1 SECONDS
46+
47+
/obj/projectile/wire/harpoon/on_hit(atom/target)
48+
var/mob/living/L = target
49+
var/mob/living/carbon/human/H = firer
50+
if(!L)
51+
return
52+
L.apply_status_effect(STATUS_EFFECT_EXPOSED_HARPOONED)
53+
if(isobj(target)) // If it's an object
54+
var/obj/item/I = target
55+
if(!I?.anchored) // Give it to us if it's not anchored
56+
I.throw_at(get_step_towards(H,I), 8, 2)
57+
H.visible_message(span_danger("[I] is pulled by [H]'s harpoon!"))
58+
if(istype(I, /obj/item/clothing/head))
59+
H.equip_to_slot_if_possible(I, ITEM_SLOT_HEAD)
60+
H.visible_message(span_danger("[H] pulls [I] onto [H.p_their()] head!"))
61+
else
62+
H.put_in_hands(I)
63+
return
64+
zip(H, target) // Pull us towards it if it's anchored
65+
if(isliving(target)) // If it's somebody
66+
H.swap_hand(0) //for the sake of throttling people you catch
67+
var/turf/T = get_step(get_turf(H), H.dir)
68+
var/turf/Q = get_turf(H)
69+
var/obj/item/bodypart/limb_to_hit = L.get_bodypart(H.zone_selected)
70+
var/armor = L.run_armor_check(limb_to_hit, MELEE, armour_penetration = 35)
71+
if(!L.anchored) // Only pull them if they're unanchored
72+
if(istype(H))
73+
L.visible_message(span_danger("[L] is pulled by [H]'s harpoon!"),span_userdanger("A harpoon pierces you and pulls you towards [H]!"))
74+
L.Immobilize(1.0 SECONDS)
75+
if(T.density) // If we happen to be facing a wall after the wire snatches them
76+
to_chat(H, span_warning("[H] catches [L] and throws [L.p_them()] against [T]!"))
77+
to_chat(L, span_userdanger("[H] crushes you against [T]!"))
78+
playsound(L,'sound/effects/pop_expl.ogg', 130, 1)
79+
L.apply_damage(15, BRUTE, limb_to_hit, armor, wound_bonus=CANT_WOUND)
80+
L.forceMove(Q)
81+
return
82+
// If we happen to be facing a dense object after the wire snatches them, like a table or window
83+
for(var/obj/D in T.contents)
84+
if(D.density == TRUE)
85+
D.take_damage(50)
86+
L.apply_damage(15, BRUTE, limb_to_hit, armor, wound_bonus=CANT_WOUND)
87+
L.forceMove(Q)
88+
to_chat(H, span_warning("[H] catches [L] throws [L.p_them()] against [D]!"))
89+
playsound(L,'sound/effects/pop_expl.ogg', 20, 1)
90+
return
91+
L.forceMove(T)
92+
if(iswallturf(target)) // If we hit a wall, pull us to it
93+
var/turf/W = target
94+
zip(H, W)
95+
96+
/// Left buster-arm means megabuster goes in left hand -- I stole this from megabuster! -- cowbot93
97+
/datum/action/cooldown/buster/megabuster/megaharpoon/l/Activate()
98+
var/obj/item/gun/magic/wire/harpoon/B = new()
99+
owner.visible_message(span_userdanger("[owner]'s arm lets out a harrowing sound!"))
100+
playsound(owner,'sound/weapons/bladeslice.ogg', 60, 1)
101+
if(do_after(owner, 2 SECONDS, owner, timed_action_flags = IGNORE_USER_LOC_CHANGE))
102+
if(!owner.put_in_l_hand(B))
103+
to_chat(owner, span_warning("You can't do this with your left hand full!"))
104+
else
105+
owner.visible_message(span_danger("[owner]'s readies the harpoon to fire!"))
106+
if(owner.active_hand_index % 2 == 0)
107+
owner.swap_hand(0)
108+
StartCooldown()
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/obj/item/clothing/gloves/gasharpoon
2+
name = "gasharpoon"
3+
desc = "A metal gauntlet with a harpoon attatched, powered by gasoline and traditionally used by space-whalers."
4+
///reminder to channge all this -- I changed it :)
5+
icon = 'icons/obj/traitor.dmi'
6+
icon_state = "gasharpoon"
7+
item_state = "gasharpoon"
8+
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
9+
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
10+
attack_verb = list("harpooned", "gouged", "pierced")
11+
force = 10
12+
throwforce = 10
13+
throw_range = 7
14+
strip_delay = 15 SECONDS
15+
cold_protection = HANDS
16+
heat_protection = HANDS
17+
w_class = WEIGHT_CLASS_NORMAL
18+
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, ELECTRIC = 100)
19+
resistance_flags = FIRE_PROOF | ACID_PROOF
20+
var/click_delay = 1.5
21+
22+
23+
/obj/item/clothing/gloves/gasharpoon/equipped(mob/user, slot)
24+
. = ..()
25+
if(slot & ITEM_SLOT_GLOVES)
26+
RegisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(power_harpoon))
27+
var/datum/action/cooldown/buster/megabuster/megaharpoon/l/harpoon = new(user)
28+
harpoon.Grant(user)
29+
30+
/obj/item/clothing/gloves/gasharpoon/dropped(mob/user)
31+
. = ..()
32+
if(user.get_item_by_slot(ITEM_SLOT_GLOVES)==src)
33+
UnregisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
34+
var/datum/action/cooldown/buster/megabuster/megaharpoon/l/harpoon = locate(/datum/action/cooldown/buster/megabuster/megaharpoon/l) in user.actions
35+
if(harpoon)
36+
harpoon.Remove(user)
37+
return ..()
38+
39+
40+
/obj/item/clothing/gloves/gasharpoon/proc/power_harpoon(mob/living/user, atom/movable/target)
41+
if(!user || user.a_intent!=INTENT_HARM || (!isliving(target) && !isobj(target)) || isitem(target))
42+
return
43+
do_attack(user, target, force * 2)
44+
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1)
45+
target.visible_message(span_danger("[user]'s gasharpoon pierces through [target.name]!"))
46+
return COMPONENT_NO_ATTACK_HAND
47+
48+
/obj/item/clothing/gloves/gasharpoon/attack(mob/living/target, mob/living/user)
49+
power_harpoon(user, target)
50+
51+
/obj/item/clothing/gloves/gasharpoon/proc/do_attack(mob/living/user, atom/target, punch_force)
52+
if(isliving(target))
53+
var/mob/living/target_mob = target
54+
target_mob.apply_damage(punch_force, BRUTE, wound_bonus = 30)
55+
else if(isobj(target))
56+
var/obj/target_obj = target
57+
target_obj.take_damage(punch_force, BRUTE, MELEE, FALSE)
58+
user.do_attack_animation(target, ATTACK_EFFECT_SLASH)
59+
user.changeNext_move(CLICK_CD_MELEE * click_delay)

code/modules/uplink/uplink_items.dm

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
339339
manufacturer = /datum/corporation/traitor/cybersun
340340
surplus = 0
341341

342+
/datum/uplink_item/dangerous/gasharpoon
343+
name = "Gasharpoon"
344+
desc = "A repurposed space-whaling tool attatched to a glove, can be used as a sturdy weapon in both hands, or worn as a glove to allow access to it's harpoon."
345+
item = /obj/item/clothing/gloves/gasharpoon
346+
cost = 10
347+
surplus = 0
348+
342349
/datum/uplink_item/dangerous/rawketlawnchair
343350
name = "84mm Rocket Propelled Grenade Launcher"
344351
desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. \

icons/effects/beam.dmi

112 Bytes
Binary file not shown.

icons/mob/actions/actions_arm.dmi

234 Bytes
Binary file not shown.

icons/mob/clothing/hands/hands.dmi

284 Bytes
Binary file not shown.
552 Bytes
Binary file not shown.
1.09 KB
Binary file not shown.

0 commit comments

Comments
 (0)