diff --git a/code/datums/cache/cache.dm b/code/datums/cache/cache.dm index 2502bb871b2..f401e54517a 100644 --- a/code/datums/cache/cache.dm +++ b/code/datums/cache/cache.dm @@ -1,6 +1,6 @@ /datum/cache_entry var/timestamp - var/data - + var/list/data = list() + /datum/repository var/cache_data \ No newline at end of file diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 6fdb8a359c2..13c3fb64f33 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1242,13 +1242,28 @@ return switch(Text) - if("brute") L.adjustBruteLoss(amount, robotic=1) - if("fire") L.adjustFireLoss(amount, robotic=1) - if("toxin") L.adjustToxLoss(amount) - if("oxygen")L.adjustOxyLoss(amount) - if("brain") L.adjustBrainLoss(amount) - if("clone") L.adjustCloneLoss(amount) - if("stamina") L.adjustStaminaLoss(amount) + if("brute") + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.adjustBruteLoss(amount, robotic = TRUE) + else + L.adjustBruteLoss(amount) + if("fire") + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.adjustFireLoss(amount, robotic = TRUE) + else + L.adjustFireLoss(amount) + if("toxin") + L.adjustToxLoss(amount) + if("oxygen") + L.adjustOxyLoss(amount) + if("brain") + L.adjustBrainLoss(amount) + if("clone") + L.adjustCloneLoss(amount) + if("stamina") + L.adjustStaminaLoss(amount) else to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") return diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 9ab851e86bf..506ef5714f8 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -188,9 +188,19 @@ ..() block=REMOTETALKBLOCK +/datum/dna/gene/basic/grant_spell/remotetalk/activate(mob/user) + ..() + user.AddSpell(new /obj/effect/proc_holder/spell/targeted/mindscan(null)) + +/datum/dna/gene/basic/grant_spell/remotetalk/deactivate(mob/user) + ..() + for(var/obj/effect/proc_holder/spell/S in user.mob_spell_list) + if(istype(S, /obj/effect/proc_holder/spell/targeted/mindscan)) + user.RemoveSpell(S) + /obj/effect/proc_holder/spell/targeted/remotetalk name = "Project Mind" - desc = "Make people understand your thoughts at any range!" + desc = "Make people understand your thoughts!" charge_max = 0 clothes_req = 0 @@ -242,6 +252,89 @@ for(var/mob/dead/observer/G in GLOB.player_list) G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]") +/obj/effect/proc_holder/spell/targeted/mindscan + name = "Scan Mind" + desc = "Offer people a chance to share their thoughts!" + charge_max = 0 + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = -2 + selection_type = "range" + action_icon_state = "genetic_mindscan" + var/list/available_targets = list() + +/obj/effect/proc_holder/spell/targeted/mindscan/choose_targets(mob/user = usr) + var/list/targets = new /list() + var/list/validtargets = new /list() + var/turf/T = get_turf(user) + for(var/mob/living/M in range(14, T)) + if(M && M.mind) + if(M == user) + continue + validtargets += M + + if(!validtargets.len) + to_chat(user, "There are no valid targets!") + start_recharge() + return + + targets += input("Choose the target to listen to.", "Targeting") as null|mob in validtargets + + if(!targets.len || !targets[1]) //doesn't waste the spell + revert_cast(user) + return + + perform(targets, user = user) + +/obj/effect/proc_holder/spell/targeted/mindscan/cast(list/targets, mob/user = usr) + if(!ishuman(user)) + return + for(var/mob/living/target in targets) + var/message = "You feel your mind expand briefly... (Click to send a message.)" + if(REMOTE_TALK in target.mutations) + message = "You feel [user.real_name] request a response from you... (Click here to project mind.)" + user.show_message("You offer your mind to [target.name].") + target.show_message("[message]") + available_targets += target + addtimer(CALLBACK(src, .proc/removeAvailability, target), 100) + +/obj/effect/proc_holder/spell/targeted/mindscan/proc/removeAvailability(mob/living/target) + if(target in available_targets) + available_targets -= target + if(!(target in available_targets)) + target.show_message("You feel the sensation fade...") + +/obj/effect/proc_holder/spell/targeted/mindscan/Topic(href, href_list) + var/mob/living/user + if(href_list["user"]) + user = locateUID(href_list["user"]) + if(href_list["target"]) + if(!user) + return + var/mob/living/target = locateUID(href_list["target"]) + if(!(target in available_targets)) + return + available_targets -= target + var/say = input("What do you wish to say") as text|null + if(!say) + return + say = strip_html(say) + say = pencode_to_html(say, target, format = 0, fields = 0) + + log_say("(TPATH to [key_name(target)]) [say]", user) + if(REMOTE_TALK in target.mutations) + target.show_message("You project your mind into [user.name]: [say]") + else + target.show_message("You fill the space in your thoughts: [say]") + user.show_message("You hear [target.name]'s voice: [say]") + for(var/mob/dead/observer/G in GLOB.player_list) + G.show_message("Telepathic response from [target] ([ghost_follow_link(target, ghost=G)]) to [user] ([ghost_follow_link(user, ghost=G)]): [say]") + +/obj/effect/proc_holder/spell/targeted/mindscan/Destroy() + available_targets.Cut() + return ..() + /datum/dna/gene/basic/grant_spell/remoteview name="Remote Viewing" activation_messages=list("Your mind can see things from afar.") diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 97371f6d35b..63f9d5fbaff 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -96,7 +96,8 @@ for(var/obj/item/implant/mindshield/I in H.contents) if(I && I.implanted) possible_traitors -= player - + if(!H.job) //Golems, special events stuff, etc. + possible_traitors -= player //message_admins("Live Players: [playercount]") //message_admins("Live Traitors: [traitorcount]") // message_admins("Potential Traitors:") diff --git a/code/game/machinery/telecomms/ntsl2.dm b/code/game/machinery/telecomms/ntsl2.dm index 32e9913e129..04f85750516 100644 --- a/code/game/machinery/telecomms/ntsl2.dm +++ b/code/game/machinery/telecomms/ntsl2.dm @@ -131,7 +131,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) var/job_indicator_type = null /* Tables */ - var/list/regex = list() + // var/list/regex = list() /* Arrays */ var/list/firewall = list() @@ -145,7 +145,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) ) // This is used to sanitize topic data - var/list/tables = list("regex") + // var/list/tables = list("regex") var/list/arrays = list("firewall") // This tells the datum what is safe to serialize and what's not. It also applies to deserialization. @@ -160,7 +160,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) "toggle_gibberish", "toggle_honk", "setting_language", - "regex", + // "regex", "firewall" ) @@ -176,7 +176,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) "toggle_gibberish" = "bool", "toggle_honk" = "bool", "setting_language" = "string", - "regex" = "table", + // "regex" = "table", "firewall" = "array" ) @@ -204,7 +204,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) job_indicator_type = initial(job_indicator_type) /* Tables */ - regex = list() + // regex = list() /* Arrays */ firewall = list() @@ -251,7 +251,8 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) switch(sanitize_method) if("bool") return variable ? TRUE : FALSE - if("table", "array") + // if("table", "array") + if("array") if(!islist(variable)) return list() // Insert html filtering for the regexes here if you're boring @@ -356,14 +357,14 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) S.speaking = GLOB.all_languages[setting_language] // Regex replacements - if(islist(regex) && regex.len > 0) - for(var/datum/multilingual_say_piece/S in message_pieces) - var/new_message = S.message - for(var/reg in regex) - var/replacePattern = pencode_to_html(regex[reg]) - var/regex/start = regex("[reg]", "gi") - new_message = start.Replace(new_message, replacePattern) - S.message = new_message + // if(islist(regex) && regex.len > 0) + // for(var/datum/multilingual_say_piece/S in message_pieces) + // var/new_message = S.message + // for(var/reg in regex) + // var/replacePattern = pencode_to_html(regex[reg]) + // var/regex/start = regex("[reg]", "gi") + // new_message = start.Replace(new_message, replacePattern) + // S.message = new_message // Make sure the message is valid after we tinkered with it, otherwise reject it if(signal.data["message"] == "" || !signal.data["message"]) @@ -404,34 +405,34 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) log_action(user, new_language == "--DISABLE--" ? "disabled NTTC language conversion" : "set NTTC language conversion to [new_language]", TRUE) // Tables - if(href_list["create_row"]) - if(href_list["table"] && href_list["table"] in tables) - if(requires_unlock[href_list["table"]] && !source.unlocked) - return - var/new_key = input(user, "Provide a key for the new row.", "New Row") as text|null - if(!new_key) - return - var/new_value = input(user, "Provide a new value for the key [new_key]", "New Row") as text|null - if(new_value == null) - return - if(word_blacklist.Find(new_value)) //uh oh, they tried to be naughty - message_admins("EXPLOIT WARNING: [user.ckey] attempted to add a NTTC regex row containing JS abusable tags!") - log_admin("EXPLOIT WARNING: [user.ckey] attempted to add a NTTC regex row containing JS abusable tags") - to_chat(user, "ERROR: Regex contained bad strings. Upload cancelled.") - return - var/list/table = vars[href_list["table"]] - table[new_key] = new_value - to_chat(user, "Added row [new_key] -> [new_value].") - log_action(user, "updated [href_list["table"]] - new row [new_key] -> [new_value]") + // if(href_list["create_row"]) + // if(href_list["table"] && href_list["table"] in tables) + // if(requires_unlock[href_list["table"]] && !source.unlocked) + // return + // var/new_key = input(user, "Provide a key for the new row.", "New Row") as text|null + // if(!new_key) + // return + // var/new_value = input(user, "Provide a new value for the key [new_key]", "New Row") as text|null + // if(new_value == null) + // return + // if(word_blacklist.Find(new_value)) //uh oh, they tried to be naughty + // message_admins("EXPLOIT WARNING: [user.ckey] attempted to add a NTTC regex row containing JS abusable tags!") + // log_admin("EXPLOIT WARNING: [user.ckey] attempted to add a NTTC regex row containing JS abusable tags") + // to_chat(user, "ERROR: Regex contained bad strings. Upload cancelled.") + // return + // var/list/table = vars[href_list["table"]] + // table[new_key] = new_value + // to_chat(user, "Added row [new_key] -> [new_value].") + // log_action(user, "updated [href_list["table"]] - new row [new_key] -> [new_value]") - if(href_list["delete_row"]) - if(href_list["table"] && href_list["table"] in tables) - if(requires_unlock[href_list["table"]] && !source.unlocked) - return - var/list/table = vars[href_list["table"]] - table.Remove(href_list["delete_row"]) - to_chat(user, "Removed row [href_list["delete_row"]] from [href_list["table"]]") - log_action(user, "updated [href_list["table"]] - removed row [href_list["delete_row"]]") + // if(href_list["delete_row"]) + // if(href_list["table"] && href_list["table"] in tables) + // if(requires_unlock[href_list["table"]] && !source.unlocked) + // return + // var/list/table = vars[href_list["table"]] + // table.Remove(href_list["delete_row"]) + // to_chat(user, "Removed row [href_list["delete_row"]] from [href_list["table"]]") + // log_action(user, "updated [href_list["table"]] - removed row [href_list["delete_row"]]") // Arrays if(href_list["create_item"]) @@ -481,7 +482,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) "tab_hack.html" = 'html/nttc/dist/tab_hack.html', "tab_filtering.html" = 'html/nttc/dist/tab_filtering.html', "tab_firewall.html" = 'html/nttc/dist/tab_firewall.html', - "tab_regex.html" = 'html/nttc/dist/tab_regex.html', + // "tab_regex.html" = 'html/nttc/dist/tab_regex.html', "uiTitleFluff.png" = 'html/nttc/dist/uiTitleFluff.png' ) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index d836a549474..f8d008c0c2c 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -32,7 +32,7 @@ return FALSE if(checking) to_chat(user, "The device is already connecting to Syndicate command. Please wait.") - return FALSE + return FALSE return TRUE /obj/item/antag_spawner/nuke_ops/attack_self(mob/user) @@ -110,10 +110,10 @@ if(switch_roles_choice == "Syndicate Cyborg") switch_roles = TRUE - rolename = "Syndicate [borg_to_spawn]" + rolename = initial(rolename) else switch_roles = FALSE - rolename = initial(rolename) + rolename = "Syndicate [borg_to_spawn] Cyborg" return TRUE diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 3a427d96bec..032792063be 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -178,6 +178,15 @@ flags = NODROP flags_cover = null +/obj/item/clothing/glasses/material/lighting + name = "Neutron Goggles" + desc = "These odd glasses use a form of neutron-based imaging to completely negate the effects of light and darkness." + origin_tech = null + vision_flags = 0 + + flags = NODROP + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + /obj/item/clothing/glasses/regular name = "prescription glasses" desc = "Made by Nerd. Co." diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index d2b32f720cf..6181644ffc8 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1785,4 +1785,4 @@ item_state = "voxbodysuit" item_color = "voxbodysuit" body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - species_fit = list("Vox") \ No newline at end of file + species_fit = list("Vox") diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index e6dcaebf51c..ee858138f70 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -277,6 +277,7 @@ Des: Removes all infected images from the alien. grant_death_vision() return + see_invisible = initial(see_invisible) sight = SEE_MOBS if(nightvision) see_in_dark = 8 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 1433b9c3358..31788ecc8cf 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1139,6 +1139,8 @@ so that different stomachs can handle things in different ways VB*/ grant_death_vision() return + see_invisible = initial(see_invisible) + see_in_dark = initial(see_in_dark) sight = initial(sight) lighting_alpha = initial(lighting_alpha) diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index e790181188e..c1e416a8a48 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -607,7 +607,6 @@ ..() last_banana = world.time last_honk = world.time - H.job = "Clown" H.mutations.Add(COMIC) H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(H), slot_r_store) H.equip_to_slot_or_del(new /obj/item/bikehorn(H), slot_l_store) @@ -682,7 +681,6 @@ /datum/species/golem/tranquillite/on_species_gain(mob/living/carbon/human/H) ..() - H.job = "Mime" H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head) H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_r_store) H.equip_to_slot_or_del(new /obj/item/cane(H), slot_l_hand) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index fae2d7f0dcb..727c900ac9c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1038,13 +1038,3 @@ update_transform() if("lighting_alpha") sync_lighting_plane_alpha() - -/mob/living/update_sight() - if(!client) - return - - if(stat == DEAD) - grant_death_vision() - return - - . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 54750e6afc1..80d644152f4 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -1303,8 +1303,8 @@ var/list/ai_verbs_default = list( see_invisible = initial(see_invisible) see_in_dark = initial(see_in_dark) - lighting_alpha = initial(lighting_alpha) sight = initial(sight) + lighting_alpha = initial(lighting_alpha) if(aiRestorePowerRoutine) sight = sight &~ SEE_TURFS diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 365889344d2..3799daacb63 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -609,4 +609,33 @@ ..() if(AIStatus == AI_Z_OFF) SSidlenpcpool.idle_mobs_by_zlevel[old_z] -= src - toggle_ai(initial(AIStatus)) \ No newline at end of file + toggle_ai(initial(AIStatus)) + +// Simple animals will not be given night vision upon death, as that would result in issues when they are revived. +/mob/living/simple_animal/grant_death_vision() + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_OBSERVER + sync_lighting_plane_alpha() + +/mob/living/simple_animal/update_sight() + if(!client) + return + + if(stat == DEAD) + grant_death_vision() + return + + see_invisible = initial(see_invisible) + see_in_dark = initial(see_in_dark) + sight = initial(sight) + + if(client.eye != src) + var/atom/A = client.eye + if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. + return + + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/drinks.dm b/code/modules/reagents/chemistry/reagents/drinks.dm index b50ed09a27c..850df4f2382 100644 --- a/code/modules/reagents/chemistry/reagents/drinks.dm +++ b/code/modules/reagents/chemistry/reagents/drinks.dm @@ -178,7 +178,7 @@ /datum/reagent/consumable/drink/banana/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) + if((ishuman(M) && COMIC in M.mutations) || issmall(M)) update_flags |= M.adjustBruteLoss(-1, FALSE) update_flags |= M.adjustFireLoss(-1, FALSE) return ..() | update_flags @@ -194,7 +194,7 @@ /datum/reagent/consumable/drink/nothing/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if(ishuman(M) && M.job in list("Mime")) + if(ishuman(M) && M.mind && M.mind.miming) update_flags |= M.adjustBruteLoss(-1, FALSE) update_flags |= M.adjustFireLoss(-1, FALSE) return ..() | update_flags @@ -402,7 +402,7 @@ /datum/reagent/consumable/drink/bananahonk/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) + if((ishuman(M) && COMIC in M.mutations) || issmall(M)) update_flags |= M.adjustBruteLoss(-1, FALSE) update_flags |= M.adjustFireLoss(-1, FALSE) return ..() | update_flags diff --git a/html/changelog.html b/html/changelog.html index 6ce02bc19c8..1d3eb4038b5 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,122 @@ -->
+

10 May 2019

+

AffectedArc07 updated:

+ +

Arkatos updated:

+ +

Couls updated:

+ +

Crazylemon and Fox McCloud updated:

+ +

EvadableMoxie updated:

+ +

Fox McCloud updated:

+ +

Ionward updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

Markolie updated:

+ +

Mitchs98 updated:

+ +

TDSSS updated:

+ +

Twinmold93 updated:

+ +

farie82 updated:

+ +

fludd12 updated:

+ +

variableundefined updated:

+ +

02 May 2019

AffectedArc07 updated: