From 0ab3a54fcb04e3fc44fcbef8ec7e5e073ebe6eac Mon Sep 17 00:00:00 2001 From: DZD Date: Sun, 12 Apr 2015 13:15:40 -0400 Subject: [PATCH 1/9] Copy-Paste Port of /tg/station's Shadowlings Ports tgstation/-tg-station#8157 This won't compile, needs to be bugfixed and tested. The only reason I am PRing this right now is so that we don't have multiple people working on the same thing. @ZomgPonies This will require PROBABILITY SHADOWLING # to be added to game_options.txt, and will likely require SQL database additions for the BE_SHADOWLING antag preference. --- code/datums/mind.dm | 63 ++ code/game/gamemodes/shadowling/shadowling.dm | 235 +++++++ .../shadowling/shadowling_abilities.dm | 613 ++++++++++++++++++ .../gamemodes/shadowling/shadowling_items.dm | 102 +++ .../special_shadowling_abilities.dm | 161 +++++ code/game/objects/effects/aliens.dm | 5 + code/modules/admin/player_panel.dm | 6 + code/modules/client/preferences.dm | 3 +- .../simple_animal/ascendant_shadowling.dm | 33 + code/setup.dm | 1 + code/stylesheet.dm | 1 + icons/mob/human.dmi | Bin 76003 -> 77314 bytes icons/mob/mob.dmi | Bin 203940 -> 206140 bytes paradise.dme | 5 + 14 files changed, 1227 insertions(+), 1 deletion(-) create mode 100644 code/game/gamemodes/shadowling/shadowling.dm create mode 100644 code/game/gamemodes/shadowling/shadowling_abilities.dm create mode 100644 code/game/gamemodes/shadowling/shadowling_items.dm create mode 100644 code/game/gamemodes/shadowling/special_shadowling_abilities.dm create mode 100644 code/modules/mob/living/simple_animal/ascendant_shadowling.dm diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 9114acbf2dc..d793bddb5d5 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -312,6 +312,25 @@ datum/mind sections["traitor"] = text + /** SHADOWLING **/ + text = "shadowling" + if(ticker.mode.config_tag == "shadowling") + text = uppertext(text) + text = "[text]: " + if(src in ticker.mode.shadows) + text += "SHADOWLING|thrall|human" + else if(src in ticker.mode.thralls) + text += "shadowling|THRALL|human" + else + text += "shadowling|thrall|HUMAN" + + if(current && current.client && current.client.prefs.be_special & BE_SHADOWLING) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["shadowling"] = text + /** MONKEY ***/ if (istype(current, /mob/living/carbon)) text = "monkey" @@ -943,6 +962,50 @@ datum/mind ticker.mode.forge_traitor_objectives(src) usr << "\blue The objectives for traitor [key] have been generated. You can edit them and anounce manually." + else if(href_list["shadowling"]) + switch(href_list["shadowling"]) + if("clear") + src.spell_list = null + if(src in ticker.mode.shadows) + ticker.mode.shadows -= src + special_role = null + current << "Your powers have been quenched! You are no longer a shadowling!" + src.spell_list = null + message_admins("[key_name_admin(usr)] has de-shadowling'ed [current].") + log_admin("[key_name(usr)] has de-shadowling'ed [current].") + current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch + current.verbs -= /mob/living/carbon/human/proc/shadowling_ascendance + else if(src in ticker.mode.thralls) + ticker.mode.thralls -= src + special_role = null + current << "You have been brainwashed! You are no longer a thrall!" + message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") + log_admin("[key_name(usr)] has de-thrall'ed [current].") + if("shadowling") + if(!ishuman(current)) + usr << "This only works on humans!" + return + ticker.mode.shadows += src + 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." + src.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind + src.spell_list += new /obj/effect/proc_holder/spell/targeted/enthrall + current.verbs += /mob/living/carbon/human/proc/shadowling_hatch + if("thrall") + if(!ishuman(current)) + usr << "This only works on humans!" + return + ticker.mode.add_thrall(src) + special_role = "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." + message_admins("[key_name_admin(usr)] has thrall'ed [current].") + log_admin("[key_name(usr)] has thrall'ed [current].") + src.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind + else if (href_list["monkey"]) var/mob/living/L = current if (L.monkeyizing) diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm new file mode 100644 index 00000000000..c14ad379d68 --- /dev/null +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -0,0 +1,235 @@ +/* + +SHADOWLING: A gamemode based on previously-run events + +Aliens called shadowlings are on the station. +These shadowlings can 'enthrall' crew members and enslave them. +They also burn in the light but heal rapidly whilst in the dark. +The game will end under two conditions: + 1. The shadowlings die + 2. The emergency shuttle docks at CentCom + +Shadowling strengths: + - The dark + - Hard vacuum (They are not affected by it) + - Their thralls who are not harmed by the light + - Stealth + +Shadowling weaknesses: + - The light + - Fire + - Enemy numbers + - Lasers (Lasers are concentrated light and do more damage) + - Flashbangs (High stun and high burn damage; if the light stuns humans, you bet your ass it'll hurt the shadowling very much!) + +Shadowlings start off disguised as normal crew members, and they only have two abilities: Hatch and Enthrall. +They can still enthrall and perhaps complete their objectives in this form. +Hatch will, after a short time, cast off the human disguise and assume the shadowling's true identity. +They will then assume the normal shadowling form and gain their abilities. + +The shadowling will seem OP, and that's because it kinda is. Being restricted to the dark while being alone most of the time is extremely difficult and as such the shadowling needs powerful abilities. +Made by Xhuis + +*/ + + + +/* + GAMEMODE +*/ + + +/datum/game_mode + var/list/datum/mind/shadows = list() + var/list/datum/mind/thralls = list() + var/list/shadow_objectives = list() + var/required_thralls = 15 //How many thralls are needed (hardcoded for now) + var/shadowling_ascended = 0 //If at least one shadowling has ascended + var/shadowling_dead = 0 //is shadowling kill + + +/proc/is_thrall(var/mob/living/M) + return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.thralls) + + +/proc/is_shadow_or_thrall(var/mob/living/M) + return istype(M) && M.mind && ticker && ticker.mode && ((M.mind in ticker.mode.thralls) || (M.mind in ticker.mode.shadows)) + + +/proc/is_shadow(var/mob/living/M) + return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.shadows) + + +/datum/game_mode/shadowling + name = "shadowling" + config_tag = "shadowling" + antag_flag = BE_SHADOWLING + required_players = 30 + required_enemies = 2 + recommended_enemies = 2 + restricted_jobs = list("AI", "Cyborg") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") + +/datum/game_mode/shadowling/announce() + world << "The current game mode is - Shadowling!" + world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding." + +/datum/game_mode/shadowling/pre_setup() + if(config.protect_roles_from_antagonist) + restricted_jobs += protected_jobs + + if(config.protect_assistant_from_antagonist) + restricted_jobs += "Assistant" + + for(var/datum/mind/player in antag_candidates) + for(var/job in restricted_jobs) + if(player.assigned_role == job) + antag_candidates -= player + + var/shadowlings = 2 //How many shadowlings there are; hardcoded to 2 + + while(shadowlings) + var/datum/mind/shadow = pick(antag_candidates) + shadows += shadow + antag_candidates -= shadow + modePlayer += shadow + shadow.special_role = "Shadowling" + shadowlings-- + return 1 + + +/datum/game_mode/shadowling/post_setup() + for(var/datum/mind/shadow in shadows) + log_game("[shadow.key] (ckey) has been selected as a Shadowling.") + sleep(10) + shadow.current << "
" + shadow.current << "You are a shadowling!" + greet_shadow(shadow) + finalize_shadowling(shadow) + process_shadow_objectives(shadow) + //give_shadowling_abilities(shadow) + ..() + return + +/datum/game_mode/proc/greet_shadow(var/datum/mind/shadow) + shadow.current << "Currently, you are disguised as an employee aboard [world.name]." + shadow.current << "In your limited state, you have three abilities: Enthrall, Hatch, and Hivemind Commune." + shadow.current << "If you are new to shadowling, or want to read about abilities, check the wiki page at https://tgstation13.org/wiki/Shadowling
" + + +/datum/game_mode/proc/process_shadow_objectives(var/datum/mind/shadow_mind) + var/objective = "enthrall" //may be devour later, but for now it seems murderbone-y + + if(objective == "enthrall") + var/objective_explanation = "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." + shadow_objectives += "enthrall" + shadow_mind.memory += "Objective #1: [objective_explanation]" + shadow_mind.current << "Objective #1: [objective_explanation]
" + + +/datum/game_mode/proc/finalize_shadowling(var/datum/mind/shadow_mind) + var/mob/living/carbon/human/S = shadow_mind.current + shadow_mind.current.verbs += /mob/living/carbon/human/proc/shadowling_hatch + shadow_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/enthrall + shadow_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind + if(shadow_mind.assigned_role == "Clown") + S << "Your alien nature has allowed you to overcome your clownishness." + S.dna.remove_mutation(CLOWNMUT) + +/datum/game_mode/proc/add_thrall(datum/mind/new_thrall_mind) + if (!istype(new_thrall_mind)) + return 0 + if(!(new_thrall_mind in thralls)) + thralls += new_thrall_mind + new_thrall_mind.current.attack_log += "\[[time_stamp()]\] Became a thrall" + return 1 + + + +/* + GAME FINISH CHECKS +*/ + + +/datum/game_mode/shadowling/check_finished() + var/shadows_alive = 0 //and then shadowling was kill + for(var/datum/mind/shadow in shadows) //but what if shadowling was not kill? + if(!istype(shadow.current,/mob/living/carbon/human) && !istype(shadow.current,/mob/living/simple_animal/ascendant_shadowling)) + continue + if(shadow.current.stat == DEAD) + continue + shadows_alive++ + if(shadows_alive) + return ..() + else + shadowling_dead = 1 //but shadowling was kill :( + return 1 + + +/datum/game_mode/shadowling/proc/check_shadow_victory() + var/success = 0 //Did they win? + if(shadow_objectives.Find("enthrall")) + success = shadowling_ascended + return success + + +/datum/game_mode/shadowling/declare_completion() + if(check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) //Doesn't end instantly - this is hacky and I don't know of a better way ~X + world << "The shadowlings have ascended and taken over the station!" + else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round + world << "The shadowlings have been killed by the crew!" + else if(!check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) + world << "The crew has escaped the station before the shadowlings could ascend!" + ..() + return 1 + + +/datum/game_mode/proc/auto_declare_completion_shadowling() + var/text = "" + if(shadows.len) + text += "
The shadowlings were:" + for(var/datum/mind/shadow in shadows) + text += printplayer(shadow) + if(thralls.len) + text += "
The thralls were:" + for(var/datum/mind/thrall in thralls) + text += printplayer(thrall) + else + world << "Round-end code broke! Please report this and its circumstances on GitHub at https://github.com/tgstation/-tg-station/issues" + text += "
" + world << text + + +/* + MISCELLANEOUS +*/ + + +/datum/species/shadow/ling + //Normal shadowpeople but with enhanced effects + name = "Shadowling" + id = "shadowling" + say_mod = "chitters" + specflags = list(NOBREATH,NOBLOOD,RADIMMUNE,NOGUNS) //Can't use guns due to muzzle flash + burnmod = 2 //2x burn damage lel + heatmod = 2 + +/datum/species/shadow/ling/spec_life(mob/living/carbon/human/H) + //H.shadowling_status = 1 //If they are affected more strongly by flashes and stuff + var/light_amount = 0 + H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry + if(isturf(H.loc)) //Copypasta + var/turf/T = H.loc + var/area/A = T.loc + if(A) + if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount + else light_amount = 10 + if(light_amount > 2) //Rapid death while in the light, countered by... + H.take_overall_damage(0,6) + H << "The light burns you!" + H << 'sound/weapons/sear.ogg' + else if (light_amount < 2) //...extreme benefits while in the dark + H.heal_overall_damage(5,3) + H.adjustToxLoss(-3) + H.SetWeakened(0) + H.SetStunned(0) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm new file mode 100644 index 00000000000..baf3d70c4b2 --- /dev/null +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -0,0 +1,613 @@ +/obj/effect/proc_holder/spell/targeted/glare + name = "Glare" + desc = "Stuns and mutes a target for a decent duration." + panel = "Shadowling Abilities" + charge_max = 300 + clothes_req = 0 + +/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets) + for(var/mob/living/carbon/human/target in targets) + if(!ishuman(target)) + charge_counter = charge_max + return + if(target.stat) + charge_counter = charge_max + return + if(is_shadow_or_thrall(target)) + usr << "You don't see why you would want to paralyze an ally." + charge_counter = charge_max + return + + usr.visible_message("[usr]'s eyes flash a blinding red!") + target.visible_message("[target] freezes in place, their eyes glazing over...") + if(in_range(target, usr)) + target << "Your gaze is forcibly drawn into [src]'s eyes, and you are mesmerized by the heavenly lights..." + else //Only alludes to the shadowling if the target is close by + target << "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights..." + target.Stun(10) + if(target.reagents) + target.reagents.add_reagent("mutetoxin", 4) //This is really bad but it's the only way it works. + + + +/obj/effect/proc_holder/spell/aoe_turf/veil + name = "Veil" + desc = "Extinguishes all electronic lights in a decent radius." + panel = "Shadowling Abilities" + charge_max = 250 //Short cooldown because people can just turn the lights back on + clothes_req = 0 + range = 5 + +/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets) + usr << "You silently disable all nearby lights." + var/list/blacklisted_lights = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/slime) + for(var/turf/T in targets) + for(var/obj/item/device/flashlight/F in T.contents) + if(is_type_in_list(F, blacklisted_lights)) + F.visible_message("[F] goes slightly dim for a moment.") + return + F.on = 0 + F.visible_message("[F] gutters and falls dark.") + F.update_brightness() + for(var/obj/machinery/light/L in T.contents) + L.on = 0 + L.visible_message("[L] flickers and falls dark.") + L.update(0) + for(var/obj/item/device/pda/P in orange(5, usr)) + P.fon = 0 + P.SetLuminosity(0) //failsafe + + + +/obj/effect/proc_holder/spell/targeted/shadow_walk + name = "Shadow Walk" + desc = "Phases you into the space between worlds for a short time, allowing movement through walls and invisbility." + panel = "Shadowling Abilities" + charge_max = 600 + clothes_req = 0 + range = -1 + include_user = 1 + +/obj/effect/proc_holder/spell/targeted/shadow_walk/cast(list/targets) + for(var/mob/living/user in targets) + playsound(user.loc, 'sound/effects/bamf.ogg', 50, 1) + user.visible_message("[user] vanishes into thin air!", "You enter the space between worlds as a passageway.") + user.SetStunned(0) + user.SetWeakened(0) + user.incorporeal_move = 1 + user.alpha = 0 + if(user.buckled) + user.buckled.unbuckle_mob() + sleep(40) //4 seconds + user.visible_message("[user] appears out of nowhere!", "The pressure becomes too much and you vacate the interdimensional darkness.") + user.incorporeal_move = 0 + user.alpha = 255 + + + +/obj/effect/proc_holder/spell/aoe_turf/flashfreeze + name = "Flash Freeze" + desc = "Instantly freezes the blood of nearby people, stunning them and causing burn damage." + panel = "Shadowling Abilities" + range = 5 + charge_max = 1200 + clothes_req = 0 + +/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets) + usr << "You freeze the nearby air." + playsound(usr.loc, 'sound/effects/ghost2.ogg', 50, 1) + + for(var/turf/T in targets) + for(var/mob/living/carbon/human/target in T.contents) + if(is_shadow_or_thrall(target)) + if(target == usr) //No message for the user, of course + continue + else + target << "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!" + continue + target << "You are hit by a blast of paralyzingly cold air and feel goosebumps break out across your body!" + target.Stun(2) + if(target.bodytemperature) + target.bodytemperature -= 200 //Extreme amount of initial cold + if(target.reagents) + target.reagents.add_reagent("frostoil", 15) //Half of a cryosting + + + +//Enthrall is the single most important spell +/obj/effect/proc_holder/spell/targeted/enthrall + name = "Enthrall" + desc = "Allows you to enslave a conscious, non-braindead, non-catatonic human to your will. This takes some time to cast." + panel = "Shadowling Abilities" + charge_max = 450 + clothes_req = 0 + range = 1 //Adjacent to user + var/enthralling = 0 + +/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets) + for(var/mob/living/carbon/human/target in targets) + if(!in_range(usr, target)) + usr << "You need to be closer to enthrall [target]." + charge_counter = charge_max + return + if(!target.ckey) + usr << "The target has no mind." + charge_counter = charge_max + return + if(target.stat) + usr << "The target must be conscious." + charge_counter = charge_max + return + if(is_shadow_or_thrall(target)) + usr << "You can not enthrall allies." + charge_counter = charge_max + return + if(!ishuman(target)) + usr << "You can only enthrall humans." + charge_counter = charge_max + return + if(enthralling) + usr << "You are already enthralling!" + charge_counter = charge_max + return + enthralling = 1 + usr << "This target is valid. You begin the enthralling." + target << "[usr] focuses in concentration. Your head begins to ache." + + for(var/progress = 0, progress <= 3, progress++) + switch(progress) + if(1) + usr << "You begin allocating energy for the enthralling." + usr.visible_message("[usr]'s eyes begin to throb a piercing red.") + if(2) + usr << "You begin the enthralling of [target]." + usr.visible_message("[usr] leans over [target], their eyes glowing a deep crimson, and stares into their face.") + target << "Your gaze is forcibly drawn into a blinding red light. You fall to the floor as conscious thought is wiped away." + target.Weaken(12) + if(3) + usr << "You begin rearranging [target]'s memories." + usr.visible_message("[usr]'s eyes flare brightly, and a horrible grin begins to spread across [target]'s face...") + target << "Your head cries out. The veil of reality begins to crumple and something evil bleeds through." //Ow the edge + if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling + usr << "The enthralling has been interrupted - your target's mind returns to its previous state." + target << "Your thoughts become coherent once more. Already you can barely remember what's happened to you." + enthralling = 0 + return + + enthralling = 0 + usr << "You have enthralled [target]!" + 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.adjustOxyLoss(-200) //In case the shadowling was choking them out + ticker.mode.add_thrall(target.mind) + target.mind.special_role = "Thrall" + var/datum/mind/thrall_mind = target.mind + thrall_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind //Lets thralls hive-chat + + + +/obj/effect/proc_holder/spell/targeted/shadowling_hivemind + name = "Hivemind Commune" + desc = "Allows you to silently communicate with all other shadowlings and thralls." + panel = "Shadowling Abilities" + charge_max = 25 + clothes_req = 0 + range = -1 + include_user = 1 + +/obj/effect/proc_holder/spell/targeted/shadowling_hivemind/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 + for(var/mob/M in mob_list) + if(is_shadow_or_thrall(M) || (M in dead_mob_list)) + M << "\[Hive Chat\] [usr.real_name]: [text]" + + + +/obj/effect/proc_holder/spell/targeted/collective_mind + name = "Collective Hivemind" + desc = "Gathers the power of all of your thralls and compares it to what is needed for ascendance. Also gains you new abilities." + panel = "Shadowling Abilities" + charge_max = 300 //30 second cooldown to prevent spam + clothes_req = 0 + range = -1 + include_user = 1 + var/blind_smoke_acquired + var/screech_acquired + var/drain_thrall_acquired + var/thrall_swap_acquired + +/obj/effect/proc_holder/spell/targeted/collective_mind/cast(list/targets) + for(var/mob/living/user in targets) + var/thralls = 0 + var/victory_threshold = 15 + var/mob/M + + user << "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls." + + for(M in living_mob_list) + if(is_thrall(M)) + thralls++ + M << "You feel hooks sink into your mind and pull." + + if(!do_after(user, 30)) + user << "Your concentration has been broken. The mental hooks you have sent out now retract into your mind." + return + + if(thralls >= 3 && !blind_smoke_acquired) + blind_smoke_acquired = 1 + user << "The power of your thralls has granted you the Blinding Smoke ability. It will create a choking cloud that will blind any non-thralls who enter. \ + " + user.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/blindness_smoke + + if(thralls >= 5 && !drain_thrall_acquired) + drain_thrall_acquired = 1 + user << "The power of your thralls has granted you the Drain Thrall ability. You can now drain nearby thralls to heal yourself." + user.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/drain_thralls + + if(thralls >= 7 && !screech_acquired) + screech_acquired = 1 + user << "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies." + user.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech + + if(thralls >= 10 && !thrall_swap_acquired) + thrall_swap_acquired = 1 + user << "The power of your thralls has granted you the Spatial Relocation ability. This will, allow you to instantly swap places with one of your thralls in \ + addition to shattering nearby lights." + user.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/spatial_relocation + + if(thralls < victory_threshold) + user << "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present." + + else if(thralls >= victory_threshold) + usr << "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls." + usr << "You may find Ascendance in the Shadowling Evolution tab." + for(M in living_mob_list) + if(is_shadow(M)) + M.mind.spell_list -= /obj/effect/proc_holder/spell/targeted/collective_mind + M.mind.current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch //In case a shadowling hasn't hatched + M.mind.current.verbs += /mob/living/carbon/human/proc/shadowling_ascendance + if(M == usr) + return + M << "[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend." //Tells all the other shadowlings + + + +/obj/effect/proc_holder/spell/targeted/blindness_smoke + name = "Blindness Smoke" + desc = "Spews a cloud of smoke which will blind enemies." + panel = "Shadowling Abilities" + charge_max = 600 + clothes_req = 0 + range = -1 + include_user = 1 + +/obj/effect/proc_holder/spell/targeted/blindness_smoke/cast(list/targets) //Extremely hacky + for(var/mob/living/user in targets) + user.visible_message("[user] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!") + user << "You regurgitate a vast cloud of blinding smoke." + playsound(user, 'sound/effects/bamf.ogg', 50, 1) + var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(user.loc) + B.reagents.clear_reagents() //Just in case! + B.icon_state = null //Invisible + B.reagents.add_reagent("blindness_smoke", 10) + var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + S.attach(B) + if(S) + S.set_up(B.reagents, 10, 0, B.loc) + S.start() + sleep(10) + S.start() + qdel(B) + +datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowlings/thralls + name = "!(%@ ERROR )!@$" + id = "blindness_smoke" + description = "<::ERROR::> CANNOT ANALYZE REAGENT <::ERROR::>" + color = "#000000" //Complete black (RGB: 0, 0, 0) + metabolization_rate = 100 //lel + +datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!is_shadow_or_thrall(M)) + M << "You breathe in the black smoke, and your eyes burn horribly!" + M.eye_blind = 5 + if(prob(25)) + M.visible_message("[M] screams and claws at their eyes!") + M.Stun(2) + else + M << "You breathe in the black smoke, and you feel revitalized!" + M.heal_organ_damage(2,2) + M.adjustOxyLoss(-2) + M.adjustToxLoss(-2) + ..() + return + + + +/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech + name = "Sonic Screech" + desc = "Deafens, stuns, and confuses nearby people. Also shatters windows." + panel = "Shadowling Abilities" + range = 7 + charge_max = 300 + clothes_req = 0 + +/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets) + usr.audible_message("[usr] lets out a horrible scream!") + playsound(usr.loc, 'sound/effects/screech.ogg', 100, 1) + + for(var/turf/T in targets) + for(var/mob/target in T.contents) + if(is_shadow_or_thrall(target)) + if(target == usr) //No message for the user, of course + continue + else + continue + if(iscarbon(target)) + var/mob/living/carbon/M = target + M << "A spike of pain drives into your head and scrambles your thoughts!" + M.Weaken(2) + M.confused += 10 + M.setEarDamage(M.ear_damage + 3) + else if(issilicon(target)) + var/mob/living/silicon/S = target + S << "ERROR $!(@ ERROR )#^! SENSOR INTERFERENCE DETECTED" + S << 'sound/misc/interference.ogg' + playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1) + var/datum/effect/effect/system/spark_spread/sp = new /datum/effect/effect/system/spark_spread + sp.set_up(5, 1, S) + sp.start() + S.Weaken(6) + for(var/obj/structure/window/W in T.contents) + W.hit(rand(25,50)) + + + +/obj/effect/proc_holder/spell/aoe_turf/drain_thralls + name = "Drain Thralls" + desc = "Damages nearby thralls, draining their life and healing yourself." + panel = "Shadowling Abilities" + range = 3 + charge_max = 100 + clothes_req = 0 + var/thralls_drained = 0 + var/list/nearby_thralls = list() + +/obj/effect/proc_holder/spell/aoe_turf/drain_thralls/cast(list/targets) + thralls_drained = 0 + nearby_thralls = list() + for(var/turf/T in targets) + for(var/mob/living/carbon/M in T.contents) + if(is_thrall(M)) + thralls_drained++ + nearby_thralls.Add(M) + M << "You feel a curious draining sensation and a wave of exhaustion washes over you." + for(var/mob/living/carbon/M in nearby_thralls) + nearby_thralls.Remove(M) //To prevent someone dying like a zillion times + M.take_organ_damage(25/thralls_drained,25/thralls_drained) //For every nearby thrall, the damage to each is reduced - 1 thrall = 50 for him, 2 thralls = 25 for each, etc. + usr << "You draw the life from [M] to heal your wounds." + if(thralls_drained) + var/mob/living/carbon/U = usr + U.heal_organ_damage(25, 25) + else + charge_counter = charge_max + usr << "There were no nearby thralls for you to drain." + + + +/obj/effect/proc_holder/spell/targeted/spatial_relocation + name = "Spatial Relocation" + desc = "Swaps places with a thrall and breaks nearby lights." + panel = "Shadowling Abilities" + range = -1 + charge_max = 3000 + clothes_req = 0 + include_user = 1 + var/list/thralls_in_world = list() + +/obj/effect/proc_holder/spell/targeted/spatial_relocation/cast(list/targets, distanceoverride) + for(var/mob/living/carbon/human/M in world) + if(is_thrall(M)) + thralls_in_world += M + if(!thralls_in_world) + charge_counter = charge_max + return + var/mob/living/carbon/thrall_to_swap = input("Who do you wish to swap places with?", "Available Thralls") as null|anything in (thralls_in_world) + var/turf/shadowturf = get_turf(usr) + var/turf/thrallturf = get_turf(thrall_to_swap) + thrall_to_swap.visible_message("[thrall_to_swap] suddenly vanishes in a puff of black smoke!") + thrall_to_swap << "You feel a brief sense of nausea before finding yourself in an entirely new place!" + usr.visible_message("[usr] suddenly goes transparent and vanishes!") + usr << "You experience vertigo as you swap your location with [thrall_to_swap]'s." + thrall_to_swap.loc = shadowturf + usr.loc = thrallturf + thrall_to_swap.Weaken(4) + usr.Weaken(4) + usr.regenerate_icons() + thrall_to_swap.regenerate_icons() + +// ASCENDANT ABILITIES BEYOND THIS POINT // + +/obj/effect/proc_holder/spell/targeted/annihilate + name = "Annihilate" + desc = "Gibs a human after a short time." + panel = "Ascendant" + range = 7 + charge_max = 300 + clothes_req = 0 + +/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets) + var/mob/living/simple_animal/ascendant_shadowling/SHA = usr + if(SHA.phasing) + usr << "You are not in the same plane of existence. Unphase first." + charge_counter = charge_max + return + + for(var/mob/boom in targets) + if(is_shadow_or_thrall(boom)) + usr << "Making an ally explode seems unwise." + charge_counter = charge_max + return + usr.visible_message("[usr]'s eyes flare as they gesture at [boom]!", \ + "You direct a lance of telekinetic energy at [boom].") + boom << "You feel an immense pressure building all across your body!" + boom.Stun(10) + boom.audible_message("[boom] screams!") + sleep(20) + playsound(boom, 'sound/effects/splat.ogg', 100, 1) + boom.visible_message("[boom] explodes!") + boom.gib() + + + +/obj/effect/proc_holder/spell/targeted/hypnosis + name = "Hypnosis" + desc = "Instantly enthralls a human." + panel = "Ascendant" + range = 7 + charge_max = 450 + clothes_req = 0 + +/obj/effect/proc_holder/spell/targeted/hypnosis/cast(list/targets) + var/mob/living/simple_animal/ascendant_shadowling/SHA = usr + if(SHA.phasing) + charge_counter = charge_max + usr << "You are not in the same plane of existence. Unphase first." + return + + for(var/mob/living/carbon/human/target in targets) + if(is_shadow_or_thrall(target)) + usr << "You cannot enthrall an ally." + charge_counter = charge_max + return + if(!target.ckey) + usr << "The target has no mind." + charge_counter = charge_max + return + if(target.stat) + usr << "The target must be conscious." + charge_counter = charge_max + return + if(!ishuman(target)) + usr << "You can only enthrall humans." + charge_counter = charge_max + return + + usr << "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall." + target << "An agonizing spike of pain drives into your mind, and--" + target << "And 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." + ticker.mode.add_thrall(target.mind) + target.mind.special_role = "Thrall" + var/datum/mind/thrall_mind = target.mind + thrall_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind + + + +/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift + name = "Phase Shift" + desc = "Phases you into the space between worlds at will, allowing you to move through walls and become invisible." + panel = "Ascendant" + range = -1 + include_user = 1 + charge_max = 15 + clothes_req = 0 + +/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift/cast(list/targets) + var/mob/living/simple_animal/ascendant_shadowling/SHA = usr + for(SHA in targets) + SHA.phasing = !SHA.phasing + if(SHA.phasing) + SHA.visible_message("[SHA] suddenly vanishes!", \ + "You begin phasing through planes of existence. Use the ability again to return.") + SHA.incorporeal_move = 1 + SHA.alpha = 0 + else + SHA.visible_message("[SHA] suddenly appears from nowhere!", \ + "You return from the space between worlds.") + SHA.incorporeal_move = 0 + SHA.alpha = 255 + + + +/obj/effect/proc_holder/spell/aoe_turf/glacial_blast + name = "Glacial Blast" + desc = "Extremely empowered version of Flash Freeze." + panel = "Ascendant" + range = 5 + charge_max = 600 + clothes_req = 0 + +/obj/effect/proc_holder/spell/aoe_turf/glacial_blast/cast(list/targets) + var/mob/living/simple_animal/ascendant_shadowling/SHA = usr + if(SHA.phasing) + usr << "You are not in the same plane of existence. Unphase first." + return + + usr << "You freeze the nearby air." + playsound(usr.loc, 'sound/effects/ghost2.ogg', 100, 1) + + for(var/turf/T in targets) + for(var/mob/living/carbon/human/target in T.contents) + if(is_shadow_or_thrall(target)) + if(target == usr) //No message for the user, of course + continue + else + target << "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!" + continue + target << "You are hit by a blast of cold unlike anything you have ever felt. Your limbs instantly lock in place and you feel ice burns across your body!" + target.Weaken(15) + if(target.bodytemperature) + target.bodytemperature -= INFINITY //:^) + target.take_organ_damage(0,80) + + + +/obj/effect/proc_holder/spell/targeted/vortex + name = "Vortex" + desc = "Tears open a hole in reality. Anyone, INCLUDING YOU, walking through it will be trapped there for eternity." + panel = "Ascendant" + range = -1 + include_user = 1 + charge_max = 1200 + clothes_req = 0 + +/obj/effect/proc_holder/spell/targeted/vortex/cast(list/targets) + var/mob/living/simple_animal/ascendant_shadowling/SHA = usr + if(SHA.phasing) + usr << "You are not in the same plane of existence. Unphase first." + return + + for(SHA in targets) + SHA.visible_message("[SHA] raises their arms upward as the markings on their body flare a blinding red!", \ + "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/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/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 new file mode 100644 index 00000000000..683d0a4bb81 --- /dev/null +++ b/code/game/gamemodes/shadowling/shadowling_items.dm @@ -0,0 +1,102 @@ +/obj/item/clothing/under/shadowling + name = "blackened flesh" + desc = "Black, chitonous skin." + item_state = "golem" + origin_tech = null + icon_state = "golem" + flags = ABSTRACT | NODROP + has_sensor = 0 + unacidable = 1 + + +/obj/item/clothing/suit/space/shadowling + name = "chitin shell" + desc = "Dark, semi-transparent shell. Protects against vacuum, but not against the light of the stars." //Still takes damage from spacewalking but is immune to space itself + icon_state = "golem" + item_state = "golem" + body_parts_covered = FULL_BODY //Shadowlings are immune to space + cold_protection = FULL_BODY + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT + flags = ABSTRACT | NODROP | THICKMATERIAL + slowdown = 0 + unacidable = 1 + heat_protection = null //You didn't expect a light-sensitive creature to have heat resistance, did you? + max_heat_protection_temperature = null + + +/obj/item/clothing/shoes/shadowling + name = "chitin feet" + desc = "Charred-looking feet. They have minature hooks that latch onto flooring." + icon_state = "golem" + unacidable = 1 + flags = NOSLIP | ABSTRACT | NODROP + + +/obj/item/clothing/mask/gas/shadowling + name = "chitin mask" + desc = "A mask-like formation with slots for facial features. A red film covers the eyes." + icon_state = "golem" + item_state = "golem" + origin_tech = null + siemens_coefficient = 0 + unacidable = 1 + flags = ABSTRACT | NODROP + + +/obj/item/clothing/gloves/shadowling + name = "chitin hands" + desc = "An electricity-resistant yet thin covering of the hands." + icon_state = "golem" + item_state = null + origin_tech = null + siemens_coefficient = 0 + unacidable = 1 + flags = ABSTRACT | NODROP + + +/obj/item/clothing/head/shadowling + name = "chitin helm" + desc = "A helmet-like enclosure of the head." + icon_state = "golem" + item_state = null + origin_tech = null + unacidable = 1 + flags = ABSTRACT | NODROP + + +/obj/item/clothing/glasses/night/shadowling + name = "crimson eyes" + desc = "A shadowling's eyes. Very light-sensitive and can detect body heat through walls." + icon = null + icon_state = null + item_state = null + origin_tech = null + vision_flags = SEE_MOBS + darkness_view = 3 + invis_view = 2 + flash_protect = 2 + unacidable = 1 + flags = ABSTRACT | NODROP + +/obj/structure/shadow_vortex + name = "vortex" + desc = "A swirling hole in the fabric of reality. Eye-watering chimes sound from its depths." + density = 0 + anchored = 1 + icon = 'icons/effects/genetics.dmi' + icon_state = "shadow_portal" + +/obj/structure/shadow_vortex/New() + src.audible_message("\The [src] lets out a dismaying screech as dimensional barriers are torn apart!") + playsound(loc, 'sound/effects/supermatter.ogg', 100, 1) + sleep(100) + qdel(src) + +/obj/structure/shadow_vortex/Crossed(var/td) + ..() + if(ismob(td)) + td << "You enter the rift. Sickening chimes begin to jangle in your ears. \ + All around you is endless blackness. After you see something moving, you realize it isn't entirely lifeless." //A bit of spooking before they die + playsound(loc, 'sound/effects/EMPulse.ogg', 25, 1) + qdel(td) diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm new file mode 100644 index 00000000000..472bee1cd61 --- /dev/null +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -0,0 +1,161 @@ +//In here: Hatch and Ascendance + +/mob/living/carbon/human/proc/shadowling_hatch() + set category = "Shadowling Evolution" + set name = "Hatch" + + if(usr.stat) + return + usr.verbs -= /mob/living/carbon/human/proc/shadowling_hatch + switch(alert("Are you sure you want to hatch? You cannot undo this!",,"Yes","No")) + if("No") + usr << "You decide against hatching for now." + usr.verbs += /mob/living/carbon/human/proc/shadowling_hatch + return + if("Yes") + usr.notransform = 1 + usr.visible_message("[usr]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them!", \ + "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) + + sleep(50) + var/turf/simulated/floor/F + var/turf/shadowturf = get_turf(usr) + for(F in orange(1, usr)) + new /obj/structure/alien/resin/wall/shadowling(F) + for(var/obj/structure/alien/resin/wall/shadowling/R in shadowturf) //extremely hacky + qdel(R) + new /obj/structure/alien/weeds/node(shadowturf) //Dim lighting in the chrysalis -- removes itself with the chrysalis + + usr.visible_message("A chrysalis forms around [usr], sealing them inside.", \ + "You create your chrysalis and begin to contort within.") + + sleep(100) + usr.visible_message("The skin on [usr]'s back begins to split apart. Black spines slowly emerge from the divide.", \ + "Spines pierce your back. Your claws break apart your fingers. You feel excruciating pain as your true form begins its exit.") + + sleep(90) + usr.visible_message("[usr], now no longer recognizable as human, begins clawing at the resin walls around them.", \ + "Your false skin slips away. You begin tearing at the fragile membrane protecting you.") + + sleep(80) + playsound(usr.loc, 'sound/weapons/slash.ogg', 25, 1) + usr << "You rip and slice." + sleep(10) + playsound(usr.loc, 'sound/weapons/slashmiss.ogg', 25, 1) + usr << "The chrysalis falls like water before you." + sleep(10) + playsound(usr.loc, 'sound/weapons/slice.ogg', 25, 1) + usr << "You are free!" + + sleep(10) + playsound(usr.loc, 'sound/effects/ghost.ogg', 100, 1) + usr.real_name = "Shadowling ([rand(1,1000)])" + usr.name = usr.real_name + usr.notransform = 0 + usr << "YOU LIVE!!!" + + for(var/obj/structure/alien/resin/wall/shadowling/W in orange(usr, 1)) + playsound(W, 'sound/effects/splat.ogg', 50, 1) + qdel(W) + for(var/obj/structure/alien/weeds/node/N in shadowturf) + qdel(N) + usr.visible_message("The chrysalis explodes in a shower of purple flesh and fluid!") + var/mob/living/carbon/human/M = usr + M.underwear = "Nude" + M.undershirt = "Nude" + M.socks = "Nude" + M.faction |= "faithless" + + usr.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform) + usr.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(usr), slot_shoes) + usr.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(usr), slot_wear_suit) + usr.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(usr), slot_head) + usr.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves) + usr.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask) + usr.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(usr), slot_glasses) + hardset_dna(usr, null, null, null, null, /datum/species/shadow/ling) //can't be a shadowling without being a shadowling + + sleep(10) + usr << "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies." + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/glare + usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/veil + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadow_walk + usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/flashfreeze + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/collective_mind + + + +/mob/living/carbon/human/proc/shadowling_ascendance() + set category = "Shadowling Evolution" + set name = "Ascendance" + + if(usr.stat) + return + usr.verbs -= /mob/living/carbon/human/proc/shadowling_ascendance + switch(alert("It is time to ascend. Are you completely sure about this? You cannot undo this!",,"Yes","No")) + if("No") + usr << "You decide against ascending for now." + usr.verbs += /mob/living/carbon/human/proc/shadowling_ascendance + return + if("Yes") + usr.notransform = 1 + usr.visible_message("[usr] rapidly bends and contorts, their eyes flaring a deep crimson!", \ + "You begin unlocking the genetic vault within you and prepare yourself for the power to come.") + + sleep(30) + usr.visible_message("[usr] suddenly shoots up a few inches in the air and begins hovering there, still twisting.", \ + "You hover into the air to make room for your new form.") + + sleep(60) + usr.visible_message("[usr]'s skin begins to pulse red in sync with their eyes. Their form slowly expands outward.", \ + "You feel yourself beginning to mutate.") + + sleep(20) + if(!ticker.mode.shadowling_ascended) + usr << "It isn't enough. Time to draw upon your thralls." + else + usr << "After some telepathic searching, you find the reservoir of life energy from the thralls and tap into it." + + sleep(50) + for(var/mob/M in mob_list) + if(is_thrall(M) && !ticker.mode.shadowling_ascended) + M.visible_message("[M] trembles minutely as their form turns to ash, black smoke pouring from their disintegrating face.", \ + "It's time! Your masters are ascending! Your last thoughts are happy as your body is drained of life.") + + ticker.mode.thralls -= M.mind //To prevent message spam + M.death(0) + M.dust() + + usr << "Drawing upon your thralls, you find the strength needed to finish and rend apart the final barriers to godhood." + + sleep(40) + for(var/mob/living/M in orange(7, src)) + M.Weaken(10) + M << "An immense pressure slams you onto the ground!" + usr << "YOU LIVE!!!" + world << "

A horrible wail echoes in your mind as the world plunges into blackness.


" + world << 'sound/hallucinations/veryfar_noise.ogg' + for(var/obj/machinery/power/apc/A in world) + A.overload_lighting() + var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(usr.loc) + usr.mind.spell_list = list() + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/annihilate + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/hypnosis + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_phase_shift + usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/glacial_blast + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/vortex + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind_ascendant + usr.mind.transfer_to(A) + A.name = usr.real_name + 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 + usr.flags |= GODMODE + usr.notransform = 1 + sleep(50) + if(!ticker.mode.shadowling_ascended) + SSshuttle.emergency.request(null, 0.3) + qdel(usr) diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 985b3bca9ba..d176161c57d 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -47,6 +47,11 @@ relativewall_neighbours() ..() +/obj/structure/alien/resin/wall/shadowling //For chrysalis + name = "chrysalis wall" + desc = "Some sort of purple substance in an egglike shape. It pulses and throbs from within and seems impenetrable." + health = INFINITY + /obj/structure/alien/resin/membrane name = "resin membrane" desc = "Resin just thin enough to let light pass through." diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 3fba23576b5..a453aea9eb2 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -501,6 +501,12 @@ if(ticker.mode.traitors.len) dat += check_role_table("Traitors", ticker.mode.traitors, src) + if(ticker.mode.shadows.len) + dat += check_role_table("Shadowlings", ticker.mode.shadowlings, src) + + if(ticker.mode.thralls.len) + dat += check_role_table("Shadowling Thralls", ticker.thralls, src) + if(ticker.mode.vampires.len) dat += check_role_table("Vampires", ticker.mode.vampires, src) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index d7896a04bc5..1c3beb5d72f 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -17,7 +17,8 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set "raider" = IS_MODE_COMPILED("heist"), // 1024 / 11 "vampire" = IS_MODE_COMPILED("vampire"), // 2048 / 12 "mutineer" = IS_MODE_COMPILED("mutiny"), // 4096 / 13 - "blob" = IS_MODE_COMPILED("blob") // 8192 / 14 + "blob" = IS_MODE_COMPILED("blob") // 8192 / 14 + "shadowling" = IS_MODE_COMPILED("shadowling") //16384 / 15 ) var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles num2text(BE_PAI) = 0, diff --git a/code/modules/mob/living/simple_animal/ascendant_shadowling.dm b/code/modules/mob/living/simple_animal/ascendant_shadowling.dm new file mode 100644 index 00000000000..9445db7592c --- /dev/null +++ b/code/modules/mob/living/simple_animal/ascendant_shadowling.dm @@ -0,0 +1,33 @@ +/mob/living/simple_animal/ascendant_shadowling + name = "Ascendant Shadowling" + desc = "A large, floating eldritch horror. It has pulsing markings all about its body and large horns. It seems to be floating without any form of support." + icon = 'icons/mob/mob.dmi' + icon_state = "shadowling_ascended" + icon_living = "shadowling_ascended" + speak_emote = list("telepathically thunders", "telepathically booms") + force_threshold = INFINITY //Can't die by normal means + health = 100000 + maxHealth = 100000 + speed = 0 + var/phasing = 0 + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + + response_help = "stares at" + response_disarm = "flails at" + response_harm = "flails at" + + harm_intent_damage = 0 + melee_damage_lower = 35 + melee_damage_upper = 35 + attacktext = "claws at" + attack_sound = 'sound/weapons/slash.ogg' + + minbodytemp = 0 + maxbodytemp = INFINITY + environment_smash = 2 + + faction = list("faithless") + +/mob/living/simple_animal/ascendant_shadowling/Process_Spacemove(var/movement_dir = 0) + return 1 //copypasta from carp code diff --git a/code/setup.dm b/code/setup.dm index 1f8956ad74c..6fad89ebc38 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -751,6 +751,7 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define BE_VAMPIRE 2048 #define BE_MUTINEER 4096 #define BE_BLOB 8192 +#define BE_SHADOWLING 16384 var/list/be_special_flags = list( "traitor" = BE_TRAITOR, diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 7d5ba8127a0..88a1a397929 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -61,6 +61,7 @@ h1.alert, h2.alert {color: #000000;} .notice {color: #000099;} .boldnotice {color: #000099; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} +.shadowling {color: #311648;} .newscaster {color: #800000;} diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index de5f30e018b9301a186955a9f985cc447e397f9a..cfa4fbee5e4022709a031b81bb5d693c8f8541ef 100644 GIT binary patch delta 13383 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 delta 12502 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 Rc@IF(6J^auWr{CC{|9>pkpln# diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 44b9b3a304300839976c9bd00f0c1d3d0e1f3e8d..2617ee6d723a0fbc318a470783e1b909ffd4ff4f 100644 GIT binary patch delta 18009 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 LmlvxNH3;}Wn*a*; diff --git a/paradise.dme b/paradise.dme index f4bdc02c04c..fc63896e061 100644 --- a/paradise.dme +++ b/paradise.dme @@ -312,6 +312,10 @@ #include "code\game\gamemodes\nuclear\pinpointer.dm" #include "code\game\gamemodes\revolution\revolution.dm" #include "code\game\gamemodes\revolution\rp_revolution.dm" +#include "code\game\gamemodes\shadowling\shadowling.dm" +#include "code\game\gamemodes\shadowling\shadowling_abilities.dm" +#include "code\game\gamemodes\shadowling\shadowling_items.dm" +#include "code\game\gamemodes\shadowling\special_shadowling_abilities.dm" #include "code\game\gamemodes\traitor\traitor.dm" #include "code\game\gamemodes\vampire\hud.dm" #include "code\game\gamemodes\vampire\vampire.dm" @@ -1291,6 +1295,7 @@ #include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" +#include "code\modules\mob\living\simple_animal\ascendant_shadowling.dm" #include "code\modules\mob\living\simple_animal\bees.dm" #include "code\modules\mob\living\simple_animal\borer.dm" #include "code\modules\mob\living\simple_animal\constructs.dm" From 00035a51f0ed3ed26acbedb9d39de024c148e4c2 Mon Sep 17 00:00:00 2001 From: DZD Date: Sun, 12 Apr 2015 19:54:45 -0400 Subject: [PATCH 2/9] It compiles! - Makes shadowlings compile, require snowflaking of a few things to the human Life() proc due to how Bay species works. - Renames monkeyizing var to notransform, as that's effectively what it was used for, to prevent transformation. (/tg/ port) --- code/datums/mind.dm | 20 ++-- code/game/dna/dna_misc.dm | 8 +- code/game/dna/genes/monkey.dm | 8 +- .../gamemodes/changeling/powers/lesserform.dm | 2 +- code/game/gamemodes/shadowling/shadowling.dm | 97 ++++++++++--------- .../shadowling/shadowling_abilities.dm | 88 ++++++++--------- .../gamemodes/shadowling/shadowling_items.dm | 7 +- .../special_shadowling_abilities.dm | 32 +++--- code/game/machinery/cloning.dm | 2 +- code/modules/admin/player_panel.dm | 4 +- code/modules/client/preferences.dm | 3 +- code/modules/mob/death.dm | 6 +- code/modules/mob/living/carbon/alien/death.dm | 4 +- .../carbon/alien/humanoid/update_icons.dm | 2 +- code/modules/mob/living/carbon/brain/death.dm | 2 +- code/modules/mob/living/carbon/human/death.dm | 6 +- code/modules/mob/living/carbon/human/human.dm | 2 + code/modules/mob/living/carbon/human/life.dm | 24 ++++- .../mob/living/carbon/human/update_icons.dm | 2 +- .../modules/mob/living/carbon/metroid/life.dm | 2 +- .../modules/mob/living/carbon/monkey/death.dm | 4 +- code/modules/mob/living/carbon/monkey/life.dm | 2 +- code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/silicon/death.dm | 4 +- code/modules/mob/living/silicon/mommi/life.dm | 2 +- .../modules/mob/living/silicon/robot/death.dm | 4 +- code/modules/mob/living/silicon/robot/life.dm | 2 +- code/modules/mob/mob.dm | 2 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/mob/mob_movement.dm | 2 +- code/modules/mob/transform_procs.dm | 30 +++--- code/modules/projectiles/gun.dm | 6 +- code/modules/projectiles/projectile/change.dm | 4 +- code/modules/projectiles/projectile/magic.dm | 4 +- code/modules/reagents/Chemistry-Reagents.dm | 4 +- code/setup.dm | 8 +- 36 files changed, 215 insertions(+), 188 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d793bddb5d5..07741d08633 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -319,8 +319,8 @@ datum/mind text = "[text]: " if(src in ticker.mode.shadows) text += "SHADOWLING|thrall|human" - else if(src in ticker.mode.thralls) - text += "shadowling|THRALL|human" + else if(src in ticker.mode.shadowling_thralls) + text += "Shadowling|THRALL|human" else text += "shadowling|thrall|HUMAN" @@ -965,18 +965,18 @@ datum/mind else if(href_list["shadowling"]) switch(href_list["shadowling"]) if("clear") - src.spell_list = null + current.spell_list = null if(src in ticker.mode.shadows) ticker.mode.shadows -= src special_role = null current << "Your powers have been quenched! You are no longer a shadowling!" - src.spell_list = null + current.spell_list = null message_admins("[key_name_admin(usr)] has de-shadowling'ed [current].") log_admin("[key_name(usr)] has de-shadowling'ed [current].") current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch current.verbs -= /mob/living/carbon/human/proc/shadowling_ascendance - else if(src in ticker.mode.thralls) - ticker.mode.thralls -= src + else if(src in ticker.mode.shadowling_thralls) + ticker.mode.shadowling_thralls -= src special_role = null current << "You have been brainwashed! You are no longer a thrall!" message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") @@ -990,8 +990,8 @@ datum/mind 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." - src.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind - src.spell_list += new /obj/effect/proc_holder/spell/targeted/enthrall + current.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind + current.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/enthrall current.verbs += /mob/living/carbon/human/proc/shadowling_hatch if("thrall") if(!ishuman(current)) @@ -1004,11 +1004,11 @@ datum/mind current << "You may use the Hivemind Commune ability to communicate with your fellow enlightened ones." message_admins("[key_name_admin(usr)] has thrall'ed [current].") log_admin("[key_name(usr)] has thrall'ed [current].") - src.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind + current.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind else if (href_list["monkey"]) var/mob/living/L = current - if (L.monkeyizing) + if (L.notransform) return switch(href_list["monkey"]) if("healthy") diff --git a/code/game/dna/dna_misc.dm b/code/game/dna/dna_misc.dm index bda19278266..bc2098d77a6 100644 --- a/code/game/dna/dna_misc.dm +++ b/code/game/dna/dna_misc.dm @@ -402,7 +402,7 @@ if (isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && istype(M, /mob/living/carbon/human)) // human > monkey var/mob/living/carbon/human/H = M - H.monkeyizing = 1 + H.notransform = 1 var/list/implants = list() //Try to preserve implants. for(var/obj/item/weapon/implant/W in H) implants += W @@ -413,7 +413,7 @@ if (W==H.w_uniform) // will be teared continue H.unEquip(W) - M.monkeyizing = 1 + M.notransform = 1 M.canmove = 0 M.icon = null M.invisibility = 101 @@ -478,7 +478,7 @@ if (!isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && !istype(M, /mob/living/carbon/human)) // monkey > human, var/mob/living/carbon/monkey/Mo = M - Mo.monkeyizing = 1 + Mo.notransform = 1 var/list/implants = list() //Still preserving implants for(var/obj/item/weapon/implant/W in Mo) implants += W @@ -486,7 +486,7 @@ if(!connected) for(var/obj/item/W in (Mo.contents-implants)) Mo.unEquip(W) - M.monkeyizing = 1 + M.notransform = 1 M.canmove = 0 M.icon = null M.invisibility = 101 diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 03ca9880c2c..c10178b285a 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -12,7 +12,7 @@ // testing("Cannot monkey-ify [M], type is [M.type].") return var/mob/living/carbon/human/H = M - H.monkeyizing = 1 + H.notransform = 1 var/list/implants = list() //Try to preserve implants. for(var/obj/item/weapon/implant/W in H) implants += W @@ -23,7 +23,7 @@ if (W==H.w_uniform) // will be teared continue H.unEquip(W) - M.monkeyizing = 1 + M.notransform = 1 M.canmove = 0 M.icon = null M.invisibility = 101 @@ -86,7 +86,7 @@ testing("Cannot humanize [M], type is [M.type].") return var/mob/living/carbon/monkey/Mo = M - Mo.monkeyizing = 1 + Mo.notransform = 1 var/list/implants = list() //Still preserving implants for(var/obj/item/weapon/implant/W in Mo) implants += W @@ -94,7 +94,7 @@ if(!connected) for(var/obj/item/W in (Mo.contents-implants)) Mo.unEquip(W) - M.monkeyizing = 1 + M.notransform = 1 M.canmove = 0 M.icon = null M.invisibility = 101 diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm index a769ee47bd0..09751412a30 100644 --- a/code/game/gamemodes/changeling/powers/lesserform.dm +++ b/code/game/gamemodes/changeling/powers/lesserform.dm @@ -23,7 +23,7 @@ for(var/obj/item/weapon/implant/W in C) implants += W - C.monkeyizing = 1 + C.notransform = 1 C.canmove = 0 C.icon = null C.overlays.Cut() diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index c14ad379d68..ccdfed9baec 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -41,7 +41,7 @@ Made by Xhuis /datum/game_mode var/list/datum/mind/shadows = list() - var/list/datum/mind/thralls = list() + var/list/datum/mind/shadowling_thralls = list() var/list/shadow_objectives = list() var/required_thralls = 15 //How many thralls are needed (hardcoded for now) var/shadowling_ascended = 0 //If at least one shadowling has ascended @@ -49,11 +49,11 @@ Made by Xhuis /proc/is_thrall(var/mob/living/M) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.thralls) + return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.shadowling_thralls) /proc/is_shadow_or_thrall(var/mob/living/M) - return istype(M) && M.mind && ticker && ticker.mode && ((M.mind in ticker.mode.thralls) || (M.mind in ticker.mode.shadows)) + return istype(M) && M.mind && ticker && ticker.mode && ((M.mind in ticker.mode.shadowling_thralls) || (M.mind in ticker.mode.shadows)) /proc/is_shadow(var/mob/living/M) @@ -63,7 +63,6 @@ Made by Xhuis /datum/game_mode/shadowling name = "shadowling" config_tag = "shadowling" - antag_flag = BE_SHADOWLING required_players = 30 required_enemies = 2 recommended_enemies = 2 @@ -78,20 +77,22 @@ Made by Xhuis if(config.protect_roles_from_antagonist) restricted_jobs += protected_jobs - if(config.protect_assistant_from_antagonist) - restricted_jobs += "Assistant" + var/list/datum/mind/possible_shadowlings = get_players_for_role(BE_SHADOWLING) - for(var/datum/mind/player in antag_candidates) + if(!possible_shadowlings.len) + return 0 + + for(var/datum/mind/player in possible_shadowlings) for(var/job in restricted_jobs) if(player.assigned_role == job) - antag_candidates -= player + possible_shadowlings -= player var/shadowlings = 2 //How many shadowlings there are; hardcoded to 2 while(shadowlings) - var/datum/mind/shadow = pick(antag_candidates) + var/datum/mind/shadow = pick(possible_shadowlings) shadows += shadow - antag_candidates -= shadow + possible_shadowlings -= shadow modePlayer += shadow shadow.special_role = "Shadowling" shadowlings-- @@ -130,17 +131,17 @@ Made by Xhuis /datum/game_mode/proc/finalize_shadowling(var/datum/mind/shadow_mind) var/mob/living/carbon/human/S = shadow_mind.current shadow_mind.current.verbs += /mob/living/carbon/human/proc/shadowling_hatch - shadow_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/enthrall - shadow_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind + S.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/enthrall + S.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind if(shadow_mind.assigned_role == "Clown") S << "Your alien nature has allowed you to overcome your clownishness." - S.dna.remove_mutation(CLOWNMUT) + S.mutations.Remove(CLUMSY) /datum/game_mode/proc/add_thrall(datum/mind/new_thrall_mind) if (!istype(new_thrall_mind)) return 0 - if(!(new_thrall_mind in thralls)) - thralls += new_thrall_mind + if(!(new_thrall_mind in shadowling_thralls)) + shadowling_thralls += new_thrall_mind new_thrall_mind.current.attack_log += "\[[time_stamp()]\] Became a thrall" return 1 @@ -174,11 +175,11 @@ Made by Xhuis /datum/game_mode/shadowling/declare_completion() - if(check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) //Doesn't end instantly - this is hacky and I don't know of a better way ~X + if(check_shadow_victory() && emergency_shuttle.returned()) //Doesn't end instantly - this is hacky and I don't know of a better way ~X world << "The shadowlings have ascended and taken over the station!
" else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round world << "The shadowlings have been killed by the crew!" - else if(!check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) + else if(!check_shadow_victory() && emergency_shuttle.returned()) world << "The crew has escaped the station before the shadowlings could ascend!" ..() return 1 @@ -189,13 +190,32 @@ Made by Xhuis if(shadows.len) text += "
The shadowlings were:" for(var/datum/mind/shadow in shadows) - text += printplayer(shadow) - if(thralls.len) + text += "
[shadow.key] was [shadow.name] (" + if(shadow.current) + if(shadow.current.stat == DEAD) + text += "died" + else + text += "survived" + if(shadow.current.real_name != shadow.name) + text += " as [shadow.current.real_name]" + else + text += "body destroyed" + text += ")" + if(shadowling_thralls.len) text += "
The thralls were:" - for(var/datum/mind/thrall in thralls) - text += printplayer(thrall) + for(var/datum/mind/thrall in shadowling_thralls) + text += "
[thrall.key] was [thrall.name] (" + if(thrall.current) + if(thrall.current.stat == DEAD) + text += "died" + else + text += "survived" + if(thrall.current.real_name != thrall.name) + text += " as [thrall.current.real_name]" + else + text += "body destroyed" else - world << "Round-end code broke! Please report this and its circumstances on GitHub at https://github.com/tgstation/-tg-station/issues" + world << "Round-end code broke! Please report this and its circumstances on GitHub at https://github.com/ParadiseSS13/Paradise/issues" text += "
" world << text @@ -205,31 +225,12 @@ Made by Xhuis */ -/datum/species/shadow/ling +/datum/species/shadowling //Normal shadowpeople but with enhanced effects name = "Shadowling" - id = "shadowling" - say_mod = "chitters" - specflags = list(NOBREATH,NOBLOOD,RADIMMUNE,NOGUNS) //Can't use guns due to muzzle flash - burnmod = 2 //2x burn damage lel - heatmod = 2 - -/datum/species/shadow/ling/spec_life(mob/living/carbon/human/H) - //H.shadowling_status = 1 //If they are affected more strongly by flashes and stuff - var/light_amount = 0 - H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry - if(isturf(H.loc)) //Copypasta - var/turf/T = H.loc - var/area/A = T.loc - if(A) - if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount - else light_amount = 10 - if(light_amount > 2) //Rapid death while in the light, countered by... - H.take_overall_damage(0,6) - H << "The light burns you!" - H << 'sound/weapons/sear.ogg' - else if (light_amount < 2) //...extreme benefits while in the dark - H.heal_overall_damage(5,3) - H.adjustToxLoss(-3) - H.SetWeakened(0) - H.SetStunned(0) + flags = NO_BREATHE | NO_BLOOD | RAD_IMMUNE | REQUIRE_DARK + burn_mod = 2 //2x burn damage + //heatmod = 2 + blood_color = "#000000" + flesh_color = "#000000" + darksight = 8 diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index baf3d70c4b2..7f1311f7cd8 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -1,11 +1,11 @@ -/obj/effect/proc_holder/spell/targeted/glare +/obj/effect/proc_holder/spell/wizard/targeted/glare name = "Glare" desc = "Stuns and mutes a target for a decent duration." panel = "Shadowling Abilities" charge_max = 300 clothes_req = 0 -/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/targeted/glare/cast(list/targets) for(var/mob/living/carbon/human/target in targets) if(!ishuman(target)) charge_counter = charge_max @@ -30,7 +30,7 @@ -/obj/effect/proc_holder/spell/aoe_turf/veil +/obj/effect/proc_holder/spell/wizard/aoe_turf/veil name = "Veil" desc = "Extinguishes all electronic lights in a decent radius." panel = "Shadowling Abilities" @@ -38,7 +38,7 @@ clothes_req = 0 range = 5 -/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/aoe_turf/veil/cast(list/targets) usr << "You silently disable all nearby lights." var/list/blacklisted_lights = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/slime) for(var/turf/T in targets) @@ -59,7 +59,7 @@ -/obj/effect/proc_holder/spell/targeted/shadow_walk +/obj/effect/proc_holder/spell/wizard/targeted/shadow_walk name = "Shadow Walk" desc = "Phases you into the space between worlds for a short time, allowing movement through walls and invisbility." panel = "Shadowling Abilities" @@ -68,7 +68,7 @@ range = -1 include_user = 1 -/obj/effect/proc_holder/spell/targeted/shadow_walk/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/targeted/shadow_walk/cast(list/targets) for(var/mob/living/user in targets) playsound(user.loc, 'sound/effects/bamf.ogg', 50, 1) user.visible_message("[user] vanishes into thin air!", "You enter the space between worlds as a passageway.") @@ -77,7 +77,7 @@ user.incorporeal_move = 1 user.alpha = 0 if(user.buckled) - user.buckled.unbuckle_mob() + user.buckled.unbuckle() sleep(40) //4 seconds user.visible_message("[user] appears out of nowhere!", "The pressure becomes too much and you vacate the interdimensional darkness.") user.incorporeal_move = 0 @@ -85,7 +85,7 @@ -/obj/effect/proc_holder/spell/aoe_turf/flashfreeze +/obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze name = "Flash Freeze" desc = "Instantly freezes the blood of nearby people, stunning them and causing burn damage." panel = "Shadowling Abilities" @@ -93,7 +93,7 @@ charge_max = 1200 clothes_req = 0 -/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze/cast(list/targets) usr << "You freeze the nearby air." playsound(usr.loc, 'sound/effects/ghost2.ogg', 50, 1) @@ -115,7 +115,7 @@ //Enthrall is the single most important spell -/obj/effect/proc_holder/spell/targeted/enthrall +/obj/effect/proc_holder/spell/wizard/targeted/enthrall name = "Enthrall" desc = "Allows you to enslave a conscious, non-braindead, non-catatonic human to your will. This takes some time to cast." panel = "Shadowling Abilities" @@ -124,7 +124,7 @@ range = 1 //Adjacent to user var/enthralling = 0 -/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/targeted/enthrall/cast(list/targets) for(var/mob/living/carbon/human/target in targets) if(!in_range(usr, target)) usr << "You need to be closer to enthrall [target]." @@ -183,12 +183,11 @@ target.adjustOxyLoss(-200) //In case the shadowling was choking them out ticker.mode.add_thrall(target.mind) target.mind.special_role = "Thrall" - var/datum/mind/thrall_mind = target.mind - thrall_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind //Lets thralls hive-chat + target.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind //Lets thralls hive-chat -/obj/effect/proc_holder/spell/targeted/shadowling_hivemind +/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind name = "Hivemind Commune" desc = "Allows you to silently communicate with all other shadowlings and thralls." panel = "Shadowling Abilities" @@ -197,7 +196,7 @@ range = -1 include_user = 1 -/obj/effect/proc_holder/spell/targeted/shadowling_hivemind/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind/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) @@ -208,7 +207,7 @@ -/obj/effect/proc_holder/spell/targeted/collective_mind +/obj/effect/proc_holder/spell/wizard/targeted/collective_mind name = "Collective Hivemind" desc = "Gathers the power of all of your thralls and compares it to what is needed for ascendance. Also gains you new abilities." panel = "Shadowling Abilities" @@ -221,7 +220,7 @@ var/drain_thrall_acquired var/thrall_swap_acquired -/obj/effect/proc_holder/spell/targeted/collective_mind/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/targeted/collective_mind/cast(list/targets) for(var/mob/living/user in targets) var/thralls = 0 var/victory_threshold = 15 @@ -242,23 +241,23 @@ blind_smoke_acquired = 1 user << "The power of your thralls has granted you the Blinding Smoke ability. It will create a choking cloud that will blind any non-thralls who enter. \ " - user.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/blindness_smoke + user.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/blindness_smoke if(thralls >= 5 && !drain_thrall_acquired) drain_thrall_acquired = 1 user << "The power of your thralls has granted you the Drain Thrall ability. You can now drain nearby thralls to heal yourself." - user.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/drain_thralls + user.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/drain_thralls if(thralls >= 7 && !screech_acquired) screech_acquired = 1 user << "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies." - user.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech + user.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/unearthly_screech if(thralls >= 10 && !thrall_swap_acquired) thrall_swap_acquired = 1 user << "The power of your thralls has granted you the Spatial Relocation ability. This will, allow you to instantly swap places with one of your thralls in \ addition to shattering nearby lights." - user.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/spatial_relocation + user.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/spatial_relocation if(thralls < victory_threshold) user << "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present." @@ -268,7 +267,7 @@ usr << "You may find Ascendance in the Shadowling Evolution tab." for(M in living_mob_list) if(is_shadow(M)) - M.mind.spell_list -= /obj/effect/proc_holder/spell/targeted/collective_mind + M.mind.current.spell_list -= /obj/effect/proc_holder/spell/wizard/targeted/collective_mind M.mind.current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch //In case a shadowling hasn't hatched M.mind.current.verbs += /mob/living/carbon/human/proc/shadowling_ascendance if(M == usr) @@ -277,7 +276,7 @@ -/obj/effect/proc_holder/spell/targeted/blindness_smoke +/obj/effect/proc_holder/spell/wizard/targeted/blindness_smoke name = "Blindness Smoke" desc = "Spews a cloud of smoke which will blind enemies." panel = "Shadowling Abilities" @@ -286,7 +285,7 @@ range = -1 include_user = 1 -/obj/effect/proc_holder/spell/targeted/blindness_smoke/cast(list/targets) //Extremely hacky +/obj/effect/proc_holder/spell/wizard/targeted/blindness_smoke/cast(list/targets) //Extremely hacky for(var/mob/living/user in targets) user.visible_message("[user] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!") user << "You regurgitate a vast cloud of blinding smoke." @@ -329,7 +328,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) -/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech +/obj/effect/proc_holder/spell/wizard/aoe_turf/unearthly_screech name = "Sonic Screech" desc = "Deafens, stuns, and confuses nearby people. Also shatters windows." panel = "Shadowling Abilities" @@ -337,7 +336,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) charge_max = 300 clothes_req = 0 -/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/aoe_turf/unearthly_screech/cast(list/targets) usr.audible_message("[usr] lets out a horrible scream!") playsound(usr.loc, 'sound/effects/screech.ogg', 100, 1) @@ -353,7 +352,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) M << "A spike of pain drives into your head and scrambles your thoughts!" M.Weaken(2) M.confused += 10 - M.setEarDamage(M.ear_damage + 3) + M.ear_damage += 3 else if(issilicon(target)) var/mob/living/silicon/S = target S << "ERROR $!(@ ERROR )#^! SENSOR INTERFERENCE DETECTED" @@ -368,7 +367,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) -/obj/effect/proc_holder/spell/aoe_turf/drain_thralls +/obj/effect/proc_holder/spell/wizard/aoe_turf/drain_thralls name = "Drain Thralls" desc = "Damages nearby thralls, draining their life and healing yourself." panel = "Shadowling Abilities" @@ -378,7 +377,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) var/thralls_drained = 0 var/list/nearby_thralls = list() -/obj/effect/proc_holder/spell/aoe_turf/drain_thralls/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/aoe_turf/drain_thralls/cast(list/targets) thralls_drained = 0 nearby_thralls = list() for(var/turf/T in targets) @@ -400,7 +399,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) -/obj/effect/proc_holder/spell/targeted/spatial_relocation +/obj/effect/proc_holder/spell/wizard/targeted/spatial_relocation name = "Spatial Relocation" desc = "Swaps places with a thrall and breaks nearby lights." panel = "Shadowling Abilities" @@ -410,7 +409,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) include_user = 1 var/list/thralls_in_world = list() -/obj/effect/proc_holder/spell/targeted/spatial_relocation/cast(list/targets, distanceoverride) +/obj/effect/proc_holder/spell/wizard/targeted/spatial_relocation/cast(list/targets, distanceoverride) for(var/mob/living/carbon/human/M in world) if(is_thrall(M)) thralls_in_world += M @@ -433,7 +432,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) // ASCENDANT ABILITIES BEYOND THIS POINT // -/obj/effect/proc_holder/spell/targeted/annihilate +/obj/effect/proc_holder/spell/wizard/targeted/annihilate name = "Annihilate" desc = "Gibs a human after a short time." panel = "Ascendant" @@ -441,7 +440,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) charge_max = 300 clothes_req = 0 -/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/targeted/annihilate/cast(list/targets) var/mob/living/simple_animal/ascendant_shadowling/SHA = usr if(SHA.phasing) usr << "You are not in the same plane of existence. Unphase first." @@ -465,7 +464,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) -/obj/effect/proc_holder/spell/targeted/hypnosis +/obj/effect/proc_holder/spell/wizard/targeted/hypnosis name = "Hypnosis" desc = "Instantly enthralls a human." panel = "Ascendant" @@ -473,7 +472,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) charge_max = 450 clothes_req = 0 -/obj/effect/proc_holder/spell/targeted/hypnosis/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/targeted/hypnosis/cast(list/targets) var/mob/living/simple_animal/ascendant_shadowling/SHA = usr if(SHA.phasing) charge_counter = charge_max @@ -506,12 +505,11 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) target << "You can communicate with the other enlightened ones by using the Hivemind Commune ability." ticker.mode.add_thrall(target.mind) target.mind.special_role = "Thrall" - var/datum/mind/thrall_mind = target.mind - thrall_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind + target.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind -/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift +/obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift name = "Phase Shift" desc = "Phases you into the space between worlds at will, allowing you to move through walls and become invisible." panel = "Ascendant" @@ -520,7 +518,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) charge_max = 15 clothes_req = 0 -/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift/cast(list/targets) var/mob/living/simple_animal/ascendant_shadowling/SHA = usr for(SHA in targets) SHA.phasing = !SHA.phasing @@ -537,7 +535,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) -/obj/effect/proc_holder/spell/aoe_turf/glacial_blast +/obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast name = "Glacial Blast" desc = "Extremely empowered version of Flash Freeze." panel = "Ascendant" @@ -545,7 +543,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) charge_max = 600 clothes_req = 0 -/obj/effect/proc_holder/spell/aoe_turf/glacial_blast/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast/cast(list/targets) var/mob/living/simple_animal/ascendant_shadowling/SHA = usr if(SHA.phasing) usr << "You are not in the same plane of existence. Unphase first." @@ -570,7 +568,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) -/obj/effect/proc_holder/spell/targeted/vortex +/obj/effect/proc_holder/spell/wizard/targeted/vortex name = "Vortex" desc = "Tears open a hole in reality. Anyone, INCLUDING YOU, walking through it will be trapped there for eternity." panel = "Ascendant" @@ -579,7 +577,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) charge_max = 1200 clothes_req = 0 -/obj/effect/proc_holder/spell/targeted/vortex/cast(list/targets) +/obj/effect/proc_holder/spell/wizard/targeted/vortex/cast(list/targets) var/mob/living/simple_animal/ascendant_shadowling/SHA = usr if(SHA.phasing) usr << "You are not in the same plane of existence. Unphase first." @@ -593,7 +591,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) -/obj/effect/proc_holder/spell/targeted/shadowling_hivemind_ascendant +/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" @@ -602,7 +600,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) range = -1 include_user = 1 -/obj/effect/proc_holder/spell/targeted/shadowling_hivemind_ascendant/cast(list/targets) +/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) diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm index 683d0a4bb81..e717bb8d6bb 100644 --- a/code/game/gamemodes/shadowling/shadowling_items.dm +++ b/code/game/gamemodes/shadowling/shadowling_items.dm @@ -16,7 +16,7 @@ item_state = "golem" body_parts_covered = FULL_BODY //Shadowlings are immune to space cold_protection = FULL_BODY - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT flags = ABSTRACT | NODROP | THICKMATERIAL slowdown = 0 @@ -74,8 +74,7 @@ origin_tech = null vision_flags = SEE_MOBS darkness_view = 3 - invis_view = 2 - flash_protect = 2 + invisa_view = 2 unacidable = 1 flags = ABSTRACT | NODROP @@ -89,7 +88,7 @@ /obj/structure/shadow_vortex/New() src.audible_message("\The [src] lets out a dismaying screech as dimensional barriers are torn apart!") - playsound(loc, 'sound/effects/supermatter.ogg', 100, 1) + playsound(loc, 'sound/effects/eleczap.ogg', 100, 1) sleep(100) qdel(src) diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 472bee1cd61..b8c106149bc 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -66,7 +66,6 @@ var/mob/living/carbon/human/M = usr M.underwear = "Nude" M.undershirt = "Nude" - M.socks = "Nude" M.faction |= "faithless" usr.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform) @@ -76,15 +75,15 @@ usr.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves) usr.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask) usr.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(usr), slot_glasses) - hardset_dna(usr, null, null, null, null, /datum/species/shadow/ling) //can't be a shadowling without being a shadowling + set_species("Shadowling") sleep(10) usr << "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies." - usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/glare - usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/veil - usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadow_walk - usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/flashfreeze - usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/collective_mind + usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/glare + usr.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/veil + usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadow_walk + usr.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze + usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/collective_mind @@ -141,14 +140,15 @@ for(var/obj/machinery/power/apc/A in world) A.overload_lighting() var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(usr.loc) - usr.mind.spell_list = list() - usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/annihilate - usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/hypnosis - usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_phase_shift - usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/glacial_blast - usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/vortex - usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind_ascendant + usr.spell_list = list() + usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/annihilate + usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/hypnosis + 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 if(A.real_name) A.real_name = usr.real_name @@ -157,5 +157,7 @@ usr.notransform = 1 sleep(50) if(!ticker.mode.shadowling_ascended) - SSshuttle.emergency.request(null, 0.3) + if(emergency_shuttle && emergency_shuttle.can_call()) + emergency_shuttle.call_evac() + emergency_shuttle.launch_time = 0 // Cannot recall qdel(usr) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 43311ce8eb7..ac469958f03 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -442,7 +442,7 @@ src.occupant.loc = src.loc src.icon_state = "pod_0" src.eject_wait = 0 //If it's still set somehow. - domutcheck(src.occupant) //Waiting until they're out before possible monkeyizing. + domutcheck(src.occupant) //Waiting until they're out before possible notransform. src.occupant.add_side_effect("Bad Stomach") // Give them an extra side-effect for free. src.occupant = null diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index a453aea9eb2..a3d862afce6 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -502,10 +502,10 @@ dat += check_role_table("Traitors", ticker.mode.traitors, src) if(ticker.mode.shadows.len) - dat += check_role_table("Shadowlings", ticker.mode.shadowlings, src) + dat += check_role_table("Shadowlings", ticker.mode.shadows, src) if(ticker.mode.thralls.len) - dat += check_role_table("Shadowling Thralls", ticker.thralls, src) + dat += check_role_table("Shadowling Thralls", ticker.mode.thralls, src) if(ticker.mode.vampires.len) dat += check_role_table("Vampires", ticker.mode.vampires, src) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1c3beb5d72f..cb59d0f3282 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -17,13 +17,14 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set "raider" = IS_MODE_COMPILED("heist"), // 1024 / 11 "vampire" = IS_MODE_COMPILED("vampire"), // 2048 / 12 "mutineer" = IS_MODE_COMPILED("mutiny"), // 4096 / 13 - "blob" = IS_MODE_COMPILED("blob") // 8192 / 14 + "blob" = IS_MODE_COMPILED("blob"), // 8192 / 14 "shadowling" = IS_MODE_COMPILED("shadowling") //16384 / 15 ) var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles num2text(BE_PAI) = 0, num2text(BE_TRAITOR) = 7, num2text(BE_CHANGELING) = 14, + num2text(BE_SHADOWLING) = 14, num2text(BE_WIZARD) = 14, num2text(BE_REV) = 14, num2text(BE_VAMPIRE) = 14, diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index cb72116b04a..e6107b4cca2 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -3,7 +3,7 @@ /mob/proc/gib() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -31,7 +31,7 @@ /mob/proc/dust() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -54,7 +54,7 @@ /mob/proc/melt() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 1ae09f9f161..c72220790d1 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -1,7 +1,7 @@ /mob/living/carbon/alien/gib() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -22,7 +22,7 @@ /mob/living/carbon/alien/dust() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index 6990eaa9223..9d49b633990 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -53,7 +53,7 @@ /mob/living/carbon/alien/humanoid/regenerate_icons() ..() - if (monkeyizing) return + if (notransform) return update_inv_head(0,0) update_inv_wear_suit(0,0) diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index 897b03c8a14..24b900a7a2d 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -19,7 +19,7 @@ /mob/living/carbon/brain/gib() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 5c5f877ef74..fbabf1b761b 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -1,7 +1,7 @@ /mob/living/carbon/human/gib() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -37,7 +37,7 @@ /mob/living/carbon/human/dust() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -57,7 +57,7 @@ /mob/living/carbon/human/melt() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 56d0f59048d..747ecbb37d9 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1042,6 +1042,8 @@ number += 1 if(istype(src.glasses, /obj/item/clothing/glasses/hud/health_advanced)) // New blueshield / brig phys no flash medi hud number += 1 + if(istype(src.glasses, /obj/item/clothing/glasses/night/shadowling)) + number += 2 if(istype(src.glasses, /obj/item/clothing/glasses/welding)) var/obj/item/clothing/glasses/welding/W = src.glasses if(!W.up) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 94f4a93d38b..ff4ad8738b0 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -41,7 +41,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc set invisibility = 0 //set background = 1 - if (monkeyizing) return + if (notransform) return if(!loc) return // Fixing a null error that occurs when the mob isn't found in the world -- TLE ..() @@ -254,7 +254,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if (radiation) if (radiation > 100) radiation = 100 - if(!(species.flags & RAD_ABSORB)) + if(!(species.flags & RAD_ABSORB) && !(species.flags & RAD_IMMUNE)) Weaken(10) if(!lying) src << "\red You feel weak." @@ -274,6 +274,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc adjustToxLoss(-(rads)) updatehealth() return + if(species.flags & RAD_IMMUNE) + return var/damage = 0 switch(radiation) @@ -807,6 +809,24 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc //adjustToxLoss(-(light_amount)) adjustOxyLoss(-(light_amount)) //TODO: heal wounds, heal broken limbs. + if(species.flags & REQUIRE_DARK) + var/light_amount = 0 + nutrition = 450 //i aint never get hongry + if(isturf(src.loc)) //Copypasta + var/turf/T = loc + var/area/A = T.loc + if(A) + if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount + else light_amount = 10 + if(light_amount > 2) //Rapid death while in the light, countered by... + take_overall_damage(0,6) + src << "The light burns you!" + src << 'sound/weapons/sear.ogg' + else if (light_amount < 2) //...extreme benefits while in the dark + heal_overall_damage(5,3) + adjustToxLoss(-3) + SetWeakened(0) + SetStunned(0) if(dna && dna.mutantrace == "shadow") var/light_amount = 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 7223899e84e..d037bed10ae 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -485,7 +485,7 @@ proc/get_damage_icon_part(damage_state, body_part) //For legacy support. /mob/living/carbon/human/regenerate_icons() ..() - if(monkeyizing) return + if(notransform) return update_mutations(0) update_mutantrace(0) update_inv_w_uniform(0,0) diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index 6ea67b70c6c..57013309cab 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -9,7 +9,7 @@ set invisibility = 0 //set background = 1 - if (src.monkeyizing) + if (src.notransform) return ..() diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm index 8e982eb9356..0c3ef632cca 100644 --- a/code/modules/mob/living/carbon/monkey/death.dm +++ b/code/modules/mob/living/carbon/monkey/death.dm @@ -1,7 +1,7 @@ /mob/living/carbon/monkey/gib() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -21,7 +21,7 @@ /mob/living/carbon/monkey/dust() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 51162a425ff..7f7ac0d911d 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -12,7 +12,7 @@ /mob/living/carbon/monkey/Life() set invisibility = 0 //set background = 1 - if (monkeyizing) return + if (notransform) return if (update_muts) update_muts=0 domutcheck(src,null,MUTCHK_FORCED) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 2901ae318aa..a1b4e4f37d9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,7 +1,7 @@ /mob/living/Life() ..() - if (monkeyizing) return + if (notransform) return if(!loc) return // Fixing a null error that occurs when the mob isn't found in the world -- TLE if(mind) if(mind in ticker.mode.implanted) diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 45b0268437d..c8c7e41d94e 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -1,7 +1,7 @@ /mob/living/silicon/gib() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -22,7 +22,7 @@ /mob/living/silicon/dust() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 diff --git a/code/modules/mob/living/silicon/mommi/life.dm b/code/modules/mob/living/silicon/mommi/life.dm index eb7aa1dd700..04ab3871af6 100644 --- a/code/modules/mob/living/silicon/mommi/life.dm +++ b/code/modules/mob/living/silicon/mommi/life.dm @@ -2,7 +2,7 @@ set invisibility = 0 set background = 1 - if (src.monkeyizing) + if (src.notransform) return diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index fef353eec6d..c73bf68f1ab 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -1,7 +1,7 @@ /mob/living/silicon/robot/gib() //robots don't die when gibbed. instead they drop their MMI'd brain var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -23,7 +23,7 @@ /mob/living/silicon/robot/dust() death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 3810dba4e34..89391a1717c 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -2,7 +2,7 @@ set invisibility = 0 //set background = 1 - if (src.monkeyizing) + if (src.notransform) return src.blinded = null diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3af5be404dc..ac726058103 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1023,7 +1023,7 @@ var/list/slot_equipment_priority = list( \ if(world.time < client.move_delay) return 0 if(stat==2) return 0 if(anchored) return 0 - if(monkeyizing) return 0 + if(notransform) return 0 if(restrained()) return 0 return 1 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index f26d26d2470..f43759f4279 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -57,7 +57,7 @@ var/disabilities = 0 //Carbon var/atom/movable/pulling = null var/next_move = null - var/monkeyizing = null //Carbon + var/notransform = null //Carbon var/other = 0.0 var/hand = null var/eye_blind = null //Carbon diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 784ae01d668..a50d948dc3b 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -190,7 +190,7 @@ if(isAI(mob)) return AIMove(n,direct,mob) - if(mob.monkeyizing) return//This is sota the goto stop mobs from moving var + if(mob.notransform) return//This is sota the goto stop mobs from moving var if(isliving(mob)) var/mob/living/L = mob diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 04a57404dca..64149efe61a 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -5,14 +5,14 @@ /* /mob/living/carbon/human/proc/monkeyize() - if (monkeyizing) + if (notransform) return for(var/obj/item/W in src) if (W==w_uniform) // will be torn continue unEquip(W) regenerate_icons() - monkeyizing = 1 + notransform = 1 canmove = 0 stunned = 1 icon = null @@ -62,7 +62,7 @@ return ..() /mob/living/carbon/human/AIize(move=1) // 'move' argument needs defining here too because BYOND is dumb - if (monkeyizing) + if (notransform) return for(var/t in organs) del(t) @@ -70,11 +70,11 @@ return ..(move) /mob/living/carbon/AIize() - if (monkeyizing) + if (notransform) return for(var/obj/item/W in src) unEquip(W) - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -178,12 +178,12 @@ //human -> robot /mob/living/carbon/human/proc/Robotize() - if (monkeyizing) + if (notransform) return for(var/obj/item/W in src) unEquip(W) regenerate_icons() - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -236,12 +236,12 @@ //human -> alien /mob/living/carbon/human/proc/Alienize() - if (monkeyizing) + if (notransform) return for(var/obj/item/W in src) unEquip(W) regenerate_icons() - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -267,12 +267,12 @@ return /mob/living/carbon/human/proc/slimeize(adult as num, reproduce as num) - if (monkeyizing) + if (notransform) return for(var/obj/item/W in src) unEquip(W) regenerate_icons() - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -302,12 +302,12 @@ return /mob/living/carbon/human/proc/corgize() - if (monkeyizing) + if (notransform) return for(var/obj/item/W in src) unEquip(W) regenerate_icons() - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 @@ -332,13 +332,13 @@ usr << "\red Sorry but this mob type is currently unavailable." return - if(monkeyizing) + if(notransform) return for(var/obj/item/W in src) unEquip(W) regenerate_icons() - monkeyizing = 1 + notransform = 1 canmove = 0 icon = null invisibility = 101 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 36e0ecaff12..40c9999e84e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -107,6 +107,8 @@ if(user.dna && user.dna.mutantrace == "adamantine") user << "\red Your metal fingers don't fit in the trigger guard!" return + if(user.dna && user.dna.species == "Shadowling") + user << "The muzzle flash would cause damage to your form!" add_fingerprint(user) @@ -128,7 +130,7 @@ if(!in_chamber) return - + if(heavy_weapon) if(user.get_inactive_hand()) recoil = 4 //one-handed kick @@ -154,7 +156,7 @@ user.visible_message("[user] fires [src][reflex ? " by reflex":""]!", \ "You fire [src][reflex ? "by reflex":""]!", \ "You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!") - + if(heavy_weapon) if(user.get_inactive_hand()) if(prob(15)) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index a0b96353d4e..23f44bf19da 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -12,8 +12,8 @@ /obj/item/projectile/change/proc/wabbajack (mob/M as mob in living_mob_list) if(istype(M, /mob/living) && M.stat != DEAD) - if(M.monkeyizing) return - M.monkeyizing = 1 + if(M.notransform) return + M.notransform = 1 M.canmove = 0 M.icon = null M.overlays.Cut() diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 28bdf2961e2..1066c294a13 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -127,8 +127,8 @@ proc/wabbajack(mob/living/M) if(istype(M)) if(istype(M, /mob/living) && M.stat != DEAD) - if(M.monkeyizing) return - M.monkeyizing = 1 + if(M.notransform) return + M.notransform = 1 M.canmove = 0 M.icon = null M.overlays.Cut() diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 09d27ee57dc..13908b9db2d 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -376,8 +376,8 @@ datum if(!M) M = holder.my_atom if(istype(M, /mob/living/carbon) && M.stat != DEAD) M << "\red Your flesh rapidly mutates!" - if(M.monkeyizing) return - M.monkeyizing = 1 + if(M.notransform) return + M.notransform = 1 M.canmove = 0 M.icon = null M.overlays.Cut() diff --git a/code/setup.dm b/code/setup.dm index 6fad89ebc38..dd3f8c6c570 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -832,7 +832,7 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse #define IS_SLOW 4 #define RAD_ABSORB 8 #define NO_SCAN 16 -#define NO_PAIN 32 +#define NO_PAIN 32 #define REQUIRE_LIGHT 64 #define IS_WHITELISTED 128 #define HAS_LIPS 512 @@ -840,8 +840,10 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse #define IS_SYNTHETIC 2048 #define IS_PLANT 4096 #define CAN_BE_FAT 8192 -#define HAS_CHITTIN 16384 -#define NO_INTORGANS 32768 +#define NO_INTORGANS 16384 +#define RAD_IMMUNE 32768 +#define REQUIRE_DARK 65536 + //Species Blood Flags #define BLOOD_SLIME 1 From 6d1096088441d056aefef7655e74b221dde69eed Mon Sep 17 00:00:00 2001 From: DZD Date: Mon, 13 Apr 2015 17:59:53 -0400 Subject: [PATCH 3/9] Minor fixes - Mutetoxin does not exist, replaced with Capulettium Plus in Shadowling's Glare - Makes chrysalis walls actually have sprites. --- code/game/gamemodes/shadowling/shadowling_abilities.dm | 2 +- code/game/objects/effects/aliens.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 7f1311f7cd8..5e9d364ec60 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -26,7 +26,7 @@ target << "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights..." target.Stun(10) if(target.reagents) - target.reagents.add_reagent("mutetoxin", 4) //This is really bad but it's the only way it works. + target.reagents.add_reagent("capulettium_plus", 4) //This is really bad but it's the only way it works. diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index d176161c57d..e1436482f0c 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -51,6 +51,7 @@ name = "chrysalis wall" desc = "Some sort of purple substance in an egglike shape. It pulses and throbs from within and seems impenetrable." health = INFINITY + icon_state = "wall0" /obj/structure/alien/resin/membrane name = "resin membrane" From c7a867ef537cbe0e5ac4ca0406d296f9dfbb2623 Mon Sep 17 00:00:00 2001 From: DZD Date: Fri, 17 Apr 2015 15:28:12 -0400 Subject: [PATCH 4/9] Shadowling Mob Sprites --- icons/mob/human_races/r_shadowling.dmi | Bin 0 -> 1734 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/mob/human_races/r_shadowling.dmi diff --git a/icons/mob/human_races/r_shadowling.dmi b/icons/mob/human_races/r_shadowling.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6add64458a0a0e22f8f99fde76de873be4e59286 GIT binary patch literal 1734 zcmYjSeK^y58~@GBnD>{V&^S9uJ&5#3$u`ANDf9aD^7J4?UShGF9cQ*5Go3nlIT1^f zyd}{_nK*%Ol0zCYLJbARsp`u_2~?CayDjoOR? z06_cjArF55fGJBDpbA$e&S_qdGNFBs26{puLs_b;t7~a#85$Zw0H8$DR05VZ=wyGN z0Dv$v6sc_5QUXtqJ=&1>sQ?IBcW9R0=EHmAMOQQ!E z&c-nu^yG+UvZc>svAt{+vfvm!ni)?nqcu>~wB8aYci3OTM*aN9tJ;^ct{X5{7OOxn zDC44SS-0S92SmgWMj_i+iggyweJX|2*e9A>4>Humbu?Ly z41BDRd)@6Vlfz$LWKREVgQ=`_wYmB0vnAe-j3t*_4^gD@7D?g=j|5&wG%UF3JS*{r zmZP5Z+_B)2053⋓(OY%pwm*=cvV*?S;dy3VJSZ0CZcOx2Yp#uW2GjlkFiKaKWH zNq-<&II+bIWf_-|oY?g*qf(qHtM|#KJKu=C@eD9MvZ(pCZ$_Goi3{# z5=)Vk$DMY1D!bTPyGGCnSBY;0NFjQy~8 zn*F>{q)2?He)r7cV8fsjghnZM{2KDkx^{6D@6+|990)0`Vr9`>gct}D$}=y<{^81Y z`~}usMK(5SQI#Rc@}$HZBMb6ZlrBe-aHqzv`7a?18Gy(=k#!P%aB*$!6_c7G7Y?E#A{6=$Sfbjf>>*oA?UemqjFXI-Kg%z2u_1^S9%p`kpix z#!9PQsJnfMn6yqZ9GZ!K+yaWucZ^r*&njke($$qM&eEfgPH8!2lr37C{w?cqxXR8n+@VY9*=ht$;;e34E3`U^xRo89>7RceEwYK0-Ff%A*S$DDi+;hC8 zIL|SuUFk8g^5-==sNKw!Au|BFf{(jV*P>i)t&LkKhsVk3zvD@?6Q&!2*VTj4bkQ0u zYv=Q45LSYyOx;(Bahy`&4M{vEHIJ;3VPxjVbu-v6()0n`|3G@)yyiC&Bq^o6foMWV zNKAGARsrf+it-#k9pmiGl_>2_hbY&mpE~)q?Xn{+_E?KwBR=nGZX-OyT3~q zA*(^8$0YJL5M9z^fG2Qthq`n@Vx`(!C4L literal 0 HcmV?d00001 From b0eebfaada0365e539743ac59eb29650b0d3ee6f Mon Sep 17 00:00:00 2001 From: DZD Date: Wed, 22 Apr 2015 11:50:50 -0400 Subject: [PATCH 5/9] Shadowling species fixes --- code/game/gamemodes/shadowling/shadowling.dm | 16 ++++--- .../gamemodes/shadowling/shadowling_items.dm | 1 + .../special_shadowling_abilities.dm | 4 +- code/modules/mob/living/carbon/human/life.dm | 41 ++++++++---------- code/modules/mob/living/carbon/species.dm | 3 +- icons/mob/human.dmi | Bin 77314 -> 76003 bytes 6 files changed, 33 insertions(+), 32 deletions(-) diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index ccdfed9baec..308e893cda6 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -225,12 +225,16 @@ Made by Xhuis */ -/datum/species/shadowling +/datum/species/shadow/ling //Normal shadowpeople but with enhanced effects name = "Shadowling" - flags = NO_BREATHE | NO_BLOOD | RAD_IMMUNE | REQUIRE_DARK + + icobase = 'icons/mob/human_races/r_shadowling.dmi' + deform = 'icons/mob/human_races/r_shadowling.dmi' + + light_effect_amp = 1 + blood_color = "#AAAAAA" + flesh_color = "#777777" + + flags = NO_BLOOD | NO_BREATHE | NO_SCAN | NO_INTORGANS burn_mod = 2 //2x burn damage - //heatmod = 2 - blood_color = "#000000" - flesh_color = "#000000" - darksight = 8 diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm index e717bb8d6bb..8b3bc073991 100644 --- a/code/game/gamemodes/shadowling/shadowling_items.dm +++ b/code/game/gamemodes/shadowling/shadowling_items.dm @@ -76,6 +76,7 @@ darkness_view = 3 invisa_view = 2 unacidable = 1 + flash_protect = -1 flags = ABSTRACT | NODROP /obj/structure/shadow_vortex diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index b8c106149bc..0444d1ea422 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -64,8 +64,8 @@ qdel(N) usr.visible_message("The chrysalis explodes in a shower of purple flesh and fluid!") var/mob/living/carbon/human/M = usr - M.underwear = "Nude" - M.undershirt = "Nude" + M.underwear = "None" + M.undershirt = "None" M.faction |= "faithless" usr.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index ae93410656a..f7087f64690 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -260,7 +260,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if (radiation) if (radiation > 100) radiation = 100 - if(!(species.flags & RAD_ABSORB) && !(species.flags & RAD_IMMUNE)) + if(!(species.flags & RAD_ABSORB)) Weaken(10) if(!lying) src << "\red You feel weak." @@ -280,8 +280,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc adjustToxLoss(-(rads)) updatehealth() return - if(species.flags & RAD_IMMUNE) - return var/damage = 0 switch(radiation) @@ -758,24 +756,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc //adjustToxLoss(-(light_amount)) adjustOxyLoss(-(light_amount)) //TODO: heal wounds, heal broken limbs. - if(species.flags & REQUIRE_DARK) - var/light_amount = 0 - nutrition = 450 //i aint never get hongry - if(isturf(src.loc)) //Copypasta - var/turf/T = loc - var/area/A = T.loc - if(A) - if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount - else light_amount = 10 - if(light_amount > 2) //Rapid death while in the light, countered by... - take_overall_damage(0,6) - src << "The light burns you!" - src << 'sound/weapons/sear.ogg' - else if (light_amount < 2) //...extreme benefits while in the dark - heal_overall_damage(5,3) - adjustToxLoss(-3) - SetWeakened(0) - SetStunned(0) if(species.light_dam) var/light_amount = 0 @@ -786,9 +766,24 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount else light_amount = 10 if(light_amount > species.light_dam) //if there's enough light, start dying - take_overall_damage(1,1) + if(species.light_effect_amp) + adjustFireLoss(10) + else + adjustFireLoss(1) + adjustBruteLoss(1) + src << "The light burns you!" + src << 'sound/weapons/sear.ogg' else //heal in the dark - heal_overall_damage(1,1) + if(species.light_effect_amp) + adjustFireLoss(-5) + adjustBruteLoss(-5) + adjustBrainLoss(-25) //gibbering shadowlings are hilarious but also bad to have + adjustCloneLoss(-1) + SetWeakened(0) + SetStunned(0) + else + adjustFireLoss(-1) + adjustBruteLoss(-1) //The fucking FAT mutation is the greatest shit ever. It makes everyone so hot and bothered. diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index ed59445f8b4..fa020cd646b 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -41,7 +41,8 @@ var/brute_mod = null // Physical damage reduction/malus. var/burn_mod = null // Burn damage reduction/malus. - var/light_dam + var/light_dam //Light level above which species takes damage, and below which it heals. + var/light_effect_amp //If 0, takes/heals 1 burn and brute per tick. Otherwise, both healing and damage effects are amplified. var/max_hurt_damage = 9 // Max melee damage dealt + 5 if hulk var/list/default_genes = list() diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index cfa4fbee5e4022709a031b81bb5d693c8f8541ef..de5f30e018b9301a186955a9f985cc447e397f9a 100644 GIT binary patch delta 12502 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 Rc@IF(6J^auWr{CC{|9>pkpln# delta 13383 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 From e916de60a1c030acaf49e8551f535728e4cab40c Mon Sep 17 00:00:00 2001 From: DZD Date: Thu, 23 Apr 2015 12:25:18 -0400 Subject: [PATCH 6/9] Ports tgstation/-tg-station#8927. And fixes a few other things. --- code/__HELPERS/global_lists.dm | 3 +- code/datums/mind.dm | 7 +- code/game/gamemodes/shadowling/shadowling.dm | 79 ++++++++++++++---- .../shadowling/shadowling_abilities.dm | 45 ++++++++-- .../gamemodes/shadowling/shadowling_items.dm | 3 +- .../special_shadowling_abilities.dm | 1 + code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/mob/living/login.dm | 3 + code/stylesheet.dm | 5 ++ icons/mob/mob.dmi | Bin 206140 -> 206295 bytes 10 files changed, 118 insertions(+), 30 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 32bd4f9a823..34082be122e 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -62,7 +62,8 @@ var/global/list/blocked_mobs = list(/mob/living/simple_animal/hostile, /mob/living/simple_animal/hostile/carp/holocarp, /mob/living/simple_animal/hostile/mining_drone, /mob/living/simple_animal/hostile/spaceWorm, - /mob/living/simple_animal/hostile/spaceWorm/wormHead + /mob/living/simple_animal/hostile/spaceWorm/wormHead, + /mob/living/simple_animal/ascendant_shadowling ) //Preferences stuff diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 07741d08633..40032ae5fef 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -965,6 +965,7 @@ datum/mind else if(href_list["shadowling"]) switch(href_list["shadowling"]) if("clear") + ticker.mode.update_shadow_icons_removed(src) current.spell_list = null if(src in ticker.mode.shadows) ticker.mode.shadows -= src @@ -990,9 +991,8 @@ datum/mind 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." - current.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind - current.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/enthrall - current.verbs += /mob/living/carbon/human/proc/shadowling_hatch + ticker.mode.finalize_shadowling(src) + ticker.mode.update_shadow_icons_added(src) if("thrall") if(!ishuman(current)) usr << "This only works on humans!" @@ -1004,7 +1004,6 @@ datum/mind current << "You may use the Hivemind Commune ability to communicate with your fellow enlightened ones." message_admins("[key_name_admin(usr)] has thrall'ed [current].") log_admin("[key_name(usr)] has thrall'ed [current].") - current.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind else if (href_list["monkey"]) var/mob/living/L = current diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 308e893cda6..3def17f9c6e 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -71,7 +71,7 @@ Made by Xhuis /datum/game_mode/shadowling/announce() world << "The current game mode is - Shadowling!" - world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding." + world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding." /datum/game_mode/shadowling/pre_setup() if(config.protect_roles_from_antagonist) @@ -115,6 +115,7 @@ Made by Xhuis /datum/game_mode/proc/greet_shadow(var/datum/mind/shadow) shadow.current << "Currently, you are disguised as an employee aboard [world.name]." shadow.current << "In your limited state, you have three abilities: Enthrall, Hatch, and Hivemind Commune." + shadow.current << "Any other shadowlings are you allies. You must assist them as they shall assist you." shadow.current << "If you are new to shadowling, or want to read about abilities, check the wiki page at https://tgstation13.org/wiki/Shadowling
" @@ -132,17 +133,25 @@ Made by Xhuis var/mob/living/carbon/human/S = shadow_mind.current shadow_mind.current.verbs += /mob/living/carbon/human/proc/shadowling_hatch S.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/enthrall - S.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind - if(shadow_mind.assigned_role == "Clown") - S << "Your alien nature has allowed you to overcome your clownishness." - S.mutations.Remove(CLUMSY) + spawn(0) + shadow_mind.current.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind + update_shadow_icons_added(shadow_mind) + if(shadow_mind.assigned_role == "Clown") + S << "Your alien nature has allowed you to overcome your clownishness." + S.mutations.Remove(CLUMSY) /datum/game_mode/proc/add_thrall(datum/mind/new_thrall_mind) if (!istype(new_thrall_mind)) return 0 if(!(new_thrall_mind in shadowling_thralls)) shadowling_thralls += new_thrall_mind + update_shadow_icons_added(new_thrall_mind) new_thrall_mind.current.attack_log += "\[[time_stamp()]\] Became a thrall" + new_thrall_mind.memory += "The Shadowlings' Objectives: 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 << "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.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind return 1 @@ -176,11 +185,11 @@ Made by Xhuis /datum/game_mode/shadowling/declare_completion() if(check_shadow_victory() && emergency_shuttle.returned()) //Doesn't end instantly - this is hacky and I don't know of a better way ~X - world << "The shadowlings have ascended and taken over the station!" + world << "The shadowlings have ascended and taken over the station!" else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round - world << "The shadowlings have been killed by the crew!" + world << "The shadowlings have been killed by the crew!" else if(!check_shadow_victory() && emergency_shuttle.returned()) - world << "The crew has escaped the station before the shadowlings could ascend!" + world << "The crew has escaped the station before the shadowlings could ascend!" ..() return 1 @@ -188,7 +197,7 @@ Made by Xhuis /datum/game_mode/proc/auto_declare_completion_shadowling() var/text = "" if(shadows.len) - text += "
The shadowlings were:" + text += "
The shadowlings were:" for(var/datum/mind/shadow in shadows) text += "
[shadow.key] was [shadow.name] (" if(shadow.current) @@ -201,8 +210,9 @@ Made by Xhuis else text += "body destroyed" text += ")" + text += "
" if(shadowling_thralls.len) - text += "
The thralls were:" + text += "
The thralls were:" for(var/datum/mind/thrall in shadowling_thralls) text += "
[thrall.key] was [thrall.name] (" if(thrall.current) @@ -214,8 +224,6 @@ Made by Xhuis text += " as [thrall.current.real_name]" else text += "body destroyed" - else - world << "Round-end code broke! Please report this and its circumstances on GitHub at https://github.com/ParadiseSS13/Paradise/issues" text += "
" world << text @@ -233,8 +241,51 @@ Made by Xhuis deform = 'icons/mob/human_races/r_shadowling.dmi' light_effect_amp = 1 - blood_color = "#AAAAAA" - flesh_color = "#777777" + blood_color = "#555555" + flesh_color = "#222222" flags = NO_BLOOD | NO_BREATHE | NO_SCAN | NO_INTORGANS burn_mod = 2 //2x burn damage + +/datum/game_mode/proc/update_shadow_icons_added(datum/mind/shadow_mind) + spawn(0) + for(var/datum/mind/shadowling in shadows) + if(shadowling.current) + if(shadowling.current.client) + var/I = image('icons/mob/mob.dmi', loc = shadowling.current, icon_state = "shadowling") + shadowling.current.client.images += I + if(shadow_mind.current) + if(shadow_mind.current.client) + var/image/J = image('icons/mob/mob.dmi', loc = shadowling.current, icon_state = "shadowling") + shadow_mind.current.client.images += J + for(var/datum/mind/thrall in shadowling_thralls) + if(thrall.current) + if(thrall.current.client) + var/I = image('icons/mob/mob.dmi', loc = thrall.current, icon_state = "thrall") + thrall.current.client.images += I + if(shadow_mind.current) + if(shadow_mind.current.client) + var/image/J = image('icons/mob/mob.dmi', loc = thrall.current, icon_state = "thrall") + shadow_mind.current.client.images += J + +/datum/game_mode/proc/update_shadow_icons_removed(datum/mind/shadow_mind) + spawn(0) + for(var/datum/mind/shadowling in shadows) + if(shadowling.current) + if(shadowling.current.client) + for(var/image/I in shadowling.current.client.images) + if((I.icon_state == "thrall" || I.icon_state == "shadowling") && I.loc == shadow_mind.current) + del(I) + + for(var/datum/mind/thrall in thralls) + if(thrall.current) + if(thrall.current.client) + for(var/image/I in thrall.current.client.images) + if((I.icon_state == "thrall" || I.icon_state == "shadowling") && I.loc == shadow_mind.current) + del(I) + + if(shadow_mind.current) + if(shadow_mind.current.client) + for(var/image/I in shadow_mind.current.client.images) + if(I.icon_state == "thrall" || I.icon_state == "shadowling") + del(I) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 5e9d364ec60..f7bfdc5e738 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -21,7 +21,7 @@ usr.visible_message("[usr]'s eyes flash a blinding red!") target.visible_message("[target] freezes in place, their eyes glazing over...") if(in_range(target, usr)) - target << "Your gaze is forcibly drawn into [src]'s eyes, and you are mesmerized by the heavenly lights..." + target << "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights..." else //Only alludes to the shadowling if the target is close by target << "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights..." target.Stun(10) @@ -53,9 +53,26 @@ L.on = 0 L.visible_message("[L] flickers and falls dark.") L.update(0) - for(var/obj/item/device/pda/P in orange(5, usr)) + for(var/obj/item/device/pda/P in T.contents) P.fon = 0 - P.SetLuminosity(0) //failsafe + P.SetLuminosity(0) + for(var/obj/effect/glowshroom/G in orange(2, usr)) //Very small radius + G.visible_message("\The [G] withers away!") + qdel(G) + for(var/mob/living/carbon/human/H in T.contents) + for(var/obj/item/device/flashlight/F in H) + if(is_type_in_list(F, blacklisted_lights)) + F.visible_message("[F] goes slightly dim for a moment.") + return + F.on = 0 + F.visible_message("[F] gutters and falls dark.") + F.update_brightness() + for(var/obj/item/device/pda/P in H) + P.fon = 0 + P.SetLuminosity(0) //failsafe + 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. @@ -164,11 +181,23 @@ usr.visible_message("[usr] leans over [target], their eyes glowing a deep crimson, and stares into their face.") target << "Your gaze is forcibly drawn into a blinding red light. You fall to the floor as conscious thought is wiped away." target.Weaken(12) + sleep(20) + if(isloyal(target)) + usr << "They are enslaved by Nanotrasen. You begin to shut down the nanobot implant - this will take some time." + usr.visible_message("[usr] halts for a moment, then begins passing its hand over [target]'s body.") + target << "You feel your loyalties begin to weaken!" + sleep(150) //15 seconds - not spawn() so the enthralling takes longer + usr << "The nanobots composing the loyalty implant have been rendered inert. Now to continue." + usr.visible_message("[usr] halts thier hand and resumes staring into [target]'s face.") + for(var/obj/item/weapon/implant/loyalty/L in target) + if(L && L.implanted) + qdel(L) + target << "Your unwavering loyalty to Nanotrasen falters, dims, dies." if(3) usr << "You begin rearranging [target]'s memories." usr.visible_message("[usr]'s eyes flare brightly, and a horrible grin begins to spread across [target]'s face...") target << "Your head cries out. The veil of reality begins to crumple and something evil bleeds through." //Ow the edge - if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling + if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a loyalty implant usr << "The enthralling has been interrupted - your target's mind returns to its previous state." target << "Your thoughts become coherent once more. Already you can barely remember what's happened to you." enthralling = 0 @@ -183,8 +212,6 @@ target.adjustOxyLoss(-200) //In case the shadowling was choking them out ticker.mode.add_thrall(target.mind) target.mind.special_role = "Thrall" - target.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind //Lets thralls hive-chat - /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind @@ -253,7 +280,7 @@ user << "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies." user.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/unearthly_screech - if(thralls >= 10 && !thrall_swap_acquired) + if(thralls >= 9 && !thrall_swap_acquired) thrall_swap_acquired = 1 user << "The power of your thralls has granted you the Spatial Relocation ability. This will, allow you to instantly swap places with one of your thralls in \ addition to shattering nearby lights." @@ -363,7 +390,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) sp.start() S.Weaken(6) for(var/obj/structure/window/W in T.contents) - W.hit(rand(25,50)) + W.hit(rand(50,100)) @@ -447,7 +474,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) charge_counter = charge_max return - for(var/mob/boom in targets) + for(var/mob/living/carbon/human/boom in targets) if(is_shadow_or_thrall(boom)) usr << "Making an ally explode seems unwise." charge_counter = charge_max diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm index 8b3bc073991..fcb84062c5e 100644 --- a/code/game/gamemodes/shadowling/shadowling_items.dm +++ b/code/game/gamemodes/shadowling/shadowling_items.dm @@ -4,6 +4,7 @@ item_state = "golem" origin_tech = null icon_state = "golem" + _color = "golem" flags = ABSTRACT | NODROP has_sensor = 0 unacidable = 1 @@ -46,7 +47,7 @@ /obj/item/clothing/gloves/shadowling name = "chitin hands" - desc = "An electricity-resistant yet thin covering of the hands." + desc = "An electricity-resistant covering of the hands." icon_state = "golem" item_state = null origin_tech = null diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 0444d1ea422..dba7f327eb6 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -160,4 +160,5 @@ if(emergency_shuttle && emergency_shuttle.can_call()) emergency_shuttle.call_evac() emergency_shuttle.launch_time = 0 // Cannot recall + ticker.mode.shadowling_ascended = 1 qdel(usr) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index f7087f64690..d21ab41af2c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -767,7 +767,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc else light_amount = 10 if(light_amount > species.light_dam) //if there's enough light, start dying if(species.light_effect_amp) - adjustFireLoss(10) + adjustFireLoss(5) //This gets doubled by Shadowling's innate fire weakness, so it ends up being 10. else adjustFireLoss(1) adjustBruteLoss(1) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index b349e3b15f7..35d7f3293ed 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -27,4 +27,7 @@ if("vampire") if((ref in ticker.mode.thralls) || (mind in ticker.mode.enthralled)) ticker.mode.update_vampire_icons_added(mind) + if("shadowling") + if((src.mind in ticker.mode.shadowling_thralls) || (src.mind in ticker.mode.shadows)) + ticker.mode.update_shadow_icons_added(src.mind) return . diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 88a1a397929..281b4c7abe4 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -92,6 +92,11 @@ h1.alert, h2.alert {color: #000000;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .interface {color: #330033;} + +.big {font-size: 3;} +.greentext {color: #00FF00; font-size: 3;} +.redtext {color: #FF0000; font-size: 3;} + BIG IMG.icon {width: 32px; height: 32px;} diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 2617ee6d723a0fbc318a470783e1b909ffd4ff4f..2a003edd4f0e3e18c8771d6808a7acc4dc2521e5 100644 GIT binary patch delta 18110 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%0AcclDXz%YDM)Fm{G;80 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 Dj&Dud delta 17980 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 Date: Wed, 29 Apr 2015 19:28:42 -0400 Subject: [PATCH 7/9] Changes, hellish runtimes - Shadowling hivemind is a language - Fixes shadowling HUD - Changes to gamemode to allow for testing. - Creates runtimes because BYOND is shit. --- code/datums/mind.dm | 8 ++++++ code/game/gamemodes/shadowling/shadowling.dm | 24 +++++++++--------- .../shadowling/shadowling_abilities.dm | 25 ++----------------- code/modules/mob/language.dm | 8 ++++++ .../mob/living/carbon/brain/brain_item.dm | 2 +- .../mob/living/carbon/brain/posibrain.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 2 ++ code/modules/mob/living/login.dm | 2 +- code/modules/mob/mob.dm | 2 +- code/stylesheet.dm | 3 +-- 10 files changed, 37 insertions(+), 41 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 40032ae5fef..829551b9fcc 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -976,9 +976,17 @@ datum/mind log_admin("[key_name(usr)] has de-shadowling'ed [current].") current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch current.verbs -= /mob/living/carbon/human/proc/shadowling_ascendance + if(current.languages) + for(var/datum/language/L in current.languages) + if(L.name == "Shadowling Hivemind") + del(L) else if(src in ticker.mode.shadowling_thralls) ticker.mode.shadowling_thralls -= src special_role = null + if(current.languages) + for(var/datum/language/L in current.languages) + if(L.name == "Shadowling Hivemind") + del(L) current << "You have been brainwashed! You are no longer a thrall!" message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") log_admin("[key_name(usr)] has de-thrall'ed [current].") diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 3def17f9c6e..bc2e69fda84 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -63,9 +63,9 @@ Made by Xhuis /datum/game_mode/shadowling name = "shadowling" config_tag = "shadowling" - required_players = 30 - required_enemies = 2 - recommended_enemies = 2 + required_players = 1 + required_enemies = 1 + recommended_enemies = 1 restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") @@ -87,7 +87,7 @@ Made by Xhuis if(player.assigned_role == job) possible_shadowlings -= player - var/shadowlings = 2 //How many shadowlings there are; hardcoded to 2 + var/shadowlings = 1 //How many shadowlings there are; hardcoded to 2 while(shadowlings) var/datum/mind/shadow = pick(possible_shadowlings) @@ -114,9 +114,9 @@ Made by Xhuis /datum/game_mode/proc/greet_shadow(var/datum/mind/shadow) shadow.current << "Currently, you are disguised as an employee aboard [world.name]." - shadow.current << "In your limited state, you have three abilities: Enthrall, Hatch, and Hivemind Commune." - shadow.current << "Any other shadowlings are you allies. You must assist them as they shall assist you." - shadow.current << "If you are new to shadowling, or want to read about abilities, check the wiki page at https://tgstation13.org/wiki/Shadowling
" + shadow.current << "In your limited state, you have three abilities: Enthrall, Hatch, and Shadowling Hivemind (:8)." + shadow.current << "Any other shadowlings are your allies. You must assist them as they shall assist you." + shadow.current << "If you are new to shadowling, or want to read about abilities, check the wiki page at http://nanotrasen.se/wiki/index.php/Shadowling
" /datum/game_mode/proc/process_shadow_objectives(var/datum/mind/shadow_mind) @@ -134,7 +134,7 @@ Made by Xhuis shadow_mind.current.verbs += /mob/living/carbon/human/proc/shadowling_hatch S.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/enthrall spawn(0) - shadow_mind.current.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind + shadow_mind.current.add_language("Shadowling Hivemind") update_shadow_icons_added(shadow_mind) if(shadow_mind.assigned_role == "Clown") S << "Your alien nature has allowed you to overcome your clownishness." @@ -151,7 +151,7 @@ Made by Xhuis This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability." 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.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind + new_thrall_mind.current.add_language("Shadowling Hivemind") return 1 @@ -250,9 +250,9 @@ Made by Xhuis /datum/game_mode/proc/update_shadow_icons_added(datum/mind/shadow_mind) spawn(0) for(var/datum/mind/shadowling in shadows) - if(shadowling.current) + if(shadowling.current && shadowling != shadow_mind) if(shadowling.current.client) - var/I = image('icons/mob/mob.dmi', loc = shadowling.current, icon_state = "shadowling") + var/I = image('icons/mob/mob.dmi', loc = shadow_mind.current, icon_state = "thrall") shadowling.current.client.images += I if(shadow_mind.current) if(shadow_mind.current.client) @@ -261,7 +261,7 @@ Made by Xhuis for(var/datum/mind/thrall in shadowling_thralls) if(thrall.current) if(thrall.current.client) - var/I = image('icons/mob/mob.dmi', loc = thrall.current, icon_state = "thrall") + var/I = image('icons/mob/mob.dmi', loc = shadow_mind.current, icon_state = "thrall") thrall.current.client.images += I if(shadow_mind.current) if(shadow_mind.current.client) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index f7bfdc5e738..3260d8e5245 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -213,27 +213,6 @@ ticker.mode.add_thrall(target.mind) target.mind.special_role = "Thrall" - -/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind - name = "Hivemind Commune" - desc = "Allows you to silently communicate with all other shadowlings and thralls." - panel = "Shadowling Abilities" - charge_max = 25 - clothes_req = 0 - range = -1 - include_user = 1 - -/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind/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 - for(var/mob/M in mob_list) - if(is_shadow_or_thrall(M) || (M in dead_mob_list)) - M << "\[Hive Chat\] [usr.real_name]: [text]" - - - /obj/effect/proc_holder/spell/wizard/targeted/collective_mind name = "Collective Hivemind" desc = "Gathers the power of all of your thralls and compares it to what is needed for ascendance. Also gains you new abilities." @@ -529,10 +508,10 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) target << "And 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)." ticker.mode.add_thrall(target.mind) target.mind.special_role = "Thrall" - target.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind + target.add_language("Shadowling Hivemind") diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index fa5725faf19..2853b2db169 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -356,6 +356,14 @@ key = "g" flags = RESTRICTED | HIVEMIND +/datum/language/shadowling + name = "Shadowling Hivemind" + desc = "Shadowlings and their thralls are capable of communicating over a psychic hivemind." + speech_verb = "says" + colour = "shadowling" + key = "8" + flags = RESTRICTED | HIVEMIND + /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/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 18b440e538a..cf6b4b9bae1 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -23,7 +23,7 @@ /obj/item/organ/brain/New() ..() spawn(5) - if(brainmob && brainmob.client) + if(brainmob && brainmob.client) //This is runtiming too. What the fuck? "runtime error: undefined variable /obj/item/organ/brain/var/client" BUT YOU'RE SUPPOSED TO BE CHECKING THE BRAINMOB. brainmob.client.screen.len = null //clear the hud /obj/item/organ/brain/proc/transfer_identity(var/mob/living/carbon/H) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 0b080d19738..76f15657886 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -172,7 +172,7 @@ src.brainmob = new(src) src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" - src.brainmob.real_name = src.brainmob.name + src.brainmob.real_name = src.brainmob.name //WHY THE FUCK IS THIS RUNTIMING? "Undefined variable /obj/item/device/mmi/posibrain/var/real_name" WHY ARE YOU CHECKING THE POSIBRAIN AND NOT THE BRAINMOB?! src.brainmob.loc = src src.brainmob.container = src src.brainmob.robot_talk_understand = 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 11342b903ca..52c5cfbd939 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1400,6 +1400,8 @@ regenerate_icons() fixblood() + UpdateAppearance() + if(species) return 1 else diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 35d7f3293ed..ad322fb81d1 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -28,6 +28,6 @@ if((ref in ticker.mode.thralls) || (mind in ticker.mode.enthralled)) ticker.mode.update_vampire_icons_added(mind) if("shadowling") - if((src.mind in ticker.mode.shadowling_thralls) || (src.mind in ticker.mode.shadows)) + if((mind in ticker.mode.shadowling_thralls) || (mind in ticker.mode.shadows)) ticker.mode.update_shadow_icons_added(src.mind) return . diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index ac726058103..bace5337085 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -988,7 +988,7 @@ var/list/slot_equipment_priority = list( \ if(mind && mind.changeling) add_stings_to_statpanel(mind.changeling.purchasedpowers) - if(spell_list && spell_list.len) + if(spell_list && spell_list.len) //YAY RUNTIMES "runtime error: undefined variable /obj/effect/proc_holder/spell/wizard/targeted/enthrall/var/len" BYOND is fucking up references for some reason. This one breaks admin-made shadowlings. for(var/obj/effect/proc_holder/spell/wizard/S in spell_list) switch(S.charge_type) if("recharge") diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 281b4c7abe4..82a6d814154 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -61,8 +61,6 @@ h1.alert, h2.alert {color: #000000;} .notice {color: #000099;} .boldnotice {color: #000099; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} -.shadowling {color: #311648;} - .newscaster {color: #800000;} .ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} @@ -85,6 +83,7 @@ h1.alert, h2.alert {color: #000000;} .kidan {color: #664205;} .slime {color: #0077AA;} .clown {color: #ff0000;} +.shadowling {color: #311648;} .rough {font-family: "Trebuchet MS", cursive, sans-serif;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .sans {font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} From 7e99d67587172d95b8e7ee04b411f138f81fd8a9 Mon Sep 17 00:00:00 2001 From: DZD Date: Thu, 30 Apr 2015 20:11:12 -0400 Subject: [PATCH 8/9] Fixes runtimes YES YES! --- code/datums/mind.dm | 4 ++-- .../special_shadowling_abilities.dm | 4 +++- .../mob/living/carbon/brain/brain_item.dm | 4 ++-- .../mob/living/carbon/brain/posibrain.dm | 22 +++++++++---------- code/modules/mob/mob.dm | 2 +- 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 829551b9fcc..5db7e620325 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -966,12 +966,12 @@ datum/mind switch(href_list["shadowling"]) if("clear") ticker.mode.update_shadow_icons_removed(src) - current.spell_list = null + current.spell_list.Cut() if(src in ticker.mode.shadows) ticker.mode.shadows -= src special_role = null current << "Your powers have been quenched! You are no longer a shadowling!" - current.spell_list = null + current.spell_list.Cut() message_admins("[key_name_admin(usr)] has de-shadowling'ed [current].") log_admin("[key_name(usr)] has de-shadowling'ed [current].") current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index dba7f327eb6..4dd5ff26b68 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -19,6 +19,8 @@ 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) sleep(50) var/turf/simulated/floor/F @@ -31,7 +33,7 @@ usr.visible_message("A chrysalis forms around [usr], sealing them inside.", \ "You create your chrysalis and begin to contort within.") - + usr.Weaken(30) sleep(100) usr.visible_message("The skin on [usr]'s back begins to split apart. Black spines slowly emerge from the divide.", \ "Spines pierce your back. Your claws break apart your fingers. You feel excruciating pain as your true form begins its exit.") diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index cf6b4b9bae1..5ad58df488f 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -23,8 +23,8 @@ /obj/item/organ/brain/New() ..() spawn(5) - if(brainmob && brainmob.client) //This is runtiming too. What the fuck? "runtime error: undefined variable /obj/item/organ/brain/var/client" BUT YOU'RE SUPPOSED TO BE CHECKING THE BRAINMOB. - brainmob.client.screen.len = null //clear the hud + for(var/mob/living/carbon/brain/bmob in src) //I'm going to hell for this, but there's no other way to stop these runtimes. + bmob.client.screen.len = null //clear the hud /obj/item/organ/brain/proc/transfer_identity(var/mob/living/carbon/H) name = "\the [H]'s [initial(src.name)]" diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 76f15657886..8540507d057 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -169,17 +169,17 @@ ..() /obj/item/device/mmi/posibrain/New() - - src.brainmob = new(src) - src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" - src.brainmob.real_name = src.brainmob.name //WHY THE FUCK IS THIS RUNTIMING? "Undefined variable /obj/item/device/mmi/posibrain/var/real_name" WHY ARE YOU CHECKING THE POSIBRAIN AND NOT THE BRAINMOB?! - src.brainmob.loc = src - src.brainmob.container = src - src.brainmob.robot_talk_understand = 1 - src.brainmob.stat = 0 - src.brainmob.silent = 0 - src.brainmob.brain_op_stage = 4.0 - dead_mob_list -= src.brainmob + for(var/mob/living/carbon/brain/bmob in src) //Also going to hell for this, but this should fix the runtimes. + bmob = new /mob/living/carbon/brain(src) + bmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" + bmob.real_name = src.brainmob.name + bmob.loc = src + bmob.container = src + bmob.robot_talk_understand = 1 + bmob.stat = 0 + bmob.silent = 0 + bmob.brain_op_stage = 4.0 + dead_mob_list -= bmob ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index bace5337085..ac726058103 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -988,7 +988,7 @@ var/list/slot_equipment_priority = list( \ if(mind && mind.changeling) add_stings_to_statpanel(mind.changeling.purchasedpowers) - if(spell_list && spell_list.len) //YAY RUNTIMES "runtime error: undefined variable /obj/effect/proc_holder/spell/wizard/targeted/enthrall/var/len" BYOND is fucking up references for some reason. This one breaks admin-made shadowlings. + if(spell_list && spell_list.len) for(var/obj/effect/proc_holder/spell/wizard/S in spell_list) switch(S.charge_type) if("recharge") From ccfa32e4c5c33fcda1bf7588a14b2466430e6faf Mon Sep 17 00:00:00 2001 From: DZD Date: Mon, 4 May 2015 19:28:12 -0400 Subject: [PATCH 9/9] Gamemode tweaks Reverts required_players and number of shadowlings back to their original values, as they were changed for testing. --- code/game/gamemodes/shadowling/shadowling.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index bc2e69fda84..51cf619fb12 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -63,9 +63,9 @@ Made by Xhuis /datum/game_mode/shadowling name = "shadowling" config_tag = "shadowling" - required_players = 1 - required_enemies = 1 - recommended_enemies = 1 + required_players = 30 + required_enemies = 2 + recommended_enemies = 2 restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") @@ -87,7 +87,7 @@ Made by Xhuis if(player.assigned_role == job) possible_shadowlings -= player - var/shadowlings = 1 //How many shadowlings there are; hardcoded to 2 + var/shadowlings = 2 //How many shadowlings there are; hardcoded to 2 while(shadowlings) var/datum/mind/shadow = pick(possible_shadowlings)