diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index a26914aa8a6..79b182afd37 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -732,7 +732,7 @@ var/list/datum/dna/hivemind_bank = list()
src << "We return our vocal glands to their original location."
return
- var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text
+ var/mimic_voice = stripped_input(usr, "Enter a name to mimic.", "Mimic Voice", null, MAX_NAME_LEN)
if(!mimic_voice)
return
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 78db5e77846..de7bc051054 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -226,7 +226,7 @@ proc/issyndicate(mob/living/M as mob)
/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob)
var/radio_freq = SYND_FREQ
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(synd_mob)
+ var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(synd_mob)
R.set_frequency(radio_freq)
synd_mob.equip_to_slot_or_del(R, slot_l_ear)
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index f5b1cac68f6..65b1d1ce2b0 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -24,7 +24,7 @@
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/hos(H), slot_l_ear)
+ H.equip_or_collect(new /obj/item/device/radio/headset/heads/hos/alt(H), slot_l_ear)
H.equip_or_collect(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_or_collect(new /obj/item/clothing/suit/armor/hos(H), slot_wear_suit)
@@ -64,7 +64,7 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
+ H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
switch(H.backbag)
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
@@ -111,7 +111,7 @@
minimal_player_age = 14
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
+ H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
switch(H.backbag)
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
@@ -166,7 +166,7 @@
minimal_player_age = 14
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
+ H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
switch(H.backbag)
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
@@ -205,7 +205,7 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
+ H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
switch(H.backbag)
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
@@ -242,7 +242,7 @@
minimal_player_age = 7
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
+ H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
switch(H.backbag)
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm
index 1c19e8c7253..d0dd51fb59f 100644
--- a/code/game/jobs/job/supervisor.dm
+++ b/code/game/jobs/job/supervisor.dm
@@ -13,7 +13,7 @@
minimal_player_age = 30
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
+ H.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(H), slot_l_ear)
switch(H.backbag)
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/captain(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_cap(H), slot_back)
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index b30205339de..6de87e93a12 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -287,6 +287,11 @@
)
/obj/machinery/alarm/proc/master_is_operating()
+
+
+ if (! alarm_area)
+ alarm_area = areaMaster
+
return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN))
@@ -892,6 +897,15 @@
update_icon()
return
+ if(istype(W, /obj/item/weapon/wirecutters)) // cutting the wires out
+ if (wires.wires_status == 31) // all wires cut
+ var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil()
+ new_coil.amount = 5
+ new_coil.loc = user.loc
+ buildstage = 1
+ update_icon()
+ return
+
if (wiresexposed && ((istype(W, /obj/item/device/multitool) || istype(W, /obj/item/weapon/wirecutters))))
return attack_hand(user)
@@ -906,6 +920,8 @@
updateUsrDialog()
else
user << "\red Access denied."
+
+
return
if(1)
@@ -1475,4 +1491,4 @@ Code shamelessly copied from apc_frame
else
usr << browse(null, "window=partyalarm")
return
- return
+ return
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 7afabaa849d..7c7ea673335 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -202,9 +202,10 @@ update_flag
return
/obj/machinery/portable_atmospherics/canister/bullet_act(var/obj/item/projectile/Proj)
- if(Proj.damage)
- src.health -= round(Proj.damage / 2)
- healthcheck()
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ if(Proj.damage)
+ src.health -= round(Proj.damage / 2)
+ healthcheck()
..()
/obj/machinery/portable_atmospherics/canister/meteorhit(var/obj/O as obj)
@@ -252,7 +253,7 @@ update_flag
/obj/machinery/portable_atmospherics/canister/attack_paw(var/mob/user as mob)
return src.attack_hand(user)
-
+
/obj/machinery/portable_atmospherics/canister/attack_alien(mob/living/carbon/alien/humanoid/user)
return
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 668a875d9b6..9dab90e6ed3 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -63,10 +63,10 @@
/obj/machinery/computer/bullet_act(var/obj/item/projectile/Proj)
if(prob(Proj.damage))
- set_broken()
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ set_broken()
..()
-
/obj/machinery/computer/blob_act()
if (prob(75))
for(var/x in verbs)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 24076937260..9ec64ff61c5 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -284,23 +284,23 @@
name = "Secure Armory Airlock"
hackProof = 1
aiControlDisabled = 1
-
+
/obj/machinery/door/airlock/alien
name = "Alien Airlock"
desc = "A mysterious alien airlock with a complicated opening mechanism."
hackProof = 1
icon = 'icons/obj/doors/Doorplasma.dmi'
-
-/obj/machinery/door/airlock/alien/bumpopen(mob/living/user as mob)
+
+/obj/machinery/door/airlock/alien/bumpopen(mob/living/user as mob)
if(istype(user,/mob/living/carbon/alien) || isrobot(user) || isAI(user))
..(user)
else
user << "You do not know how to operate this airlock's mechanism."
return
-
+
/obj/machinery/door/airlock/alien/attackby(C as obj, mob/user as mob)
if(isalien(user) || isrobot(user) || isAI(user))
- ..(C, user)
+ ..(C, user)
else
user << "You do not know how to operate this airlock's mechanism."
return
@@ -512,8 +512,8 @@ About the new airlock wires panel:
if(src.emergency)
t1 += text("Emergency Access Override is enabled. Disable?
\n", src)
else
- t1 += text("Emergency Access Override is disabled. Enable?
\n", src)
-
+ t1 += text("Emergency Access Override is disabled. Enable?
\n", src)
+
if(src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1))
t1 += text("Main Power Input wire is cut.
\n")
if(src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2))
@@ -1094,28 +1094,9 @@ About the new airlock wires panel:
if(locate(/mob/living) in turf)
// playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) //THE BUZZING IT NEVER STOPS -Pete
spawn (60)
- close()
+ autoclose()
return
- for(var/turf/turf in locs)
- for(var/mob/living/M in turf)
- if(isrobot(M))
- M.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
- else
- M.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
- M.SetStunned(5)
- M.SetWeakened(5)
- var/obj/effect/stop/S
- S = new /obj/effect/stop
- S.victim = M
- S.loc = M.loc
- spawn(20)
- del(S)
- M.emote("scream")
- var/turf/location = src.loc
- if(istype(location, /turf/simulated))
- location.add_blood(M)
-
use_power(50)
if(forced)
playsound(src.loc, 'sound/machines/airlockforced.ogg', 30, 1)
@@ -1131,7 +1112,28 @@ About the new airlock wires panel:
if (W)
W.destroy()
- ..()
+ if(density)
+ return 1
+ operating = 1
+ door_animate("closing")
+ src.layer = 3.1
+ sleep(5)
+ src.density = 1
+ if(!safe)
+ crush()
+ sleep(5)
+ update_icon()
+ if(visible && !glass)
+ SetOpacity(1)
+ operating = 0
+ update_nearby_tiles()
+ if(locate(/mob/living) in get_turf(src))
+ open()
+
+ //I shall not add a check every x ticks if a door has closed over some fire.
+ var/obj/fire/fire = locate() in loc
+ if(fire)
+ del fire
return
/obj/machinery/door/airlock/proc/lock(var/forced=0)
@@ -1230,7 +1232,7 @@ About the new airlock wires panel:
return
else
return
-
+
/obj/machinery/door/airlock/CanAStarPass(var/obj/item/weapon/card/id/ID)
//Airlock is passable if it is open (!density), bot has access, and is not bolted shut)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 2aefc60be27..88d72fbf8b9 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -227,24 +227,27 @@
/obj/machinery/door/proc/open()
- if(!density) return 1
- if(operating > 0) return
- if(!ticker) return 0
+ if(!density)
+ return 1
+ if(operating > 0)
+ return
+ if(!ticker)
+ return 0
if(!operating) operating = 1
door_animate("opening")
icon_state = "door0"
src.SetOpacity(0)
- sleep(10)
- src.layer = 2.7
+ sleep(5)
src.density = 0
+ sleep(5)
+ src.layer = 2.7
explosion_resistance = 0
update_icon()
SetOpacity(0)
+ operating = 0
update_nearby_tiles()
- if(operating) operating = 0
-
if(autoclose && normalspeed)
spawn(150)
autoclose()
@@ -256,15 +259,18 @@
/obj/machinery/door/proc/close()
- if(density) return 1
- if(operating > 0) return
+ if(density)
+ return 1
+ if(operating > 0)
+ return
operating = 1
door_animate("closing")
- src.density = 1
explosion_resistance = initial(explosion_resistance)
- src.layer = 3.0
- sleep(10)
+ src.layer = 3.1
+ sleep(5)
+ src.density = 1
+ sleep(5)
update_icon()
if(visible && !glass)
SetOpacity(1) //caaaaarn!
@@ -277,6 +283,24 @@
del fire
return
+/obj/machinery/door/proc/crush()
+ for(var/mob/living/L in get_turf(src))
+ if(isalien(L)) //For xenos
+ L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans.
+ L.emote("roar")
+ else if(ishuman(L)) //For humans
+ L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
+ L.emote("scream")
+ L.Weaken(5)
+ else if(ismonkey(L)) //For monkeys
+ L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
+ L.Weaken(5)
+ else //for simple_animals & borgs
+ L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
+ var/turf/location = src.loc
+ if(istype(location, /turf/simulated)) //add_blood doesn't work for borgs/xenos, but add_blood_floor does.
+ location.add_blood(L)
+
/obj/machinery/door/proc/requiresID()
return 1
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index bad76ca8ef0..eeceaf2de18 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -14,7 +14,7 @@
/obj/machinery/door/poddoor/four_tile_ver/
name = "Large Pod Door"
icon = 'icons/obj/doors/1x4blast_vert.dmi'
-
+
/obj/machinery/door/poddoor/three_tile_ver/
name = "Large Pod Door"
icon = 'icons/obj/doors/1x3blast_vert.dmi'
@@ -51,8 +51,9 @@
flick("pdoorc0", src)
src.icon_state = "pdoor0"
src.SetOpacity(0)
- sleep(10)
+ sleep(5)
src.density = 0
+ sleep(5)
update_nearby_tiles()
if(operating == 1) //emag again
@@ -68,11 +69,13 @@
src.operating = 1
flick("pdoorc1", src)
src.icon_state = "pdoor1"
- src.density = 1
src.SetOpacity(initial(opacity))
update_nearby_tiles()
+ sleep(5)
+ crush()
+ src.density = 1
+ sleep(5)
- sleep(10)
src.operating = 0
return
@@ -153,7 +156,7 @@
spawn(150)
autoclose()
return 1
-
+
/obj/machinery/door/poddoor/three_tile_hor/close()
if (src.operating)
return
@@ -332,7 +335,7 @@
sleep(10)
src.operating = 0
- return
+ return
/obj/machinery/door/poddoor/four_tile_ver/open()
if (src.operating == 1) //doors can still open when emag-disabled
@@ -364,7 +367,7 @@
spawn(150)
autoclose()
return 1
-
+
/obj/machinery/door/poddoor/four_tile_ver/close()
if (src.operating)
return
@@ -454,7 +457,7 @@
del f2
del f3
..()
-
+
/obj/machinery/door/poddoor/three_tile_ver
var/obj/machinery/door/poddoor/filler_object/f1
var/obj/machinery/door/poddoor/filler_object/f2
@@ -477,8 +480,8 @@
del f1
del f2
del f3
- ..()
-
+ ..()
+
/obj/machinery/door/poddoor/four_tile_hor
var/obj/machinery/door/poddoor/filler_object/f1
var/obj/machinery/door/poddoor/filler_object/f2
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 564e25f1aad..8213c2f8879 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -369,8 +369,11 @@ Status: []
"},
sleep(60)
attacked = 0
- src.health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
+
..()
+
if(prob(45) && Proj.damage > 0) src.spark_system.start()
if (src.health <= 0)
src.die() // the death process :(
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index fa7c83ff2b8..6bb718ea8eb 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -275,12 +275,13 @@
popping = 0
/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj)
- src.health -= Proj.damage
- ..()
- if(prob(45) && Proj.damage > 0) src.spark_system.start()
- del (Proj)
- if (src.health <= 0)
- src.die()
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ src.health -= Proj.damage
+ ..()
+ if(prob(45) && Proj.damage > 0) src.spark_system.start()
+ del(Proj)
+ if (src.health <= 0)
+ src.die()
return
/obj/machinery/turret/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 6a3f81c461c..d34d2bb0f2e 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -260,7 +260,7 @@
if(do_after(melee_cooldown))
melee_can_hit = 1
return
-
+
/obj/mecha/proc/mech_toxin_damage(mob/living/target)
playsound(src, 'sound/effects/spray2.ogg', 50, 1)
if(target.reagents)
@@ -554,8 +554,10 @@
return
if(istype(Proj, /obj/item/projectile/beam/pulse))
ignore_threshold = 1
- src.take_damage(Proj.damage,Proj.flag)
- src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold)
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ src.take_damage(Proj.damage,Proj.flag)
+ src.visible_message("[src.name] is hit by [Proj].")
+ src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold)
Proj.on_hit(src)
return
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 7a21d472b82..64c29246834 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -19,6 +19,43 @@
return
*/
+/obj/mecha/working/ripley/Destroy()
+ while(src.damage_absorption.["brute"] < 0.6)
+ new /obj/item/asteroid/goliath_hide(src.loc)
+ src.damage_absorption.["brute"] = src.damage_absorption.["brute"] + 0.1 //If a goliath-plated ripley gets killed, all the plates drop
+ for(var/atom/movable/A in src.cargo)
+ A.loc = loc
+ step_rand(A)
+ cargo.Cut()
+ ..()
+
+/obj/mecha/working/ripley/go_out()
+ ..()
+ if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-open")
+ else if (src.damage_absorption.["brute"] == 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full-open")
+
+/obj/mecha/working/ripley/moved_inside(var/mob/living/carbon/human/H as mob)
+ ..()
+ if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g")
+ else if (src.damage_absorption.["brute"] == 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full")
+
+/obj/mecha/working/ripley/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob)
+ ..()
+ if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g")
+ else if (src.damage_absorption.["brute"] == 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full")
+
/obj/mecha/working/ripley/firefighter
desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
name = "APLU \"Firefighter\""
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index de3422e168f..fb6ca1b2fa4 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -31,6 +31,15 @@
/obj/item/device/radio/headset/syndicate
origin_tech = "syndicate=3"
+
+/obj/item/device/radio/headset/syndicate/alt //undisguised bowman with flash protection
+ name = "syndicate headset"
+ desc = "A syndicate headset that can be used to hear all radio frequencies. Protects ears from flashbangs. \nTo access the syndicate channel, use ; before speaking."
+ flags = EARBANGPROTECT
+ origin_tech = "syndicate=3"
+ icon_state = "syndie_headset"
+ item_state = "syndie_headset"
+
/obj/item/device/radio/headset/syndicate/New()
..()
del(keyslot1)
@@ -53,6 +62,13 @@
item_state = "headset"
keyslot1 = new /obj/item/device/encryptionkey/headset_sec
+/obj/item/device/radio/headset/headset_sec/alt
+ name = "security bowman headset"
+ desc = "This is used by your elite security force. Protects ears from flashbangs. \nTo access the security channel, use :s."
+ flags = EARBANGPROTECT
+ icon_state = "sec_headset_alt"
+ item_state = "sec_headset_alt"
+
/obj/item/device/radio/headset/headset_eng
name = "engineering radio headset"
desc = "When the engineers wish to chat like girls. To access the engineering channel, use :e. "
@@ -102,6 +118,13 @@
item_state = "headset"
keyslot1 = new /obj/item/device/encryptionkey/heads/captain
+/obj/item/device/radio/headset/heads/captain/alt
+ name = "\proper the captain's bowman headset"
+ desc = "The headset of the boss. Protects ears from flashbangs. \nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
+ flags = EARBANGPROTECT
+ icon_state = "com_headset_alt"
+ item_state = "com_headset_alt"
+
/obj/item/device/radio/headset/heads/rd
name = "Research Director's headset"
desc = "Headset of the researching God. To access the science channel, use :n. For command, use :c."
@@ -116,6 +139,13 @@
item_state = "headset"
keyslot1 = new /obj/item/device/encryptionkey/heads/hos
+/obj/item/device/radio/headset/heads/hos/alt
+ name = "\proper the head of security's bowman headset"
+ desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs. \nTo access the security channel, use :s. For command, use :c."
+ flags = EARBANGPROTECT
+ icon_state = "com_headset_alt"
+ item_state = "com_headset_alt"
+
/obj/item/device/radio/headset/heads/ce
name = "chief engineer's headset"
desc = "The headset of the guy who is in charge of morons. To access the engineering channel, use :e. For command, use :c."
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index a6f18c378e7..b1d0e0783fe 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -436,6 +436,7 @@
desc = "A colourful crayon. Looks tasty. Mmmm..."
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonred"
+ slot_flags = SLOT_EARS
w_class = 1.0
attack_verb = list("attacked", "coloured")
var/colour = "#FF0000" //RGB
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index fe457888911..2229c5bc00f 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -57,6 +57,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_state = "cigoff"
throw_speed = 0.5
item_state = "cigoff"
+ slot_flags = SLOT_EARS
w_class = 1
body_parts_covered = null
attack_verb = list("burnt", "singed")
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index 26372ce5700..601e4d5a8f7 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -5,109 +5,68 @@
origin_tech = "materials=2;combat=1"
var/banglet = 0
- prime()
- ..()
- for(var/obj/structure/closet/L in hear(7, get_turf(src)))
- if(locate(/mob/living/carbon/, L))
- for(var/mob/living/carbon/M in L)
- bang(get_turf(src), M)
-
-
- for(var/mob/living/carbon/M in hear(7, get_turf(src)))
- bang(get_turf(src), M)
-
- for(var/obj/effect/blob/B in hear(8,get_turf(src))) //Blob damage here
- var/damage = round(30/(get_dist(B,get_turf(src))+1))
- B.health -= damage
- B.update_icon()
-
- new/obj/effect/effect/smoke/flashbang(src.loc)
- del(src)
+/obj/item/weapon/grenade/flashbang/prime()
+ update_mob()
+ var/flashbang_turf = get_turf(src)
+ if(!flashbang_turf)
return
+ for(var/mob/living/M in hearers(7, flashbang_turf))
+ bang(get_turf(M), M)
- proc/bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged.
- if (locate(/obj/item/weapon/cloaking_device, M)) // Called during the loop that bangs people in lockers/containers and when banging
- for(var/obj/item/weapon/cloaking_device/S in M) // people in normal view. Could theroetically be called during other explosions.
- S.active = 0 // -- Polymorph
- S.icon_state = "shield0"
+ for(var/obj/effect/blob/B in hear(8,flashbang_turf)) //Blob damage here
+ var/damage = round(30/(get_dist(B,get_turf(src))+1))
+ B.health -= damage
+ B.update_icon()
+ del(src)
- M << "\red BANG"
- playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5)
+/obj/item/weapon/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/M)
+ M.show_message("BANG", 2)
+ playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
//Checking for protections
- var/eye_safety = 0
- var/ear_safety = 0
- if(iscarbon(M))
- eye_safety = M.eyecheck()
- if(ishuman(M))
- if(istype(M:l_ear, /obj/item/clothing/ears/earmuffs) || istype(M:r_ear, /obj/item/clothing/ears/earmuffs))
- ear_safety += 2
- if(M_HULK in M.mutations)
- ear_safety += 1
- if(istype(M:head, /obj/item/clothing/head/helmet))
- ear_safety += 1
+ var/eye_safety = 0
+ var/ear_safety = 0
+ var/distance = max(1,get_dist(src,T))
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ eye_safety = C.eyecheck()
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT)))
+ ear_safety++
-//Flashing everyone
- if(eye_safety < 1)
- flick("e_flash", M.flash)
- M.Stun(2)
- M.Weaken(10)
-
-
-
-//Now applying sound
- if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M))
- if(ear_safety > 0)
- M.Stun(2)
- M.Weaken(1)
- else
- M.Stun(10)
- M.Weaken(3)
- if ((prob(14) || (M == src.loc && prob(70))))
- M.ear_damage += rand(1, 10)
- else
- M.ear_damage += rand(0, 5)
- M.ear_deaf = max(M.ear_deaf,15)
-
- else if(get_dist(M, T) <= 5)
- if(!ear_safety)
- M.Stun(8)
- M.ear_damage += rand(0, 3)
- M.ear_deaf = max(M.ear_deaf,10)
-
- else if(!ear_safety)
- M.Stun(4)
- M.ear_damage += rand(0, 1)
- M.ear_deaf = max(M.ear_deaf,5)
-
-//This really should be in mob not every check
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
- if (E.damage >= E.min_bruised_damage)
- M << "\red Your eyes start to burn badly!"
- if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
- if (E.damage >= E.min_broken_damage)
- M << "\red You can't see anything!"
- if (M.ear_damage >= 15)
- M << "\red Your ears start to ring badly!"
+//Flash
+ if(!eye_safety)
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
+ flick("e_flash", M.flash)
+ E.damage += rand(1, 3)
+ M.Stun(max(10/distance, 3))
+ M.Weaken(max(10/distance, 3))
+ if (E.damage >= E.min_bruised_damage)
+ M << "Your eyes start to burn badly!"
if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
- if (prob(M.ear_damage - 10 + 5))
- M << "\red You can't hear anything!"
- M.sdisabilities |= DEAF
+ if (E.damage >= E.min_broken_damage)
+ M << "You can't see anything!"
+
+//Bang
+ if((src.loc == M) || src.loc == M.loc)//Holding on person or being exactly where lies is significantly more dangerous and voids protection
+ M.Stun(10)
+ M.Weaken(10)
+ if(!ear_safety)
+ M.Stun(max(10/distance, 3))
+ M.Weaken(max(10/distance, 3))
+ M.ear_damage += rand(0, 5)
+ M.ear_deaf = max(M.ear_deaf,15)
+ if (M.ear_damage >= 15)
+ M << "Your ears start to ring badly!"
+ if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
+ if(prob(M.ear_damage - 10 + 5))
+ M << "You can't hear anything!"
+ M.disabilities |= DEAF
else
if (M.ear_damage >= 5)
- M << "\red Your ears start to ring!"
- M.update_icons()
-
-/obj/effect/effect/smoke/flashbang
- name = "illumination"
- opacity = 0
- icon_state = "sparks"
-
-/obj/effect/effect/smoke/flashbang/New()
- ..()
- SetLuminosity(15)
+ M << "Your ears start to ring!"
/obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve
desc = "Use of this weapon may constiute a war crime in your area, consult your local captain."
@@ -116,6 +75,7 @@
icon_state = "clusterbang"
/obj/item/weapon/grenade/flashbang/clusterbang/prime()
+ update_mob()
var/numspawned = rand(4,8)
var/again = 0
for(var/more = numspawned,more > 0,more--)
@@ -132,9 +92,7 @@
spawn(0)
new /obj/item/weapon/grenade/flashbang/clusterbang/segment(src.loc)//Creates a 'segment' that launches a few more flashbangs
playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
- spawn(0)
- del(src)
- return
+ del(src)
/obj/item/weapon/grenade/flashbang/clusterbang/segment
desc = "A smaller segment of a clusterbang. Better run."
@@ -145,7 +103,6 @@
/obj/item/weapon/grenade/flashbang/clusterbang/segment/New()//Segments should never exist except part of the clusterbang, since these immediately 'do their thing' and asplode
icon_state = "clusterbang_segment_active"
active = 1
- banglet = 1
var/stepdist = rand(1,4)//How far to step
var/temploc = src.loc//Saves the current location to know where to step away from
walk_away(src,temploc,stepdist)//I must go, my people need me
@@ -155,6 +112,7 @@
..()
/obj/item/weapon/grenade/flashbang/clusterbang/segment/prime()
+ update_mob()
var/numspawned = rand(4,8)
for(var/more = numspawned,more > 0,more--)
if(prob(35))
@@ -164,19 +122,16 @@
spawn(0)
new /obj/item/weapon/grenade/flashbang/cluster(src.loc)
playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
- spawn(0)
- del(src)
- return
+ del(src)
/obj/item/weapon/grenade/flashbang/cluster/New()//Same concept as the segments, so that all of the parts don't become reliant on the clusterbang
- spawn(0)
- icon_state = "flashbang_active"
- active = 1
- banglet = 1
- var/stepdist = rand(1,3)
- var/temploc = src.loc
- walk_away(src,temploc,stepdist)
- var/dettime = rand(15,60)
- spawn(dettime)
- prime()
- ..()
\ No newline at end of file
+ ..()
+ icon_state = "flashbang_active"
+ active = 1
+ banglet = 1
+ var/stepdist = rand(1,3)
+ var/temploc = src.loc
+ walk_away(src,temploc,stepdist)
+ var/dettime = rand(15,60)
+ spawn(dettime)
+ prime()
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 63f318ba89c..e206fc37408 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -155,13 +155,13 @@
qdel(src)
/obj/structure/closet/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
..()
- if(health <= 0)
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- del(src)
-
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
+ if(health <= 0)
+ for(var/atom/movable/A as mob|obj in src)
+ A.loc = src.loc
+ del(src)
return
/obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob)
@@ -273,7 +273,7 @@
else if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(src == user.loc)
- user << "You can not [welded?"unweld":"weld"] the locker from inside."
+ user << "You can not [welded?"unweld":"weld"] the locker from inside."
return
if(!WT.remove_fuel(0,user))
user << "You need more welding fuel to complete this task."
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index f2e064ecc11..917c8feb815 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -23,7 +23,7 @@
new /obj/item/clothing/suit/armor/vest/capcarapace(src)
new /obj/item/weapon/cartridge/captain(src)
new /obj/item/clothing/shoes/brown(src)
- new /obj/item/device/radio/headset/heads/captain(src)
+ new /obj/item/device/radio/headset/heads/captain/alt(src)
new /obj/item/clothing/gloves/color/captain(src)
new /obj/item/weapon/gun/energy/gun(src)
return
@@ -101,7 +101,7 @@
else
new /obj/item/weapon/storage/backpack/satchel_sec(src)
new /obj/item/weapon/cartridge/hos(src)
- new /obj/item/device/radio/headset/heads/hos(src)
+ new /obj/item/device/radio/headset/heads/hos/alt(src)
new /obj/item/clothing/under/rank/head_of_security(src)
new /obj/item/clothing/under/rank/head_of_security/formal(src)
new /obj/item/clothing/suit/armor/hos(src)
@@ -139,7 +139,7 @@
new /obj/item/weapon/storage/backpack/security(src)
else
new /obj/item/weapon/storage/backpack/satchel_sec(src)
- new /obj/item/device/radio/headset/headset_sec(src)
+ new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/clothing/suit/armor/vest/warden(src)
new /obj/item/clothing/head/warden(src)
new /obj/item/clothing/suit/armor/vest/warden/alt(src)
@@ -178,7 +178,7 @@
else
new /obj/item/weapon/storage/backpack/satchel_sec(src)
new /obj/item/clothing/suit/armor/vest/security(src)
- new /obj/item/device/radio/headset/headset_sec(src)
+ new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/clothing/head/beret/sec(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/device/flash(src)
@@ -301,7 +301,7 @@
new /obj/item/clothing/shoes/brown(src)
new /obj/item/weapon/storage/box/evidence(src)
new /obj/item/weapon/clipboard(src)
- new /obj/item/device/radio/headset/headset_sec(src)
+ new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/device/detective_scanner(src)
new /obj/item/clothing/suit/armor/vest/det_suit(src)
new /obj/item/ammo_box/c38(src)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index e477868a72e..577e28c02f9 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -69,16 +69,16 @@
/obj/structure/displaycase/captains_laser
name = "captain's display case"
- desc = "A display case for the captain's antique laser gun. It taunts you to kick it."
+ desc = "A display case for the captain's antique laser gun. It taunts you to kick it."
/obj/structure/displaycase/captains_laser/New()
req_access = list(access_captain)
occupant = new /obj/item/weapon/gun/energy/laser/captain(src)
locked = 1
update_icon()
-
+
/obj/structure/proc/getPrint(mob/user as mob)
- return md5(user:dna:uni_identity)
+ return md5(user:dna:uni_identity)
/obj/structure/displaycase/examine()
..()
@@ -112,12 +112,12 @@
/obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
..()
src.healthcheck()
return
-
/obj/structure/displaycase/blob_act()
if (prob(75))
getFromPool(/obj/item/weapon/shard, loc)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index efda3d2e00e..b02fb0f0c86 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -128,16 +128,13 @@
return !density
/obj/structure/grille/bullet_act(var/obj/item/projectile/Proj)
-
- if(!Proj) return
-
- //Tasers and the like should not damage grilles.
- if(Proj.damage_type == STAMINA)
+ if(!Proj)
return
-
- src.health -= Proj.damage*0.2
- healthcheck()
- return 0
+ ..()
+ if((Proj.damage_type != STAMINA)) //Grilles can't be exhausted to death
+ src.health -= Proj.damage*0.3
+ healthcheck()
+ return
/obj/structure/grille/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iswirecutter(W))
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 3b24d5cc057..e77672df358 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -58,11 +58,9 @@ var/global/wcColored
// var/icon/silicateIcon = null // the silicated icon
/obj/structure/window/bullet_act(var/obj/item/projectile/Proj)
- //Tasers and the like should not damage windows.
- if(Proj.damage_type == STAMINA)
- return
-
- health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
+ update_nearby_icons()
..()
if(health <= 0)
var/pdiff=performWallPressureCheck(src.loc)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 54fcd327470..2991d32164c 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -828,7 +828,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/officer(M), slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
M.equip_if_possible(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear)
+ M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear)
M.equip_if_possible(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head)
var/obj/item/device/pda/centcom/pda = new(M)
@@ -853,7 +853,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
M.equip_if_possible(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear)
+ M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear)
M.equip_if_possible(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head)
var/obj/item/device/pda/centcom/pda = new(M)
diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm
index 73be9adbebf..90a54ad0391 100644
--- a/code/modules/admin/verbs/striketeam_syndicate.dm
+++ b/code/modules/admin/verbs/striketeam_syndicate.dm
@@ -129,7 +129,7 @@ var/global/sent_syndicate_strike_team = 0
/mob/living/carbon/human/proc/equip_syndicate_commando(syndicate_leader_selected = 0)
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(src)
+ var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(src)
R.set_frequency(SYND_FREQ) //Same frequency as the syndicate team in Nuke mode.
equip_to_slot_or_del(R, slot_l_ear)
equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(src), slot_w_uniform)
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 099d828e182..cd646e76e77 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -163,7 +163,7 @@
var/cost = href_list["KarmaRefundCost"]
src.karmarefund(type,job,cost)
return
-
+
switch(href_list["_src_"])
if("holder") hsrc = holder
if("usr") hsrc = mob
@@ -412,5 +412,6 @@
'icons/stamp_icons/large_stamp-qm.png',
'icons/stamp_icons/large_stamp-law.png',
'icons/stamp_icons/large_stamp-cent.png',
- 'html/talisman.png'
+ 'html/talisman.png',
+ 'html/images/ntlogo.png'
)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 154790ce338..ca66eaf0ca9 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -119,6 +119,7 @@
desc = "Protects your hearing from loud noises, and quiet ones as well."
icon_state = "earmuffs"
item_state = "earmuffs"
+ flags = EARBANGPROTECT
//Glasses
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 1da4ae739c3..bf1baad2081 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -2,7 +2,7 @@
name = "helmet"
desc = "Standard Security gear. Protects the head from impacts."
icon_state = "helmet"
- flags = FPRINT | TABLEPASS | HEADCOVERSEYES
+ flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADBANGPROTECT
item_state = "helmet"
armor = list(melee = 50, bullet = 15, laser = 50,energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEEARS|HIDEEYES
@@ -18,7 +18,7 @@
desc = "It's a helmet specifically designed to protect against close range attacks."
icon_state = "riot"
item_state = "helmet"
- flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH
+ flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|HEADBANGPROTECT
armor = list(melee = 82, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEEARS
siemens_coefficient = 0.7
@@ -59,6 +59,7 @@
/obj/item/clothing/head/helmet/roman
name = "roman helmet"
desc = "An ancient helmet made of bronze and leather."
+ flags = HEADCOVERSEYES
armor = list(melee = 25, bullet = 0, laser = 25, energy = 10, bomb = 10, bio = 0, rad = 0)
icon_state = "roman"
item_state = "roman"
@@ -73,7 +74,7 @@
name = "gladiator helmet"
desc = "Ave, Imperator, morituri te salutant."
icon_state = "gladiator"
- flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
+ flags = FPRINT|TABLEPASS|HEADCOVERSEYES|BLOCKHAIR
item_state = "gladiator"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
siemens_coefficient = 1
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 02654e9a23b..37b168ddec8 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -433,7 +433,6 @@
icon_state = "roman"
_color = "roman"
item_state = "armor"
- armor = list(melee = 25, bullet = 0, laser = 25, energy = 10, bomb = 10, bio = 0, rad = 0)
/obj/item/clothing/under/maid
name = "maid costume"
diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm
index d57940852f6..f1aa5bea66b 100644
--- a/code/modules/mob/living/carbon/metroid/life.dm
+++ b/code/modules/mob/living/carbon/metroid/life.dm
@@ -182,7 +182,12 @@
/mob/living/carbon/slime/proc/handle_chemicals_in_body()
if(reagents) reagents.metabolize(src)
-
+ if (reagents.get_reagent_amount("plasma")>=5)
+ mutation_chance = min(mutation_chance + 5,50) //Prevents mutation chance going >50%
+ reagents.remove_reagent("plasma", 5)
+ if (reagents.get_reagent_amount("inaprovaline")>=5)
+ mutation_chance = max(mutation_chance - 5,0) //Prevents muation chance going <0%
+ reagents.remove_reagent("inaprovaline", 5)
src.updatehealth()
return //TODO: DEFERRED
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index b7146e208a4..cb5be464681 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -534,14 +534,23 @@
return
/mob/living/carbon/slime/attackby(obj/item/W, mob/user)
- if(W.force > 0)
+ if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Lets you feed slimes plasma.
+ if (user in Friends)
+ ++Friends[user]
+ else
+ Friends[user] = 1
+ user << "You feed the slime the plasma. It chirps happily."
+ var/obj/item/stack/sheet/mineral/plasma/S = W
+ S.use(1)
+ return
+ else if(W.force > 0)
attacked += 10
if(prob(25))
user << "[W] passes right through [src]!"
return
if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
Discipline = 0
- if(W.force >= 3)
+ else if(W.force >= 3)
if(is_adult)
if(prob(5 + round(W.force/2)))
if(Victim || Target)
@@ -613,7 +622,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
Target = null
++Discipline
return
-
+
/mob/living/carbon/slime/can_use_vents()
if(Victim)
return "You cannot ventcrawl while feeding."
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 39505b7ee40..0c8f61569b4 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -179,7 +179,8 @@
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
var/reflectchance = 80 - round(P.damage/3)
if(prob(reflectchance))
- adjustBruteLoss(P.damage * 0.5)
+ if((P.damage_type == BRUTE || P.damage_type == BURN))
+ adjustBruteLoss(P.damage * 0.5)
visible_message("The [P.name] gets reflected by [src]'s shell!", \
"The [P.name] gets reflected by [src]'s shell!")
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 47300bcd973..1cc7a8fff7d 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -11,7 +11,7 @@
var/projectiletype
var/projectilesound
var/casingtype
- var/move_to_delay = 2 //delay for the automated movement.
+ var/move_to_delay = 3 //delay for the automated movement.
var/list/friends = list()
var/vision_range = 9 //How big of an area to search for targets in, a vision of 9 attempts to find targets as soon as they walk into screen view
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 6a22c22cb04..65ee9f5629b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -32,8 +32,8 @@
/mob/living/simple_animal/hostile/asteroid/bullet_act(var/obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills
if(!stat)
Aggro()
- if(P.damage < 30)
- P.damage = (P.damage / 2)
+ if(P.damage < 30 && P.damage_type != BRUTE)
+ P.damage = (P.damage / 3)
visible_message("The [P] has a reduced effect on [src]!")
..()
@@ -42,7 +42,7 @@
var/obj/item/T = AM
if(!stat)
Aggro()
- if(T.throwforce <= 15)
+ if(T.throwforce <= 20)
visible_message("The [T.name] [src.throw_message] [src.name]!")
return
..()
@@ -76,6 +76,7 @@
ranged_cooldown_cap = 4
aggro_vision_range = 9
idle_vision_range = 2
+ turns_per_move = 5
/obj/item/projectile/temp/basilisk
name = "freezing blast"
@@ -123,13 +124,13 @@
icon_aggro = "Goldgrub_alert"
icon_dead = "Goldgrub_dead"
icon_gib = "syndicate_gib"
- vision_range = 3
+ vision_range = 2
aggro_vision_range = 9
- idle_vision_range = 3
- move_to_delay = 3
+ idle_vision_range = 2
+ move_to_delay = 5
friendly = "harmlessly rolls into"
- maxHealth = 60
- health = 60
+ maxHealth = 45
+ health = 45
harm_intent_damage = 5
melee_damage_lower = 0
melee_damage_upper = 0
@@ -208,6 +209,10 @@
Reward()
..()
+/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustBruteLoss(var/damage)
+ idle_vision_range = 9
+ ..()
+
/mob/living/simple_animal/hostile/asteroid/hivelord
name = "hivelord"
desc = "A truly alien creature, it is a mass of unknown organic material, constantly fluctuating. When attacking, pieces of it split off and attack in tandem with the original."
@@ -293,7 +298,7 @@
icon_dead = "Hivelordbrood"
icon_gib = "syndicate_gib"
mouse_opacity = 2
- move_to_delay = 0
+ move_to_delay = 1
friendly = "buzzes near"
vision_range = 10
speed = 3
@@ -328,9 +333,10 @@
mouse_opacity = 2
move_to_delay = 40
ranged = 1
+ ranged_cooldown = 2 //By default, start the Goliath with his cooldown off so that people can run away quickly on first sight
ranged_cooldown_cap = 8
friendly = "wails at"
- vision_range = 5
+ vision_range = 4
speed = 3
maxHealth = 300
health = 300
@@ -341,18 +347,50 @@
throw_message = "does nothing to the rocky hide of the"
aggro_vision_range = 9
idle_vision_range = 5
+ anchored = 1 //Stays anchored until death as to be unpullable
+ var/pre_attack = 0
+
+/mob/living/simple_animal/hostile/asteroid/goliath/Life()
+ ..()
+ handle_preattack()
+
+/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack()
+ if(ranged_cooldown <= 2 && !pre_attack)
+ pre_attack++
+ if(!pre_attack || stat || stance == HOSTILE_STANCE_IDLE)
+ return
+ icon_state = "Goliath_preattack"
+
+/mob/living/simple_animal/hostile/asteroid/goliath/revive()
+ anchored = 1
+ ..()
+
+/mob/living/simple_animal/hostile/asteroid/goliath/Die()
+ anchored = 0
+ ..()
/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire()
- visible_message("The [src.name] digs its tentacles under [target.name]!")
var/tturf = get_turf(target)
- new /obj/effect/goliath_tentacle/original(tturf)
- ranged_cooldown = ranged_cooldown_cap
+ if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
+ visible_message("The [src.name] digs its tentacles under [target.name]!")
+ new /obj/effect/goliath_tentacle/original(tturf)
+ ranged_cooldown = ranged_cooldown_cap
+ icon_state = icon_aggro
+ pre_attack = 0
return
/mob/living/simple_animal/hostile/asteroid/goliath/adjustBruteLoss(var/damage)
ranged_cooldown--
+ handle_preattack()
..()
+/mob/living/simple_animal/hostile/asteroid/goliath/Aggro()
+ vision_range = aggro_vision_range
+ handle_preattack()
+ if(icon_state != icon_aggro)
+ icon_state = icon_aggro
+ return
+
/obj/effect/goliath_tentacle/
name = "Goliath tentacle"
icon = 'icons/mob/animal.dmi'
@@ -369,6 +407,9 @@
/obj/effect/goliath_tentacle/original
/obj/effect/goliath_tentacle/original/New()
+ for(var/obj/effect/goliath_tentacle/original/O in loc)//No more GG NO RE from 2+ goliaths simultaneously tentacling you
+ if(O != src)
+ qdel(src)
var/list/directions = cardinal.Copy()
var/counter
for(counter = 1, counter <= 3, counter++)
@@ -378,6 +419,7 @@
new /obj/effect/goliath_tentacle(T)
..()
+
/obj/effect/goliath_tentacle/proc/Trip()
for(var/mob/living/M in src.loc)
M.Weaken(5)
@@ -400,6 +442,7 @@
desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna."
icon = 'icons/obj/items.dmi'
icon_state = "goliath_hide"
+ flags = NOBLUDGEON
w_class = 3
layer = 4
@@ -408,10 +451,31 @@
if(istype(target, /obj/item/clothing/suit/space/rig/mining) || istype(target, /obj/item/clothing/head/helmet/space/rig/mining))
var/obj/item/clothing/C = target
var/current_armor = C.armor
- if(current_armor.["melee"] < 90)
- current_armor.["melee"] = min(current_armor.["melee"] + 10, 90)
+ if(current_armor.["melee"] < 80)
+ current_armor.["melee"] = min(current_armor.["melee"] + 10, 80)
user << "You strengthen [target], improving its resistance against melee attacks."
del(src)
else
user << "You can't improve [C] any further."
- return
+ return
+ if(istype(target, /obj/mecha/working/ripley))
+ var/obj/mecha/D = target
+ var/list/damage_absorption = D.damage_absorption
+ if(damage_absorption.["brute"] > 0.3)
+ damage_absorption.["brute"] = max(damage_absorption.["brute"] - 0.1, 0.3)
+ user << "You strengthen [target], improving its resistance against melee attacks."
+ qdel(src)
+ if(D.icon_state == "ripley-open")
+ D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open")
+ D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
+ else
+ user << "You can't add armour onto the mech while someone is inside!"
+ if(damage_absorption.["brute"] == 0.3)
+ if(D.icon_state == "ripley-open")
+ D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open")
+ D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter."
+ else
+ user << "You can't add armour onto the mech while someone is inside!"
+ else
+ user << "You can't improve [D] any further."
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 3d43d4628fb..df1f903f21f 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -75,7 +75,8 @@
/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(var/obj/item/projectile/Proj)
if(!Proj) return
if(prob(65))
- src.health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ src.health -= Proj.damage
else
visible_message("\red [src] blocks [Proj] with its shield!")
return 0
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 801ebbbe387..7becc36cfa2 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -56,7 +56,7 @@
var/friendly = "nuzzles" //If the mob does no damage with it's attack
var/environment_smash = 0 //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls
- var/speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
+ var/speed = 1 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
var/can_hide = 0
//Hot simple_animal baby making vars
@@ -251,8 +251,11 @@
adjustBruteLoss(damage)
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
- if(!Proj) return
- adjustBruteLoss(Proj.damage)
+ if(!Proj)
+ return
+ if((Proj.damage_type != STAMINA))
+ adjustBruteLoss(Proj.damage)
+ Proj.on_hit(src, 0)
return 0
/mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob)
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 90c5c422ad8..976d8da1ca6 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -231,7 +231,7 @@
t = replacetext(t, "\[/grid\]", "")
t = replacetext(t, "\[row\]", "
")
+ t = replacetext(t, "\[logo\]", "
")
t = "[t]"
else // If it is a crayon, and he still tries to use these, make them empty!
@@ -552,47 +552,47 @@
/obj/item/weapon/paper/sop
name = "paper- 'Standard Operating Procedure'"
info = "Alert Levels:LIST OF SPELLS AVAILABLE
Magic Missile:
This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.
Fireball:
This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you.
Disintegrate:This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.
Disable Technology:
This spell disables all weapons, cameras and most other technology in range.
Smoke:
This spell spawns a cloud of choking smoke at your location and does not require wizard garb.
Blind:
This spell temporarly blinds a single person and does not require wizard garb.
Forcewall:
This spell creates an unbreakable wall that lasts for 30 seconds and does not require wizard garb.
Blink:
This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.
Teleport:
This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.
Mutate:
This spell causes you to turn into a hulk, and gain telekinesis for a short while.
Ethereal Jaunt:
This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.
Knock:
This spell opens nearby doors and does not require wizard garb.
LIST OF SPELLS AVAILABLE
Magic Missile:
This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.
Fireball:
This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you.
Disintegrate:This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.
Disable Technology:
This spell disables all weapons, cameras and most other technology in range.
Smoke:
This spell spawns a cloud of choking smoke at your location and does not require wizard garb.
Blind:
This spell temporarly blinds a single person and does not require wizard garb.
Forcewall:
This spell creates an unbreakable wall that lasts for 30 seconds and does not require wizard garb.
Blink:
This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.
Teleport:
This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.
Mutate:
This spell causes you to turn into a hulk, and gain telekinesis for a short while.
Ethereal Jaunt:
This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.
Knock:
This spell opens nearby doors and does not require wizard garb.