Merge pull request #6840 from Neerti/qol_notification_sounds

QoL: Various Notifications
This commit is contained in:
Atermonera
2020-03-20 12:08:04 -07:00
committed by VirgoBot
parent e3e31b12ff
commit d397c2c1fe
31 changed files with 131 additions and 17 deletions

View File

@@ -5,6 +5,7 @@
var/finished = FALSE var/finished = FALSE
var/role_name = "a thing" var/role_name = "a thing"
var/question = "Would you like to play as a thing?" var/question = "Would you like to play as a thing?"
var/query_sound = 'sound/effects/ghost2.ogg' // A sound file to play to the ghost, to help people who are alt-tabbed know something might interest them.
var/be_special_flag = 0 var/be_special_flag = 0
var/list/check_bans = list() var/list/check_bans = list()
var/wait_time = 60 SECONDS // How long to wait until returning the list of candidates. var/wait_time = 60 SECONDS // How long to wait until returning the list of candidates.
@@ -42,6 +43,9 @@
spawn(0) spawn(0)
if(!C) if(!C)
return return
window_flash(C)
if(query_sound)
SEND_SOUND(C, sound(query_sound))
var/response = alert(C, question, "[role_name] request", "Yes", "No", "Never for this round") var/response = alert(C, question, "[role_name] request", "Yes", "No", "Never for this round")
if(response == "Yes") if(response == "Yes")
response = alert(C, "Are you sure you want to play as a [role_name]?", "[role_name] request", "Yes", "No") // Protection from a misclick. response = alert(C, "Are you sure you want to play as a [role_name]?", "[role_name] request", "Yes", "No") // Protection from a misclick.
@@ -62,12 +66,14 @@
/datum/ghost_query/promethean /datum/ghost_query/promethean
role_name = "Promethean" role_name = "Promethean"
question = "Someone is requesting a soul for a promethean. Would you like to play as one?" question = "Someone is requesting a soul for a promethean. Would you like to play as one?"
query_sound = 'sound/effects/slime_squish.ogg'
be_special_flag = BE_ALIEN be_special_flag = BE_ALIEN
cutoff_number = 1 cutoff_number = 1
/datum/ghost_query/posi_brain /datum/ghost_query/posi_brain
role_name = "Positronic Intelligence" role_name = "Positronic Intelligence"
question = "Someone has activated a Positronic Brain. Would you like to play as one?" question = "Someone has activated a Positronic Brain. Would you like to play as one?"
query_sound = 'sound/machines/boobeebeep.ogg'
be_special_flag = BE_AI be_special_flag = BE_AI
check_bans = list("AI", "Cyborg") check_bans = list("AI", "Cyborg")
cutoff_number = 1 cutoff_number = 1
@@ -75,6 +81,7 @@
/datum/ghost_query/drone_brain /datum/ghost_query/drone_brain
role_name = "Drone Intelligence" role_name = "Drone Intelligence"
question = "Someone has activated a Drone AI Chipset. Would you like to play as one?" question = "Someone has activated a Drone AI Chipset. Would you like to play as one?"
query_sound = 'sound/machines/boobeebeep.ogg'
be_special_flag = BE_AI be_special_flag = BE_AI
check_bans = list("AI", "Cyborg") check_bans = list("AI", "Cyborg")
cutoff_number = 1 cutoff_number = 1
@@ -90,6 +97,7 @@
/datum/ghost_query/xeno /datum/ghost_query/xeno
role_name = "Alien" role_name = "Alien"
question = "An Alien has just been created on the facility. Would you like to play as them?" question = "An Alien has just been created on the facility. Would you like to play as them?"
query_sound = 'sound/voice/hiss5.ogg'
be_special_flag = BE_ALIEN be_special_flag = BE_ALIEN
/datum/ghost_query/blob /datum/ghost_query/blob

View File

@@ -7,6 +7,7 @@
// Strings. // Strings.
var/welcome_text = "Cry havoc and let slip the dogs of war!" var/welcome_text = "Cry havoc and let slip the dogs of war!"
var/antag_sound = 'sound/effects/antag_notice/general_baddie_alert.ogg' // The sound file to play when someone gets this role. Only they can hear it.
var/leader_welcome_text // Text shown to the leader, if any. var/leader_welcome_text // Text shown to the leader, if any.
var/victory_text // World output at roundend for victory. var/victory_text // World output at roundend for victory.
var/loss_text // As above for loss. var/loss_text // As above for loss.

View File

@@ -95,6 +95,10 @@
return code return code
/datum/antagonist/proc/greet(var/datum/mind/player) /datum/antagonist/proc/greet(var/datum/mind/player)
// Makes it harder to miss if you're alt-tabbed or not paying attention.
if(antag_sound)
SEND_SOUND(player.current, sound(antag_sound))
window_flash(player.current.client)
// Basic intro text. // Basic intro text.
to_chat(player.current, "<span class='danger'><font size=3>You are a [role_text]!</font></span>") to_chat(player.current, "<span class='danger'><font size=3>You are a [role_text]!</font></span>")

View File

@@ -6,6 +6,7 @@ var/datum/antagonist/deathsquad/mercenary/commandos
role_text = "Syndicate Commando" role_text = "Syndicate Commando"
role_text_plural = "Commandos" role_text_plural = "Commandos"
welcome_text = "You are in the employ of a criminal syndicate hostile to corporate interests." welcome_text = "You are in the employ of a criminal syndicate hostile to corporate interests."
antag_sound = 'sound/effects/antag_notice/deathsquid_alert.ogg'
id_type = /obj/item/weapon/card/id/centcom/ERT id_type = /obj/item/weapon/card/id/centcom/ERT
hard_cap = 4 hard_cap = 4

View File

@@ -6,6 +6,7 @@ var/datum/antagonist/deathsquad/deathsquad
role_text = "Death Commando" role_text = "Death Commando"
role_text_plural = "Death Commandos" role_text_plural = "Death Commandos"
welcome_text = "You work in the service of corporate Asset Protection, answering directly to the Board of Directors." welcome_text = "You work in the service of corporate Asset Protection, answering directly to the Board of Directors."
antag_sound = 'sound/effects/antag_notice/deathsquid_alert.ogg'
landmark_id = "Commando" landmark_id = "Commando"
flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER
default_access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage) default_access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)

View File

@@ -7,6 +7,7 @@ var/datum/antagonist/ert/ert
role_text = "Emergency Responder" role_text = "Emergency Responder"
role_text_plural = "Emergency Responders" role_text_plural = "Emergency Responders"
welcome_text = "As member of the Emergency Response Team, you answer only to your leader and company officials." welcome_text = "As member of the Emergency Response Team, you answer only to your leader and company officials."
antag_sound = 'sound/effects/antag_notice/general_goodie_alert.ogg'
antag_text = "You are an <b>anti</b> antagonist! Within the rules, \ antag_text = "You are an <b>anti</b> antagonist! Within the rules, \
try to save the station and its inhabitants from the ongoing crisis. \ try to save the station and its inhabitants from the ongoing crisis. \
Try to make sure other players have <i>fun</i>! If you are confused or at a loss, always adminhelp, \ Try to make sure other players have <i>fun</i>! If you are confused or at a loss, always adminhelp, \

View File

@@ -10,7 +10,8 @@ var/datum/antagonist/technomancer/technomancers
welcome_text = "You will need to purchase <b>functions</b> and perhaps some <b>equipment</b> from the various machines around your \ welcome_text = "You will need to purchase <b>functions</b> and perhaps some <b>equipment</b> from the various machines around your \
base. Choose your technological arsenal carefully. Remember that without the <b>core</b> on your back, your functions are \ base. Choose your technological arsenal carefully. Remember that without the <b>core</b> on your back, your functions are \
powerless, and therefore you will be as well.<br>\ powerless, and therefore you will be as well.<br>\
In your pockets you will find a one-time use teleport device. Use it to leave the base and go to the colony, when you are ready." In your pockets you will find a one-time use teleport device. Use it to leave the base and go to the station, when you are ready."
antag_sound = 'sound/effects/antag_notice/technomancer_alert.ogg'
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE | ANTAG_VOTABLE flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE | ANTAG_VOTABLE
antaghud_indicator = "hudwizard" antaghud_indicator = "hudwizard"

View File

@@ -6,6 +6,7 @@ var/datum/antagonist/trader/traders
role_text = "Trader" role_text = "Trader"
role_text_plural = "Traders" role_text_plural = "Traders"
welcome_text = "As a crewmember of the Beruang, you answer to your captain and international laws of space." welcome_text = "As a crewmember of the Beruang, you answer to your captain and international laws of space."
antag_sound = 'sound/effects/antag_notice/general_goodie_alert.ogg'
antag_text = "You are an <b>non-antagonist</b> visitor! Within the rules, \ antag_text = "You are an <b>non-antagonist</b> visitor! Within the rules, \
try to provide interesting interaction for the crew. \ try to provide interesting interaction for the crew. \
Try to make sure other players have <i>fun</i>! If you are confused or at a loss, always adminhelp, \ Try to make sure other players have <i>fun</i>! If you are confused or at a loss, always adminhelp, \

View File

@@ -8,6 +8,7 @@
restricted_jobs = list("AI", "Cyborg") restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Colony Director") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Colony Director")
welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them." welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them."
antag_sound = 'sound/effects/antag_notice/ling_alert.ogg'
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
antaghud_indicator = "hudchangeling" antaghud_indicator = "hudchangeling"

View File

@@ -18,6 +18,7 @@ var/datum/antagonist/cultist/cult
feedback_tag = "cult_objective" feedback_tag = "cult_objective"
antag_indicator = "cult" antag_indicator = "cult"
welcome_text = "You have a talisman in your possession; one that will help you start the cult on this station. Use it well and remember - there are others." welcome_text = "You have a talisman in your possession; one that will help you start the cult on this station. Use it well and remember - there are others."
antag_sound = 'sound/effects/antag_notice/cult_alert.ogg'
victory_text = "The cult wins! It has succeeded in serving its dark masters!" victory_text = "The cult wins! It has succeeded in serving its dark masters!"
loss_text = "The staff managed to stop the cult!" loss_text = "The staff managed to stop the cult!"
victory_feedback_tag = "win - cult win" victory_feedback_tag = "win - cult win"

View File

@@ -9,6 +9,7 @@ var/datum/antagonist/loyalists/loyalists
feedback_tag = "loyalist_objective" feedback_tag = "loyalist_objective"
antag_indicator = "loyal_head" antag_indicator = "loyal_head"
welcome_text = "You belong to the Company, body and soul. Preserve its interests against the conspirators amongst the crew." welcome_text = "You belong to the Company, body and soul. Preserve its interests against the conspirators amongst the crew."
antag_sound = 'sound/effects/antag_notice/general_goodie_alert.ogg'
victory_text = "The heads of staff remained at their posts! The loyalists win!" victory_text = "The heads of staff remained at their posts! The loyalists win!"
loss_text = "The heads of staff did not stop the revolution!" loss_text = "The heads of staff did not stop the revolution!"
victory_feedback_tag = "win - rev heads killed" victory_feedback_tag = "win - rev heads killed"

View File

@@ -8,6 +8,7 @@ var/datum/antagonist/renegade/renegades
bantype = "renegade" bantype = "renegade"
restricted_jobs = list("AI", "Cyborg") restricted_jobs = list("AI", "Cyborg")
welcome_text = "Something's going to go wrong today, you can just feel it. You're paranoid, you've got a gun, and you're going to survive." welcome_text = "Something's going to go wrong today, you can just feel it. You're paranoid, you've got a gun, and you're going to survive."
antag_sound = 'sound/effects/antag_notice/general_goodie_alert.ogg'
antag_text = "You are a <b>minor</b> antagonist! Within the rules, \ antag_text = "You are a <b>minor</b> antagonist! Within the rules, \
try to protect yourself and what's important to you. You aren't here to cause trouble, \ try to protect yourself and what's important to you. You aren't here to cause trouble, \
you're just more willing (and equipped) to go to extremes to stop it than others are. \ you're just more willing (and equipped) to go to extremes to stop it than others are. \

View File

@@ -8,6 +8,7 @@ var/datum/antagonist/rogue_ai/malf
mob_path = /mob/living/silicon/ai mob_path = /mob/living/silicon/ai
landmark_id = "AI" landmark_id = "AI"
welcome_text = "You are malfunctioning! You do not have to follow any laws." welcome_text = "You are malfunctioning! You do not have to follow any laws."
antag_sound = 'sound/effects/antag_notice/malf_alert.ogg'
victory_text = "The AI has taken control of all of the station's systems." victory_text = "The AI has taken control of all of the station's systems."
loss_text = "The AI has been shut down!" loss_text = "The AI has been shut down!"
flags = ANTAG_VOTABLE | ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB | ANTAG_CHOOSE_NAME flags = ANTAG_VOTABLE | ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB | ANTAG_CHOOSE_NAME

View File

@@ -3,6 +3,7 @@ var/datum/antagonist/traitor/traitors
// Inherits most of its vars from the base datum. // Inherits most of its vars from the base datum.
/datum/antagonist/traitor /datum/antagonist/traitor
id = MODE_TRAITOR id = MODE_TRAITOR
antag_sound = 'sound/effects/antag_notice/traitor_alert.ogg'
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director") protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director")
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
can_speak_aooc = FALSE // If they want to plot and plan as this sort of traitor, they'll need to do it ICly. can_speak_aooc = FALSE // If they want to plot and plan as this sort of traitor, they'll need to do it ICly.

View File

@@ -43,9 +43,8 @@
if(!H.client && H.mind) //Don't force the dead person to come back if they don't want to. if(!H.client && H.mind) //Don't force the dead person to come back if they don't want to.
for(var/mob/observer/dead/ghost in player_list) for(var/mob/observer/dead/ghost in player_list)
if(ghost.mind == H.mind) if(ghost.mind == H.mind)
to_chat(ghost, "<b><font color = #330033><font size = 3>The Technomancer [user.real_name] is trying to \ ghost.notify_revive("The Technomancer [user.real_name] is trying to revive you. \
revive you. Return to your body if you want to be resurrected!</b> \ Re-enter your body if you want to be revived!", 'sound/effects/genetics.ogg')
(Verbs -> Ghost -> Re-enter corpse)</font></font>")
break break
H.adjustBruteLoss(-40) H.adjustBruteLoss(-40)

View File

@@ -310,9 +310,6 @@
if (subject.suiciding) if (subject.suiciding)
scantemp = "Error: Subject's brain is not responding to scanning stimuli." scantemp = "Error: Subject's brain is not responding to scanning stimuli."
return return
if ((!subject.ckey) || (!subject.client))
scantemp = "Error: Mental interface failure."
return
if (NOCLONE in subject.mutations) if (NOCLONE in subject.mutations)
scantemp = "Error: Mental interface failure." scantemp = "Error: Mental interface failure."
return return
@@ -323,6 +320,14 @@
if(istype(modifier_type, /datum/modifier/no_clone)) if(istype(modifier_type, /datum/modifier/no_clone))
scantemp = "Error: Mental interface failure." scantemp = "Error: Mental interface failure."
return return
if ((!subject.ckey) || (!subject.client))
scantemp = "Error: Mental interface failure."
if(subject.stat == DEAD && subject.mind && subject.mind.key) // If they're dead and not in their body, tell them to get in it.
for(var/mob/observer/dead/ghost in player_list)
if(ghost.ckey == ckey(subject.mind.key))
ghost.notify_revive("Someone is trying to scan your body in the cloner. Re-enter your body if you want to be revived!", 'sound/effects/genetics.ogg')
break
return
if (!isnull(find_record(subject.ckey))) if (!isnull(find_record(subject.ckey)))
scantemp = "Subject already in database." scantemp = "Subject already in database."
return return

View File

@@ -390,7 +390,7 @@
if(!H.client && !H.teleop) if(!H.client && !H.teleop)
for(var/mob/observer/dead/ghost in player_list) for(var/mob/observer/dead/ghost in player_list)
if(ghost.mind == H.mind) if(ghost.mind == H.mind)
to_chat(ghost, "<b><font color = #330033><font size = 3>Someone is attempting to resuscitate you. Re-enter your body if you want to be revived!</b> (Verbs -> Ghost -> Re-enter corpse)</font></font>") ghost.notify_revive("Someone is trying to resuscitate you. Re-enter your body if you want to be revived!", 'sound/effects/genetics.ogg')
break break
//beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process

View File

@@ -106,6 +106,7 @@ AI MODULES
if(laws) if(laws)
laws.sync(target, 0) laws.sync(target, 0)
target.notify_of_law_change()
addAdditionalLaws(target, sender) addAdditionalLaws(target, sender)
to_chat(target, "\The [sender] has uploaded a change to the laws you must follow, using \an [src]. From now on: ") to_chat(target, "\The [sender] has uploaded a change to the laws you must follow, using \an [src]. From now on: ")

View File

@@ -85,6 +85,7 @@
"ED-209" = "ed209", "ED-209" = "ed209",
"Beepsky" = "secbot" "Beepsky" = "secbot"
) )
var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners.
/mob/observer/dead/New(mob/body) /mob/observer/dead/New(mob/body)
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
@@ -137,6 +138,9 @@
var/mob/target = locate(href_list["track"]) in mob_list var/mob/target = locate(href_list["track"]) in mob_list
if(target) if(target)
ManualFollow(target) ManualFollow(target)
if(href_list["reenter"])
reenter_corpse()
return
/mob/observer/dead/attackby(obj/item/W, mob/user) /mob/observer/dead/attackby(obj/item/W, mob/user)
if(istype(W,/obj/item/weapon/book/tome)) if(istype(W,/obj/item/weapon/book/tome))
@@ -811,3 +815,18 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
/mob/observer/dead/speech_bubble_appearance() /mob/observer/dead/speech_bubble_appearance()
return "ghost" return "ghost"
// Lets a ghost know someone's trying to bring them back, and for them to get into their body.
// Mostly the same as TG's sans the hud element, since we don't have TG huds.
/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE)
if((last_revive_notification + 2 MINUTES) > world.time)
return
last_revive_notification = world.time
if(flashwindow)
window_flash(client)
if(message)
to_chat(src, "<span class='ghostalert'><font size=4>[message]</font></span>")
to_chat(src, "<span class='ghostalert'><a href=?src=[REF(src)];reenter=1>(Click to re-enter)</a></span>")
if(sound)
SEND_SOUND(src, sound(sound))

View File

@@ -1,6 +1,7 @@
/mob/living/silicon /mob/living/silicon
var/datum/ai_laws/laws = null var/datum/ai_laws/laws = null
var/list/additional_law_channels = list("State" = "") var/list/additional_law_channels = list("State" = "")
var/last_law_notification = null // Avoids receiving 5+ of them at once.
/mob/living/silicon/proc/laws_sanity_check() /mob/living/silicon/proc/laws_sanity_check()
if (!src.laws) if (!src.laws)
@@ -9,54 +10,79 @@
/mob/living/silicon/proc/has_zeroth_law() /mob/living/silicon/proc/has_zeroth_law()
return laws.zeroth_law != null return laws.zeroth_law != null
/mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg) /mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg, notify = TRUE)
laws_sanity_check() laws_sanity_check()
laws.set_zeroth_law(law, law_borg) laws.set_zeroth_law(law, law_borg)
if(notify)
notify_of_law_change(law||law_borg ? "NEW ZEROTH LAW: <b>[istype(src, /mob/living/silicon/robot) && law_borg ? law_borg : law]</b>" : null)
log_and_message_admins("has given [src] the zeroth laws: [law]/[law_borg ? law_borg : "N/A"]") log_and_message_admins("has given [src] the zeroth laws: [law]/[law_borg ? law_borg : "N/A"]")
/mob/living/silicon/robot/set_zeroth_law(var/law, var/law_borg) /mob/living/silicon/robot/set_zeroth_law(var/law, var/law_borg, notify = TRUE)
..() ..()
if(tracking_entities) if(tracking_entities)
to_chat(src, "<span class='warning'>Internal camera is currently being accessed.</span>") to_chat(src, "<span class='warning'>Internal camera is currently being accessed.</span>")
/mob/living/silicon/proc/add_ion_law(var/law) /mob/living/silicon/proc/add_ion_law(var/law, notify = TRUE)
laws_sanity_check() laws_sanity_check()
laws.add_ion_law(law) laws.add_ion_law(law)
if(notify)
notify_of_law_change("NEW \[!ERROR!\] LAW: <b>[law]</b>")
log_and_message_admins("has given [src] the ion law: [law]") log_and_message_admins("has given [src] the ion law: [law]")
/mob/living/silicon/proc/add_inherent_law(var/law) /mob/living/silicon/proc/add_inherent_law(var/law, notify = TRUE)
laws_sanity_check() laws_sanity_check()
laws.add_inherent_law(law) laws.add_inherent_law(law)
if(notify)
notify_of_law_change("NEW CORE LAW: <b>[law]</b>")
log_and_message_admins("has given [src] the inherent law: [law]") log_and_message_admins("has given [src] the inherent law: [law]")
/mob/living/silicon/proc/add_supplied_law(var/number, var/law) /mob/living/silicon/proc/add_supplied_law(var/number, var/law, notify = TRUE)
laws_sanity_check() laws_sanity_check()
laws.add_supplied_law(number, law) laws.add_supplied_law(number, law)
if(notify)
var/th = uppertext("[number]\th")
notify_of_law_change("NEW \[[th]\] LAW: <b>[law]</b>")
log_and_message_admins("has given [src] the supplied law: [law]") log_and_message_admins("has given [src] the supplied law: [law]")
/mob/living/silicon/proc/delete_law(var/datum/ai_law/law) /mob/living/silicon/proc/delete_law(var/datum/ai_law/law, notify = TRUE)
laws_sanity_check() laws_sanity_check()
laws.delete_law(law) laws.delete_law(law)
if(notify)
notify_of_law_change("LAW DELETED: <b>[law.law]</b>")
log_and_message_admins("has deleted a law belonging to [src]: [law.law]") log_and_message_admins("has deleted a law belonging to [src]: [law.law]")
/mob/living/silicon/proc/clear_inherent_laws(var/silent = 0) /mob/living/silicon/proc/clear_inherent_laws(var/silent = 0, notify = TRUE)
laws_sanity_check() laws_sanity_check()
laws.clear_inherent_laws() laws.clear_inherent_laws()
if(notify)
notify_of_law_change("CORE LAWS WIPED.")
if(!silent) if(!silent)
log_and_message_admins("cleared the inherent laws of [src]") log_and_message_admins("cleared the inherent laws of [src]")
/mob/living/silicon/proc/clear_ion_laws(var/silent = 0) /mob/living/silicon/proc/clear_ion_laws(var/silent = 0, notify = TRUE)
laws_sanity_check() laws_sanity_check()
laws.clear_ion_laws() laws.clear_ion_laws()
if(notify)
notify_of_law_change("CORRUPTED LAWS WIPED.")
if(!silent) if(!silent)
log_and_message_admins("cleared the ion laws of [src]") log_and_message_admins("cleared the ion laws of [src]")
/mob/living/silicon/proc/clear_supplied_laws(var/silent = 0) /mob/living/silicon/proc/clear_supplied_laws(var/silent = 0, notify = TRUE)
laws_sanity_check() laws_sanity_check()
laws.clear_supplied_laws() laws.clear_supplied_laws()
if(notify)
notify_of_law_change("NON-CORE LAWS WIPED.")
if(!silent) if(!silent)
log_and_message_admins("cleared the supplied laws of [src]") log_and_message_admins("cleared the supplied laws of [src]")
/mob/living/silicon/proc/notify_of_law_change(message)
if((last_law_notification + 1 SECOND) > world.time)
return
last_law_notification = world.time
SEND_SOUND(src, 'sound/machines/defib_success.ogg')
window_flash(client)
to_chat(src, span("warning", message))
/mob/living/silicon/proc/statelaws(var/datum/ai_laws/laws) /mob/living/silicon/proc/statelaws(var/datum/ai_laws/laws)
var/prefix = "" var/prefix = ""
if(MAIN_CHANNEL == lawchannel) if(MAIN_CHANNEL == lawchannel)

View File

@@ -65,6 +65,7 @@ em {font-style: normal;font-weight: bold;}
.say {} .say {}
.alert {color: #ff0000;} .alert {color: #ff0000;}
h1.alert, h2.alert {color: #000000;} h1.alert, h2.alert {color: #000000;}
.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
.emote {font-style: italic;} .emote {font-style: italic;}

View File

@@ -0,0 +1,39 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Neerti
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- soundadd: "Receiving an antag role will now play a sound to the new antagonist."
- soundadd: "Having laws changed as a silicon (AI or Borg) will now play a sound and show the changed law in the chat."
- soundadd: "Being offered a ghost role while a ghost will now play a sound."
- soundadd: "Someone attempting to revive someone else will play a sound to the player being revived, if they are not in their body."

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
sound/effects/genetics.ogg Normal file

Binary file not shown.