/* Changeling Mutations! ~By Miauw (ALL OF IT :V) Contains: Arm Blade Space Suit Shield Armor Tentacles */ //Parent to shields and blades because muh copypasted code. /obj/effect/proc_holder/changeling/weapon name = "Organic Weapon" desc = "Go tell a coder if you see this" helptext = "Yell at Miauw and/or Perakp" chemical_cost = 1000 dna_cost = -1 genetic_damage = 1000 var/silent = FALSE var/weapon_type var/weapon_name_simple /obj/effect/proc_holder/changeling/weapon/try_to_sting(mob/user, mob/target) for(var/obj/item/I in user.held_items) if(check_weapon(user, I)) return ..(user, target) /obj/effect/proc_holder/changeling/weapon/proc/check_weapon(mob/user, obj/item/hand_item) if(istype(hand_item, weapon_type)) user.temporarilyRemoveItemFromInventory(hand_item, TRUE) //DROPDEL will delete the item if(!silent) playsound(user, 'sound/effects/blobattack.ogg', 30, 1) user.visible_message("With a sickening crunch, [user] reforms their [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "The [user.get_active_held_item()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!") return var/limb_regen = 0 if(user.active_hand_index % 2 == 0) //we regen the arm before changing it into the weapon limb_regen = user.regenerate_limb("r_arm", 1) else limb_regen = user.regenerate_limb("l_arm", 1) if(limb_regen) user.visible_message("[user]'s missing arm reforms, making a loud, grotesque sound!", "Your arm regrows, making a loud, crunchy sound and giving you great pain!", "You hear organic matter ripping and tearing!") user.emote("scream") var/obj/item/W = new weapon_type(user, silent) user.put_in_hands(W) if(!silent) playsound(user, 'sound/effects/blobattack.ogg', 30, 1) return W /obj/effect/proc_holder/changeling/weapon/on_refund(mob/user) for(var/obj/item/I in user.held_items) check_weapon(user, I) //Parent to space suits and armor. /obj/effect/proc_holder/changeling/suit name = "Organic Suit" desc = "Go tell a coder if you see this" helptext = "Yell at Miauw and/or Perakp" chemical_cost = 1000 dna_cost = -1 genetic_damage = 1000 var/helmet_type = /obj/item var/suit_type = /obj/item var/suit_name_simple = " " var/helmet_name_simple = " " var/recharge_slowdown = 0 var/blood_on_castoff = 0 /obj/effect/proc_holder/changeling/suit/try_to_sting(mob/user, mob/target) if(check_suit(user)) return var/mob/living/carbon/human/H = user ..(H, target) //checks if we already have an organic suit and casts it off. /obj/effect/proc_holder/changeling/suit/proc/check_suit(mob/user) var/datum/changeling/changeling = user.mind.changeling if(!ishuman(user) || !changeling) return 1 var/mob/living/carbon/human/H = user if(istype(H.wear_suit, suit_type) || istype(H.head, helmet_type)) H.visible_message("[H] casts off their [suit_name_simple]!", "We cast off our [suit_name_simple][genetic_damage > 0 ? ", temporarily weakening our genomes." : "."]", "You hear the organic matter ripping and tearing!") H.temporarilyRemoveItemFromInventory(H.head, TRUE) //The qdel on dropped() takes care of it H.temporarilyRemoveItemFromInventory(H.wear_suit, TRUE) H.update_inv_wear_suit() H.update_inv_head() H.update_hair() if(blood_on_castoff) H.add_splatter_floor() playsound(H.loc, 'sound/effects/splat.ogg', 50, 1) //So real sounds changeling.geneticdamage += genetic_damage //Casting off a space suit leaves you weak for a few seconds. changeling.chem_recharge_slowdown -= recharge_slowdown return 1 /obj/effect/proc_holder/changeling/suit/on_refund(mob/user) if(!ishuman(user)) return var/mob/living/carbon/human/H = user check_suit(H) /obj/effect/proc_holder/changeling/suit/sting_action(mob/living/carbon/human/user) if(!user.canUnEquip(user.wear_suit)) to_chat(user, "\the [user.wear_suit] is stuck to your body, you cannot grow a [suit_name_simple] over it!") return if(!user.canUnEquip(user.head)) to_chat(user, "\the [user.head] is stuck on your head, you cannot grow a [helmet_name_simple] over it!") return user.dropItemToGround(user.head) user.dropItemToGround(user.wear_suit) user.equip_to_slot_if_possible(new suit_type(user), slot_wear_suit, 1, 1, 1) user.equip_to_slot_if_possible(new helmet_type(user), slot_head, 1, 1, 1) var/datum/changeling/changeling = user.mind.changeling changeling.chem_recharge_slowdown += recharge_slowdown return TRUE //fancy headers yo /***************************************\ |***************ARM BLADE***************| \***************************************/ /obj/effect/proc_holder/changeling/weapon/arm_blade name = "Arm Blade" desc = "We reform one of our arms into a deadly blade." helptext = "We may retract our armblade in the same manner as we form it. Cannot be used while in lesser form." chemical_cost = 20 dna_cost = 2 genetic_damage = 10 req_human = 1 max_genetic_damage = 20 weapon_type = /obj/item/weapon/melee/arm_blade weapon_name_simple = "blade" /obj/item/weapon/melee/arm_blade name = "arm blade" desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter." icon = 'icons/obj/weapons.dmi' icon_state = "arm_blade" item_state = "arm_blade" flags = ABSTRACT | NODROP | DROPDEL w_class = WEIGHT_CLASS_HUGE force = 25 throwforce = 0 //Just to be on the safe side throw_range = 0 throw_speed = 0 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = IS_SHARP var/can_drop = FALSE /obj/item/weapon/melee/arm_blade/Initialize(mapload,silent,synthetic) . = ..() if(ismob(loc) && !silent) loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!") if(synthetic) can_drop = TRUE /obj/item/weapon/melee/arm_blade/afterattack(atom/target, mob/user, proximity) if(!proximity) return if(istype(target, /obj/structure/table)) var/obj/structure/table/T = target T.deconstruct(FALSE) else if(istype(target, /obj/machinery/computer)) var/obj/machinery/computer/C = target C.attack_alien(user) //muh copypasta else if(istype(target, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/A = target if(!A.requiresID() || A.allowed(user)) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message. return if(A.locked) to_chat(user, "The airlock's bolts prevent it from being forced!") return if(A.hasPower()) user.visible_message("[user] jams [src] into the airlock and starts prying it open!", "We start forcing the airlock open.", \ "You hear a metal screeching sound.") playsound(A, 'sound/machines/airlock_alien_prying.ogg', 100, 1) if(!do_after(user, 100, target = A)) return //user.say("Heeeeeeeeeerrre's Johnny!") user.visible_message("[user] forces the airlock to open with their [src]!", "We force the airlock to open.", \ "You hear a metal screeching sound.") A.open(2) /obj/item/weapon/melee/arm_blade/dropped(mob/user) ..() if(can_drop) new /obj/item/weapon/melee/synthetic_arm_blade(get_turf(user)) /***************************************\ |***********COMBAT TENTACLES*************| \***************************************/ /obj/effect/proc_holder/changeling/weapon/tentacle name = "Tentacle" desc = "We ready a tentacle to grab items or victims with." helptext = "We can use it once to retrieve a distant item. If used on living creatures, the effect depends on the intent: \ Help will simply drag them closer, Disarm will grab whatever they're holding instead of them, Grab will put the victim in our hold after catching it, \ and Harm will stun it, and stab it if we're also holding a sharp weapon. Cannot be used while in lesser form." chemical_cost = 10 dna_cost = 2 genetic_damage = 5 req_human = 1 max_genetic_damage = 10 weapon_type = /obj/item/weapon/gun/magic/tentacle weapon_name_simple = "tentacle" silent = TRUE /obj/item/weapon/gun/magic/tentacle name = "tentacle" desc = "A fleshy tentacle that can stretch out and grab things or people." icon = 'icons/obj/weapons.dmi' icon_state = "tentacle" item_state = "tentacle" flags = ABSTRACT | NODROP | DROPDEL | NOBLUDGEON w_class = WEIGHT_CLASS_HUGE ammo_type = /obj/item/ammo_casing/magic/tentacle fire_sound = 'sound/effects/splat.ogg' force = 0 max_charges = 1 throwforce = 0 //Just to be on the safe side throw_range = 0 throw_speed = 0 /obj/item/weapon/gun/magic/tentacle/Initialize(mapload, silent) . = ..() if(ismob(loc)) if(!silent) loc.visible_message("[loc.name]\'s arm starts stretching inhumanly!", "Our arm twists and mutates, transforming it into a tentacle.", "You hear organic matter ripping and tearing!") else to_chat(loc, "You prepare to extend a tentacle.") /obj/item/weapon/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj) to_chat(user, "The [name] is not ready yet.") /obj/item/weapon/gun/magic/tentacle/suicide_act(mob/user) user.visible_message("[user] coils [src] tightly around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!") return (OXYLOSS) /obj/item/ammo_casing/magic/tentacle name = "tentacle" desc = "a tentacle." projectile_type = /obj/item/projectile/tentacle caliber = "tentacle" icon_state = "tentacle_end" firing_effect_type = null var/obj/item/weapon/gun/magic/tentacle/gun //the item that shot it /obj/item/ammo_casing/magic/tentacle/Initialize() gun = loc . = ..() /obj/item/ammo_casing/magic/tentacle/Destroy() gun = null return ..() /obj/item/projectile/tentacle name = "tentacle" icon_state = "tentacle_end" pass_flags = PASSTABLE damage = 0 damage_type = BRUTE range = 8 hitsound = 'sound/weapons/thudswoosh.ogg' var/chain var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it /obj/item/projectile/tentacle/Initialize() source = loc . = ..() /obj/item/projectile/tentacle/fire(setAngle) if(firer) chain = firer.Beam(src, icon_state = "tentacle", time = INFINITY, maxdistance = INFINITY, beam_sleep_time = 1) ..() /obj/item/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H) if(H.in_throw_mode) H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item /obj/item/projectile/tentacle/proc/tentacle_grab(mob/living/carbon/human/H, mob/living/carbon/C) if(H.Adjacent(C)) C.grabbedby(H) C.grippedby(H) //instant aggro grab /obj/item/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C) if(H.Adjacent(C)) for(var/obj/item/I in H.held_items) if(I.is_sharp()) C.visible_message("[H] impales [C] with [H.p_their()] [I.name]!", "[H] impales you with [H.p_their()] [I.name]!") C.apply_damage(I.force, BRUTE, "chest") H.do_item_attack_animation(C, used_item = I) H.add_mob_blood(C) playsound(get_turf(H),I.hitsound,75,1) return /obj/item/projectile/tentacle/on_hit(atom/target, blocked = 0) var/mob/living/carbon/human/H = firer H.dropItemToGround(source.gun, TRUE) //Unequip thus delete the tentacle on hit if(blocked >= 100) return 0 if(istype(target, /obj/item)) var/obj/item/I = target if(!I.anchored) to_chat(firer, "You pull [I] towards yourself.") H.throw_mode_on() I.throw_at(H, 10, 2) . = 1 else if(isliving(target)) var/mob/living/L = target if(!L.anchored && !L.throwing)//avoid double hits if(iscarbon(L)) var/mob/living/carbon/C = L switch(firer.a_intent) if(INTENT_HELP) C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") C.throw_at(get_step_towards(H,C), 8, 2) return 1 if(INTENT_DISARM) var/obj/item/I = C.get_active_held_item() if(I) if(C.drop_item()) C.visible_message("[I] is yanked off [C]'s hand by [src]!","A tentacle pulls [I] away from you!") on_hit(I) //grab the item as if you had hit it directly with the tentacle return 1 else to_chat(firer, "You can't seem to pry [I] off [C]'s hands!") return 0 else to_chat(firer, "[C] has nothing in hand to disarm!") return 0 if(INTENT_GRAB) C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(src, .proc/tentacle_grab, H, C)) return 1 if(INTENT_HARM) C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!") C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(src, .proc/tentacle_stab, H, C)) return 1 else L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") L.throw_at(get_step_towards(H,L), 8, 2) . = 1 /obj/item/projectile/tentacle/Destroy() qdel(chain) source = null return ..() /***************************************\ |****************SHIELD*****************| \***************************************/ /obj/effect/proc_holder/changeling/weapon/shield name = "Organic Shield" desc = "We reform one of our arms into a hard shield." helptext = "Organic tissue cannot resist damage forever; the shield will break after it is hit too much. The more genomes we absorb, the stronger it is. Cannot be used while in lesser form." chemical_cost = 20 dna_cost = 1 genetic_damage = 12 req_human = 1 max_genetic_damage = 20 weapon_type = /obj/item/weapon/shield/changeling weapon_name_simple = "shield" /obj/effect/proc_holder/changeling/weapon/shield/sting_action(mob/user) var/datum/changeling/changeling = user.mind.changeling //So we can read the absorbedcount. if(!changeling) return var/obj/item/weapon/shield/changeling/S = ..(user) S.remaining_uses = round(changeling.absorbedcount * 3) return TRUE /obj/item/weapon/shield/changeling name = "shield-like mass" desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield." flags = ABSTRACT | NODROP | DROPDEL icon = 'icons/obj/weapons.dmi' icon_state = "ling_shield" block_chance = 50 var/remaining_uses //Set by the changeling ability. /obj/item/weapon/shield/changeling/Initialize() . = ..() if(ismob(loc)) loc.visible_message("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!", "We inflate our hand into a strong shield.", "You hear organic matter ripping and tearing!") /obj/item/weapon/shield/changeling/hit_reaction() if(remaining_uses < 1) if(ishuman(loc)) var/mob/living/carbon/human/H = loc H.visible_message("With a sickening crunch, [H] reforms his shield into an arm!", "We assimilate our shield into our body", "[loc.name]\'s flesh rapidly inflates, forming a bloated mass around their body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") START_PROCESSING(SSobj, src) /obj/item/clothing/suit/space/changeling/process() if(ishuman(loc)) var/mob/living/carbon/human/H = loc H.reagents.add_reagent("salbutamol", REAGENTS_METABOLISM) /obj/item/clothing/head/helmet/space/changeling name = "flesh mass" icon_state = "lingspacehelmet" desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." flags = STOPSPRESSUREDMAGE | NODROP | DROPDEL //Again, no THICKMATERIAL. armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 90) flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH /***************************************\ |*****************ARMOR*****************| \***************************************/ /obj/effect/proc_holder/changeling/suit/armor name = "Chitinous Armor" desc = "We turn our skin into tough chitin to protect us from damage." helptext = "Upkeep of the armor requires a low expenditure of chemicals. The armor is strong against brute force, but does not provide much protection from lasers. Retreating the armor damages our genomes. Cannot be used in lesser form." chemical_cost = 20 dna_cost = 1 genetic_damage = 11 req_human = 1 max_genetic_damage = 20 recharge_slowdown = 0.25 suit_type = /obj/item/clothing/suit/armor/changeling helmet_type = /obj/item/clothing/head/helmet/changeling suit_name_simple = "armor" helmet_name_simple = "helmet" /obj/item/clothing/suit/armor/changeling name = "chitinous mass" desc = "A tough, hard covering of black chitin." icon_state = "lingarmor" flags = NODROP | DROPDEL body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 10, bio = 4, rad = 0, fire = 90, acid = 90) flags_inv = HIDEJUMPSUIT cold_protection = 0 heat_protection = 0 /obj/item/clothing/suit/armor/changeling/Initialize() . = ..() if(ismob(loc)) loc.visible_message("[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!", "We harden our flesh, creating a suit of armor!", "You hear organic matter ripping and tearing!") /obj/item/clothing/head/helmet/changeling name = "chitinous mass" desc = "A tough, hard covering of black chitin with transparent chitin in front." icon_state = "lingarmorhelmet" flags = NODROP | DROPDEL armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 10, bio = 4, rad = 0, fire = 90, acid = 90) flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE