diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm index 638bd59930..9a51a3fc01 100644 --- a/code/game/gamemodes/changeling/generic_equip_procs.dm +++ b/code/game/gamemodes/changeling/generic_equip_procs.dm @@ -39,7 +39,7 @@ return 1 //This is a generic proc that should be called by other ling weapon procs to equip them. -/mob/proc/changeling_generic_weapon(var/weapon_type, var/make_sound = 1) +/mob/proc/changeling_generic_weapon(var/weapon_type, var/make_sound = 1, var/cost = 20) var/datum/changeling/changeling = changeling_power(20,1,100,CONSCIOUS) if(!changeling) return @@ -56,7 +56,7 @@ var/obj/item/weapon/W = new weapon_type(src) src.put_in_hands(W) - src.mind.changeling.chem_charges -= 20 + src.mind.changeling.chem_charges -= cost if(make_sound) playsound(src, 'sound/effects/blobattack.ogg', 30, 1) return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/electric_lockpick.dm b/code/game/gamemodes/changeling/powers/electric_lockpick.dm new file mode 100644 index 0000000000..c8c87e6a9d --- /dev/null +++ b/code/game/gamemodes/changeling/powers/electric_lockpick.dm @@ -0,0 +1,93 @@ +/datum/power/changeling/electric_lockpick + name = "Electric Lockpick" + desc = "We discreetly evolve a finger to be able to send a small electric charge. \ + We can open most electrical locks, but it will be obvious when we do so." + helptext = "Use the ability, then touch something that utilizes an electrical locking system, to open it. Each use costs 10 chemicals." + genomecost = 3 + verbpath = /mob/proc/changeling_electric_lockpick + +//Emag-lite +/mob/proc/changeling_electric_lockpick() + set category = "Changeling" + set name = "Electric Lockpick (5 + 10/use)" + set desc = "Bruteforces open most electrical locking systems, at 10 chemicals per use." + + var/datum/changeling/changeling = changeling_power(5,0,100,CONSCIOUS) + + var/obj/held_item = get_active_hand() + + if(!changeling) + return 0 + + if(held_item == null) + if(changeling_generic_weapon(/obj/item/weapon/finger_lockpick,0,5)) //Chemical cost is handled in the equip proc. + return 1 + return 0 + +/obj/item/weapon/finger_lockpick + name = "finger lockpick" + desc = "This finger appears to be an organic datajack." + icon = 'icons/obj/weapons.dmi' + icon_state = "electric_hand" + +/obj/item/weapon/finger_lockpick/New() + if(ismob(loc)) + loc << "We shape our finger to fit inside electronics, and are ready to force them open." + +/obj/item/weapon/finger_lockpick/dropped(mob/user) + user << "We discreetly shape our finger back to a less suspicious form." + spawn(1) + if(src) + qdel(src) + +/obj/item/weapon/finger_lockpick/afterattack(var/atom/target, var/mob/living/user, proximity) + if(!target) + return + if(!proximity) + return + if(!user.mind.changeling) + return + + var/datum/changeling/ling_datum = user.mind.changeling + + if(ling_datum.chem_charges < 10) + user << "We require more chemicals to do that." + return + + //Airlocks require an ugly block of code, but we don't want to just call emag_act(), since we don't want to break airlocks forever. + if(istype(target,/obj/machinery/door)) + var/obj/machinery/door/door = target + user << "We send an electrical pulse up our finger, and into \the [target], attempting to open it." + + if(door.density && door.operable()) + door.do_animate("spark") + sleep(6) + //More typechecks, because windoors can't be locked. Fun. + if(istype(target,/obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/airlock = target + + if(airlock.locked) //Check if we're bolted. + airlock.unlock() + user << "We've unlocked \the [airlock]. Another pulse is requried to open it." + else //We're not bolted, so open the door already. + airlock.open() + user << "We've opened \the [airlock]." + else + door.open() //If we're a windoor, open the windoor. + user << "We've opened \the [door]." + else //Probably broken or no power. + user << "The door does not respond to the pulse." + door.add_fingerprint(user) + ling_datum.chem_charges -= 10 + return 1 + + else if(istype(target,/obj/)) //This should catch everything else we might miss, without a million typechecks. + var/obj/O = target + user << "We send an electrical pulse up our finger, and into \the [O]." + O.add_fingerprint(user) + O.emag_act(1,user,src) + log_and_message_admins("emagged \an [O].") + ling_datum.chem_charges -= 10 + + return 1 + return 0 \ No newline at end of file diff --git a/polaris.dme b/polaris.dme index 1b7026b03a..4653cf1d9d 100644 --- a/polaris.dme +++ b/polaris.dme @@ -298,6 +298,7 @@ #include "code\game\gamemodes\changeling\powers\cryo_sting.dm" #include "code\game\gamemodes\changeling\powers\deaf_sting.dm" #include "code\game\gamemodes\changeling\powers\digital_camo.dm" +#include "code\game\gamemodes\changeling\powers\electric_lockpick.dm" #include "code\game\gamemodes\changeling\powers\engorged_glands.dm" #include "code\game\gamemodes\changeling\powers\epinephrine_overdose.dm" #include "code\game\gamemodes\changeling\powers\extract_dna_sting.dm"