From a769b4fc39f075bf9ab8979a99a01567113bd444 Mon Sep 17 00:00:00 2001 From: DZD Date: Tue, 5 May 2015 21:44:44 -0400 Subject: [PATCH 1/2] Shadowling fixes - Fixes shadowling thralls not showing up on Check Antagonists. - Also adds vampire thralls to Check Antagonists - Fixes shadowlings not turning off hardsuit helmet lights. - Fixes transforming into a shadowling dropping organs. - Adds job such as blueshield, NT rep, and pod pilot to the list of jobs that cannot be shadowlings. - Remove ascended shadowling commune, transfers the shadowling's languages to the ascendant instead. - Fixes intercept not being sent to the station on shadowling rounds. --- code/datums/mind.dm | 4 +-- code/game/gamemodes/game_mode.dm | 3 +- code/game/gamemodes/shadowling/shadowling.dm | 9 ++++- .../shadowling/shadowling_abilities.dm | 36 ++++++------------- .../gamemodes/shadowling/shadowling_items.dm | 3 +- .../special_shadowling_abilities.dm | 8 ++--- code/modules/admin/player_panel.dm | 7 ++-- code/modules/mob/living/carbon/human/life.dm | 4 +++ 8 files changed, 38 insertions(+), 36 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 5db7e620325..268f0b4d02b 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -995,7 +995,7 @@ datum/mind usr << "This only works on humans!" return ticker.mode.shadows += src - special_role = "shadowling" + special_role = "Shadowling" current << "You notice a brightening around you. No, it isn't that. The shadows grow, darken, swirl. The darkness has a new welcome for you, and you realize with a \ start that you can't be human. No, you are a shadowling, a harbringer of the shadows! Your alien abilities have been unlocked from within, and you may both commune with your allies and use \ a chrysalis to reveal your true form. You are to ascend at all costs." @@ -1006,7 +1006,7 @@ datum/mind usr << "This only works on humans!" return ticker.mode.add_thrall(src) - special_role = "thrall" + special_role = "Shadowling Thrall" current << "All at once it becomes clear to you. Where others see darkness, you see an ally. You realize that the shadows are not dead and dark as one would think, but \ living, and breathing, and eating. Their children, the Shadowlings, are to be obeyed and protected at all costs." current << "You may use the Hivemind Commune ability to communicate with your fellow enlightened ones." diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index a367d1f5600..0546d5516a3 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -290,7 +290,8 @@ Implants; else if(special_role == "traitor" && prob(40) || \ special_role == "Changeling" && prob(50) || \ special_role == "Cultist" && prob(30) || \ - special_role == "Head Revolutionary" && prob(30)) + special_role == "Head Revolutionary" && prob(30) || \ + special_role == "Shadowling" && prob(15)) suspects += man // If they're a traitor or likewise, give them extra TC in exchange. diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 51cf619fb12..1f6d926520f 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -67,7 +67,10 @@ Made by Xhuis required_enemies = 2 recommended_enemies = 2 restricted_jobs = list("AI", "Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent") + + var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) + var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) /datum/game_mode/shadowling/announce() world << "The current game mode is - Shadowling!" @@ -109,6 +112,8 @@ Made by Xhuis finalize_shadowling(shadow) process_shadow_objectives(shadow) //give_shadowling_abilities(shadow) + spawn (rand(waittime_l, waittime_h)) + send_intercept() ..() return @@ -139,6 +144,7 @@ Made by Xhuis if(shadow_mind.assigned_role == "Clown") S << "Your alien nature has allowed you to overcome your clownishness." S.mutations.Remove(CLUMSY) + shadow_mind.current.hud_updateflag |= (1 << SPECIALROLE_HUD) /datum/game_mode/proc/add_thrall(datum/mind/new_thrall_mind) if (!istype(new_thrall_mind)) @@ -152,6 +158,7 @@ Made by Xhuis new_thrall_mind.current << "The objectives of your shadowlings:: Ascend to your true form by use of the Ascendance ability. \ This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability." new_thrall_mind.current.add_language("Shadowling Hivemind") + new_thrall_mind.current.hud_updateflag |= (1 << SPECIALROLE_HUD) return 1 diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 3260d8e5245..f59c579f969 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -70,6 +70,14 @@ for(var/obj/item/device/pda/P in H) P.fon = 0 P.SetLuminosity(0) //failsafe + for(var/obj/item/clothing/head/helmet/space/rig/R in H) + if(R.on) + R.on = 0 + R.icon_state = "rig[R.on]-[R._color]" + H.update_inv_head() + R.visible_message("[R]'s light fades and turns off.") + H.SetLuminosity(H.luminosity - R.brightness_on) + R.SetLuminosity(0) if(H != usr) H << "You feel a chill and are plunged into darkness." H.luminosity = 0 //This might not be required, but it just acts as another failsafe. @@ -208,10 +216,10 @@ target << "You see the Truth. Reality has been torn away and you realize what a fool you've been." target << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals." target << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls." - target << "You can communicate with the other enlightened ones by using the Hivemind Commune ability." + target << "You can communicate with the other enlightened ones by using the Shadowling Hivemind (:8) ability." target.adjustOxyLoss(-200) //In case the shadowling was choking them out ticker.mode.add_thrall(target.mind) - target.mind.special_role = "Thrall" + target.mind.special_role = "Shadowling Thrall" /obj/effect/proc_holder/spell/wizard/targeted/collective_mind name = "Collective Hivemind" @@ -304,9 +312,8 @@ S.attach(B) if(S) S.set_up(B.reagents, 10, 0, B.loc) - S.start() + S.start(4) sleep(10) - S.start() qdel(B) datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowlings/thralls @@ -594,24 +601,3 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) "You tear open a rift to the black space between worlds. It would be wise to avoid it.") new /obj/structure/shadow_vortex(SHA.loc) - - - -/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind_ascendant - name = "Ascendant Commune" - desc = "Allows you to silently communicate with all other shadowlings and thralls." - panel = "Ascendant" - charge_max = 20 - clothes_req = 0 - range = -1 - include_user = 1 - -/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind_ascendant/cast(list/targets) - for(var/mob/living/user in targets) - var/text = stripped_input(user, "What do you want to say to fellow thralls and shadowlings?.", "Hive Chat", "") - if(!text) - return - text = "[text]" - for(var/mob/M in mob_list) - if(is_shadow_or_thrall(M) || (M in dead_mob_list)) - M << "\[Hive Chat\] [usr.real_name] (ASCENDANT): [text]" //Bigger text for ascendants. diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm index fcb84062c5e..fc21d467a5a 100644 --- a/code/game/gamemodes/shadowling/shadowling_items.dm +++ b/code/game/gamemodes/shadowling/shadowling_items.dm @@ -74,7 +74,8 @@ item_state = null origin_tech = null vision_flags = SEE_MOBS - darkness_view = 3 + darkness_view = 8 + see_darkness = 0 invisa_view = 2 unacidable = 1 flash_protect = -1 diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 4dd5ff26b68..42d7a5d04eb 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -18,9 +18,9 @@ "You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you.") for(var/obj/item/I in usr) //drops all items - usr.unEquip(I) - if(istype(I, /obj/item/organ) && (I in src.internal_organs)) //Shadowlings only have a brain, the other organs would drop otherwise. - qdel(I) + var/obj/item/organ/O = I + if(!istype(O) || O.owner != src) + usr.unEquip(I) sleep(50) var/turf/simulated/floor/F @@ -148,10 +148,10 @@ usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift usr.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/vortex - usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind_ascendant usr.mind.transfer_to(A) A.spell_list = usr.spell_list A.name = usr.real_name + A.languages = usr.languages if(A.real_name) A.real_name = usr.real_name usr.alpha = 0 //This is pretty bad, but is also necessary for the shuttle call to function properly diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index a3d862afce6..55890046c42 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -504,12 +504,15 @@ if(ticker.mode.shadows.len) dat += check_role_table("Shadowlings", ticker.mode.shadows, src) - if(ticker.mode.thralls.len) - dat += check_role_table("Shadowling Thralls", ticker.mode.thralls, src) + if(ticker.mode.shadowling_thralls.len) + dat += check_role_table("Shadowling Thralls", ticker.mode.shadowling_thralls, src) if(ticker.mode.vampires.len) dat += check_role_table("Vampires", ticker.mode.vampires, src) + if(ticker.mode.enthralled.len) + dat += check_role_table("Vampire Thralls", ticker.mode.enthralled, src) + if(ticker.mode.xenos.len) dat += check_role_table("Xenos", ticker.mode.xenos, src) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d21ab41af2c..2a6dd3ff422 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1768,6 +1768,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc holder.icon_state = "mutineer" if("mutineer") holder.icon_state = "mutineer" + if("Shadowling") + holder.icon_state = "shadowling" + if("Shadowling Thrall") + holder.icon_state = "thrall" hud_list[SPECIALROLE_HUD] = holder From 830b7bde99c4f035ceb0ea75ecdfa09fbd2bf653 Mon Sep 17 00:00:00 2001 From: DZD Date: Wed, 6 May 2015 17:39:36 -0400 Subject: [PATCH 2/2] More fixes - Fixes shadowling HUD (for real this time). - Adds antag role display in shadowling hivemind, this prints (Shadowling) or (Shadowling Thrall) prior to each message, depending on the role of the speaker (although theoretically multi-antags could have something else there). --- code/modules/mob/language.dm | 6 ++++++ code/modules/mob/living/carbon/human/life.dm | 4 ++-- icons/mob/hud.dmi | Bin 5706 -> 5762 bytes 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 2853b2db169..61330250ca0 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -364,6 +364,12 @@ key = "8" flags = RESTRICTED | HIVEMIND +/datum/language/shadowling/broadcast(var/mob/living/speaker, var/message, var/speaker_mask) + if(speaker.mind && speaker.mind.special_role) + ..(speaker, message, "([speaker.mind.special_role]) [speaker]") + else + ..(speaker, message) + /datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) if(speaker.mind && speaker.mind.changeling) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 2a6dd3ff422..b4614b23713 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1769,9 +1769,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if("mutineer") holder.icon_state = "mutineer" if("Shadowling") - holder.icon_state = "shadowling" + holder.icon_state = "hudshadowling" if("Shadowling Thrall") - holder.icon_state = "thrall" + holder.icon_state = "hudshadowlingthrall" hud_list[SPECIALROLE_HUD] = holder diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 45eabcc6959f84f771a0261d1196ac9e5a3b6c92..aac04dda2a460bd494535c1ed6dd25c09f479d88 100644 GIT binary patch delta 4936 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 delta 4858 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 sVMzbdZ;g8vLW}G(E1~&sr~y$