diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 9a90a26971a..1ac6670fc78 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -16,6 +16,8 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E var/max_geneticpoints = 5 var/purchasedpowers = list() var/mimicing = "" + var/cloaked = 0 + var/armor_deployed = 0 //This is only used for changeling_generic_equip_all_slots() at the moment. /datum/changeling/New(var/gender=FEMALE) ..() diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm index 9a51a3fc01b..65d388ccfed 100644 --- a/code/game/gamemodes/changeling/generic_equip_procs.dm +++ b/code/game/gamemodes/changeling/generic_equip_procs.dm @@ -38,9 +38,260 @@ M.update_hair() return 1 +/mob/proc/changeling_generic_equip_all_slots(var/list/stuff_to_equip, var/cost) + var/datum/changeling/changeling = changeling_power(cost,1,100,CONSCIOUS) + if(!changeling) + return + + if(!ishuman(src)) + return 0 + + var/mob/living/carbon/human/M = src + + var/success = 0 +/* + slot_back,\ + slot_wear_id,\ + slot_w_uniform,\ + slot_wear_suit,\ + slot_wear_mask,\ + slot_head,\ + slot_shoes,\ + slot_gloves,\ + slot_l_ear,\ + slot_r_ear,\ + slot_glasses,\ + slot_belt,\ + slot_s_store,\ + slot_tie,\ + slot_l_store,\ + slot_r_store\ + ) +*/ + //First, check if we're already wearing the armor, and if so, take it off. +/* + if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type)) + M.visible_message("[M] casts off their [M.wear_suit.name]!", + "We cast off our [M.wear_suit.name]", + "You hear the organic matter ripping and tearing!") + qdel(M.wear_suit) + qdel(M.head) + M.update_inv_wear_suit() + M.update_inv_head() + M.update_hair() + return 1 +*/ + + if(M.mind.changeling.armor_deployed) + if(M.head) + for(var/obj/item/clothing/head/head_slot in stuff_to_equip) + if(istype(M.head,head_slot)) + qdel(M.head) + success = 1 + break + + if(M.wear_suit) + for(var/obj/item/clothing/suit/suit_slot in stuff_to_equip) + if(istype(M.glasses,suit_slot)) + qdel(M.wear_suit) + success = 1 + break + + if(M.gloves) + for(var/obj/item/clothing/gloves/gloves_slot in stuff_to_equip) + if(istype(M.head,gloves_slot)) + qdel(M.gloves) + success = 1 + break + if(M.shoes) + for(var/obj/item/clothing/shoes/shoes_slot in stuff_to_equip) + if(istype(M.head,shoes_slot)) + qdel(M.shoes) + success = 1 + break + + if(M.belt) + for(var/obj/item/weapon/storage/belt/belt_slot in stuff_to_equip) + if(istype(M.belt,belt_slot)) + qdel(M.belt) + success = 1 + break + + if(M.glasses) + for(var/obj/item/clothing/glasses/glasses_slot in stuff_to_equip) + if(istype(M.glasses,glasses_slot)) + qdel(M.glasses) + success = 1 + break + + if(M.wear_mask) + for(var/obj/item/clothing/mask/mask_slot in stuff_to_equip) + if(istype(M.glasses,mask_slot)) + qdel(M.wear_mask) + success = 1 + break + + if(M.back) + for(var/obj/item/weapon/storage/backpack/backpack_slot in stuff_to_equip) + if(istype(M.glasses,backpack_slot)) + qdel(M.back) + success = 1 + break + + if(M.w_uniform) + for(var/obj/item/clothing/under/uniform_slot in stuff_to_equip) + if(istype(M.head,uniform_slot)) + qdel(M.w_uniform) + success = 1 + break + + if(M.wear_id) + for(var/obj/item/weapon/card/id/id_slot in stuff_to_equip) + if(istype(M.glasses,id_slot)) + qdel(M.wear_id) + success = 1 + break + if(success) + M.mind.changeling.armor_deployed = 0 + playsound(src, 'sound/effects/splat.ogg', 30, 1) + visible_message("[src] pulls on their clothes, peeling it off along with parts of their skin attached!", + "We remove and deform our equipment.") + M.update_icons() + return success + + else + + M << "We begin growing our new equipment..." + + var/list/grown_items_list = list() + if(!M.head) + for(var/obj/item/clothing/head/head_slot in stuff_to_equip) + var/I = new head_slot.type + M.equip_to_slot_or_del(I, slot_head) + grown_items_list.Add("a helmet") + playsound(src, 'sound/effects/blobattack.ogg', 30, 1) + M.update_icons() + success = 1 + sleep(20) + break + + if(!M.w_uniform) + for(var/obj/item/clothing/under/uniform_slot in stuff_to_equip) + var/I = new uniform_slot.type + M.equip_to_slot_or_del(I, slot_w_uniform) + grown_items_list.Add("a uniform") + playsound(src, 'sound/effects/blobattack.ogg', 30, 1) + M.update_icons() + success = 1 + sleep(20) + break + + if(!M.gloves) + for(var/obj/item/clothing/gloves/gloves_slot in stuff_to_equip) + var/I = new gloves_slot.type + M.equip_to_slot_or_del(I, slot_gloves) + grown_items_list.Add("some gloves") + playsound(src, 'sound/effects/splat.ogg', 30, 1) + M.update_icons() + success = 1 + sleep(20) + break + + if(!M.shoes) + for(var/obj/item/clothing/shoes/shoes_slot in stuff_to_equip) + var/I = new shoes_slot.type + M.equip_to_slot_or_del(I, slot_shoes) + grown_items_list.Add("shoes") + playsound(src, 'sound/effects/splat.ogg', 30, 1) + M.update_icons() + success = 1 + sleep(20) + break + + if(!M.belt) + for(var/obj/item/weapon/storage/belt/belt_slot in stuff_to_equip) + var/I = new belt_slot.type + M.equip_to_slot_or_del(I, slot_belt) + grown_items_list.Add("a belt") + playsound(src, 'sound/effects/splat.ogg', 30, 1) + M.update_icons() + success = 1 + sleep(20) + break + + if(!M.glasses) + for(var/obj/item/clothing/glasses/glasses_slot in stuff_to_equip) + var/I = new glasses_slot.type + M.equip_to_slot_or_del(I, slot_glasses) + grown_items_list.Add("some glasses") + playsound(src, 'sound/effects/splat.ogg', 30, 1) + M.update_icons() + success = 1 + sleep(20) + break + + if(!M.wear_mask) + for(var/obj/item/clothing/mask/mask_slot in stuff_to_equip) + var/I = new mask_slot.type + M.equip_to_slot_or_del(I, slot_wear_mask) + grown_items_list.Add("a mask") + playsound(src, 'sound/effects/splat.ogg', 30, 1) + M.update_icons() + success = 1 + sleep(20) + break + + if(!M.back) + for(var/obj/item/weapon/storage/backpack/backpack_slot in stuff_to_equip) + var/I = new backpack_slot.type + M.equip_to_slot_or_del(I, slot_back) + grown_items_list.Add("a backpack") + playsound(src, 'sound/effects/blobattack.ogg', 30, 1) + M.update_icons() + success = 1 + sleep(20) + break + + if(!M.wear_suit) + for(var/obj/item/clothing/suit/suit_slot in stuff_to_equip) + var/I = new suit_slot.type + M.equip_to_slot_or_del(I, slot_wear_suit) + grown_items_list.Add("an exosuit") + playsound(src, 'sound/effects/blobattack.ogg', 30, 1) + M.update_icons() + success = 1 + sleep(20) + break + + if(!M.wear_id) + for(var/obj/item/weapon/card/id/id_slot in stuff_to_equip) + var/I = new id_slot.type + M.equip_to_slot_or_del(I, slot_wear_id) + grown_items_list.Add("an ID card") + playsound(src, 'sound/effects/splat.ogg', 30, 1) + M.update_icons() + success = 1 + sleep(20) + break + + var/feedback = english_list(grown_items_list, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) + + M << "We have grown [feedback]." + /* + for(var/I in stuff_to_equip) + world << I + world << stuff_to_equip + world << "Proc ended." + */ + M.update_icons() + if(success) + M.mind.changeling.armor_deployed = 1 + M.mind.changeling.chem_charges -= 10 + return success + //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, var/cost = 20) - var/datum/changeling/changeling = changeling_power(20,1,100,CONSCIOUS) + var/datum/changeling/changeling = changeling_power(cost,1,100,CONSCIOUS) if(!changeling) return diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm index e4d4587103e..0a0c14452cd 100644 --- a/code/game/gamemodes/changeling/powers/armor.dm +++ b/code/game/gamemodes/changeling/powers/armor.dm @@ -70,10 +70,11 @@ name = "chitinous mass" desc = "A tough, hard covering of black chitin." icon_state = "lingarmor" - item_state = "lingarmor" +// item_state = "lingarmor" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS armor = list(melee = 85, bullet = 70, laser = 70, energy = 70, bomb = 70, bio = 0, rad = 0) //It costs 3 points, so it should be very protective. siemens_coefficient = 0.1 + max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE slowdown = 3 /obj/item/clothing/suit/space/changeling/armored/New() @@ -90,8 +91,29 @@ name = "chitinous mass" desc = "A tough, hard covering of black chitin with transparent chitin in front." icon_state = "lingarmorhelmet" - item_state = "lingarmorhelmet" +// item_state = "lingarmorhelmet" armor = list(melee = 85, bullet = 70, laser = 70,energy = 70, bomb = 70, bio = 0, rad = 0) + siemens_coefficient = 0.1 + max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE /obj/item/clothing/head/helmet/space/changeling/armored/dropped() qdel(src) + +/obj/item/clothing/gloves/combat/changeling //Combined insulated/fireproof gloves + name = "chitinous gauntlets" + desc = "Very resilient gauntlets made out of black chitin. It looks very durable, and can probably resist electrical shock in addition to the elements." + icon_state = "lingarmorgloves" + armor = list(melee = 85, bullet = 70, laser = 70,energy = 70, bomb = 70, bio = 0, rad = 0) //No idea if glove armor gets checked + siemens_coefficient = 0 + +/obj/item/clothing/shoes/combat/changeling //Noslips + desc = "chitinous boots" + name = "Footwear made out of a hard, black chitinous material. The bottoms of these appear to have spikes that can protrude or extract itself into and out \ + of the floor at will, granting the wearer stability." + icon_state = "lingboots" + armor = list(melee = 85, bullet = 70, laser = 70,energy = 70, bomb = 70, bio = 0, rad = 0) + siemens_coefficient = 0.1 + cold_protection = FEET + min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE + heat_protection = FEET + max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE diff --git a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm index f704558e29f..ff45c30d0a3 100644 --- a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm +++ b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm @@ -2,14 +2,15 @@ name = "Bioelectrogenesis" desc = "We reconfigure a large number of cells in our body to generate an electric charge. \ On demand, we can attempt to recharge anything in our active hand, or we can touch someone with an electrified hand, shocking them." - helptext = "We can shock someone by grabbing them and using this ability, or using the ability with an empty hand and touching them." - genomecost = 3 + helptext = "We can shock someone by grabbing them and using this ability, or using the ability with an empty hand and touching them. \ + Shocking someone costs ten chemicals per use." + genomecost = 2 verbpath = /mob/proc/changeling_bioelectrogenesis //Recharge whatever's in our hand, or shock people. /mob/proc/changeling_bioelectrogenesis() set category = "Changeling" - set name = "Bioelectrogenesis (20)" + set name = "Bioelectrogenesis (20 + 10/shock)" set desc = "Recharges anything in your hand, or shocks people." var/datum/changeling/changeling = changeling_power(20,0,100,CONSCIOUS) @@ -29,11 +30,17 @@ if(istype(held_item,/obj/item/weapon/grab)) var/obj/item/weapon/grab/G = held_item if(G.affecting) - G.affecting.electrocute_act(25,src,1.0,"chest") + G.affecting.electrocute_act(5,src,1.0,"chest") + var/agony = 60 //The same as a stunbaton. + var/stun = 0 + G.affecting.stun_effect_act(stun, agony, "chest", src) + + msg_admin_attack("[key_name(src)] stunned [key_name(G.affecting)] with the [src].") + visible_message("Arcs of electricity strike [G.affecting]!", "Our hand channels raw electricity into [G.affecting].", "You hear sparks!") - src.mind.changeling.chem_charges -= 20 + src.mind.changeling.chem_charges -= 10 return 1 //Otherwise, charge up whatever's in their hand. @@ -52,20 +59,25 @@ //Now for the actual recharging. for(var/obj/item/weapon/cell/cell in L) - cell.charge += 1000 //This should be a nice compromise between recharging guns and other batteries. - if(cell.charge > cell.maxcharge) - cell.charge = cell.maxcharge visible_message("Some sparks fall out from \the [src.name]\'s [held_item]!", "Our hand channels raw electricity into \the [held_item].", "You hear sparks!") - var/T = get_turf(src) - new /obj/effect/effect/sparks(T) - held_item.update_icon() + var/i = 10 + while(i) + cell.charge += 100 //This should be a nice compromise between recharging guns and other batteries. + if(cell.charge > cell.maxcharge) + cell.charge = cell.maxcharge + break + var/T = get_turf(src) + new /obj/effect/effect/sparks(T) + held_item.update_icon() + i-- + sleep(10) success = 1 if(success == 0) //If we couldn't do anything with the ability, don't deduct the chemicals. src << "We are unable to affect \the [held_item]." else - src.mind.changeling.chem_charges -= 20 + src.mind.changeling.chem_charges -= 10 return success /obj/item/weapon/electric_hand @@ -95,20 +107,39 @@ //Excuse the copypasta. if(istype(target,/mob/living/carbon)) var/mob/living/carbon/C = target - C.electrocute_act(25,src,1.0,"chest") + + if(user.mind.changeling.chem_charges < 10) + src << "We require more chemicals to electrocute [C]!" + return 0 + + C.electrocute_act(5,src,1.0,"chest") + var/agony = 60 //The same as a stunbaton. + var/stun = 0 + C.stun_effect_act(stun, agony, "chest", src) + + msg_admin_attack("[key_name(user)] stunned [key_name(C)] with the [src].") + visible_message("Arcs of electricity strike [C]!", "Our hand channels raw electricity into [C]", "You hear sparks!") - qdel(src) + //qdel(src) //Since we're no longer a one hit stun, we need to stick around. + user.mind.changeling.chem_charges -= 10 return 1 else if(istype(target,/mob/living/silicon)) var/mob/living/silicon/S = target - S.electrocute_act(25,src,1.0) + + if(user.mind.changeling.chem_charges < 10) + src << "We require more chemicals to electrocute [S]!" + return 0 + + S.electrocute_act(60,src,1.0) //If only they had surge protectors. visible_message("Arcs of electricity strike [S]!", "Our hand channels raw electricity into [S]", "You hear sparks!") - qdel(src) + S << "Warning: Electrical surge detected!" + //qdel(src) + user.mind.changeling.chem_charges -= 10 return 1 else @@ -117,16 +148,24 @@ var/obj/T = target //We can also recharge things we touch, such as APCs or hardsuits. for(var/obj/item/weapon/cell/cell in T.contents) - cell.charge += 1000 - if(cell.charge > cell.maxcharge) - cell.charge = cell.maxcharge visible_message("Some sparks fall out from \the [target]!", "Our hand channels raw electricity into \the [target].", "You hear sparks!") - var/Turf = get_turf(src) - new /obj/effect/effect/sparks(Turf) - T.update_icon() + var/i = 10 + while(i) + cell.charge += 100 //This should be a nice compromise between recharging guns and other batteries. + if(cell.charge > cell.maxcharge) + cell.charge = cell.maxcharge + break //No point making sparks if the cell's full. +// if(!Adjacent(T)) +// break + var/Turf = get_turf(src) + new /obj/effect/effect/sparks(Turf) + T.update_icon() + i-- + sleep(10) success = 1 + break if(success == 0) src << "We are unable to affect \the [target]." else diff --git a/code/game/gamemodes/changeling/powers/engorged_glands.dm b/code/game/gamemodes/changeling/powers/engorged_glands.dm index 7f95fdf3718..01241d7fc69 100644 --- a/code/game/gamemodes/changeling/powers/engorged_glands.dm +++ b/code/game/gamemodes/changeling/powers/engorged_glands.dm @@ -8,6 +8,6 @@ //Increases macimum chemical storage /mob/proc/changeling_engorgedglands() - src.mind.changeling.chem_storage += 25 + src.mind.changeling.chem_storage += 30 src.mind.changeling.chem_recharge_rate *= 2 return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/fabricate_clothing.dm b/code/game/gamemodes/changeling/powers/fabricate_clothing.dm new file mode 100644 index 00000000000..1c688403844 --- /dev/null +++ b/code/game/gamemodes/changeling/powers/fabricate_clothing.dm @@ -0,0 +1,153 @@ +var/global/list/changeling_fabricated_clothing = list( + new /obj/item/clothing/under/chameleon/changeling, + new /obj/item/clothing/head/chameleon/changeling, + new /obj/item/clothing/suit/chameleon/changeling, + new /obj/item/clothing/shoes/chameleon/changeling, + new /obj/item/clothing/gloves/chameleon/changeling, + new /obj/item/clothing/mask/chameleon/changeling, + new /obj/item/clothing/glasses/chameleon/changeling, + new /obj/item/weapon/storage/backpack/chameleon/changeling, + new /obj/item/weapon/storage/belt/chameleon/changeling, + new /obj/item/weapon/card/id/syndicate/changeling + ) + +/datum/power/changeling/fabricate_clothing + name = "Fabricate Clothing" + desc = "We reform our flesh to resemble various cloths, leathers, and other materials, allowing us to quickly create a disguise. \ + We cannot be relieved of this clothing by others." + helptext = "The disguise we create offers no defensive ability. Each equipment slot that is empty will be filled with fabricated equipment. \ + To remove our new fabricated clothing, use this ability again." + genomecost = 2 + verbpath = /mob/proc/changeling_fabricate_clothing + +//Grows biological versions of chameleon clothes. +/mob/proc/changeling_fabricate_clothing() + set category = "Changeling" + set name = "Fabricate Clothing (10)" + + if(changeling_generic_equip_all_slots(changeling_fabricated_clothing, cost = 10)) + return 1 + return 0 + +/obj/item/clothing/under/chameleon/changeling + name = "malformed flesh" + icon_state = "black" + item_state = "bl_suit" + worn_state = "black" + desc = "The flesh all around us has grown a new layer of cells that can shift appearance and create a biological fabric that cannot be distinguished from \ + ordinary cloth, allowing us to make ourselves appear to wear almost anything." + origin_tech = list() //The base chameleon items have origin technology, which we will inherit if we don't null out this variable. + canremove = 0 //Since this is essentially flesh impersonating clothes, tearing someone's skin off as if it were clothing isn't possible. + +/obj/item/clothing/under/chameleon/changeling/emp_act(severity) //As these are purely organic, EMP does nothing to them. + return + +/obj/item/clothing/head/chameleon/changeling + name = "malformed head" + icon_state = "lingchameleon" + desc = "Our head is swelled with a large quanity of rapidly shifting skin cells. We can reform our head to resemble various hats and \ + helmets that biologicals are so fond of wearing." + origin_tech = list() + canremove = 0 + +/obj/item/clothing/head/chameleon/changeling/emp_act(severity) + return + +/obj/item/clothing/suit/chameleon/changeling + name = "chitinous chest" + icon_state = "lingchameleon" + item_state = "armor" + desc = "The cells in our chest are rapidly shifting, ready to reform into material that can resemble most pieces of clothing." + origin_tech = list() + canremove = 0 + +/obj/item/clothing/suit/chameleon/changeling/emp_act(severity) + return + +/obj/item/clothing/shoes/chameleon/changeling + name = "malformed feet" + icon_state = "lingchameleon" + item_state = "black" + desc = "Our feet are overlayed with another layer of flesh and bone on top. We can reform our feet to resemble various boots and shoes." + origin_tech = list() + canremove = 0 + +/obj/item/clothing/shoes/chameleon/changeling/emp_act() + return + +/obj/item/weapon/storage/backpack/chameleon/changeling + name = "backpack" + icon_state = "backpack" + item_state = "backpack" + desc = "A large pouch imbedded in our back, it can shift form to resemble many common backpacks that other biologicals are fond of using." + origin_tech = list() + canremove = 0 + +/obj/item/weapon/storage/backpack/chameleon/changeling/emp_act() + +/obj/item/clothing/gloves/chameleon/changeling + name = "malformed hands" + icon_state = "lingchameleon" + item_state = "bgloves" + desc = "Our hands have a second layer of flesh on top. We can reform our hands to resemble a large variety of fabrics and materials that biologicals \ + tend to wear on their hands. Remember that these won't protect your hands from harm." + origin_tech = list() + canremove = 0 + +/obj/item/clothing/gloves/chameleon/changeling/emp_act() + return + +/obj/item/clothing/mask/chameleon/changeling + name = "chitin visor" + icon_state = "lingchameleon" + item_state = "gas_alt" + desc = "A transparent visor of brittle chitin covers our face. We can reform it to resemble various masks that biologicals use. It can also utilize internal \ + tanks.." + origin_tech = list() + canremove = 0 + +/obj/item/clothing/mask/chameleon/changeling/emp_act() + return + +/obj/item/clothing/glasses/chameleon/changeling + name = "chitin goggles" + icon_state = "lingchameleon" + item_state = "glasses" + desc = "A transparent piece of eyewear made out of brittle chitin. We can reform it to resemble various glasses and goggles." + origin_tech = list() + canremove = 0 + +/obj/item/clothing/glasses/chameleon/changeling/emp_act() + return + +/obj/item/weapon/storage/belt/chameleon/changeling + name = "waist pouch" + desc = "We can store objects in this, as well as shift it's appearance, so that it resembles various common belts." + icon_state = "lingchameleon" + item_state = "utility" + origin_tech = list() + canremove = 0 + +/obj/item/weapon/storage/belt/chameleon/changeling/emp_act() + return + +/obj/item/weapon/card/id/syndicate/changeling + name = "chitinous card" + desc = "A card that we can reform to resemble identification cards. Due to the nature of the material this is made of, it cannot store any access codes." + icon_state = "changeling" + assignment = "Harvester" + origin_tech = list() + electronic_warfare = 1 //The lack of RFID stuff makes it hard for AIs to track, I guess. *handwaves* + registered_user = null + access = null + canremove = 0 + +/obj/item/weapon/card/id/syndicate/changeling/New(mob/user as mob) + ..() + registered_user = user + access = null + +/obj/item/weapon/card/id/syndicate/changeling/Click() //Since we can't hold it in our hands, and attack_hand() doesn't work if it in inventory... + if(ismob(loc)) + ui_interact(loc) + ..() \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index d6cdabdc030..70a699eb41c 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -1,6 +1,7 @@ /datum/power/changeling/fleshmend name = "Fleshmend" desc = "Begins a slow rengeration of our form. Does not effect stuns or chemicals." + helptext = "Can be used while unconscious." genomecost = 1 verbpath = /mob/proc/changeling_fleshmend diff --git a/code/game/gamemodes/changeling/powers/respec.dm b/code/game/gamemodes/changeling/powers/respec.dm index 7bea5fd0af6..f834a29b960 100644 --- a/code/game/gamemodes/changeling/powers/respec.dm +++ b/code/game/gamemodes/changeling/powers/respec.dm @@ -13,6 +13,9 @@ ling_datum.geneticpoints = ling_datum.max_geneticpoints //Now refund our points to the maximum. ling_datum.chem_recharge_rate = 0.5 //If glands were bought, revert that upgrade. ling_datum.chem_storage = 50 + if(istype(src,/mob/living/carbon)) + var/mob/living/carbon/C = src + C.does_not_breathe = 0 //If self respiration was bought, revert that too. src.make_changeling() //And give back our freebies. src << "We have removed our evolutions from this form, and are now ready to readapt." diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 865896eadef..465088a06ae 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -34,6 +34,6 @@ feedback_add_details("changeling_powers","CR") C.stat = CONSCIOUS src.verbs -= /mob/proc/changeling_revive - // re-add out changeling powers + // re-add our changeling powers C.make_changeling() return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/self_respiration.dm b/code/game/gamemodes/changeling/powers/self_respiration.dm new file mode 100644 index 00000000000..a00ec7958cb --- /dev/null +++ b/code/game/gamemodes/changeling/powers/self_respiration.dm @@ -0,0 +1,16 @@ +/datum/power/changeling/self_respiration + name = "Self Respiration" + desc = "We evolve our body to no longer require drawing oxygen from the atmosphere.." + helptext = "We will no longer require internals, and we cannot inhale any gas, including harmful ones." + genomecost = 1 + isVerb = 0 + verbpath = /mob/proc/changeling_self_respiration + +//No breathing required +/mob/proc/changeling_self_respiration() + if(istype(src,/mob/living/carbon)) + var/mob/living/carbon/C = src + C.does_not_breathe = 1 + src << "We stop breathing, as we no longer need to." + return 1 + return 0 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/visible_camouflage.dm b/code/game/gamemodes/changeling/powers/visible_camouflage.dm new file mode 100644 index 00000000000..fd46cc9e451 --- /dev/null +++ b/code/game/gamemodes/changeling/powers/visible_camouflage.dm @@ -0,0 +1,63 @@ +/datum/power/changeling/visible_camouflage + name = "Camouflage" + desc = "We rapidly shape the color of our skin and secrete easily reversible dye on our clothes, to blend in with our surroundings. \ + We are undetectable, so long as we move slowly.(Toggle)" + helptext = "Running, and performing most acts will reveal us. Our chemical regeneration is halted while we are hidden." + genomecost = 3 + verbpath = /mob/proc/changeling_visible_camouflage + +//Hide us from anyone who would do us harm. +/mob/proc/changeling_visible_camouflage() + set category = "Changeling" + set name = "Visible Camouflage (10)" + set desc = "Turns yourself almost invisible, as long as you move slowly." + + + if(istype(src,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = src + + if(H.mind.changeling.cloaked) + H.mind.changeling.cloaked = 0 + return 1 + + //We delay the check, so that people can uncloak without needing 10 chemicals to do so. + var/datum/changeling/changeling = changeling_power(10,0,100,CONSCIOUS) + + if(!changeling) + return 0 + + var/old_regen_rate = H.mind.changeling.chem_recharge_rate + + H << "We vanish from sight, and will remain hidden, so long as we move carefully." + H.set_m_intent("walk") + H.mind.changeling.cloaked = 1 + H.mind.changeling.chem_recharge_rate = 0 + animate(src,alpha = 255, alpha = 10, time = 10) + + while(H.m_intent == "walk" && H.mind.changeling.cloaked) //This loop will keep going until the player uncloaks. + if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked. + old_regen_rate += mind.changeling.chem_recharge_rate //Unfortunately, it has to occupy this part of the proc. This fixes it while at the same time + mind.changeling.chem_recharge_rate = 0 //making sure nobody loses out on their bonus regeneration after they're done hiding. + sleep(10) + + +// H.invisibility = initial(invisibility) + visible_message("[src] suddenly fades in, seemingly from nowhere!", + "We revert our camouflage, revealing ourselves.") + H.set_m_intent("run") + H.mind.changeling.cloaked = 0 + H.mind.changeling.chem_recharge_rate = old_regen_rate + + animate(src,alpha = 10, alpha = 255, time = 10) + +/* + if(holder && mob) + if(mob.invisibility == INVISIBILITY_OBSERVER) + mob.invisibility = initial(mob.invisibility) + mob << "\red Invisimin off. Invisibility reset." + mob.alpha = max(mob.alpha + 100, 255) + else + mob.invisibility = INVISIBILITY_OBSERVER + mob << "\blue Invisimin on. You are now as invisible as a ghost." + mob.alpha = max(mob.alpha - 100, 0) +*/ \ 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 98eaeff7275..8344b96f73e 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -1,7 +1,6 @@ /obj/item/weapon/storage/belt name = "belt" desc = "Can hold various things." - icon = 'icons/obj/clothing/belts.dmi' icon_state = "utilitybelt" item_state = "utility" slot_flags = SLOT_BELT diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index fe4eecb1f53..f1f916cd3cc 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -5,23 +5,24 @@ /obj/item/proc/disguise(var/newtype) //this is necessary, unfortunately, as initial() does not play well with list vars var/obj/item/copy = new newtype(null) //so that it is GCed once we exit - + desc = copy.desc name = copy.name icon_state = copy.icon_state item_state = copy.item_state body_parts_covered = copy.body_parts_covered - + item_icons = copy.item_icons.Copy() - item_state_slots = copy.item_state_slots.Copy() + if(copy.item_state_slots) //Runtime prevention for backpacks + item_state_slots = copy.item_state_slots.Copy() sprite_sheets = copy.sprite_sheets.Copy() //copying sprite_sheets_obj should be unnecessary as chameleon items are not refittable. - + return copy //for inheritance /proc/generate_chameleon_choices(var/basetype, var/blacklist=list()) . = list() - + var/i = 1 //in case there is a collision with both name AND icon_state for(var/typepath in typesof(basetype) - blacklist) var/obj/O = typepath @@ -100,7 +101,7 @@ if(!ispath(clothing_choices[picked])) return - + disguise(clothing_choices[picked]) update_clothing_icon() //so our overlays update. @@ -323,6 +324,48 @@ disguise(clothing_choices[picked]) update_clothing_icon() //so our overlays update. +//****************** +//**Chameleon Belt** +//****************** + +/obj/item/weapon/storage/belt/chameleon + name = "belt" + desc = "Can hold various things. It also has a small dial inside one of the pouches." + icon = 'icons/obj/clothing/belts.dmi' + icon_state = "utilitybelt" + item_state = "utility" + origin_tech = list(TECH_ILLEGAL = 3) + var/list/clothing_choices = list() + +/obj/item/weapon/storage/belt/chameleon/New() + ..() + if(!clothing_choices) + clothing_choices = generate_chameleon_choices(/obj/item/weapon/storage/belt, list(src.type)) + +/obj/item/weapon/storage/belt/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. + name = "belt" + desc = "Can hold various things." + icon_state = "utilitybelt" + item_state = "utility" + update_icon() + if(ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_belt() + +/obj/item/weapon/storage/belt/chameleon/verb/change(picked in clothing_choices) + set name = "Change Belt Appearance" + set category = "Chameleon Items" + set src in usr + + if(!ispath(clothing_choices[picked])) + return + + disguise(clothing_choices[picked]) + + if(ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_belt() //so our overlays update. + //***************** //**Chameleon Gun** //***************** @@ -333,19 +376,19 @@ w_class = 3 origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) matter = list() - + fire_sound = 'sound/weapons/Gunshot.ogg' projectile_type = /obj/item/projectile/chameleon charge_meter = 0 charge_cost = 20 //uses next to no power, since it's just holograms max_shots = 50 - + var/obj/item/projectile/copy_projectile var/global/list/gun_choices /obj/item/weapon/gun/energy/chameleon/New() ..() - + if(!gun_choices) gun_choices = list() for(var/gun_type in typesof(/obj/item/weapon/gun/) - src.type) diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm index d1cd0ca2ad7..20f86d4dde0 100644 --- a/code/modules/mob/living/carbon/breathe.dm +++ b/code/modules/mob/living/carbon/breathe.dm @@ -7,7 +7,7 @@ /mob/living/carbon/proc/breathe() //if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return - if(species && (species.flags & NO_BREATHE)) return + if(species && (species.flags & NO_BREATHE) || does_not_breathe) return var/datum/gas_mixture/breath = null diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 1478108b2ad..fa0cf273e25 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -23,3 +23,5 @@ var/datum/reagents/metabolism/touching = null var/pulse = PULSE_NORM //current pulse level + + var/does_not_breathe = 0 //Used for specific mobs that can't take advantage of the species flags (changelings) diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index b74db9f914d..4b1cf6385ff 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi index 8861d573e4e..5d5bc1b8cf3 100644 Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index df7f7c2e57b..d7a6ec3720c 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index 61f2aa12a43..2eea179c28f 100644 Binary files a/icons/mob/screen1.dmi and b/icons/mob/screen1.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 5557059a534..cc5e415c47e 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 1e2e926b591..75d2b5ebf48 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index a7c7e0ae3bf..29031e6a26f 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 9f94ea9ed73..8cbacf37eda 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 3fb1966da51..7ab2c39374c 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/polaris.dme b/polaris.dme index 18263766b4c..0d9b8dc7400 100644 --- a/polaris.dme +++ b/polaris.dme @@ -5,6 +5,73 @@ // END_INTERNALS // BEGIN_FILE_DIR #define FILE_DIR . +#define FILE_DIR "html" +#define FILE_DIR "html/images" +#define FILE_DIR "icons" +#define FILE_DIR "icons/48x48" +#define FILE_DIR "icons/atmos" +#define FILE_DIR "icons/effects" +#define FILE_DIR "icons/mecha" +#define FILE_DIR "icons/misc" +#define FILE_DIR "icons/mob" +#define FILE_DIR "icons/mob/human_races" +#define FILE_DIR "icons/mob/human_races/cyberlimbs" +#define FILE_DIR "icons/mob/human_races/masks" +#define FILE_DIR "icons/mob/human_races/monkeys" +#define FILE_DIR "icons/mob/human_races/subspecies" +#define FILE_DIR "icons/mob/human_races/xenos" +#define FILE_DIR "icons/mob/items" +#define FILE_DIR "icons/mob/screen" +#define FILE_DIR "icons/mob/species" +#define FILE_DIR "icons/mob/species/resomi" +#define FILE_DIR "icons/mob/species/skrell" +#define FILE_DIR "icons/mob/species/tajaran" +#define FILE_DIR "icons/mob/species/unathi" +#define FILE_DIR "icons/mob/species/vox" +#define FILE_DIR "icons/NTOS" +#define FILE_DIR "icons/NTOS/battery_icons" +#define FILE_DIR "icons/obj" +#define FILE_DIR "icons/obj/assemblies" +#define FILE_DIR "icons/obj/atmospherics" +#define FILE_DIR "icons/obj/clothing" +#define FILE_DIR "icons/obj/clothing/species" +#define FILE_DIR "icons/obj/clothing/species/resomi" +#define FILE_DIR "icons/obj/clothing/species/skrell" +#define FILE_DIR "icons/obj/clothing/species/tajaran" +#define FILE_DIR "icons/obj/clothing/species/unathi" +#define FILE_DIR "icons/obj/doors" +#define FILE_DIR "icons/obj/flora" +#define FILE_DIR "icons/obj/machines" +#define FILE_DIR "icons/obj/pipes" +#define FILE_DIR "icons/pda_icons" +#define FILE_DIR "icons/spideros_icons" +#define FILE_DIR "icons/Testing" +#define FILE_DIR "icons/turf" +#define FILE_DIR "icons/turf/flooring" +#define FILE_DIR "icons/vending_icons" +#define FILE_DIR "local" +#define FILE_DIR "maps" +#define FILE_DIR "maps/overmap" +#define FILE_DIR "maps/overmap/bearcat" +#define FILE_DIR "nano" +#define FILE_DIR "nano/images" +#define FILE_DIR "sound" +#define FILE_DIR "sound/AI" +#define FILE_DIR "sound/ambience" +#define FILE_DIR "sound/effects" +#define FILE_DIR "sound/effects/turret" +#define FILE_DIR "sound/effects/wind" +#define FILE_DIR "sound/hallucinations" +#define FILE_DIR "sound/items" +#define FILE_DIR "sound/machines" +#define FILE_DIR "sound/mecha" +#define FILE_DIR "sound/misc" +#define FILE_DIR "sound/music" +#define FILE_DIR "sound/piano" +#define FILE_DIR "sound/violin" +#define FILE_DIR "sound/voice" +#define FILE_DIR "sound/voice/Serithi" +#define FILE_DIR "sound/weapons" // END_FILE_DIR // BEGIN_PREFERENCES #define DEBUG @@ -300,16 +367,16 @@ #include "code\game\gamemodes\changeling\powers\fake_death.dm" #include "code\game\gamemodes\changeling\powers\fleshmend.dm" #include "code\game\gamemodes\changeling\powers\hivemind.dm" -#include "code\game\gamemodes\changeling\powers\lesser_form.dm" #include "code\game\gamemodes\changeling\powers\mimic_voice.dm" #include "code\game\gamemodes\changeling\powers\panacea.dm" -#include "code\game\gamemodes\changeling\powers\para_sting.dm" #include "code\game\gamemodes\changeling\powers\rapid_regen.dm" #include "code\game\gamemodes\changeling\powers\respec.dm" #include "code\game\gamemodes\changeling\powers\revive.dm" +#include "code\game\gamemodes\changeling\powers\self_respiration.dm" #include "code\game\gamemodes\changeling\powers\shriek.dm" #include "code\game\gamemodes\changeling\powers\silence_sting.dm" #include "code\game\gamemodes\changeling\powers\transform.dm" +#include "code\game\gamemodes\changeling\powers\visible_camouflage.dm" #include "code\game\gamemodes\cult\cult.dm" #include "code\game\gamemodes\cult\cult_items.dm" #include "code\game\gamemodes\cult\cult_structures.dm"