diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 52e324bd76..c2d3256e59 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -154,3 +154,5 @@ #define JUDGE_IGNOREMONKEYS 16 #define MEGAFAUNA_DEFAULT_RECOVERY_TIME 5 + +#define SHADOW_SPECIES_LIGHT_THRESHOLD 0.2 \ No newline at end of file diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index acae2764ae..642a7ffc3a 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -30,7 +30,7 @@ GLOBAL_LIST_EMPTY(PDAs) //Secondary variables var/scanmode = 0 //1 is medical scanner, 2 is forensics, 3 is reagent scanner. var/fon = 0 //Is the flashlight function on? - var/f_lum = 3 //Luminosity for the flashlight function + var/f_lum = 2.3 //Luminosity for the flashlight function var/silent = 0 //To beep or not to beep, that is the question var/toff = 0 //If 1, messenger disabled var/tnote = null //Current Texts @@ -352,9 +352,9 @@ GLOBAL_LIST_EMPTY(PDAs) if(fon) fon = 0 set_light(0) - else + else if(f_lum) fon = 1 - set_light(2.3) + set_light(f_lum) update_icon() if("Medical Scan") if(scanmode == 1) diff --git a/code/game/sound.dm b/code/game/sound.dm index a7db2439b0..714f8ff5b2 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -146,6 +146,7 @@ soundin = pick('sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg') if ("can_open") soundin = pick('sound/effects/can_open1.ogg', 'sound/effects/can_open2.ogg', 'sound/effects/can_open3.ogg') +<<<<<<< HEAD if ("struggle_sound") soundin = pick( 'sound/vore/pred/struggle_01.ogg','sound/vore/pred/struggle_02.ogg','sound/vore/pred/struggle_03.ogg', 'sound/vore/pred/struggle_04.ogg','sound/vore/pred/struggle_05.ogg') @@ -176,4 +177,8 @@ 'sound/vore/prey/death_04.ogg','sound/vore/prey/death_05.ogg','sound/vore/prey/death_06.ogg', 'sound/vore/prey/death_07.ogg','sound/vore/prey/death_08.ogg','sound/vore/prey/death_09.ogg', 'sound/vore/prey/death_10.ogg') +======= + if("bullet_miss") + soundin = pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg') +>>>>>>> 35279a3... Nightmare (#30415) return soundin diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 3d30a3e1c1..183e90595e 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /datum/species/shadow // Humans cursed to stay in the darkness, lest their life forces drain. They regain health in shadow and die in light. name = "???" @@ -21,3 +22,120 @@ H.take_overall_damage(1,1) else if (light_amount < 0.2) //heal in the dark H.heal_overall_damage(1,1) +======= +/datum/species/shadow + // Humans cursed to stay in the darkness, lest their life forces drain. They regain health in shadow and die in light. + name = "???" + id = "shadow" + sexes = 0 + blacklisted = 1 + ignored_by = list(/mob/living/simple_animal/hostile/faithless) + meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/shadow + species_traits = list(NOBREATH,NOBLOOD,RADIMMUNE,VIRUSIMMUNE) + + dangerous_existence = 1 + mutanteyes = /obj/item/organ/eyes/night_vision + + +/datum/species/shadow/spec_life(mob/living/carbon/human/H) + var/turf/T = H.loc + if(istype(T)) + var/light_amount = T.get_lumcount() + + if(light_amount > SHADOW_SPECIES_LIGHT_THRESHOLD) //if there's enough light, start dying + H.take_overall_damage(1,1) + else if (light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) //heal in the dark + H.heal_overall_damage(1,1) + + +/datum/species/shadow/nightmare + name = "Nightmare" + id = "nightmare" + limbs_id = "shadow" + burnmod = 1.5 + blacklisted = TRUE + no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store) + species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOHUNGER) + mutanteyes = /obj/item/organ/eyes/night_vision/nightmare + var/obj/effect/proc_holder/spell/targeted/shadowwalk/shadowwalk + + var/info_text = "You are a Nightmare. The ability shadow walk allows unlimited, unrestricted movement in the dark using. \ + Your light eater will destroy any light producing objects you attack, as well as destroy any lights a living creature may be holding. You will automatically dodge gunfire and melee attacks when on a dark tile." + +/datum/species/shadow/nightmare/on_species_gain(mob/living/carbon/C, datum/species/old_species) + . = ..() + var/obj/effect/proc_holder/spell/targeted/shadowwalk/SW = new + C.AddSpell(SW) + shadowwalk = SW + var/obj/item/light_eater/blade = new + C.put_in_hands(blade) + + to_chat(C, "[info_text]") + + C.real_name = "Nightmare" + C.name = "Nightmare" + if(C.mind) + C.mind.name = "Nightmare" + C.dna.real_name = "Nightmare" + +/datum/species/shadow/nightmare/on_species_loss(mob/living/carbon/C) + . = ..() + if(shadowwalk) + C.RemoveSpell(shadowwalk) + +/datum/species/shadow/nightmare/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H) + var/turf/T = H.loc + if(istype(T)) + var/light_amount = T.get_lumcount() + if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) + H.visible_message("[H] dances in the shadows, evading [P]!") + playsound(T, "bullet_miss", 75, 1) + return -1 + return 0 + +/obj/item/light_eater + name = "light eater" + icon_state = "arm_blade" + item_state = "arm_blade" + force = 25 + armour_penetration = 35 + lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' + righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' + flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1 + w_class = WEIGHT_CLASS_HUGE + sharpness = IS_SHARP + +/obj/item/light_eater/afterattack(atom/movable/AM, mob/user, proximity) + if(!proximity) + return + if(isopenturf(AM)) //So you can actually melee with it + return + if(isliving(AM)) + var/mob/living/L = AM + if(iscyborg(AM)) + var/mob/living/silicon/robot/borg = AM + borg.update_headlamp(TRUE, 100) + else + for(var/obj/item/O in AM) + if(O.light_range && O.light_power) + disintegrate(O) + if(L.pulling && L.pulling.light_range && isitem(L.pulling)) + disintegrate(L.pulling) + else if(isitem(AM)) + var/obj/item/I = AM + if(I.light_range && I.light_power) + disintegrate(I) + +/obj/item/light_eater/proc/disintegrate(obj/item/O) + if(istype(O, /obj/item/device/pda)) + var/obj/item/device/pda/PDA = O + PDA.set_light(0) + PDA.fon = 0 + PDA.f_lum = 0 + PDA.update_icon() + visible_message("The light in [PDA] shorts out!") + else + visible_message("[O] is disintegrated by [src]!") + O.burn() + playsound(src, 'sound/items/welder.ogg', 50, 1) +>>>>>>> 35279a3... Nightmare (#30415) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 644f845901..09d2570b72 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -72,7 +72,7 @@ var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting. var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power. - var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled. + var/lamp_cooldown = 0 //Flag for if the lamp is on cooldown after being forcibly disabled. var/sight_mode = 0 hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD) @@ -742,7 +742,7 @@ set_autosay() /mob/living/silicon/robot/proc/control_headlamp() - if(stat || lamp_recharging || low_power_mode) + if(stat || lamp_cooldown > world.time || low_power_mode) to_chat(src, "This function is currently offline.") return @@ -757,8 +757,7 @@ if(lamp_intensity && (turn_off || stat || low_power_mode)) to_chat(src, "Your headlamp has been deactivated.") lamp_intensity = 0 - lamp_recharging = TRUE - addtimer(CALLBACK(src, .proc/reset_headlamp), cooldown) + lamp_cooldown = world.time + cooldown else set_light(lamp_intensity) @@ -767,9 +766,6 @@ update_icons() -/mob/living/silicon/robot/proc/reset_headlamp() - lamp_recharging = FALSE - /mob/living/silicon/robot/proc/deconstruct() var/turf/T = get_turf(src) if (robot_suit) diff --git a/code/modules/spells/spell_types/shadow_walk.dm b/code/modules/spells/spell_types/shadow_walk.dm index 546b960793..45ea521098 100644 --- a/code/modules/spells/spell_types/shadow_walk.dm +++ b/code/modules/spells/spell_types/shadow_walk.dm @@ -13,7 +13,7 @@ action_icon_state = "ninja_cloak" action_background_icon_state = "bg_alien" -/obj/effect/proc_holder/spell/targeted/shadowwalk/cast(list/targets,mob/user = usr) +/obj/effect/proc_holder/spell/targeted/shadowwalk/cast(list/targets,mob/living/user = usr) var/L = user.loc if(istype(user.loc, /obj/effect/dummy/shadow)) var/obj/effect/dummy/shadow/S = L @@ -22,9 +22,11 @@ else var/turf/T = get_turf(user) var/light_amount = T.get_lumcount() - if(light_amount < 0.2) + if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) playsound(get_turf(user), 'sound/magic/ethereal_enter.ogg', 50, 1, -1) visible_message("[user] melts into the shadows!") + user.AdjustStun(-20, 0) + user.AdjustKnockdown(-20, 0) var/obj/effect/dummy/shadow/S2 = new(get_turf(user.loc)) user.forceMove(S2) S2.jaunter = user diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 554bcfdf60..4b939bf4f1 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -61,14 +61,17 @@ /obj/item/organ/eyes/night_vision/alien name = "alien eyes" desc = "It turned out they had them after all!" - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE sight_flags = SEE_MOBS /obj/item/organ/eyes/night_vision/zombie name = "undead eyes" desc = "Somewhat counterintuitively, these half rotten eyes actually have superior vision to those of a living human." +/obj/item/organ/eyes/night_vision/nightmare + name = "burning red eyes" + desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." + icon_state = "burning_eyes" + ///Robotic /obj/item/organ/eyes/robotic diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 3753cc6e11..d18a1bf262 100755 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ