diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 704d40bcd18..f004e281cd4 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -485,6 +485,7 @@ datum/mind
current << "\red You have been brainwashed! You are no longer a head revolutionary!"
ticker.mode.update_rev_icons_removed(src)
special_role = null
+ message_admins("[key_name_admin(usr)] has de-rev'ed [current].", 1)
if("rev")
if(src in ticker.mode.head_revolutionaries)
@@ -498,6 +499,7 @@ datum/mind
ticker.mode.revolutionaries += src
ticker.mode.update_rev_icons_added(src)
special_role = "Revolutionary"
+ message_admins("[key_name(usr)] has rev'ed [current].")
if("headrev")
if(src in ticker.mode.revolutionaries)
@@ -522,6 +524,7 @@ datum/mind
ticker.mode.head_revolutionaries += src
ticker.mode.update_rev_icons_added(src)
special_role = "Head Revolutionary"
+ message_admins("[key_name_admin(usr)] has head-rev'ed [current].", 1)
if("autoobjectives")
ticker.mode.forge_revolutionary_objectives(src)
@@ -570,6 +573,7 @@ datum/mind
cult.memoize_cult_objectives(src)
current << "\red You have been brainwashed! You are no longer a cultist!"
memory = ""
+ message_admins("[key_name_admin(usr)] has de-cult'ed [current].", 1)
if("cultist")
if(!(src in ticker.mode.cult))
ticker.mode.cult += src
@@ -580,6 +584,7 @@ datum/mind
var/datum/game_mode/cult/cult = ticker.mode
if (istype(cult))
cult.memoize_cult_objectives(src)
+ message_admins("[key_name_admin(usr)] has cult'ed [current].", 1)
if("tome")
var/mob/living/carbon/human/H = current
if (istype(H))
@@ -610,12 +615,14 @@ datum/mind
special_role = null
current.spellremove(current, config.feature_object_spell_system? "object":"verb")
current << "\red You have been brainwashed! You are no longer a wizard!"
+ message_admins("[key_name_admin(usr)] has de-wizard'ed [current].", 1)
if("wizard")
if(!(src in ticker.mode.wizards))
ticker.mode.wizards += src
special_role = "Wizard"
//ticker.mode.learn_basic_spells(current)
current << "\red You are the Space Wizard!"
+ message_admins("[key_name_admin(usr)] has wizard'ed [current].", 1)
if("lair")
current.loc = pick(wizardstart)
if("dressup")
@@ -635,12 +642,14 @@ datum/mind
current.remove_changeling_powers()
if(changeling) del(changeling)
current << "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!"
+ message_admins("[key_name_admin(usr)] has de-changeling'ed [current].", 1)
if("changeling")
if(!(src in ticker.mode.changelings))
ticker.mode.changelings += src
ticker.mode.grant_changeling_powers(current)
special_role = "Changeling"
current << "Your powers are awoken. A flash of memory returns to us...we are a changeling!"
+ message_admins("[key_name_admin(usr)] has changeling'ed [current].", 1)
if("autoobjectives")
ticker.mode.forge_changeling_objectives(src)
usr << "\blue The objectives for changeling [key] have been generated. You can edit them and anounce manually."
@@ -664,6 +673,7 @@ datum/mind
for (var/datum/objective/nuclear/O in objectives)
objectives-=O
current << "\red You have been brainwashed! You are no longer a syndicate operative!"
+ message_admins("[key_name_admin(usr)] has de-nuke op'ed [current].", 1)
if("nuclear")
if(!(src in ticker.mode.syndicates))
ticker.mode.syndicates += src
@@ -676,6 +686,7 @@ datum/mind
current << "\blue You are a [syndicate_name()] agent!"
ticker.mode.forge_syndicate_objectives(src)
ticker.mode.greet_syndicate(src)
+ message_admins("[key_name_admin(usr)] has nuke op'ed [current].", 1)
if("lair")
current.loc = get_turf(locate("landmark*Syndicate-Spawn"))
if("dressup")
@@ -711,12 +722,14 @@ datum/mind
ticker.mode.traitors -= src
special_role = null
current << "\red You have been brainwashed! You are no longer a traitor!"
+ message_admins("[key_name_admin(usr)] has de-traitor'ed [current].", 1)
if("traitor")
if(!(src in ticker.mode.traitors))
ticker.mode.traitors += src
special_role = "traitor"
current << "\red You are a traitor!"
+ message_admins("[key_name_admin(usr)] has traitor'ed [current].", 1)
if("autoobjectives")
ticker.mode.forge_traitor_objectives(src)
@@ -796,9 +809,11 @@ datum/mind
current.icon_state = "ai"
current << "\red You have been patched! You are no longer malfunctioning!"
+ message_admins("[key_name_admin(usr)] has de-malf'ed [current].", 1)
if("malf")
make_AI_Malf()
+ message_admins("[key_name_admin(usr)] has malf'ed [current].", 1)
if("unemag")
var/mob/living/silicon/robot/R = current
@@ -815,6 +830,7 @@ datum/mind
else if(R.module_state_3 == R.module.emag)
R.module_state_3 = null
R.contents -= R.module.emag
+ message_admins("[key_name_admin(usr)] has unemag'ed [R].", 1)
if("unemagcyborgs")
if (istype(current, /mob/living/silicon/ai))
@@ -833,6 +849,7 @@ datum/mind
else if(R.module_state_3 == R.module.emag)
R.module_state_3 = null
R.contents -= R.module.emag
+ message_admins("[key_name_admin(usr)] has unemag'ed [ai]'s Cyborgs.", 1)
else if (href_list["common"])
switch(href_list["common"])
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 54824cbaf1b..cf045d0464a 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -12,6 +12,16 @@
if(!(P in src.verbs))
src.verbs += P.verbpath
+ if(!powerinstances.len)
+ for(var/P in powers)
+ powerinstances += new P()
+
+ // 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?
+ mind.changeling.purchasePower(P.name)// Purchase it.
+
mind.changeling.absorbed_dna |= dna
return 1
@@ -25,29 +35,29 @@
//Helper proc. Does all the checks and stuff for us to avoid copypasta
/mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=100, var/max_stat=0)
- if(!usr) return
- if(!usr.mind) return
- if(!iscarbon(usr)) return
+ if(!src) return
+ if(!src.mind) return
+ if(!iscarbon(src)) return
- var/datum/changeling/changeling = usr.mind.changeling
+ var/datum/changeling/changeling = src.mind.changeling
if(!changeling)
world.log << "[src] has the changeling_transform() verb but is not a changeling."
return
if(usr.stat > max_stat)
- usr << "We are incapacitated."
+ src << "We are incapacitated."
return
if(changeling.absorbed_dna.len < required_dna)
- usr << "We require at least [required_dna] samples of compatible DNA."
+ src << "We require at least [required_dna] samples of compatible DNA."
return
if(changeling.chem_charges < required_chems)
- usr << "We require at least [required_chems] units of chemicals to do that!"
+ src << "We require at least [required_chems] units of chemicals to do that!"
return
if(changeling.geneticdamage > max_genetic_damage)
- usr << usr << "Our geneomes are still reassembling. We need time to recover first."
+ src << "Our geneomes are still reassembling. We need time to recover first."
return
return changeling
@@ -586,7 +596,7 @@
var/mob/living/carbon/T = changeling_sting(30,/mob/proc/changeling_paralysis_sting)
if(!T) return 0
T << "Your muscles begin to painfully tighten."
- T.Weaken(10)
+ T.Weaken(20)
feedback_add_details("changeling_powers","PS")
return 1
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index f62a485e9b0..240a89fb199 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -424,18 +424,21 @@ var/list/datum/power/changeling/powerinstances = list()
-/datum/changeling/proc/purchasePower(var/datum/power/changeling/Pname)
+/datum/changeling/proc/purchasePower(var/Pname)
if(!usr.mind || !usr.mind.changeling)
return
// src = usr.mind.changeling
- var/datum/power/changeling/Thepower = null
+ var/datum/power/changeling/Thepower = Pname
+
for (var/datum/power/changeling/P in powerinstances)
+ //world << "[P] - [Pname] = [P.name == Pname ? "True" : "False"]"
if(P.name == Pname)
Thepower = P
break
+
if(Thepower == null)
usr << "This is awkward. Changeling power purchase failed, please report this bug to a coder!"
return
diff --git a/code/game/gamemodes/factions.dm b/code/game/gamemodes/factions.dm
index 5045cd8ed3a..fe03788dd0d 100644
--- a/code/game/gamemodes/factions.dm
+++ b/code/game/gamemodes/factions.dm
@@ -134,7 +134,7 @@ Whitespace:Seperator;
Stealth and Camouflage Items;
/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit;
/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes;
-/obj/item/weapon/card/id/syndicate:3:Agent ID card;
+/obj/item/weapon/card/id/syndicate:2:Agent ID card;
/obj/item/clothing/mask/gas/voice:4:Voice Changer;
/obj/item/device/chameleon:4:Chameleon-Projector;
Whitespace:Seperator;
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index e194e341365..e9c95cceb91 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -44,7 +44,7 @@ Whitespace:Seperator;
Stealth and Camouflage Items;
/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit;
/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes;
-/obj/item/weapon/card/id/syndicate:3:Agent ID card;
+/obj/item/weapon/card/id/syndicate:2:Agent ID card;
/obj/item/clothing/mask/gas/voice:4:Voice Changer;
/obj/item/device/chameleon:4:Chameleon-Projector;
Whitespace:Seperator;
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index f4c290a6032..482b1d2df72 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -153,10 +153,10 @@ A list of items and costs is stored under the datum of every game mode, alongsid
if("/obj/item/weapon/melee/energy/sword" , "/obj/item/clothing/mask/gas/voice" , "/obj/item/device/chameleon")
uses -= 4
if("/obj/item/weapon/storage/emp_kit" , "/obj/item/weapon/pen/paralysis" , "/obj/item/weapon/cartridge/syndicate" , "/obj/item/clothing/under/chameleon" , \
- "/obj/item/weapon/card/id/syndicate" , "/obj/item/weapon/card/emag" , "/obj/item/weapon/storage/syndie_kit/space" , "/obj/item/device/encryptionkey/binary" , \
+ "/obj/item/weapon/card/emag" , "/obj/item/weapon/storage/syndie_kit/space" , "/obj/item/device/encryptionkey/binary" , \
"/obj/item/weapon/storage/syndie_kit/imp_freedom" , "/obj/item/clothing/glasses/thermal/syndi")
uses -= 3
- if("/obj/item/ammo_magazine/a357" , "/obj/item/clothing/shoes/syndigaloshes" , "/obj/item/weapon/plastique")
+ if("/obj/item/ammo_magazine/a357" , "/obj/item/clothing/shoes/syndigaloshes" , "/obj/item/weapon/plastique", "/obj/item/weapon/card/id/syndicate")
uses -= 2
if("/obj/item/weapon/soap/syndie" , "/obj/item/weapon/storage/toolbox/syndicate")
uses -= 1
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index 5701501eedd..87d964ada16 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -34,6 +34,7 @@
if(!broken)
if(prob(50/severity))
src.locked = !src.locked
+ src.update_icon()
if(prob(20/severity) && !opened)
if(!locked)
open()
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 2c2f7fa40a0..b26fef731e9 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -2133,13 +2133,14 @@ var/global/floorIsLava = 0
for(var/mob/living/carbon/L in living_mob_list)
if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?!
var/turf/simulated/floor/F = L.loc
- var/safe = 0
- for(var/obj/structure/O in F.contents)
- if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor!
- safe = 1
- break
- if(!safe)
- L.adjustFireLoss(damage)
+ if(F.lava)
+ var/safe = 0
+ for(var/obj/structure/O in F.contents)
+ if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor!
+ safe = 1
+ break
+ if(!safe)
+ L.adjustFireLoss(damage)
sleep(10)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index f8ef9f4ee3e..95ca8e250a9 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -267,6 +267,8 @@
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
if(temp_vent.loc == loc)
continue
+ if(temp_vent.welded)
+ continue
var/turf/T = get_turf(temp_vent)
if(!T || T.z != loc.z)