diff --git a/code/game/machinery/computer/syndicate_shuttle.dm b/code/game/machinery/computer/syndicate_shuttle.dm index 477975d46bf..44118fc28d2 100644 --- a/code/game/machinery/computer/syndicate_shuttle.dm +++ b/code/game/machinery/computer/syndicate_shuttle.dm @@ -98,4 +98,7 @@ add_fingerprint(usr) updateUsrDialog() - return \ No newline at end of file + return + +/obj/machinery/computer/syndicate_station/bullet_act(var/obj/item/projectile/Proj) + visible_message("[Proj] ricochets off [src]!") //let's not let them fuck themselves in the rear \ No newline at end of file diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 23de5511efa..77ca568d26b 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -6,8 +6,12 @@ icon_state = "mirror" density = 0 anchored = 1 + var/shattered = 0 + /obj/structure/mirror/attack_hand(mob/user as mob) + if(shattered) return + if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -29,4 +33,63 @@ if(new_style) H.h_style = new_style - H.update_hair() \ No newline at end of file + H.update_hair() + + +/obj/structure/mirror/proc/shatter() + if(shattered) return + shattered = 1 + icon_state = "mirror_broke" + playsound(src, "shatter", 70, 1) + desc = "Oh no, seven years of bad luck!" + + +/obj/structure/mirror/bullet_act(var/obj/item/projectile/Proj) + if(prob(Proj.damage * 2)) + if(!shattered) + shatter() + else + playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + ..() + + +/obj/structure/mirror/attackby(obj/item/I as obj, mob/user as mob) + if(shattered) + playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + return + + if(prob(I.force * 2)) + visible_message("[user] smashes [src] with [I]!") + shatter() + else + visible_message("[user] hits [src] with [I]!") + playsound(src.loc, 'sound/effects/Glasshit.ogg', 70, 1) + + +/obj/structure/mirror/attack_alien(mob/user as mob) + if(islarva(user)) return + if(shattered) + playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + return + user.visible_message("[user] smashes [src]!") + shatter() + + +/obj/structure/mirror/attack_animal(mob/user as mob) + if(!isanimal(user)) return + var/mob/living/simple_animal/M = user + if(M.melee_damage_upper <= 0) return + if(shattered) + playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + return + user.visible_message("[user] smashes [src]!") + shatter() + + +/obj/structure/mirror/attack_metroid(mob/user as mob) + if(!ismetroidadult(user)) return + if(shattered) + playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + return + user.visible_message("[user] smashes [src]!") + shatter() \ No newline at end of file diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index bce88aa60be..8674e54ef0c 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -1,263 +1,195 @@ /obj/structure/window name = "window" - icon = 'icons/obj/structures.dmi' desc = "A window." + icon = 'icons/obj/structures.dmi' density = 1 layer = 3.2//Just above doors + pressure_resistance = 4*ONE_ATMOSPHERE + anchored = 1.0 + flags = ON_BORDER var/health = 14.0 var/ini_dir = null var/state = 0 var/reinf = 0 - var/silicate = 0 // number of units of silicate - var/icon/silicateIcon = null // the silicated icon - pressure_resistance = 4*ONE_ATMOSPHERE - anchored = 1.0 - flags = ON_BORDER +// var/silicate = 0 // number of units of silicate +// var/icon/silicateIcon = null // the silicated icon + /obj/structure/window/bullet_act(var/obj/item/projectile/Proj) health -= Proj.damage ..() - if(health <=0) - new /obj/item/weapon/shard( src.loc ) - new /obj/item/stack/rods( src.loc ) - src.density = 0 + if(health <= 0) + new /obj/item/weapon/shard(loc) + new /obj/item/stack/rods(loc) del(src) return + /obj/structure/window/ex_act(severity) switch(severity) if(1.0) del(src) return if(2.0) - new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/stack/rods( src.loc) - //SN src = null + new /obj/item/weapon/shard(loc) + if(reinf) new /obj/item/stack/rods(loc) del(src) return if(3.0) - if (prob(50)) - new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/stack/rods( src.loc) - + if(prob(50)) + new /obj/item/weapon/shard(loc) + if(reinf) new /obj/item/stack/rods(loc) del(src) return - return + /obj/structure/window/blob_act() - if(reinf) new /obj/item/stack/rods( src.loc) - density = 0 + new /obj/item/weapon/shard(loc) + if(reinf) new /obj/item/stack/rods(loc) del(src) + +/obj/structure/window/meteorhit() + //world << "glass at [x],[y],[z] Mhit" + new /obj/item/weapon/shard( loc ) + if(reinf) new /obj/item/stack/rods( loc) + del(src) + + /obj/structure/window/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(istype(mover) && mover.checkpass(PASSGLASS)) return 1 - if (src.dir == SOUTHWEST || src.dir == SOUTHEAST || src.dir == NORTHWEST || src.dir == NORTHEAST) - return 0 //full tile window, you can't move into it! + if(dir == SOUTHWEST || dir == SOUTHEAST || dir == NORTHWEST || dir == NORTHEAST) + return 0 //full tile window, you can't move into it! if(get_dir(loc, target) == dir) return !density else return 1 + /obj/structure/window/CheckExit(atom/movable/O as mob|obj, target as turf) if(istype(O) && O.checkpass(PASSGLASS)) return 1 - if (get_dir(O.loc, target) == dir) + if(get_dir(O.loc, target) == dir) return 0 return 1 -/obj/structure/window/meteorhit() - - //*****RM - //world << "glass at [x],[y],[z] Mhit" - src.health = 0 - new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/stack/rods( src.loc) - src.density = 0 - - - del(src) - return - /obj/structure/window/hitby(AM as mob|obj) - ..() - for(var/mob/O in viewers(src, null)) - O.show_message("\red [src] was hit by [AM].", 1) + visible_message("[src] was hit by [AM].") var/tforce = 0 if(ismob(AM)) tforce = 40 - else - tforce = AM:throwforce - if(reinf) tforce /= 4.0 - playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1) - src.health = max(0, src.health - tforce) - if (src.health <= 7 && !reinf) - src.anchored = 0 + else if(isobj(AM)) + var/obj/item/I = AM + tforce = I.throwforce + if(reinf) tforce *= 0.25 + playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) + health = max(0, health - tforce) + if(health <= 7 && !reinf) + anchored = 0 update_nearby_icons() step(src, get_dir(AM, src)) - if (src.health <= 0) - new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/stack/rods( src.loc) - src.density = 0 + if(health <= 0) + new /obj/item/weapon/shard(loc) + if(reinf) new /obj/item/stack/rods(loc) del(src) - return - //..() //Does this really need to be here twice? The parent proc doesn't even do anything yet. - Nodrak - return -//These all need to be rewritten to use visiblemessage() -/obj/structure/window/attack_hand() - if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations)) - usr << "\blue You smash through the window." - usr.say(pick("RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << "\red [usr] smashes through the window!" - src.health = 0 - new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/stack/rods( src.loc) - src.density = 0 +/obj/structure/window/attack_hand(mob/user as mob) + if((HULK in user.mutations) || (SUPRSTR in user.augmentations)) + user.say(pick("RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!")) + user.visible_message("[user] smashes through [src]!") + new /obj/item/weapon/shard(loc) + if(reinf) new /obj/item/stack/rods(loc) del(src) - return + else + user.visible_message("[user] knocks on [src].") + playsound(loc, 'sound/effects/Glasshit.ogg', 50, 1) -/obj/structure/window/attack_paw() - if ((HULK in usr.mutations)) - usr << "\blue You smash through the window." - usr.say(pick("RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << "\red [usr] smashes through the window!" - src.health = 0 - new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/stack/rods( src.loc) - src.density = 0 + +/obj/structure/window/attack_paw(mob/user as mob) + return attack_hand(user) + + +/obj/structure/window/proc/attack_generic(mob/user as mob, damage = 0) //used by attack_alien, attack_animal, and attack_metroid + health -= damage + if(health <= 0) + user.visible_message("[user] smashes through [src]!") + new /obj/item/weapon/shard(loc) + if(reinf) new /obj/item/stack/rods(loc) del(src) - return - -/obj/structure/window/attack_alien() - if (istype(usr, /mob/living/carbon/alien/larva))//Safety check for larva. /N - return - usr << "\green You smash against the window." - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << "\red [usr] smashes against the window." - playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1) - src.health -= 15 - if(src.health <= 0) - usr << "\green You smash through the window." - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << "\red [usr] smashes through the window!" - src.health = 0 - new /obj/item/weapon/shard(src.loc) - if(reinf) - new /obj/item/stack/rods(src.loc) - src.density = 0 - del(src) - return - return + else //for nicer text~ + user.visible_message("[user] smashes into [src]!") + playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) -/obj/structure/window/attack_animal(mob/living/simple_animal/M as mob) - if (M.melee_damage_upper == 0) - return - M << "\green You smash against the window." - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O << "\red [M] smashes against the window." - playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1) - src.health -= M.melee_damage_upper - if(src.health <= 0) - M << "\green You smash through the window." - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O << "\red [M] smashes through the window!" - src.health = 0 - new /obj/item/weapon/shard(src.loc) - if(reinf) - new /obj/item/stack/rods(src.loc) - src.density = 0 - del(src) - return - return +/obj/structure/window/attack_alien(mob/user as mob) + if(islarva(user)) return + attack_generic(user, 15) -/obj/structure/window/attack_metroid() - if(!istype(usr, /mob/living/carbon/metroid/adult)) - return +/obj/structure/window/attack_animal(mob/user as mob) + if(!isanimal(user)) return + var/mob/living/simple_animal/M = user + if(M.melee_damage_upper <= 0) return + attack_generic(M, M.melee_damage_upper) + + +/obj/structure/window/attack_metroid(mob/user as mob) + if(!ismetroidadult(user)) return + attack_generic(user, rand(10, 15)) - usr<< "\green You smash against the window." - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << "\red [usr] smashes against the window." - playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1) - src.health -= rand(10,15) - if(src.health <= 0) - usr << "\green You smash through the window." - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << "\red [usr] smashes through the window!" - src.health = 0 - new /obj/item/weapon/shard(src.loc) - if(reinf) - new /obj/item/stack/rods(src.loc) - src.density = 0 - del(src) - return - return /obj/structure/window/attackby(obj/item/weapon/W as obj, mob/user as mob) if(!istype(W)) return//I really wish I did not need this - if (istype(W, /obj/item/weapon/screwdriver)) + if(istype(W, /obj/item/weapon/screwdriver)) if(reinf && state >= 1) state = 3 - state - playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1) - usr << ( state==1? "You have unfastened the window from the frame." : "You have fastened the window to the frame." ) + playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) + user << (state == 1 ? "You have unfastened the window from the frame." : "You have fastened the window to the frame.") else if(reinf && state == 0) anchored = !anchored update_nearby_icons() - playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1) - user << (src.anchored ? "You have fastened the frame to the floor." : "You have unfastened the frame from the floor.") + playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) + user << (anchored ? "You have fastened the frame to the floor." : "You have unfastened the frame from the floor.") else if(!reinf) - src.anchored = !( src.anchored ) + anchored = !anchored update_nearby_icons() - playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1) - user << (src.anchored ? "You have fastened the window to the floor." : "You have unfastened the window.") - else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <=1) - state = 1-state; - playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1) - user << (state ? "You have pried the window into the frame." : "You have pried the window out of the frame.") + playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) + user << (anchored ? "You have fastened the window to the floor." : "You have unfastened the window.") + else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1) + state = 1 - state + playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) + user << (state ? "You have pried the window into the frame." : "You have pried the window out of the frame.") else if(W.damtype == BRUTE || W.damtype == BURN) hit(W.force) - if (src.health <= 7) - src.anchored = 0 + if(health <= 7) + anchored = 0 update_nearby_icons() step(src, get_dir(user, src)) else - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) ..() return /obj/structure/window/proc/hit(var/damage, var/sound_effect = 1) - - if(reinf) damage /= 2.0 - src.health = max(0, src.health - damage) + if(reinf) damage *= 0.5 + health = max(0, health - damage) if(sound_effect) - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) - if (src.health <= 0) - if (src.dir == SOUTHWEST) + playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) + if(health <= 0) + if(dir == SOUTHWEST) var/index = null index = 0 while(index < 2) - new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/stack/rods( src.loc) + new /obj/item/weapon/shard(loc) + if(reinf) new /obj/item/stack/rods(loc) index++ else - new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/stack/rods( src.loc) - src.density = 0 + new /obj/item/weapon/shard(loc) + if(reinf) new /obj/item/stack/rods(loc) del(src) return @@ -267,44 +199,39 @@ set category = "Object" set src in oview(1) - if (src.anchored) - usr << "It is fastened to the floor; therefore, you can't rotate it!" + if(anchored) + usr << "It is fastened to the floor therefore you can't rotate it!" return 0 update_nearby_tiles(need_rebuild=1) //Compel updates before - - src.dir = turn(src.dir, 90) - - updateSilicate() - + dir = turn(dir, 90) +// updateSilicate() update_nearby_tiles(need_rebuild=1) - - src.ini_dir = src.dir + ini_dir = dir return + /obj/structure/window/verb/revrotate() set name = "Rotate Window Clockwise" set category = "Object" set src in oview(1) - if (src.anchored) - usr << "It is fastened to the floor; therefore, you can't rotate it!" + if(anchored) + usr << "It is fastened to the floor therefore you can't rotate it!" return 0 update_nearby_tiles(need_rebuild=1) //Compel updates before - - src.dir = turn(src.dir, 270) - - updateSilicate() - + dir = turn(dir, 270) +// updateSilicate() update_nearby_tiles(need_rebuild=1) - - src.ini_dir = src.dir + ini_dir = dir return + +/* /obj/structure/window/proc/updateSilicate() if(silicateIcon && silicate) - src.icon = initial(icon) + icon = initial(icon) var/icon/I = icon(icon,icon_state,dir) @@ -314,13 +241,15 @@ I.SetIntensity(r,g,b) icon = I silicateIcon = I +*/ + /obj/structure/window/New(Loc,re=0) ..() if(re) reinf = re - src.ini_dir = src.dir + ini_dir = dir if(reinf) icon_state = "rwindow" desc = "A reinforced window." @@ -337,26 +266,21 @@ return + /obj/structure/window/Del() density = 0 - update_nearby_tiles() - playsound(src, "shatter", 70, 1) - update_nearby_icons() - ..() + /obj/structure/window/Move() update_nearby_tiles(need_rebuild=1) - ..() - - src.dir = src.ini_dir + dir = ini_dir update_nearby_tiles(need_rebuild=1) - return //This proc has to do with airgroups and atmos, it has nothing to do with smoothwindows, that's update_nearby_tiles(). /obj/structure/window/proc/update_nearby_tiles(need_rebuild) @@ -390,7 +314,7 @@ //This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc! /obj/structure/window/proc/update_nearby_icons() - src.update_icon() + update_icon() for(var/direction in cardinal) for(var/obj/structure/window/W in get_step(src,direction) ) W.update_icon() @@ -402,21 +326,21 @@ //This spawn is here so windows get properly updated when one gets deleted. spawn(2) if(!src) return - if (!is_fulltile()) + if(!is_fulltile()) return var/junction = 0 //will be used to determine from which side the window is connected to other windows - if (src.anchored) + if(anchored) for(var/obj/structure/window/W in orange(src,1)) - if (W.anchored && W.density && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows. - if (abs(src.x-W.x)-abs(src.y-W.y) ) //doesn't count windows, placed diagonally to src + if(W.anchored && W.density && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows. + if(abs(x-W.x)-abs(y-W.y) ) //doesn't count windows, placed diagonally to src junction |= get_dir(src,W) - if (opacity) - src.icon_state = "twindow[junction]" + if(opacity) + icon_state = "twindow[junction]" else - if (reinf) - src.icon_state = "rwindow[junction]" + if(reinf) + icon_state = "rwindow[junction]" else - src.icon_state = "window[junction]" + icon_state = "window[junction]" return @@ -431,9 +355,9 @@ icon_state = "window" /obj/structure/window/reinforced - reinf = 1 - icon_state = "rwindow" name = "reinforced window" + icon_state = "rwindow" + reinf = 1 /obj/structure/window/reinforced/tinted name = "tinted window" @@ -441,5 +365,5 @@ opacity = 1 /obj/structure/window/reinforced/tinted/frosted - icon_state = "fwindow" - name = "frosted window" \ No newline at end of file + name = "frosted window" + icon_state = "fwindow" \ No newline at end of file diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 9aff161b935..d10a75ebfb5 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -35,6 +35,11 @@ return 1 return 0 +/proc/ismetroidadult(A) + if(istype(A, /mob/living/carbon/metroid/adult)) + return 1 + return 0 + /proc/isrobot(A) if(istype(A, /mob/living/silicon/robot)) return 1 diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 112b7d81f69..e99db66af2d 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -11,11 +11,11 @@ /obj/item/weapon/gun/projectile/automatic/mini_uzi - name = "mini-uzi" + name = "Uzi" desc = "A lightweight, fast firing gun, for when you want someone dead. Uses .45 rounds." icon_state = "mini-uzi" w_class = 3.0 - max_shells = 20 + max_shells = 16 caliber = ".45" origin_tech = "combat=5;materials=2;syndicate=8" ammo_type = "/obj/item/ammo_casing/c45" @@ -103,7 +103,7 @@ if(loc != user) ..() return //let them pick it up - if(!cover_open) + if(!cover_open || (cover_open && !mag_inserted)) ..() else if(cover_open && mag_inserted) //drop the mag