diff --git a/code/datums/spells/magnet.dm b/code/datums/spells/magnet.dm
new file mode 100644
index 00000000000..dbb4b572bbc
--- /dev/null
+++ b/code/datums/spells/magnet.dm
@@ -0,0 +1,122 @@
+/obj/effect/proc_holder/spell/wizard/targeted/magnet
+ name = "Magnetic Pull"
+ desc = "Pulls metalic objects from enemies hands with the power of MAGNETS."
+ charge_type = "recharge"
+ charge_max = 300
+ clothes_req = 0
+ invocation = "UN'LTD P'WAH!"
+ invocation_type = "none"
+ range = 7
+ cooldown_min = 30
+ selection_type = "view"
+ random_target = 1
+ var/energy = 0
+ var/ready = 0
+ var/image/halo = null
+ icon_power_button = "spell_tech"
+
+
+/obj/effect/proc_holder/spell/wizard/targeted/magnet/Click()
+ if(!ready)
+ if(cast_check())
+ StartChargeup()
+ else
+ if(cast_check(skipcharge=1))
+ choose_targets()
+ return 1
+
+/obj/effect/proc_holder/spell/wizard/targeted/magnet/proc/StartChargeup(mob/user = usr)
+ ready = 1
+ user << "You start gathering the power."
+ halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER)
+ user.overlays.Add(halo)
+ spawn(0)
+ while(ready)
+ sleep(1)
+ energy++
+ if(energy >= 100 && ready)
+ Discharge()
+
+obj/effect/proc_holder/spell/wizard/targeted/magnet/proc/Reset(mob/user = usr)
+ ready = 0
+ energy = 0
+ if(halo)
+ user.overlays.Remove(halo)
+
+/obj/effect/proc_holder/spell/wizard/targeted/magnet/revert_cast(mob/user = usr)
+ user << "No target found in range."
+ Reset(user)
+ ..()
+
+/obj/effect/proc_holder/spell/wizard/targeted/magnet/proc/Discharge(mob/user = usr)
+ var/mob/living/M = user
+ //M.electrocute_act(25,"magnet Bolt")
+ M << "You lose control over the power."
+ Reset(user)
+ start_recharge()
+
+
+/obj/effect/proc_holder/spell/wizard/targeted/magnet/cast(list/targets, mob/user = usr)
+
+ var/mob/living/carbon/target = targets[1]
+
+ if(get_dist(user,target)>range)
+ user << "They are too far away!"
+ Reset(user)
+ return
+
+ user.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5)
+
+ switch(energy)
+ if(0 to 25)
+ if(prob(50))
+ for(var/obj/item/I in target.l_hand)
+ if(I.flags & CONDUCT)
+ I.throw_at(user, I.throw_range, 4, target)
+ else
+ for(var/obj/item/I in target.r_hand)
+ if(I.flags & CONDUCT)
+ I.throw_at(user, I.throw_range, 4, target)
+ playsound(get_turf(target), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ if(25 to 75)
+ for(var/obj/item/I in target.l_hand)
+ if(I.flags & CONDUCT)
+ I.throw_at(user, I.throw_range, 4, target)
+ for(var/obj/item/I in target.r_hand)
+ if(I.flags & CONDUCT)
+ I.throw_at(user, I.throw_range, 4, target)
+ playsound(get_turf(target), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ if(75 to 100)
+ //CHAIN magnet
+ Bolt(user,target,energy,user)
+ Reset(user)
+
+/obj/effect/proc_holder/spell/wizard/targeted/magnet/proc/Bolt(mob/origin,mob/target,bolt_energy,mob/user = usr)
+ origin.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5)
+ var/mob/living/carbon/current = target
+ if(bolt_energy < 75)
+ for(var/obj/item/I in target.l_hand)
+ if(I.flags & CONDUCT)
+ I.throw_at(user, I.throw_range, 4, target)
+ for(var/obj/item/I in target.r_hand)
+ if(I.flags & CONDUCT)
+ I.throw_at(user, I.throw_range, 4, target)
+ playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ else
+ for(var/obj/item/I in target.l_hand)
+ if(I.flags & CONDUCT)
+ I.throw_at(user, I.throw_range, 4, target)
+ for(var/obj/item/I in target.r_hand)
+ if(I.flags & CONDUCT)
+ I.throw_at(user, I.throw_range, 4, target)
+ playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ var/list/possible_targets = new
+ for(var/mob/living/M in view_or_range(range,target,"view"))
+ if(user == M || target == M && los_check(current,M)) // || origin == M ? Not sure double shockings is good or not
+ continue
+ possible_targets += M
+ if(!possible_targets.len)
+ return
+ var/mob/living/next = pick(possible_targets)
+ if(next)
+ Bolt(current,next,bolt_energy-6,user) // 5 max bounces
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index db68c73ee56..f499f14d2b7 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -346,22 +346,56 @@
desc = "Sometimes people choose justice. Sometimes, justice chooses you..."
icon_state = "securitybelt"
item_state = "security"
- storage_slots = 14
+ storage_slots = 6
max_w_class = 3
- max_combined_w_class = 28 // = 14 * 2
+ max_combined_w_class = 18
origin_tech = "bluespace=4;syndicate=2"
allow_quick_empty = 1
- can_hold = list()
- flags = NODROP
- New()
- ..()
- new /obj/item/weapon/grenade/smokebomb(src)
- new /obj/item/weapon/grenade/smokebomb(src)
- new /obj/item/weapon/grenade/smokebomb(src)
- new /obj/item/weapon/grenade/smokebomb(src)
- new /obj/item/weapon/legcuffs/bolas(src)
- new /obj/item/weapon/legcuffs/bolas(src)
+ can_hold = list(
+ "/obj/item/weapon/grenade/smokebomb",
+ "/obj/item/weapon/legcuffs/bolas"
+ )
+ flags = NODROP
+ var/smokecount = 0
+ var/bolacount = 0
+ var/cooldown = 0
+
+/obj/item/weapon/storage/belt/bluespace/owlman/New()
+ ..()
+ new /obj/item/weapon/grenade/smokebomb(src)
+ new /obj/item/weapon/grenade/smokebomb(src)
+ new /obj/item/weapon/grenade/smokebomb(src)
+ new /obj/item/weapon/grenade/smokebomb(src)
+ new /obj/item/weapon/legcuffs/bolas(src)
+ new /obj/item/weapon/legcuffs/bolas(src)
+ processing_objects.Add(src)
+ cooldown = world.time
+
+/obj/item/weapon/storage/belt/bluespace/owlman/process()
+ if(cooldown < world.time - 600)
+ smokecount = 0
+ var/obj/item/weapon/grenade/smokebomb/S
+ for(S in src)
+ smokecount++
+ bolacount = 0
+ var/obj/item/weapon/legcuffs/bolas/B
+ for(B in src)
+ bolacount++
+ if(smokecount < 4)
+ while(smokecount < 4)
+ new /obj/item/weapon/grenade/smokebomb(src)
+ smokecount++
+ if(bolacount < 2)
+ while(bolacount < 2)
+ new /obj/item/weapon/legcuffs/bolas(src)
+ bolacount++
+ cooldown = world.time
+ update_icon()
+
+
+
+/* DEPRECATED DUE TO SUPERHERO CODE AND NODROP
// As a last resort, the belt can be used as a plastic explosive with a fixed timer (15 seconds). Naturally, you'll lose all your gear...
// Of course, it could be worse. It could spawn a singularity!
/obj/item/weapon/storage/belt/bluespace/owlman/afterattack(atom/target as obj|turf, mob/user as mob, flag)
@@ -400,6 +434,8 @@
del(target)
if (src)
del(src)
+*/
+
/obj/item/weapon/storage/belt/bluespace/attack(mob/M as mob, mob/user as mob, def_zone)
return
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 753f0454fe7..1cd2a19525e 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -240,6 +240,10 @@
flags = BLOCKHAIR | NODROP
siemens_coefficient = 2.0
+/obj/item/clothing/head/corgi/en
+ name = "E-N suit head"
+ icon_state = "enhead"
+
/obj/item/clothing/head/bearpelt
name = "bear pelt hat"
desc = "Fuzzy."
@@ -344,6 +348,25 @@
item_state = "griffinhat"
flags = BLOCKHAIR|NODROP
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ var/cooldown = 0
+ action_button_name = "Caw"
+ icon_action_button = "action_griffin"
+
+/obj/item/clothing/head/griffin/attack_self()
+ caw()
+
+/obj/item/clothing/head/griffin/verb/caw()
+
+ set category = "Object"
+ set name = "Caw"
+ set src in usr
+ if(!istype(usr, /mob/living)) return
+ if(usr.stat) return
+
+ if(cooldown < world.time - 20) // A cooldown, to stop people being jerks
+ playsound(src.loc, "sound/misc/caw.ogg", 50, 1)
+ cooldown = world.time
+
/obj/item/clothing/head/lordadmiralhat
name = "Lord Admiral's Hat"
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 63d660cf78b..eac240c5073 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -136,7 +136,24 @@
icon_state = "owl"
species_fit = list("Vox")
flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS | NODROP
+ var/cooldown = 0
+ action_button_name = "Hoot"
+ icon_action_button = "action_owlman"
+/obj/item/clothing/mask/gas/owl_mask/attack_self()
+ hoot()
+
+/obj/item/clothing/mask/gas/owl_mask/verb/hoot()
+
+ set category = "Object"
+ set name = "Hoot"
+ set src in usr
+ if(!istype(usr, /mob/living)) return
+ if(usr.stat) return
+
+ if(cooldown < world.time - 35) // A cooldown, to stop people being jerks
+ playsound(src.loc, "sound/misc/hoot.ogg", 50, 1)
+ cooldown = world.time
// ********************************************************************
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 6b5b86e00f5..9f819f9985b 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -158,6 +158,25 @@
siemens_coefficient = 2.0
flags = NODROP
+/obj/item/clothing/suit/corgisuit/en
+ name = "E-N Suit"
+ icon_state = "ensuit"
+
+/obj/item/clothing/suit/corgisuit/en/New()
+ ..()
+ processing_objects.Add(src)
+
+/obj/item/clothing/suit/corgisuit/en/process()
+ if(prob(2))
+ for(var/obj/M in orange(2,src))
+ if(!M.anchored && (M.flags & CONDUCT))
+ step_towards(M,src)
+ for(var/mob/living/silicon/S in orange(2,src))
+ if(istype(S, /mob/living/silicon/ai)) continue
+ step_towards(S,src)
+ for(var/mob/living/carbon/human/machine/M in orange(2,src))
+ step_towards(M,src)
+
/obj/item/clothing/suit/monkeysuit
name = "Monkey Suit"
desc = "A suit that looks like a primate"
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index b9182040923..fb4f597bbae 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -21,6 +21,7 @@
for(var/obj/item/W in H)
if(istype(W,/obj/item/organ)) continue
H.unEquip(W)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_l_ear)
/datum/superheroes/proc/assign_genes(var/mob/living/carbon/human/H)
if(default_genes.len)
@@ -39,7 +40,7 @@
/datum/superheroes/proc/assign_id(var/mob/living/carbon/human/H)
var/obj/item/weapon/card/id/syndicate/W = new(H)
W.registered_name = H.real_name
- W.access = get_all_accesses()
+ W.access = list(access_maint_tunnels)
if(class == "Superhero")
W.name = "[H.real_name]'s ID Card (Superhero)"
W.assignment = "Superhero"
@@ -64,7 +65,7 @@
/datum/superheroes/owlman/equip(var/mob/living/carbon/human/H)
..()
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black/greytide(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/owl(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/owlwings(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/owl_mask(H), slot_wear_mask)
@@ -88,6 +89,14 @@
H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/owlwings/griffinwings(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/griffin(H), slot_head)
+ var/obj/item/weapon/implant/freedom/L = new/obj/item/weapon/implant/freedom(H)
+ L.imp_in = H
+ L.implanted = 1
+ var/obj/item/organ/external/affected = H.organs_by_name["head"]
+ affected.implants += L
+ L.part = affected
+ return 1
+
/datum/superheroes/lightnian
name = "LightnIan"
@@ -100,7 +109,7 @@
/datum/superheroes/lightnian/equip(var/mob/living/carbon/human/H)
..()
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/brown(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/corgisuit(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/corgi(H), slot_head)
@@ -108,7 +117,22 @@
H.equip_to_slot_or_del(new /obj/item/weapon/bedsheet/orange(H), slot_back)
+/datum/superheroes/electro
+ name = "Electro-Negmatic"
+ class = "Supevillain"
+ desc = "You were a roboticist, once. Now you are Electro-Negmatic, a name this station will learn to fear. You designed \
+ your costume to resemble E-N, your faithful dog that some callous RD destroyed because it was sparking up the plasma. You \
+ intend to take your revenge and make them all pay thanks to your magnetic powers."
+ default_spells = list(/obj/effect/proc_holder/spell/wizard/targeted/magnet)
+/datum/superheroes/electro/equip(var/mob/living/carbon/human/H)
+ ..()
+
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black/greytide(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/corgisuit/en(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/corgi/en(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/weapon/bedsheet/cult(H), slot_back)
@@ -120,7 +144,6 @@
/obj/effect/proc_holder/spell/wizard/targeted/recruit
name = "Recruit Greyshirt"
desc = "Allows you to recruit a conscious, non-braindead, non-catatonic human to be part of the Greyshirts, your personal henchmen. This works on Civilians only and you can recruit a maximum of 3!."
- panel = "Shadowling Abilities"
charge_max = 450
clothes_req = 0
range = 1 //Adjacent to user
@@ -191,11 +214,24 @@
ticker.mode.greyshirts += target.mind
target.set_species("Human")
target.h_style = "Bald"
- target.fully_replace_character_name(target.real_name, "Generic Henchman ([rand(1, 1000)])")
+ target.f_style = "Shaved"
+ target.s_tone = 35
+ target.r_eyes = 1
+ target.b_eyes = 1
+ target.g_eyes = 1
for(var/obj/item/W in target)
if(istype(W,/obj/item/organ)) continue
target.unEquip(W)
+ target.fully_replace_character_name(target.real_name, "Generic Henchman ([rand(1, 1000)])")
target.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey/greytide(target), slot_w_uniform)
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/black/greytide(target), slot_shoes)
target.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical/greytide(target), slot_l_hand)
- target.regenerate_icons()
\ No newline at end of file
+ var/obj/item/weapon/card/id/syndicate/W = new(target)
+ W.registered_name = target.real_name
+ W.access = list(access_maint_tunnels)
+ W.name = "[target.real_name]'s ID Card (Greyshirt)"
+ W.assignment = "Greyshirt"
+ target.equip_to_slot_or_del(W, slot_wear_id)
+ target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_l_ear)
+ target.regenerate_icons()
+
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index c1eb1966043..bcd4eedbc16 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 431299550f7..944f0ec6dbe 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index b808cde1bc3..da79be81666 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 6ab4a1cb1ce..4d12b0c59c7 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 87370cb5516..26da97bd657 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -168,6 +168,7 @@
#include "code\datums\spells\inflict_handler.dm"
#include "code\datums\spells\knock.dm"
#include "code\datums\spells\lightning.dm"
+#include "code\datums\spells\magnet.dm"
#include "code\datums\spells\mind_transfer.dm"
#include "code\datums\spells\projectile.dm"
#include "code\datums\spells\summonitem.dm"
diff --git a/sound/misc/caw.ogg b/sound/misc/caw.ogg
new file mode 100644
index 00000000000..dc199f7f4fe
Binary files /dev/null and b/sound/misc/caw.ogg differ
diff --git a/sound/misc/hoot.ogg b/sound/misc/hoot.ogg
new file mode 100644
index 00000000000..a1b6b5f18fa
Binary files /dev/null and b/sound/misc/hoot.ogg differ