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