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"