diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 50819be8c1d..a5a18c6676e 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -204,6 +204,8 @@
cult -= cult_mind
cult_mind.current << "\red An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it."
cult_mind.memory = ""
+ cult_mind.special_role = null
+ cult_mind.current.hud_updateflag |= 1 << SPECIALROLE_HUD
// remove the cult viewpoint object
var/obj/viewpoint = getCultViewpoint(cult_mind.current)
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 6e236db2154..0d5a399b892 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -488,6 +488,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
R.check_icon()
R.blood_DNA = list()
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
+ R.add_hiddenprint(H)
return
else
user << "The book seems full of illegible scribbles. Is this a joke?"
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 421582d26a1..1cc2cd9d469 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -172,9 +172,8 @@ Made by Xhuis
thrall_mind.current.attack_log += "\[[time_stamp()]\] Dethralled"
thrall_mind.special_role = null
update_shadow_icons_removed(thrall_mind)
- thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_glare)
- thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk)
- //thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/thrall_vision) //uncomment when vision code is unfucked.
+ for(var/obj/effect/proc_holder/spell/S in thrall_mind.spell_list)
+ thrall_mind.remove_spell(S)
thrall_mind.current.remove_language("Shadowling Hivemind")
if(kill && ishuman(thrall_mind.current)) //If dethrallization surgery fails, kill the mob as well as dethralling them
var/mob/living/carbon/human/H = thrall_mind.current
@@ -211,7 +210,29 @@ Made by Xhuis
else
shadowling_dead = 1 //but shadowling was kill :(
return 1
-
+
+/datum/game_mode/proc/remove_shadowling(datum/mind/ling_mind)
+ if(!istype(ling_mind) || !(ling_mind in shadows)) return 0
+ update_shadow_icons_removed(ling_mind)
+ shadows.Remove(ling_mind)
+ ling_mind.current.attack_log += "\[[time_stamp()]\] Deshadowlinged"
+ ling_mind.special_role = null
+ for(var/obj/effect/proc_holder/spell/S in ling_mind.spell_list)
+ ling_mind.remove_spell(S)
+ var/mob/living/M = ling_mind.current
+ if(issilicon(M))
+ M.audible_message("[M] lets out a short blip.", \
+ "You have been turned into a robot! You are no longer a shadowling! Though you try, you cannot remember anything about your time as one...")
+ else
+ M.visible_message("[M] screams and contorts!", \
+ "THE LIGHT-- YOUR MIND-- BURNS--")
+ spawn(30)
+ if(!M || qdeleted(M))
+ return
+ M.visible_message("[M] suddenly bloats and explodes!", \
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA----")
+ playsound(M, 'sound/magic/Disintegrate.ogg', 100, 1)
+ M.gib()
/datum/game_mode/shadowling/proc/check_shadow_victory()
var/success = 0 //Did they win?
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 0e05c316052..12419f66244 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -8,7 +8,15 @@
var/datum/ai_laws/laws = null
var/obj/item/weapon/circuitboard/circuit = null
var/obj/item/device/mmi/brain = null
-
+
+/obj/structure/AIcore/Destroy()
+ qdel(laws)
+ qdel(circuit)
+ qdel(brain)
+ laws = null
+ circuit = null
+ brain = null
+ return ..()
/obj/structure/AIcore/attackby(obj/item/P as obj, mob/user as mob, params)
switch(state)
@@ -176,7 +184,8 @@
state = 20//So it doesn't interact based on the above. Not really necessary.
/obj/structure/AIcore/deactivated/Destroy()
- empty_playable_ai_cores -= src
+ if(src in empty_playable_ai_cores)
+ empty_playable_ai_cores -= src
return ..()
/obj/structure/AIcore/deactivated/attackby(var/obj/item/W, var/mob/user, params)
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 6950d3b0361..da972725956 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -6,6 +6,8 @@
w_class = 2.0
slot_flags = SLOT_BELT
origin_tech = "programming=2"
+ var/request_cooldown = 60 // one minute
+ var/last_request
var/obj/item/device/radio/radio
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
@@ -241,6 +243,12 @@
pai.master_dna = dna.unique_enzymes
pai << "You have been bound to a new master.
"
if(href_list["request"])
+ var/delta = (world.time / 10) - last_request
+ if(request_cooldown > delta)
+ var/cooldown_time = round(request_cooldown - ((world.time / 10) - last_request), 1)
+ usr << "\red The request system is currently offline. Please wait another [cooldown_time] seconds."
+ return
+ last_request = world.time / 10
src.looking_for_personality = 1
paiController.findPAI(src, usr)
if(href_list["wipe"])
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 4dbd5be8f5d..32cd8fb90ba 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1833,6 +1833,8 @@
stampvalue = "cent"
sendername = command_name()
if("Syndicate")
+ stamptype = "icon"
+ stampvalue = "syndicate"
sendername = "UNKNOWN"
if("Administrator")
stamptype = input(src.owner, "Pick a stamp type.", "Stamp Type") as null|anything in list("icon","text","none")
@@ -1904,8 +1906,9 @@
else
for(var/obj/machinery/photocopier/faxmachine/F in allfaxes)
if((F.z in config.station_levels))
- if(!F.receivefax(P))
- src.owner << "\red Message transmission to [F.department] failed."
+ spawn(0)
+ if(!F.receivefax(P))
+ src.owner << "\red Message transmission to [F.department] failed."
var/datum/fax/admin/A = new /datum/fax/admin()
A.name = P.name
@@ -1923,7 +1926,7 @@
src.owner << "\blue Message transmitted successfully."
if(notify == "Yes")
var/mob/living/carbon/human/H = sender
- if(istype(H) && H.stat == 1 && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset)))
+ if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset)))
sender << "Your headset pings, notifying you that a reply to your fax has arrived."
if(sender)
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(sender)]: [input]")
diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm
index a95a754eae8..cc2cb3e8435 100644
--- a/code/modules/mob/living/silicon/login.dm
+++ b/code/modules/mob/living/silicon/login.dm
@@ -3,4 +3,6 @@
if(mind && ticker && ticker.mode)
ticker.mode.remove_cultist(mind, 1)
ticker.mode.remove_revolutionary(mind, 1)
+ ticker.mode.remove_thrall(mind,0)
+ ticker.mode.remove_shadowling(mind)
..()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 433a8361719..bcf862b3d92 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -25,6 +25,8 @@
//Used for self-mailing.
var/mail_destination = 0
+ var/reboot_cooldown = 60 // one minute
+ var/last_reboot
holder_type = /obj/item/weapon/holder/drone
// var/sprite[0]
@@ -123,8 +125,15 @@
if(!allowed(usr))
user << "\red Access denied."
return
-
+
+ var/delta = (world.time / 10) - last_reboot
+ if(reboot_cooldown > delta)
+ var/cooldown_time = round(reboot_cooldown - ((world.time / 10) - last_reboot), 1)
+ usr << "\red The reboot system is currently offline. Please wait another [cooldown_time] seconds."
+ return
+
user.visible_message("\red \the [user] swipes \his ID card through \the [src], attempting to reboot it.", "\red You swipe your ID card through \the [src], attempting to reboot it.")
+ last_reboot = world.time / 10
var/drones = 0
for(var/mob/living/silicon/robot/drone/D in world)
if(D.key && D.client)
@@ -256,13 +265,11 @@
/mob/living/silicon/robot/drone/proc/question(var/client/C,var/mob/M)
spawn(0)
if(!C || !M || jobban_isbanned(M,"nonhumandept") || jobban_isbanned(M,"Drone")) return
- var/response = alert(C, "Someone is attempting to reboot a maintenance drone. Would you like to play as one?", "Maintenance drone reboot", "Yes", "No", "Never for this round.")
+ var/response = alert(C, "Someone is attempting to reboot a maintenance drone. Would you like to play as one?", "Maintenance drone reboot", "Yes", "No")
if(!C || ckey)
return
if(response == "Yes")
transfer_personality(C)
- else if (response == "Never for this round")
- C.prefs.be_special ^= BE_PAI
/mob/living/silicon/robot/drone/proc/transfer_personality(var/client/player)
diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm
index df9f6e050e5..84b31b16766 100644
--- a/code/modules/mob/living/silicon/robot/login.dm
+++ b/code/modules/mob/living/silicon/robot/login.dm
@@ -2,6 +2,8 @@
..()
regenerate_icons()
show_laws(0)
+ if(mind) ticker.mode.remove_cultist(mind)
if(mind) ticker.mode.remove_revolutionary(mind)
if(mind) ticker.mode.remove_thrall(mind,0)
+ if(mind) ticker.mode.remove_shadowling(mind)
return
\ No newline at end of file
diff --git a/interface/skin.dmf b/interface/skin.dmf
index fdec926068f..888f4461135 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -315,11 +315,11 @@ macro "AZERTYon"
is-disabled = false
elem
name = "H"
- command = ".holster"
+ command = "holster"
is-disabled = false
elem
name = "CTRL+H"
- command = ".holster"
+ command = "holster"
is-disabled = false
elem
name = "Q+REP"
@@ -751,11 +751,11 @@ macro "hotkeymode"
is-disabled = false
elem
name = "H"
- command = ".holster"
+ command = "holster"
is-disabled = false
elem
name = "CTRL+H"
- command = ".holster"
+ command = "holster"
is-disabled = false
elem
name = "Q"
diff --git a/sound/magic/Disintegrate.ogg b/sound/magic/Disintegrate.ogg
new file mode 100644
index 00000000000..d36217a5b34
Binary files /dev/null and b/sound/magic/Disintegrate.ogg differ
diff --git a/sound/magic/FleshToStone.ogg b/sound/magic/FleshToStone.ogg
new file mode 100644
index 00000000000..9033d4425ed
Binary files /dev/null and b/sound/magic/FleshToStone.ogg differ