diff --git a/code/datums/repositories/cameras.dm b/code/datums/repositories/cameras.dm
new file mode 100644
index 0000000000..7bac2a4634
--- /dev/null
+++ b/code/datums/repositories/cameras.dm
@@ -0,0 +1,34 @@
+var/global/datum/repository/cameras/camera_repository = new()
+
+/proc/invalidateCameraCache()
+ camera_repository.networks.Cut()
+ camera_repository.invalidated = 1
+ camera_repository.camera_cache_id = (++camera_repository.camera_cache_id % 999999)
+
+/datum/repository/cameras
+ var/list/networks
+ var/invalidated = 1
+ var/camera_cache_id = 1
+
+/datum/repository/cameras/New()
+ networks = list()
+ ..()
+
+/datum/repository/cameras/proc/cameras_in_network(var/network)
+ setup_cache()
+ var/list/network_list = networks[network]
+ return network_list
+
+/datum/repository/cameras/proc/setup_cache()
+ if(!invalidated)
+ return
+ invalidated = 0
+
+ cameranet.process_sort()
+ for(var/obj/machinery/camera/C in cameranet.cameras)
+ var/cam = C.nano_structure()
+ for(var/network in C.network)
+ if(!networks[network])
+ networks[network] = list()
+ var/list/netlist = networks[network]
+ netlist[++netlist.len] = cam
diff --git a/code/datums/crew.dm b/code/datums/repositories/crew.dm
similarity index 95%
rename from code/datums/crew.dm
rename to code/datums/repositories/crew.dm
index d46a83846f..6fbe1863da 100644
--- a/code/datums/crew.dm
+++ b/code/datums/repositories/crew.dm
@@ -1,9 +1,5 @@
var/global/datum/repository/crew/crew_repository = new()
-/datum/cache_entry
- var/timestamp
- var/data
-
/datum/repository/crew
var/list/cache_data
diff --git a/code/datums/repositories/repository.dm b/code/datums/repositories/repository.dm
new file mode 100644
index 0000000000..6267099c93
--- /dev/null
+++ b/code/datums/repositories/repository.dm
@@ -0,0 +1,4 @@
+/datum/cache_entry
+ var/timestamp
+ var/data
+
diff --git a/code/game/antagonist/station/changeling.dm b/code/game/antagonist/station/changeling.dm
index dad7ed81a2..044e968f49 100644
--- a/code/game/antagonist/station/changeling.dm
+++ b/code/game/antagonist/station/changeling.dm
@@ -73,4 +73,14 @@
if(player.current.client.prefs.organ_data["torso"] == "cyborg") // Full synthetic.
return 0
return 1
- return 0
\ No newline at end of file
+ return 0
+
+/datum/antagonist/changeling/print_player_full(var/datum/mind/ply)
+ var/text = print_player_lite(ply)
+
+ if(ply.changeling)
+ var/datum/changeling/ling_datum = ply.changeling
+ text += " (had [ling_datum.max_geneticpoints] genomes)"
+ text += "
Bought [english_list(ling_datum.purchased_powers_history)]."
+
+ return text
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 8ab1944f5e..4b9d257a46 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -77,7 +77,7 @@ var/list/ghostteleportlocs = list()
/hook/startup/proc/setupGhostTeleportLocs()
for(var/area/AR in world)
if(ghostteleportlocs.Find(AR.name)) continue
- if(istype(AR, /area/turret_protected/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome) || istype(AR, /area/shuttle/specops/centcom))
+ if(istype(AR, /area/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome) || istype(AR, /area/shuttle/specops/centcom))
ghostteleportlocs += AR.name
ghostteleportlocs[AR.name] = AR
var/turf/picked = pick(get_area_turfs(AR.type))
@@ -122,8 +122,6 @@ area/space/atmosalert()
/area/space/partyalert()
return
-/area/turret_protected/
-
/area/arrival
requires_power = 0
@@ -2422,65 +2420,65 @@ area/space/atmosalert()
name = "Emergency Storage"
icon_state = "storage"
-/area/turret_protected/ai_upload
+/area/ai_upload
name = "\improper AI Upload Chamber"
icon_state = "ai_upload"
ambience = list('sound/ambience/ambimalf.ogg')
-/area/turret_protected/ai_upload_foyer
+/area/ai_upload_foyer
name = "AI Upload Access"
icon_state = "ai_foyer"
ambience = list('sound/ambience/ambimalf.ogg')
sound_env = SMALL_ENCLOSED
-/area/turret_protected/ai_server_room
+/area/ai_server_room
name = "Messaging Server Room"
icon_state = "ai_server"
sound_env = SMALL_ENCLOSED
-/area/turret_protected/ai
+/area/ai
name = "\improper AI Chamber"
icon_state = "ai_chamber"
ambience = list('sound/ambience/ambimalf.ogg')
-/area/turret_protected/ai_cyborg_station
+/area/ai_cyborg_station
name = "\improper Cyborg Station"
icon_state = "ai_cyborg"
sound_env = SMALL_ENCLOSED
-/area/turret_protected/aisat
+/area/aisat
name = "\improper AI Satellite"
icon_state = "ai"
-/area/turret_protected/aisat_interior
+/area/aisat_interior
name = "\improper AI Satellite"
icon_state = "ai"
-/area/turret_protected/AIsatextFP
+/area/AIsatextFP
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = 0
-/area/turret_protected/AIsatextFS
+/area/AIsatextFS
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = 0
-/area/turret_protected/AIsatextAS
+/area/AIsatextAS
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = 0
-/area/turret_protected/AIsatextAP
+/area/AIsatextAP
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = 0
-/area/turret_protected/NewAIMain
+/area/NewAIMain
name = "\improper AI Main New"
icon_state = "storage"
@@ -2524,22 +2522,22 @@ area/space/atmosalert()
name = "\improper Telecoms Central Compartment"
icon_state = "tcomsatcham"
-/area/turret_protected/tcomsat
+/area/tcomsat
name = "\improper Telecoms Satellite"
icon_state = "tcomsatlob"
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
-/area/turret_protected/tcomfoyer
+/area/tcomfoyer
name = "\improper Telecoms Foyer"
icon_state = "tcomsatentrance"
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
-/area/turret_protected/tcomwest
+/area/tcomwest
name = "\improper Telecommunications Satellite West Wing"
icon_state = "tcomsatwest"
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
-/area/turret_protected/tcomeast
+/area/tcomeast
name = "\improper Telecommunications Satellite East Wing"
icon_state = "tcomsateast"
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
@@ -2762,9 +2760,9 @@ var/list/the_station_areas = list (
/area/ai_monitored/storage/eva, //do not try to simplify to "/area/ai_monitored" --rastaf0
/area/ai_monitored/storage/secure,
/area/ai_monitored/storage/emergency,
- /area/turret_protected/ai_upload, //do not try to simplify to "/area/turret_protected" --rastaf0
- /area/turret_protected/ai_upload_foyer,
- /area/turret_protected/ai,
+ /area/ai_upload, //do not try to simplify to "/area" --rastaf0
+ /area/ai_upload_foyer,
+ /area/ai,
)
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 566cad6ace..84d6bb8536 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -14,11 +14,12 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
var/isabsorbing = 0
var/geneticpoints = 5
var/max_geneticpoints = 5
- var/purchasedpowers = list()
+ var/list/purchased_powers = list()
var/mimicing = ""
var/cloaked = 0
var/armor_deployed = 0 //This is only used for changeling_generic_equip_all_slots() at the moment.
var/recursive_enhancement = 0 //Used to power up other abilities from the ling power with the same name.
+ var/list/purchased_powers_history = list() //Used for round-end report, includes respec uses too.
/datum/changeling/New(var/gender=FEMALE)
..()
@@ -60,10 +61,10 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
// Code to auto-purchase free powers.
for(var/datum/power/changeling/P in powerinstances)
if(!P.genomecost) // Is it free?
- if(!(P in mind.changeling.purchasedpowers)) // Do we not have it already?
+ if(!(P in mind.changeling.purchased_powers)) // Do we not have it already?
mind.changeling.purchasePower(mind, P.name, 0)// Purchase it. Don't remake our verbs, we're doing it after this.
- for(var/datum/power/changeling/P in mind.changeling.purchasedpowers)
+ for(var/datum/power/changeling/P in mind.changeling.purchased_powers)
if(P.isVerb)
if(lesser_form && !P.allowduringlesserform) continue
if(!(P in src.verbs))
@@ -83,7 +84,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
//removes our changeling verbs
/mob/proc/remove_changeling_powers()
if(!mind || !mind.changeling) return
- for(var/datum/power/changeling/P in mind.changeling.purchasedpowers)
+ for(var/datum/power/changeling/P in mind.changeling.purchased_powers)
if(P.isVerb)
verbs -= P.verbpath
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index 7c6f674628..c0330fb080 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -249,7 +249,7 @@ var/list/datum/power/changeling/powerinstances = list()
for(var/datum/power/changeling/P in powerinstances)
var/ownsthis = 0
- if(P in purchasedpowers)
+ if(P in purchased_powers)
ownsthis = 1
@@ -324,7 +324,7 @@ var/list/datum/power/changeling/powerinstances = list()
M.current << "This is awkward. Changeling power purchase failed, please report this bug to a coder!"
return
- if(Thepower in purchasedpowers)
+ if(Thepower in purchased_powers)
M.current << "We have already evolved this ability!"
return
@@ -335,7 +335,10 @@ var/list/datum/power/changeling/powerinstances = list()
geneticpoints -= Thepower.genomecost
- purchasedpowers += Thepower
+ purchased_powers += Thepower
+
+ if(Thepower.genomecost > 0)
+ purchased_powers_history.Add("[Pname] ([Thepower.genomecost] points)")
if(!Thepower.isVerb && Thepower.verbpath)
call(M.current, Thepower.verbpath)()
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 6adead4b89..d145f95946 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -1,10 +1,10 @@
/datum/power/changeling/absorb_dna
name = "Absorb DNA"
- desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger."
+ desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger if they were of our kind."
genomecost = 0
verbpath = /mob/proc/changeling_absorb_dna
-//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
+//Absorbs the victim's DNA. Requires a strong grip on the victim.
//Doesn't cost anything as it's the most basic ability.
/mob/proc/changeling_absorb_dna()
set category = "Changeling"
@@ -27,9 +27,10 @@
src << "We do not know how to parse this creature's DNA!"
return
- if(HUSK in T.mutations)
- src << "This creature's DNA is ruined beyond useability!"
- return
+ if(HUSK in T.mutations) //Lings can always absorb other lings, unless someone beat them to it first.
+ if(!T.mind.changeling || T.mind.changeling && T.mind.changeling.geneticpoints < 0)
+ src << "This creature's DNA is ruined beyond useability!"
+ return
if(G.state != GRAB_KILL)
src << "We must have a tighter grip to absorb this creature."
diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm
index e1d6609851..c5441d90ee 100644
--- a/code/game/gamemodes/changeling/powers/armblade.dm
+++ b/code/game/gamemodes/changeling/powers/armblade.dm
@@ -2,6 +2,7 @@
name = "Arm Blade"
desc = "We reform one of our arms into a deadly blade."
helptext = "We may retract our armblade by dropping it. It can deflect projectiles."
+ enhancedtext = "The blade will have armor peneratration."
genomecost = 2
verbpath = /mob/proc/changeling_arm_blade
@@ -10,9 +11,16 @@
set category = "Changeling"
set name = "Arm Blade (20)"
- if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade))
- return 1
- return 0
+ if(src.mind.changeling.recursive_enhancement)
+ if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade/greater))
+ src << "We prepare an extra sharp blade."
+ src.mind.changeling.recursive_enhancement = 0
+ return 1
+
+ else
+ if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade))
+ return 1
+ return 0
/obj/item/weapon/melee/arm_blade
name = "arm blade"
@@ -31,6 +39,11 @@
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/mob/living/creator //This is just like ninja swords, needed to make sure dumb shit that removes the sword doesn't make it stay around.
+/obj/item/weapon/melee/arm_blade/greater
+ name = "arm greatblade"
+ desc = "A grotesque blade made out of bone and flesh that cleaves through people and armor as a hot knife through butter."
+ armor_penetration = 30
+
/obj/item/weapon/melee/arm_blade/New(location)
..()
processing_objects |= src
diff --git a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
index 694e22e8dd..dd1489248f 100644
--- a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
+++ b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
@@ -4,6 +4,7 @@
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. \
Shocking someone costs ten chemicals per use."
+ enhancedtext = "Shocking biologicals without grabbing only requires five chemicals, and has more disabling power."
genomecost = 2
verbpath = /mob/proc/changeling_bioelectrogenesis
@@ -21,8 +22,14 @@
return 0
if(held_item == null)
- if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc.
- return 1
+ if(src.mind.changeling.recursive_enhancement)
+ if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent))
+ src << "We will shock others more efficently."
+ src.mind.changeling.recursive_enhancement = 0
+ return 1
+ else
+ if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc.
+ return 1
return 0
else
@@ -30,12 +37,11 @@
if(istype(held_item,/obj/item/weapon/grab))
var/obj/item/weapon/grab/G = held_item
if(G.affecting)
- G.affecting.electrocute_act(5,src,1.0,BP_TORSO)
- var/agony = 60 //The same as a stunbaton.
- var/stun = 0
- G.affecting.stun_effect_act(stun, agony, BP_TORSO, src)
+ G.affecting.electrocute_act(10,src,1.0,BP_TORSO)
+ var/agony = 80 //Does more than if hit with an electric hand, since grabbing is slower.
+ G.affecting.stun_effect_act(0, agony, BP_TORSO, src)
- msg_admin_attack("[key_name(src)] stunned [key_name(G.affecting)] with the [src].")
+ msg_admin_attack("[key_name(src)] shocked [key_name(G.affecting)] with the [src].")
visible_message("Arcs of electricity strike [G.affecting]!",
"Our hand channels raw electricity into [G.affecting].",
@@ -72,7 +78,7 @@
new /obj/effect/effect/sparks(T)
held_item.update_icon()
i--
- sleep(10)
+ sleep(1 SECOND)
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]."
@@ -85,6 +91,14 @@
desc = "You could probably shock someone badly if you touched them, or recharge something."
icon = 'icons/obj/weapons.dmi'
icon_state = "electric_hand"
+ var/shock_cost = 10
+ var/agony_amount = 60
+ var/electrocute_amount = 10
+
+/obj/item/weapon/electric_hand/efficent
+ shock_cost = 5
+ agony_amount = 80
+ electrocute_amount = 20
/obj/item/weapon/electric_hand/New()
if(ismob(loc))
@@ -108,22 +122,20 @@
if(istype(target,/mob/living/carbon))
var/mob/living/carbon/C = target
- if(user.mind.changeling.chem_charges < 10)
+ if(user.mind.changeling.chem_charges < shock_cost)
src << "We require more chemicals to electrocute [C]!"
return 0
- C.electrocute_act(5,src,1.0,BP_TORSO)
- var/agony = 60 //The same as a stunbaton.
- var/stun = 0
- C.stun_effect_act(stun, agony, BP_TORSO, src)
+ C.electrocute_act(electrocute_amount,src,1.0,BP_TORSO)
+ C.stun_effect_act(0, agony_amount, BP_TORSO, src)
- msg_admin_attack("[key_name(user)] stunned [key_name(C)] with the [src].")
+ msg_admin_attack("[key_name(user)] shocked [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) //Since we're no longer a one hit stun, we need to stick around.
- user.mind.changeling.chem_charges -= 10
+ user.mind.changeling.chem_charges -= shock_cost
return 1
else if(istype(target,/mob/living/silicon))
@@ -163,7 +175,7 @@
new /obj/effect/effect/sparks(Turf)
T.update_icon()
i--
- sleep(10)
+ sleep(1 SECOND)
success = 1
break
if(success == 0)
diff --git a/code/game/gamemodes/changeling/powers/cryo_sting.dm b/code/game/gamemodes/changeling/powers/cryo_sting.dm
index d6a4f6302b..7fae4c1601 100644
--- a/code/game/gamemodes/changeling/powers/cryo_sting.dm
+++ b/code/game/gamemodes/changeling/powers/cryo_sting.dm
@@ -1,7 +1,8 @@
/datum/power/changeling/cryo_sting
name = "Cryogenic Sting"
desc = "We silently sting a biological with a cocktail of chemicals that freeze them."
- helptext = "Does not provide a warning to the victim, though they will likely realize they are suddenly freezing."
+ helptext = "Does not provide a warning to the victim, though they will likely realize they are suddenly freezing. Has \
+ a three minute cooldown between uses."
enhancedtext = "Increases the amount of chemicals injected."
genomecost = 1
verbpath = /mob/proc/changeling_cryo_sting
diff --git a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
index 0b0b95589c..8f7998f67a 100644
--- a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
+++ b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
@@ -1,7 +1,8 @@
/datum/power/changeling/delayed_toxic_sting
name = "Delayed Toxic Sting"
- desc = "We silently sting a biological, causing a significant amount of toxins after a few minutes, allowing us to not implicate ourselves."
- helptext = "The toxin takes effect in about two minutes."
+ desc = "We silently sting a biological, causing a significant amount of toxins after a few minutes, allowing us to not \
+ implicate ourselves."
+ helptext = "The toxin takes effect in about two minutes. The sting has a three minute cooldown between uses."
enhancedtext = "The toxic damage is doubled."
genomecost = 1
verbpath = /mob/proc/changeling_delayed_toxic_sting
@@ -25,7 +26,7 @@
while(i)
T.adjustToxLoss(1)
i--
- sleep(20)
+ sleep(2 SECONDS)
src.verbs -= /mob/proc/changeling_delayed_toxic_sting
spawn(3 MINUTES)
src << "We are ready to use our delayed toxic string once more."
diff --git a/code/game/gamemodes/changeling/powers/electric_lockpick.dm b/code/game/gamemodes/changeling/powers/electric_lockpick.dm
index c8c87e6a9d..40c4b372a0 100644
--- a/code/game/gamemodes/changeling/powers/electric_lockpick.dm
+++ b/code/game/gamemodes/changeling/powers/electric_lockpick.dm
@@ -78,6 +78,7 @@
else //Probably broken or no power.
user << "The door does not respond to the pulse."
door.add_fingerprint(user)
+ log_and_message_admins("finger-lockpicked \an [door].")
ling_datum.chem_charges -= 10
return 1
@@ -86,7 +87,7 @@
user << "We send an electrical pulse up our finger, and into \the [O]."
O.add_fingerprint(user)
O.emag_act(1,user,src)
- log_and_message_admins("emagged \an [O].")
+ log_and_message_admins("finger-lockpicked \an [O].")
ling_datum.chem_charges -= 10
return 1
diff --git a/code/game/gamemodes/changeling/powers/endoarmor.dm b/code/game/gamemodes/changeling/powers/endoarmor.dm
index c548e549f1..4052568a50 100644
--- a/code/game/gamemodes/changeling/powers/endoarmor.dm
+++ b/code/game/gamemodes/changeling/powers/endoarmor.dm
@@ -1,7 +1,7 @@
/datum/power/changeling/endoarmor
name = "Endoarmor"
desc = "We grow hard plating underneath our skin, making us more resilient to harm by increasing our maximum health potential by 50 points."
- helptext = "Our maximum health is increased to 150 health."
+ helptext = "Our maximum health is increased by 50 points."
genomecost = 1
isVerb = 0
verbpath = /mob/proc/changeling_endoarmor
diff --git a/code/game/gamemodes/changeling/powers/enfeebling_string.dm b/code/game/gamemodes/changeling/powers/enfeebling_string.dm
index 35d4ef7570..94699995ff 100644
--- a/code/game/gamemodes/changeling/powers/enfeebling_string.dm
+++ b/code/game/gamemodes/changeling/powers/enfeebling_string.dm
@@ -1,7 +1,8 @@
/datum/power/changeling/enfeebling_string
name = "Enfeebling String"
desc = "We sting a biological with a potent toxin that will greatly weaken them for a short period of time."
- helptext = "Lowers the maximum health of the victim for a few minutes. This sting will also warn them of this."
+ helptext = "Lowers the maximum health of the victim for a few minutes. This sting will also warn them of this. Has a \
+ five minute coodown between uses."
enhancedtext = "Maximum health is lowered further."
genomecost = 1
verbpath = /mob/proc/changeling_enfeebling_string
@@ -17,17 +18,21 @@
if(ishuman(T))
var/mob/living/carbon/human/H = T
- var/effect = 30
+ var/effect = 30 //percent
if(src.mind.changeling.recursive_enhancement)
effect = effect + 20
src << "We make them extremely weak."
src.mind.changeling.recursive_enhancement = 0
+ var/health_to_take_away = H.maxHealth * (effect / 100)
- H.maxHealth -= effect
- H << "You feel a small prick and you feel weak."
- spawn(300) //Five minutes
+ H.maxHealth -= health_to_take_away
+ H << "You feel a small prick and you feel extremly weak!"
+ src.verbs -= /mob/proc/changeling_enfeebling_string
+ spawn(5 MINUTES)
+ src.verbs |= /mob/proc/changeling_enfeebling_string
+ src << "Our enfeebling string is ready to be used once more."
if(H) //Just incase we stop existing in five minutes for whatever reason.
- H.maxHealth += 30
+ H.maxHealth += health_to_take_away
if(!H.stat) //It'd be weird to no longer feel weak when you're dead.
H << "You no longer feel extremly weak."
feedback_add_details("changeling_powers","ES")
diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm
index 0046e1517c..5a157cdbb7 100644
--- a/code/game/gamemodes/changeling/powers/fleshmend.dm
+++ b/code/game/gamemodes/changeling/powers/fleshmend.dm
@@ -31,10 +31,10 @@
C.adjustBruteLoss(-heal_amount)
C.adjustOxyLoss(-heal_amount)
C.adjustFireLoss(-heal_amount)
- sleep(10)
+ sleep(1 SECOND)
src.verbs -= /mob/proc/changeling_fleshmend
- spawn(500)
+ spawn(50 SECONDS)
src << "Our regeneration has slowed to normal levels."
src.verbs += /mob/proc/changeling_fleshmend
feedback_add_details("changeling_powers","FM")
diff --git a/code/game/gamemodes/changeling/powers/respec.dm b/code/game/gamemodes/changeling/powers/respec.dm
index f2bfe8f19c..661a761d8c 100644
--- a/code/game/gamemodes/changeling/powers/respec.dm
+++ b/code/game/gamemodes/changeling/powers/respec.dm
@@ -9,7 +9,7 @@
src.remove_changeling_powers() //First, remove the verbs.
var/datum/changeling/ling_datum = src.mind.changeling
- ling_datum.purchasedpowers = list() //Then wipe all the powers we bought.
+ ling_datum.purchased_powers = list() //Then wipe all the powers we bought.
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
@@ -21,5 +21,7 @@
src << "We have removed our evolutions from this form, and are now ready to readapt."
+ ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])")
+
//Now to lose the verb, so no unlimited resets.
src.verbs -= /mob/proc/changeling_respec
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index 7dc2310f78..647f5bd91f 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -33,10 +33,13 @@
if(ishuman(C))
var/mob/living/carbon/human/H = src
H.restore_blood()
+ H.mutations.Remove(HUSK)
+ H.status_flags -= DISFIGURED
+ H.update_body(1)
C << "We have regenerated."
C.status_flags &= ~(FAKEDEATH)
C.update_canmove()
- C.mind.changeling.purchasedpowers -= C
+ C.mind.changeling.purchased_powers -= C
feedback_add_details("changeling_powers","CR")
C.stat = CONSCIOUS
src.verbs -= /mob/proc/changeling_revive
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index 33d75c03a3..99f1a4d130 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -37,6 +37,8 @@
if(ishuman(src))
var/mob/living/carbon/human/H = src
H.b_type = "AB+" //For some reason we have two blood types on the mob.
+ for(var/flavor in H.flavor_texts) //Nulls out flavor text, so we don't keep our previous mob's flavor.
+ flavor = null
src.real_name = chosen_dna.real_name
src.flavor_text = ""
src.UpdateAppearance()
diff --git a/code/game/gamemodes/events/power_failure.dm b/code/game/gamemodes/events/power_failure.dm
index 0f7d6149d3..04404573e8 100644
--- a/code/game/gamemodes/events/power_failure.dm
+++ b/code/game/gamemodes/events/power_failure.dm
@@ -3,7 +3,7 @@
if(announce)
command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg')
- var/list/skipped_areas = list(/area/turret_protected/ai)
+ var/list/skipped_areas = list(/area/ai)
for(var/obj/machinery/power/smes/S in world)
var/area/current_area = get_area(S)
@@ -24,7 +24,7 @@
C.cell.charge = 0
/proc/power_restore(var/announce = 1)
- var/list/skipped_areas = list(/area/turret_protected/ai)
+ var/list/skipped_areas = list(/area/ai)
if(announce)
command_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
diff --git a/code/game/gamemodes/malfunction/malf_hardware.dm b/code/game/gamemodes/malfunction/malf_hardware.dm
index b33a5e49d8..864ba0722d 100644
--- a/code/game/gamemodes/malfunction/malf_hardware.dm
+++ b/code/game/gamemodes/malfunction/malf_hardware.dm
@@ -60,11 +60,6 @@
/datum/malf_hardware/strong_turrets/install()
..()
- for(var/obj/machinery/turret/T in machines)
- T.maxhealth = round(initial(T.maxhealth) * 1.4)
- T.shot_delay = round(initial(T.shot_delay) / 2)
- T.auto_repair = 1
- T.active_power_usage = round(initial(T.active_power_usage) * 5)
for(var/obj/machinery/porta_turret/T in machines)
T.maxhealth = round(initial(T.maxhealth) * 1.4)
T.shot_delay = round(initial(T.shot_delay) / 2)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index cb0d95c1df..291b985294 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -33,6 +33,8 @@
var/on_open_network = 0
+ var/affected_by_emp_until = 0
+
/obj/machinery/camera/New()
wires = new(src)
assembly = new(src)
@@ -62,22 +64,29 @@
wires = null
return ..()
+/obj/machinery/camera/process()
+ if((stat & EMPED) && world.time >= affected_by_emp_until)
+ stat &= ~EMPED
+ cancelCameraAlarm()
+ update_icon()
+ update_coverage()
+ return internal_process()
+
+/obj/machinery/camera/proc/internal_process()
+ return
+
/obj/machinery/camera/emp_act(severity)
- if(!isEmpProof())
- if(prob(100/severity))
+ if(!isEmpProof() && prob(100/severity))
+ if(!affected_by_emp_until || (world.time < affected_by_emp_until))
+ affected_by_emp_until = max(affected_by_emp_until, world.time + (90 SECONDS / severity))
+ else
stat |= EMPED
set_light(0)
+ triggerCameraAlarm()
kick_viewers()
- triggerCameraAlarm(30 / severity)
update_icon()
update_coverage()
-
- spawn(900)
- stat &= ~EMPED
- cancelCameraAlarm()
- update_icon()
- update_coverage()
- ..()
+ processing_objects |= src
/obj/machinery/camera/bullet_act(var/obj/item/projectile/P)
take_damage(P.get_structure_damage())
@@ -105,7 +114,6 @@
cameranet.updateVisibility(src, 0)
/obj/machinery/camera/attack_hand(mob/living/carbon/human/user as mob)
-
if(!istype(user))
return
@@ -114,7 +122,6 @@
user.do_attack_animation(src)
visible_message("\The [user] slashes at [src]!")
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
- icon_state = "[initial(icon_state)]1"
add_hiddenprint(user)
destroy()
@@ -176,7 +183,7 @@
for(var/mob/O in player_list)
if (istype(O.machine, /obj/machinery/computer/security))
var/obj/machinery/computer/security/S = O.machine
- if (S.current == src)
+ if (S.current_camera == src)
O << "[U] holds \a [itemname] up to one of the cameras ..."
O << browse(text("