diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index dfa125d547b..d627fe8edbe 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -18,6 +18,8 @@ ..() if(!affected_mob.dna) cure() + if(affected_mob.dna.species.specflags & NOTRANSSTING) //Only species that can be spread by transformation sting can be spread by the retrovirus + cure() if(!strain_data["dna"]) //Absorbs the target DNA. diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 85545b66aee..9123a969bee 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -36,6 +36,11 @@ user << "You cannot glare at allies!" revert_cast() return + var/mob/living/L = user + if(L.incorporeal_move) //Other abilities can still be used, but glare needed balancing + user << "You cannot glare while shadow walking!" + revert_cast() + return var/mob/living/carbon/human/M = target user.visible_message("[user]'s eyes flash a blinding red!") target.visible_message("[target] freezes in place, their eyes glazing over...") diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 00fd0278901..c8c79304546 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -374,11 +374,12 @@ var/list/airlock_overlays = list() if("closing") update_icon(AIRLOCK_CLOSING) if("deny") - update_icon(AIRLOCK_DENY) - playsound(src,doorDeni,50,0,3) - sleep(6) - update_icon(AIRLOCK_CLOSED) - icon_state = "closed" + if(!stat) + update_icon(AIRLOCK_DENY) + playsound(src,doorDeni,50,0,3) + sleep(6) + update_icon(AIRLOCK_CLOSED) + icon_state = "closed" /obj/machinery/door/airlock/examine(mob/user) ..() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 8a836bb737e..c6d7f9de008 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -179,6 +179,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \ */ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \ + new/datum/stack_recipe("runed girder", /obj/structure/girder/cult, 2, time = 50, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("pylon", /obj/structure/cult/pylon, 4, time = 40, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("forge", /obj/structure/cult/forge, 6, time = 40, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("archives", /obj/structure/cult/tome, 4, time = 40, one_per_turf = 1, on_floor = 1), \ diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 16c5a7363a6..a031e2ad2de 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -463,7 +463,7 @@ boxes.layer = 19 closer = new /obj/screen/close() closer.master = src - closer.icon_state = "x" + closer.icon_state = "backpack_close" closer.layer = 20 orient2hud() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index cbfa33903e8..fe6a97e262f 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -126,7 +126,7 @@ if(!isliving(AM)) //let's not put ghosts or camera mobs inside closets... return var/mob/living/L = AM - if(L.buckled || L.buckled_mobs.len) + if(L.buckled || L.incorporeal_move || L.buckled_mobs.len) return if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items. if(horizontal && !L.lying) @@ -259,7 +259,7 @@ "You stuff [O] into [src].", \ "You hear a loud metal bang.") var/mob/living/L = O - if(istype(L)) + if(istype(L) && !issilicon(L)) L.Weaken(2) step_towards(O, loc) close() diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index f2c47db7d61..fed6ee8b6c5 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -12,6 +12,7 @@ layer = 2.9 var/state = GIRDER_NORMAL var/girderpasschance = 20 // percentage chance that a projectile passes through the girder. + var/can_displace = TRUE //If the girder can be moved around by wrenching it /obj/structure/girder/attackby(obj/item/W, mob/user, params) add_fingerprint(user) @@ -49,7 +50,7 @@ var/obj/structure/girder/G = new (loc) transfer_fingerprints_to(G) qdel(src) - else if(state == GIRDER_NORMAL) + else if(state == GIRDER_NORMAL && can_displace) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user << "You start unsecuring the girder..." if(do_after(user, 40/W.toolspeed, target = src)) @@ -311,16 +312,22 @@ //////////////////////////////////////////// cult girder ////////////////////////////////////////////// -/obj/structure/cultgirder - icon= 'icons/obj/cult.dmi' +/obj/structure/girder/cult + name = "runed girder" + desc = "Framework made of a strange and shockingly cold metal. It doesn't seem to have any bolts." + icon = 'icons/obj/cult.dmi' icon_state= "cultgirder" - anchored = 1 - density = 1 - layer = 2 + can_displace = FALSE -/obj/structure/cultgirder/attackby(obj/item/W, mob/user, params) +/obj/structure/girder/cult/attackby(obj/item/W, mob/user, params) add_fingerprint(user) - if(istype(W, /obj/item/weapon/weldingtool)) + if(istype(W, /obj/item/weapon/tome) && iscultist(user)) //Cultists can demolish cult girders instantly with their tomes + user.visible_message("[user] strikes [src] with [W]!", "You demolish [src].") + var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) + R.amount = 2 + qdel(src) + + else if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) @@ -329,7 +336,8 @@ if( !WT.isOn() ) return user << "You slice apart the girder." - var/obj/effect/decal/remains/human/R = new (get_turf(src)) + var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) + R.amount = 2 transfer_fingerprints_to(R) qdel(src) @@ -338,32 +346,54 @@ playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 30, target = src)) user << "You slice apart the girder." - var/obj/effect/decal/remains/human/R = new (get_turf(src)) + var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) + R.amount = 2 transfer_fingerprints_to(R) qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer)) var/obj/item/weapon/pickaxe/drill/jackhammer/D = W user << "Your jackhammer smashes through the girder!" - var/obj/effect/decal/remains/human/R = new (get_turf(src)) + var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) + R.amount = 2 transfer_fingerprints_to(R) D.playDigSound() qdel(src) -/obj/structure/cultgirder/blob_act() + else if(istype(W, /obj/item/stack/sheet/runed_metal)) + var/obj/item/stack/sheet/runed_metal/R = W + if(R.amount < 2) + user << "You need at least two sheets of runed metal to construct a runed wall!" + return 0 + user.visible_message("[user] begins laying runed metal on [src]...", "You begin constructing a runed wall...") + if(!do_after(user, 50, target = src)) + return 0 + user.visible_message("[user] plates [src] with runed metal.", "You construct a runed wall.") + R.amount -= 2 + if(R.amount <= 0) + user.drop_item() + qdel(R) + new/turf/simulated/wall/cult(get_turf(src)) + qdel(src) + + else + ..() + +/obj/structure/girder/cult/blob_act() if(prob(40)) qdel(src) - -/obj/structure/cultgirder/ex_act(severity, target) +/obj/structure/girder/cult/ex_act(severity, target) switch(severity) if(1) qdel(src) if(2) if(prob(30)) - new /obj/effect/decal/remains/human(loc) + var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) + R.amount = 2 qdel(src) if(3) if(prob(5)) - new /obj/effect/decal/remains/human(loc) + var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) + R.amount = 2 qdel(src) diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index ec9a7794770..79b1bc7e006 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -1,6 +1,6 @@ /turf/simulated/wall/cult - name = "wall" - desc = "The patterns engraved on the wall seem to shift as you try to focus on them. You feel sick." + name = "runed wall" + desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound." icon = 'icons/turf/walls/cult_wall.dmi' icon_state = "cult" walltype = "cult" @@ -12,8 +12,9 @@ ..() /turf/simulated/wall/cult/break_wall() - new /obj/effect/decal/cleanable/blood(src) - return (new /obj/structure/cultgirder(src)) + var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) + R.amount = 2 + return (new /obj/structure/girder/cult(src)) /turf/simulated/wall/cult/devastate_wall() new /obj/effect/decal/cleanable/blood(src) diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 088698548f2..e9152f15168 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -69,7 +69,7 @@ set waitfor = 0 playsound_global('sound/magic/lightning_chargeup.ogg', repeat=0, channel=1, volume=100) sleep(80) - priority_announce("Attention personnel of [world.name]: incoming portal storm!") + priority_announce("Massive bluespace anomaly detected en route to [station_name()]. Brace for impact.") sleep(20) playsound_global('sound/magic/lightningbolt.ogg', repeat=0, channel=1, volume=100) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 87c0aabd31a..f7611bd8147 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -178,7 +178,7 @@ /turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner) && stage == 1) - user.visible_message("You use [I] to locate where to cut off the chain reaction and attempt to stop it...") + user.visible_message("[user] holds [I] to [src]...", "You use [I] to locate where to cut off the chain reaction and attempt to stop it...") defuse() ..() diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 4b94f89d3ac..9847750d49b 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -2,7 +2,7 @@ if(stat == DEAD) return if(!gibbed) - emote("me", 1, "sparks and its screen flickers, its systems slowly coming to a halt.") + visible_message("[src] lets out a flurry of sparks, its screen flickering as its systems slowly halt.") stat = DEAD diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index b8848a47565..e586bbd8b0e 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -22,7 +22,7 @@ if(stat == DEAD) return if(!gibbed) - emote("deathgasp") + visible_message("[src] shudders violently for a moment before falling still, its eyes slowly darkening.") locked = 0 //unlock cover stat = DEAD update_canmove() diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 12400eda73e..caec75bfd22 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -66,9 +66,8 @@ max_ammo = 6 /obj/item/ammo_box/magazine/internal/cylinder/rev38/can_load(mob/user) - user << "You start reloading \the [src]..." - if(!do_after(user, 30)) - user << "You didn't manage to reload \the [src]!" + user << "You start reloading..." + if(!do_after(user, 30, target = user)) return 0 return 1 diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 0e3bd3c2470..9c5ae1a2043 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ