diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index b2f58691818..fb6e47f6c0e 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -32,6 +32,8 @@ Pipelines + Other Objects -> Pipe network
var/global/datum/pipe_icon_manager/icon_manager
/obj/machinery/atmospherics/New()
+ if(!armor)
+ armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100)
..()
atmos_machinery += src
if(!icon_manager)
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index a03ba7c9d4c..8c2d6ac0f29 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -1,3 +1,6 @@
+#define ALL ~0 //For convenience.
+#define NONE 0
+
//FLAGS BITMASK
#define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
#define NODROP 2 // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
@@ -89,3 +92,12 @@
#define AFFECT_ROBOTIC_ORGAN 1
#define AFFECT_ORGANIC_ORGAN 2
#define AFFECT_ALL_ORGANS 3
+
+//Fire stuff, for burn_state
+#define LAVA_PROOF -2
+#define FIRE_PROOF -1
+#define FLAMMABLE 0
+#define ON_FIRE 1
+
+//resistant_flags
+#define INDESTRUCTIBLE 64 //doesn't take damage
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index f6cb33eb527..d83512ae2b2 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -294,12 +294,6 @@
#define RADIO_CONNECTION_FAIL 0
#define RADIO_CONNECTION_NON_SUBSPACE 1
-//Fire stuff, for burn_state
-#define LAVA_PROOF -2
-#define FIRE_PROOF -1
-#define FLAMMABLE 0
-#define ON_FIRE 1
-
// Bluespace shelter deploy checks
#define SHELTER_DEPLOY_ALLOWED "allowed"
#define SHELTER_DEPLOY_BAD_TURFS "bad turfs"
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index f30809d32ef..f300608e699 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -127,9 +127,7 @@
if(A == loc || (A in loc) || (sdepth != -1 && sdepth <= 2))
// No adjacency needed
if(W)
- var/resolved = A.attackby(W,src)
- if(!resolved && A && W)
- W.afterattack(A,src,1,params) // 1 indicates adjacency
+ W.melee_attack_chain(src, A, params)
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
@@ -145,10 +143,7 @@
if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1))
if(A.Adjacent(src)) // see adjacent.dm
if(W)
- // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example, params)
- var/resolved = A.attackby(W,src,params)
- if(!resolved && A && W)
- W.afterattack(A,src,1,params) // 1: clicking something Adjacent
+ W.melee_attack_chain(src, A, params)
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 631044f5c97..a00c9561cd3 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -81,10 +81,7 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents))
- // No adjacency checks
- var/resolved = A.attackby(W,src,params, params)
- if(!resolved && A && W)
- W.afterattack(A,src,1,params)
+ W.melee_attack_chain(src, A, params)
return
if(!isturf(loc))
@@ -93,9 +90,7 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
if(isturf(A) || isturf(A.loc))
if(A.Adjacent(src)) // see adjacent.dm
- var/resolved = A.attackby(W, src, params, params)
- if(!resolved && A && W)
- W.afterattack(A, src, 1, params)
+ W.melee_attack_chain(src, A, params)
return
else
W.afterattack(A, src, 0, params)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 141308a0135..bf6c7b5531f 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -1,8 +1,17 @@
+/obj/item/proc/melee_attack_chain(mob/user, atom/target, params)
+ if(pre_attackby(target, user, params))
+ // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
+ var/resolved = target.attackby(src, user, params)
+ if(!resolved && target && !qdeleted(src))
+ afterattack(target, user, 1, params) // 1: clicking something Adjacent
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
/obj/item/proc/attack_self(mob/user)
return
+/obj/item/proc/pre_attackby(atom/A, mob/living/user, params) //do stuff before attackby!
+ return TRUE //return FALSE to avoid calling attackby after this proc does stuff
+
// No comment
/atom/proc/attackby(obj/item/W, mob/living/user, params)
return
@@ -16,7 +25,7 @@
/obj/attackby(obj/item/I, mob/living/user, params)
return I.attack_obj(src, user)
-/mob/living/attackby(obj/item/I, mob/user, params)
+/mob/living/attackby(obj/item/I, mob/living/user, params)
user.changeNext_move(CLICK_CD_MELEE)
if(attempt_harvest(I, user))
return 1
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 6e085df1a5c..fbb7d249ba0 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -400,6 +400,7 @@ var/bomb_set
name = "nuclear authentication disk"
desc = "Better keep this safe."
icon_state = "nucleardisk"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 30, bio = 0, rad = 0)
/obj/item/weapon/disk/nuclear/New()
..()
diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm
index 244b3b04977..d373b09edd6 100644
--- a/code/game/machinery/Freezer.dm
+++ b/code/game/machinery/Freezer.dm
@@ -8,6 +8,7 @@
use_power = 1
current_heat_capacity = 1000
layer = 3
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100)
/obj/machinery/atmospherics/unary/cold_sink/freezer/New()
..()
@@ -159,8 +160,8 @@
var/max_temperature = 0
anchored = 1.0
layer = 3
-
current_heat_capacity = 1000
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100)
/obj/machinery/atmospherics/unary/heat_reservoir/heater/New()
..()
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 13d619aef9f..b4c725f7d59 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -4,6 +4,7 @@
icon_state = "motion3"
layer = 3
anchored = 1.0
+ armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0)
var/uses = 20
var/disabled = TRUE
var/lethal = 0
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index ee6493973e5..7694ff41ca0 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -80,6 +80,7 @@
active_power_usage = 8
power_channel = ENVIRON
req_one_access = list(access_atmospherics, access_engine_equip)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100)
var/alarm_id = null
var/frequency = 1439
//var/skipprocess = 0 //Experimenting
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 8057c6edf23..00ca34e9a30 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -50,6 +50,7 @@ var/datum/canister_icons/canister_icon_container = new()
density = 1
var/health = 100.0
flags = CONDUCT
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 100, bomb = 10, bio = 100, rad = 100)
var/menu = 0
//used by nanoui: 0 = main menu, 1 = relabel
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm
index d3f1f25a52d..2fc688f8906 100644
--- a/code/game/machinery/atmoalter/meter.dm
+++ b/code/game/machinery/atmoalter/meter.dm
@@ -5,6 +5,7 @@
icon_state = "meterX"
var/obj/machinery/atmospherics/pipe/target = null
anchored = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100)
power_channel = ENVIRON
var/frequency = 0
var/id
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 45dcb5f7880..d24ffb75adc 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -1,6 +1,7 @@
/obj/machinery/portable_atmospherics
name = "atmoalter"
use_power = 0
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100)
var/datum/gas_mixture/air_contents = new
var/obj/machinery/atmospherics/unary/portables_connector/connected_port
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index b0179ff493f..61bcf2a15b8 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -7,7 +7,7 @@
idle_power_usage = 5
active_power_usage = 10
layer = 5
-
+ armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0)
var/datum/wires/camera/wires = null // Wires datum
var/list/network = list("SS13")
var/c_tag = null
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 938011c1fc8..bb33210f780 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -6,7 +6,7 @@
anchored = 1.0
layer = 2.8
interact_offline = 1
-
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100)
var/on = 0
var/temperature_archived
var/mob/living/carbon/occupant = null
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 842b08b577c..c3a1d2dac03 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -8,6 +8,7 @@
density = 1
layer = OPEN_DOOR_LAYER
power_channel = ENVIRON
+ armor = list(melee = 30, bullet = 30, laser = 20, energy = 20, bomb = 10, bio = 100, rad = 100)
var/open_layer = OPEN_DOOR_LAYER
var/closed_layer = CLOSED_DOOR_LAYER
var/visible = 1
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index fc0fc16d9cf..548e677eecd 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -19,6 +19,7 @@
closed_layer = 3.11
auto_close_time = 50
assemblytype = /obj/structure/firelock_frame
+ armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100)
var/can_force = TRUE
var/force_open_time = 300
var/can_crush = TRUE
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index d64b08efedf..c42e046ea28 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -5,6 +5,7 @@
icon_state = "pdoor1"
explosion_block = 3
heat_proof = 1
+ armor = list(melee = 50, bullet = 100, laser = 100, energy = 100, bomb = 50, bio = 100, rad = 100)
var/id_tag = 1.0
var/protected = 1
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index b9910e00997..89157003e5f 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -7,6 +7,7 @@
flags = ON_BORDER
opacity = 0
dir = EAST
+ armor = list(melee = 20, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100)
var/obj/item/weapon/airlock_electronics/electronics = null
var/base_state = "left"
var/health = 150.0 //If you change this, consider changing ../door/window/brigdoor/ health at the bottom of this .dm file
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 2c48f91b422..56a36b07e92 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -12,6 +12,7 @@ FIRE ALARM
var/timing = 0.0
var/lockdownbyai = 0
anchored = 1.0
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
use_power = 1
idle_power_usage = 2
active_power_usage = 6
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 811eceb8e23..41d81a9aef0 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -36,7 +36,7 @@ var/list/holopads = list()
icon_state = "holopad0"
layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them.
-
+ armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0)
var/mob/living/silicon/ai/master//Which AI, if any, is controlling the object? Only one AI may control a hologram at any time.
var/last_request = 0 //to prevent request spam. ~Carn
var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating.
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 44a5cc3eee4..ba5867eb260 100755
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -3,6 +3,7 @@
desc = "It's useful for igniting plasma."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "igniter1"
+ armor = list(melee = 50, bullet = 30, laser = 70, energy = 50, bomb = 20, bio = 0, rad = 0)
var/id = null
var/on = 1.0
anchored = 1.0
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 0497ac716f0..f74ef8717a7 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -149,6 +149,8 @@ Class Procs:
fast_processing -= src
/obj/machinery/New() //new
+ if(!armor)
+ armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
machines += src
..()
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index 16f7c047dd2..e8f5b743dfd 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -10,7 +10,7 @@
level = 1 // underfloor
layer = 2.5
anchored = 1
-
+ armor = list(melee = 70, bullet = 70, laser = 70, energy = 70, bomb = 0, bio = 0, rad = 0)
var/open = 0 // true if cover is open
var/locked = 1 // true if controls are locked
var/location = "" // location response text
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index a67580d0ebb..7cc40fdc62e 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -78,6 +78,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!"
icon = 'icons/obj/terminals.dmi'
icon_state = "newscaster_normal"
+ armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
var/screen = NEWSCASTER_MAIN
var/paper_remaining = 15
var/securityCaster = 0
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 98013119723..01486963356 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -8,13 +8,12 @@
icon = 'icons/obj/turrets.dmi'
icon_state = "turretCover"
anchored = 1
-
density = 0
use_power = 1 //this turret uses and requires power
idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power
active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power
power_channel = EQUIP //drains power from the EQUIPMENT channel
-
+ armor = list(melee = 50, bullet = 30, laser = 30, energy = 30, bomb = 30, bio = 0, rad = 0)
var/raised = 0 //if the turret cover is "open" and the turret is raised
var/raising= 0 //if the turret is currently opening or closing its cover
var/health = 80 //the turret's health
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 21e91f3759b..c10f4044f78 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -38,6 +38,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
anchored = 1
icon = 'icons/obj/terminals.dmi'
icon_state = "req_comp0"
+ armor = list(melee = 70, bullet = 30, laser = 30, energy = 30, bomb = 0, bio = 0, rad = 0)
var/department = "Unknown" //The list of all departments on the station (Determined from this variable on each unit) Set this to the same thing if you want several consoles in one department
var/list/message_log = list() //List of all messages
var/departmentType = 0 //Bitflag. Zero is reply-only. Map currently uses raw numbers instead of defines.
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 600dc3704fa..5e09185c002 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -5,6 +5,7 @@
icon_state = "sheater0"
name = "space heater"
desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed not to set the station on fire."
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
var/obj/item/weapon/stock_parts/cell/cell
var/on = 0
var/open = 0
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 4af01736028..1329922235f 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -42,7 +42,7 @@
layer = 2.9
anchored = 1
density = 1
-
+ armor = list(melee = 20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
var/icon_vend //Icon_state when vending
var/icon_deny //Icon_state when denying access
@@ -804,11 +804,13 @@
product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?"
product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!"
refill_canister = /obj/item/weapon/vending_refill/boozeomat
+
/obj/machinery/vending/assist
products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4,
/obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4)
contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2, /obj/item/device/assembly/voice = 2, /obj/item/device/assembly/health = 2)
product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/boozeomat/New()
..()
@@ -961,7 +963,7 @@
prices = list(/obj/item/device/pda =300,/obj/item/weapon/cartridge/mob_hunt_game = 50,/obj/item/weapon/cartridge/medical = 200,/obj/item/weapon/cartridge/chemistry = 150,/obj/item/weapon/cartridge/engineering = 100,
/obj/item/weapon/cartridge/atmos = 75,/obj/item/weapon/cartridge/janitor = 100,/obj/item/weapon/cartridge/signal/toxins = 150,
/obj/item/weapon/cartridge/signal = 75)
-
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/liberationstation
name = "\improper Liberation Station"
@@ -977,6 +979,7 @@
/obj/item/weapon/gun/projectile/shotgun = 2,/obj/item/weapon/gun/projectile/automatic/ar = 2)
premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2)
contraband = list(/obj/item/clothing/under/patriotsuit = 1,/obj/item/weapon/bedsheet/patriot = 3)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/cigarette
name = "cigarette machine"
@@ -1015,7 +1018,7 @@
/obj/item/stack/medical/bruise_pack = 3,/obj/item/stack/medical/splint = 4, /obj/item/device/sensor_device = 2, /obj/item/weapon/reagent_containers/hypospray/autoinjector = 4,
/obj/item/weapon/pinpointer/crew = 2)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/pancuronium = 1,/obj/item/weapon/reagent_containers/glass/bottle/sulfonal = 1)
-
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
//This one's from bay12
/obj/machinery/vending/plasmaresearch
@@ -1036,6 +1039,7 @@
density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/weapon/reagent_containers/hypospray/autoinjector = 4,/obj/item/device/healthanalyzer = 1)
contraband = list(/obj/item/weapon/reagent_containers/syringe/charcoal = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/food/pill/tox = 1)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/wallmed2
name = "\improper NanoMed"
@@ -1047,6 +1051,7 @@
products = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector = 5,/obj/item/weapon/reagent_containers/syringe/charcoal = 3,/obj/item/stack/medical/bruise_pack = 3,
/obj/item/stack/medical/ointment =3,/obj/item/device/healthanalyzer = 3)
contraband = list(/obj/item/weapon/reagent_containers/food/pill/tox = 3)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/wallmed1/syndicate
name = "\improper SyndiMed Plus"
@@ -1069,6 +1074,7 @@
/obj/item/weapon/reagent_containers/food/snacks/donut = 12,/obj/item/weapon/storage/box/evidence = 6,/obj/item/device/flashlight/seclite = 4,/obj/item/weapon/restraints/legcuffs/bola/energy = 7,
/obj/item/clothing/mask/muzzle/safety = 4)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/fancy/donut_box = 2,/obj/item/device/hailer = 5)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/hydronutrients
name = "\improper NutriMax"
@@ -1080,6 +1086,7 @@
products = list(/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez = 30,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z = 20,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh = 10,/obj/item/weapon/reagent_containers/spray/pestspray = 20,
/obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5,/obj/item/weapon/cultivator = 3,/obj/item/weapon/shovel/spade = 3,/obj/item/device/plant_analyzer = 4)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
///obj/item/beezeez = 45,
@@ -1100,6 +1107,7 @@
contraband = list(/obj/item/seeds/amanita = 2, /obj/item/seeds/glowshroom = 2, /obj/item/seeds/liberty = 2, /obj/item/seeds/nettle = 2,
/obj/item/seeds/plump = 2, /obj/item/seeds/reishi = 2, /obj/item/seeds/cannabis = 3, /obj/item/seeds/starthistle = 2, /obj/item/seeds/fungus = 3, /obj/item/seeds/random = 2)
premium = list(/obj/item/weapon/reagent_containers/spray/waterflower = 1)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/**
* Populate hydroseeds product_records
@@ -1143,6 +1151,7 @@
/obj/item/clothing/shoes/sandal = 1,
/obj/item/weapon/twohanded/staff = 2)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/autodrobe
name = "\improper AutoDrobe"
@@ -1198,7 +1207,7 @@
component_parts += new /obj/item/weapon/vending_refill/autodrobe(0)
/obj/machinery/vending/dinnerware
- name = "\improper Dinnerware"
+ name = "\improper Plasteel Chef's Dinnerware Vendor"
desc = "A kitchen and restaurant equipment vendor."
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
@@ -1215,6 +1224,7 @@
/obj/item/weapon/kitchen/mould/cane = 1, /obj/item/weapon/kitchen/mould/cash = 1,
/obj/item/weapon/kitchen/mould/coin = 1, /obj/item/weapon/kitchen/mould/loli = 1)
contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/kitchen/knife/butcher = 2)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/sovietsoda
name = "\improper BODA"
@@ -1223,6 +1233,7 @@
product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
products = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda = 30)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola = 20)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/tool
name = "\improper YouTool"
@@ -1234,6 +1245,7 @@
/obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5)
contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/color/fyellow = 2)
premium = list(/obj/item/clothing/gloves/color/yellow = 1)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/engivend
name = "\improper Engi-Vend"
@@ -1244,6 +1256,7 @@
products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/firelock_electronics = 10,/obj/item/weapon/firealarm_electronics = 10,/obj/item/weapon/apc_electronics = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/stock_parts/cell/high = 10,/obj/item/weapon/camera_assembly = 10)
contraband = list(/obj/item/weapon/stock_parts/cell/potato = 3)
premium = list(/obj/item/weapon/storage/belt/utility = 3)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
//This one's from bay12
/obj/machinery/vending/engineering
@@ -1261,6 +1274,7 @@
// There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty.
// Another invalid entry, /obj/item/weapon/circuitry. I don't even know what that would translate to, removed it.
// The original products list wasn't finished. The ones without given quantities became quantity 5. -Sayu
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
//This one's from bay12
/obj/machinery/vending/robotics
@@ -1274,6 +1288,7 @@
/obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
/obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
//everything after the power cell had no amounts, I improvised. -Sayu
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/sustenance
name = "\improper Sustenance Vendor"
@@ -1285,6 +1300,7 @@
/obj/item/weapon/reagent_containers/food/drinks/ice = 12,
/obj/item/weapon/reagent_containers/food/snacks/candy/candy_corn = 6)
contraband = list(/obj/item/weapon/kitchen/knife = 6)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/hatdispenser
name = "\improper Hatlord 9000"
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index aef0a766172..d71775a6a44 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -4,6 +4,7 @@
internal_damage_threshold = 50
maint_access = 0
damage_absorption = list("brute"=0.7,"fire"=1,"bullet"=0.7,"laser"=0.85,"energy"=1,"bomb"=0.8)
+ armor = list(melee = 30, bullet = 30, laser = 15, energy = 20, bomb = 20, bio = 0, rad = 0)
var/am = "d3c2fbcadca903a41161ccc9df9cf948"
/obj/mecha/combat/moved_inside(var/mob/living/carbon/human/H as mob)
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index 01b5ceb346e..6f3a8b51354 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -8,6 +8,7 @@
health = 400
deflect_chance = 20
damage_absorption = list("brute"=0.5,"fire"=1.1,"bullet"=0.65,"laser"=0.85,"energy"=0.9,"bomb"=0.8)
+ armor = list(melee = 40, bullet = 35, laser = 15, energy = 10, bomb = 20, bio = 0, rad = 0)
max_temperature = 30000
infra_luminosity = 8
force = 40
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 471a24078fb..d820eef82d1 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -8,6 +8,7 @@
health = 250
deflect_chance = 5
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
+ armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0)
max_temperature = 25000
infra_luminosity = 6
var/overload = 0
diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm
index e0b10fb622a..751d93c944a 100644
--- a/code/game/mecha/combat/honker.dm
+++ b/code/game/mecha/combat/honker.dm
@@ -8,6 +8,7 @@
deflect_chance = 60
internal_damage_threshold = 60
damage_absorption = list("brute"=1.2,"fire"=1.5,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1)
+ armor = list(melee = -20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
max_temperature = 25000
infra_luminosity = 5
operation_req_access = list(access_clown)
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 1fa404ed5ce..31c3e46afd3 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -7,6 +7,7 @@
health = 500
deflect_chance = 25
damage_absorption = list("brute"=0.5,"fire"=0.7,"bullet"=0.45,"laser"=0.6,"energy"=0.7,"bomb"=0.7)
+ armor = list(melee = 50, bullet = 55, laser = 40, energy = 30, bomb = 30, bio = 0, rad = 0)
max_temperature = 60000
burn_state = LAVA_PROOF
infra_luminosity = 3
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index 5f66ad3a85c..5dbffb62f29 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -9,6 +9,7 @@
health = 200
deflect_chance = 30
damage_absorption = list("brute"=0.7,"fire"=0.7,"bullet"=0.7,"laser"=0.7,"energy"=0.7,"bomb"=0.7)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 30, bio = 0, rad = 0)
max_temperature = 25000
infra_luminosity = 3
wreckage = /obj/effect/decal/mecha_wreckage/phazon
diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm
index 19eb34fb448..9e51be0357d 100644
--- a/code/game/mecha/combat/reticence.dm
+++ b/code/game/mecha/combat/reticence.dm
@@ -8,6 +8,7 @@
health = 150
deflect_chance = 30
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
+ armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0)
max_temperature = 15000
wreckage = /obj/effect/decal/mecha_wreckage/reticence
operation_req_access = list(access_mime)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 3f05012586a..c3de7aa4bfb 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -19,6 +19,7 @@
layer = MOB_LAYER //icon draw layer
infra_luminosity = 15 //byond implementation is bugged.
force = 5
+ armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
var/initial_icon = null //Mech type for resetting icon. Only used for reskinning kits (see custom items)
var/can_move = 1
var/mob/living/carbon/occupant = null
@@ -333,11 +334,7 @@
else if(istype(obstacle, /obj/structure/grille/))
var/obj/structure/grille/G = obstacle
- G.health = (0.25*initial(G.health))
- G.broken = 1
- G.icon_state = "[initial(G.icon_state)]-b"
- G.density = 0
- new /obj/item/stack/rods(get_turf(G.loc))
+ G.obj_break()
breakthrough = 1
else if(istype(obstacle, /obj/structure/table))
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 6c563bb22b3..3d3906edc71 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -9,6 +9,7 @@
lights_power = 7
deflect_chance = 15
damage_absorption = list("brute"=0.6,"fire"=1,"bullet"=0.8,"laser"=0.9,"energy"=1,"bomb"=0.6)
+ armor = list(melee = 40, bullet = 20, laser = 10, energy = 20, bomb = 40, bio = 0, rad = 0)
max_equip = 6
wreckage = /obj/effect/decal/mecha_wreckage/ripley
var/list/cargo = new
@@ -65,6 +66,7 @@
burn_state = LAVA_PROOF
lights_power = 7
damage_absorption = list("brute"=0.6,"fire"=0.5,"bullet"=0.7,"laser"=0.7,"energy"=1,"bomb"=0.4)
+ armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 60, bio = 0, rad = 0)
max_equip = 5 // More armor, less tools
wreckage = /obj/effect/decal/mecha_wreckage/ripley/firefighter
diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm
new file mode 100644
index 00000000000..4a70c73c9c3
--- /dev/null
+++ b/code/game/objects/effects/temporary_visuals/clockcult.dm
@@ -0,0 +1,23 @@
+//temporary visual effects(/obj/effect/temp_visual) used by clockcult stuff
+/obj/effect/temp_visual/ratvar
+ name = "ratvar's light"
+ icon = 'icons/effects/clockwork_effects.dmi'
+ duration = 8
+ randomdir = 0
+ layer = ABOVE_NORMAL_TURF_LAYER
+
+/obj/effect/temp_visual/ratvar/beam
+ icon_state = "ratvarbeamglow"
+
+/obj/effect/temp_visual/ratvar/beam/grille
+ layer = BELOW_OBJ_LAYER
+
+/obj/effect/temp_visual/ratvar/floor
+ icon_state = "ratvarfloorglow"
+
+/obj/effect/temp_visual/ratvar/grille
+ icon_state = "ratvargrilleglow"
+ layer = BELOW_OBJ_LAYER
+
+/obj/effect/temp_visual/ratvar/grille/broken
+ icon_state = "ratvarbrokengrilleglow"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 91cc00384b0..9d6ebd06fcb 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -44,7 +44,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/permeability_coefficient = 1 // for chemicals/diseases
var/siemens_coefficient = 1 // for electrical admittance/conductance (electrocution checks and shit)
var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up
- var/armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
var/armour_penetration = 0 //percentage of armour effectiveness to remove
var/list/allowed = null //suit storage stuff.
var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers.
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 2a78511d2c7..a30c3e1b716 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -271,7 +271,6 @@
created_window = /obj/structure/window/plasmabasic
full_window = /obj/structure/window/full/plasmabasic
-
/obj/item/stack/sheet/plasmaglass/attack_self(mob/user as mob)
construct_window(user)
@@ -359,7 +358,7 @@
origin_tech = "plasmatech=2;materials=2"
created_window = /obj/structure/window/plasmareinforced
full_window = /obj/structure/window/full/plasmareinforced
-
+ armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0)
/obj/item/stack/sheet/plasmarglass/attack_self(mob/user as mob)
construct_window(user)
diff --git a/code/game/objects/items/weapons/holosign.dm b/code/game/objects/items/weapons/holosign.dm
index 3ec25dfabaf..c96c5f6f207 100644
--- a/code/game/objects/items/weapons/holosign.dm
+++ b/code/game/objects/items/weapons/holosign.dm
@@ -50,3 +50,4 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "holosign"
anchored = 1
+ armor = list(melee = 0, bullet = 50, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0)
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm
index 71e0e079282..ec0fdeaf386 100644
--- a/code/game/objects/items/weapons/shards.dm
+++ b/code/game/objects/items/weapons/shards.dm
@@ -13,6 +13,7 @@
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
attack_verb = list("stabbed", "slashed", "sliced", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
+ armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0)
/obj/item/weapon/shard/suicide_act(mob/user)
to_chat(viewers(user), pick("[user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.",
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 6d4b1238d39..7863e5431ae 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -1,6 +1,7 @@
/obj/item/weapon/shield
name = "shield"
block_chance = 50
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 0, bomb = 30, bio = 0, rad = 0)
/obj/item/weapon/shield/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
if(attack_type == THROWN_PROJECTILE_ATTACK)
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index 19c4661c707..3ee198e8765 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -8,14 +8,12 @@
slot_flags = SLOT_BACK
hitsound = 'sound/weapons/smash.ogg'
w_class = WEIGHT_CLASS_NORMAL
-
pressure_resistance = ONE_ATMOSPHERE*5
-
force = 5.0
throwforce = 10.0
throw_speed = 1
throw_range = 4
-
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0)
actions_types = list(/datum/action/item_action/set_internals)
var/datum/gas_mixture/air_contents = null
var/distribute_pressure = ONE_ATMOSPHERE
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index 11da88ae680..f2ecf3190a3 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -103,6 +103,7 @@ Frequency:
throw_range = 5
materials = list(MAT_METAL=10000)
origin_tech = "magnets=3;bluespace=4"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 30, bio = 0, rad = 0)
var/active_portals = 0
/obj/item/weapon/hand_tele/attack_self(mob/user as mob)
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 96628da9a26..9c78e6f7b94 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -545,6 +545,7 @@
throwforce = 15
throw_range = 1
w_class = WEIGHT_CLASS_HUGE
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 0, bomb = 50, bio = 0, rad = 0)
var/charged = 5
origin_tech = "combat=4;bluespace=4;plasmatech=7"
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index c78d8d0e2b4..8ad7e8c9b91 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -1,6 +1,35 @@
+//the essential proc to call when an obj must receive damage of any kind.
+/obj/proc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, armour_penetration = 0)
+ if(sound_effect)
+ play_attack_sound(damage_amount, damage_type, damage_flag)
+ if(!(resistance_flags & INDESTRUCTIBLE) && obj_integrity > 0)
+ damage_amount = run_obj_armor(damage_amount, damage_type, damage_flag, attack_dir, armour_penetration)
+ if(damage_amount >= 0.1)
+ . = damage_amount
+ var/old_integ = obj_integrity
+ obj_integrity = max(old_integ - damage_amount, 0)
+ if(obj_integrity <= 0)
+ var/int_fail = integrity_failure
+ if(int_fail && old_integ > int_fail)
+ obj_break(damage_flag)
+ obj_destruction(damage_flag)
+ else if(integrity_failure)
+ if(obj_integrity <= integrity_failure)
+ obj_break(damage_flag)
-/obj/proc/take_damage()
- return
+//returns the damage value of the attack after processing the obj's various armor protections
+/obj/proc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(BURN)
+ else
+ return 0
+ var/armor_protection = 0
+ if(damage_flag)
+ armor_protection = armor[damage_flag]
+ if(armor_protection) //Only apply weak-against-armor/hollowpoint effects if there actually IS armor.
+ armor_protection = Clamp(armor_protection - armour_penetration, 0, 100)
+ return round(damage_amount * (100 - armor_protection)*0.01, 0.1)
//the sound played when the obj is damaged.
/obj/proc/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
@@ -13,6 +42,16 @@
if(BURN)
playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
+/obj/hitby(atom/movable/AM)
+ ..()
+ var/tforce = 0
+ if(ismob(AM))
+ tforce = 10
+ else if(isobj(AM))
+ var/obj/O = AM
+ tforce = O.throwforce
+ take_damage(tforce, BRUTE, "melee", 1, get_dir(src, AM))
+
/obj/singularity_act()
ex_act(1)
if(src && !qdeleted(src))
@@ -54,4 +93,36 @@
//the obj is deconstructed into pieces, whether through careful disassembly or when destroyed.
/obj/proc/deconstruct(disassembled = TRUE)
- qdel(src)
\ No newline at end of file
+ qdel(src)
+
+//what happens when the obj's health is below integrity_failure level.
+/obj/proc/obj_break(damage_flag)
+ return
+
+//what happens when the obj's integrity reaches zero.
+/obj/proc/obj_destruction(damage_flag)
+ if(damage_flag == "fire")
+ burn()
+ else
+ deconstruct(FALSE)
+
+//changes max_integrity while retaining current health percentage
+//returns TRUE if the obj broke, FALSE otherwise
+/obj/proc/modify_max_integrity(new_max, can_break = TRUE, damage_type = BRUTE, new_failure_integrity = null)
+ var/current_integrity = obj_integrity
+ var/current_max = max_integrity
+
+ if(current_integrity != 0 && current_max != 0)
+ var/percentage = current_integrity / current_max
+ current_integrity = max(1, round(percentage * new_max)) //don't destroy it as a result
+ obj_integrity = current_integrity
+
+ max_integrity = new_max
+
+ if(new_failure_integrity != null)
+ integrity_failure = new_failure_integrity
+
+ if(can_break && integrity_failure && current_integrity <= integrity_failure)
+ obj_break(damage_type)
+ return TRUE
+ return FALSE
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index daea457e696..2bbadfcd0ba 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -12,11 +12,13 @@
var/can_deconstruct = TRUE
var/damtype = "brute"
var/force = 0
-
+ var/list/armor
var/obj_integrity //defaults to max_integrity
var/max_integrity = 500
var/integrity_failure = 0 //0 if we have no special broken behavior
+ var/resistance_flags = NONE // INDESTRUCTIBLE
+
var/Mtoollink = 0 // variable to decide if an object should show the multitool menu linking menu, not all objects use it
var/burn_state = FIRE_PROOF // LAVA_PROOF | FIRE_PROOF | FLAMMABLE | ON_FIRE
@@ -28,7 +30,9 @@
var/force_blueprints = FALSE //forces the obj to be on the blueprints, regardless of when it was created.
/obj/New()
- . = ..()
+ ..()
+ if(!armor)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
if(obj_integrity == null)
obj_integrity = max_integrity
if(on_blueprints && isturf(loc))
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 2f05d26dd53..a775fec0095 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -3,6 +3,7 @@
pressure_resistance = 8
var/climbable
var/mob/climber
+ var/broken = FALSE
/obj/structure/blob_act()
if(prob(50))
diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm
index 93f4bb7be9b..1306e4214be 100644
--- a/code/game/objects/structures/barsign.dm
+++ b/code/game/objects/structures/barsign.dm
@@ -4,17 +4,14 @@
icon = 'icons/obj/barsigns.dmi'
icon_state = "empty"
req_access = list(access_bar)
+ armor = list(melee = 20, bullet = 20, laser = 20, energy = 100, bomb = 0, bio = 0, rad = 0)
var/list/barsigns=list()
var/list/hiddensigns
- var/broken = 0
var/emagged = 0
var/state = 0
var/prev_sign = ""
var/panel_open = 0
-
-
-
/obj/structure/sign/barsign/New()
..()
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 4c8a2528b1e..9ab957d4664 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -4,12 +4,12 @@
icon = 'icons/obj/closet.dmi'
icon_state = "closed"
density = 1
+ armor = list(melee = 20, bullet = 10, laser = 10, energy = 0, bomb = 10, bio = 0, rad = 0)
var/icon_closed = "closed"
var/icon_opened = "open"
var/opened = 0
var/welded = 0
var/locked = 0
- var/broken = 0
var/wall_mounted = 0 //never solid (You can always pass over it)
var/health = 100
var/lastbang
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index 5baef28f262..47eb5ead7e5 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -8,6 +8,7 @@
icon_opened = "fireaxe1100"
anchored = 1
density = 0
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 100, bomb = 10, bio = 100, rad = 100)
var/localopened = 0 //Setting this to keep it from behaviouring like a normal closet and obstructing movement in the map. -Agouri
opened = 1
var/hitstaken = 0
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index 72ef10a5cde..6f4af20adc4 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -7,6 +7,7 @@
opened = 0
locked = 1
broken = 0
+ armor = list(melee = 30, bullet = 50, laser = 50, energy = 100, bomb = 0, bio = 0, rad = 0)
var/large = 1
icon_closed = "secure"
var/icon_locked = "secure1"
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 16d77587274..c1bd4bc9721 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -18,6 +18,7 @@ var/global/list/captain_display_cases = list()
name = "display case frame"
icon = 'icons/obj/stock_parts.dmi'
icon_state = "box_glass"
+ armor = list(melee = 30, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0)
var/obj/item/weapon/airlock_electronics/circuit = null
var/obj/item/device/assembly/prox_sensor/sensor = null
var/state = DISPLAYCASE_FRAME_CIRCUIT
@@ -116,7 +117,7 @@ var/global/list/captain_display_cases = list()
/obj/structure/displaycase/captains_laser
name = "captain's display case"
desc = "A display case for the captain's antique laser gun. Hooked up with an anti-theft system."
- burglar_alarm = 1
+ burglar_alarm = 1
locked = 1
req_access = list(access_captain)
start_showpiece_type = /obj/item/weapon/gun/energy/laser/captain
diff --git a/code/game/objects/structures/fullwindow.dm b/code/game/objects/structures/fullwindow.dm
index f2663063dea..08e86e8f534 100644
--- a/code/game/objects/structures/fullwindow.dm
+++ b/code/game/objects/structures/fullwindow.dm
@@ -95,6 +95,7 @@
health = 160
reinf = 1
explosion_block = 3
+ armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100)
/obj/structure/window/full/shuttle/New()
..()
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 25dfb7f6961..9af91affa52 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -1,16 +1,17 @@
/obj/structure/grille
- desc = "A flimsy lattice of metal rods, with screws to secure it to the floor."
+ desc = "A flimsy framework of metal rods."
name = "grille"
icon = 'icons/obj/structures.dmi'
icon_state = "grille"
- density = 1
- anchored = 1
+ density = TRUE
+ anchored = TRUE
flags = CONDUCT
pressure_resistance = 5*ONE_ATMOSPHERE
layer = BELOW_OBJ_LAYER
level = 3
- var/health = 10
- var/broken = 0
+ armor = list(melee = 50, bullet = 70, laser = 70, energy = 100, bomb = 10, bio = 100, rad = 100)
+ max_integrity = 50
+ integrity_failure = 20
var/rods_type = /obj/item/stack/rods
var/rods_amount = 2
var/rods_broken = 1
@@ -19,7 +20,6 @@
/obj/structure/grille/fence/
var/width = 3
- health = 50
/obj/structure/grille/fence/New()
if(width > 1)
@@ -51,6 +51,20 @@
if(!broken)
obj_break()
+/obj/structure/grille/examine(mob/user)
+ ..()
+ if(anchored)
+ to_chat(user, "It's secured in place with screws. The rods look like they could be cut through.")
+ if(!anchored)
+ to_chat(user, "The anchoring screws are unscrewed. The rods look like they could be cut through.")
+
+/obj/structure/grille/ratvar_act()
+ if(broken)
+ new /obj/structure/grille/ratvar/broken(loc)
+ else
+ new /obj/structure/grille/ratvar(loc)
+ qdel(src)
+
/obj/structure/grille/Bumped(atom/user)
if(ismob(user))
shock(user, 70)
@@ -65,9 +79,9 @@
if(shock(user, 70))
return
if(HULK in user.mutations)
- take_damage(5)
+ take_damage(60, BRUTE, "melee", 1)
else
- take_damage(rand(1,2))
+ take_damage(rand(5,10), BRUTE, "melee", 1)
/obj/structure/grille/attack_alien(mob/living/user)
if(istype(user, /mob/living/carbon/alien/larva))
@@ -79,7 +93,7 @@
"You hear twisting metal.")
if(!shock(user, 70))
- take_damage(5)
+ take_damage(20, BRUTE, "melee", 1)
/obj/structure/grille/attack_slime(mob/living/user)
user.changeNext_move(CLICK_CD_MELEE)
@@ -105,7 +119,7 @@
"You smash against [src].", \
"You hear twisting metal.")
- take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type)
+ take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, "melee", 1)
/obj/structure/grille/mech_melee_attack(obj/mecha/M)
if(..())
@@ -259,25 +273,15 @@
var/obj/R = new rods_type(loc, rods_amount)
transfer_fingerprints_to(R)
qdel(src)
+ ..()
-/obj/structure/grille/proc/obj_break()
+/obj/structure/grille/obj_break()
if(!broken && can_deconstruct)
new broken_type(loc)
var/obj/R = new rods_type(loc, rods_broken)
transfer_fingerprints_to(R)
qdel(src)
-/obj/structure/grille/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
- if(sound_effect)
- play_attack_sound(damage_amount, damage_type, damage_flag)
- health -= damage_amount
- if(health <= 0)
- if(!broken)
- obj_break()
- else
- if(health <= -6)
- deconstruct()
-
// shock user with probability prb (if all connections & power are working)
// returns 1 if shocked, 0 otherwise
@@ -303,33 +307,60 @@
/obj/structure/grille/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(!broken)
if(exposed_temperature > T0C + 1500)
- take_damage(1)
+ take_damage(1, BURN, 0, 0)
..()
/obj/structure/grille/hitby(atom/movable/AM)
- ..()
- var/tforce = 0
- if(ismob(AM))
- tforce = 5
- else if(isobj(AM))
- if(prob(50))
- var/obj/O = AM
- tforce = max(0, O.throwforce * 0.5)
- else if(anchored && !broken)
+ if(isobj(AM))
+ if(prob(50) && anchored && !broken)
var/turf/T = get_turf(src)
var/obj/structure/cable/C = T.get_cable_node()
if(C)
playsound(loc, 'sound/magic/LightningShock.ogg', 100, 1, extrarange = 5)
tesla_zap(src, 3, C.powernet.avail * 0.01) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot.
C.powernet.load += C.powernet.avail * 0.0375 // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock.
- take_damage(tforce)
+ return ..()
/obj/structure/grille/broken // Pre-broken grilles for map placement
icon_state = "brokengrille"
density = 0
- health = 0
+ obj_integrity = 20
broken = 1
rods_amount = 1
rods_broken = 0
grille_type = /obj/structure/grille
broken_type = null
+
+/obj/structure/grille/ratvar
+ icon_state = "ratvargrille"
+ name = "cog grille"
+ desc = "A strangely-shaped grille."
+ broken_type = /obj/structure/grille/ratvar/broken
+
+/obj/structure/grille/ratvar/New()
+ ..()
+ if(broken)
+ new /obj/effect/temp_visual/ratvar/grille/broken(get_turf(src))
+ else
+ new /obj/effect/temp_visual/ratvar/grille(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/beam/grille(get_turf(src))
+
+/obj/structure/grille/ratvar/narsie_act()
+ take_damage(rand(1, 3), BRUTE)
+ if(src)
+ var/previouscolor = color
+ color = "#960000"
+ animate(src, color = previouscolor, time = 8)
+
+/obj/structure/grille/ratvar/ratvar_act()
+ return
+
+/obj/structure/grille/ratvar/broken
+ icon_state = "brokenratvargrille"
+ density = FALSE
+ obj_integrity = 20
+ broken = TRUE
+ rods_amount = 1
+ rods_broken = 0
+ grille_type = /obj/structure/grille/ratvar
+ broken_type = null
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index 003daa76645..0cb716bcc7d 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -5,6 +5,7 @@
icon_state = "latticefull"
density = 0
anchored = 1.0
+ armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
layer = 2.3 //under pipes
// flags = CONDUCT
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index f6a035158ec..097439cccf2 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -7,7 +7,7 @@
icon = 'icons/obj/doors/mineral_doors.dmi'
icon_state = "metal"
-
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 100, bomb = 10, bio = 100, rad = 100)
var/initial_state
var/state = 0 //closed, 1 == open
var/isSwitchingStates = 0
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
index d9eff5b9ea3..b9c54600ab6 100644
--- a/code/game/objects/structures/plasticflaps.dm
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -6,6 +6,7 @@
density = 0
anchored = 1
layer = 4
+ armor = list(melee = 100, bullet = 80, laser = 80, energy = 100, bomb = 50, bio = 100, rad = 100)
var/list/mobs_can_pass = list(
/mob/living/carbon/slime,
/mob/living/simple_animal/mouse,
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index b1cf367ba1f..7d89f48eb33 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -4,6 +4,7 @@
opacity = 0
density = 0
layer = 3.5
+ armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/structure/sign/ex_act(severity)
switch(severity)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 5b6fec84c73..5005d9e4aff 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -534,6 +534,7 @@
canSmoothWith = list(/obj/structure/table/reinforced, /obj/structure/table)
max_integrity = 200
integrity_failure = 50
+ armor = list(melee = 10, bullet = 30, laser = 30, energy = 100, bomb = 20, bio = 0, rad = 0)
/obj/structure/table/reinforced/deconstruction_hints(mob/user)
if(deconstruction_ready)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index cfee76dc749..361b815a358 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -446,6 +446,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
shardtype = /obj/item/weapon/shard/plasma
glasstype = /obj/item/stack/sheet/plasmaglass
health = 120
+ armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100)
/obj/structure/window/plasmabasic/New(Loc,re=0)
..()
@@ -474,7 +475,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
glasstype = /obj/item/stack/sheet/plasmaglass
reinf = 1
health = 160
-
+ armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100)
/obj/structure/window/plasmareinforced/New(Loc,re=0)
..()
@@ -499,6 +500,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
reinf = 1
basestate = "rwindow"
health = 40
+ armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100)
/obj/structure/window/reinforced/tinted
name = "tinted window"
diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm
index 3072fd2a264..21a55004ade 100644
--- a/code/game/shuttle_engines.dm
+++ b/code/game/shuttle_engines.dm
@@ -1,6 +1,7 @@
/obj/structure/shuttle
name = "shuttle"
icon = 'icons/turf/shuttle.dmi'
+ armor = list(melee = 100, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) //default + ignores melee
/obj/structure/shuttle/shuttleRotate(rotation)
..()
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index ddc95afaccd..62f3ff84f0e 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -74,6 +74,11 @@
desc = "Tightly-pressed brass tiles. They emit minute vibration."
icon_state = "clockwork_floor"
+/turf/simulated/floor/clockwork/New()
+ ..()
+ new /obj/effect/temp_visual/ratvar/floor(src)
+ new /obj/effect/temp_visual/ratvar/beam(src)
+
/turf/simulated/floor/clockwork/attackby(obj/item/I, mob/living/user, params)
if(iscrowbar(I))
user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...")
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index f0408a9bdc0..c4460519521 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -481,37 +481,39 @@
eater.say("Nom")
wither()
-/obj/structure/spacevine/attackby(obj/item/weapon/W, mob/user, params)
- if (!W || !user || !W.type)
- return
- user.changeNext_move(CLICK_CD_MELEE)
- var/damage_to_do = W.force
-
- if(istype(W, /obj/item/weapon/scythe))
- var/obj/item/weapon/scythe/S = W
+/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user)
+ var/damage_dealt = I.force
+ if(istype(I, /obj/item/weapon/scythe))
+ var/obj/item/weapon/scythe/S = I
if(S.extend) //so folded telescythes won't get damage boosts / insta-clears (they instead will instead be treated like non-scythes)
- damage_to_do *= 4
+ damage_dealt *= 4
for(var/obj/structure/spacevine/B in range(1,src))
- if(B.health > damage_to_do) //this only is going to occur for woodening mutation vines (increased health) or if we nerf scythe damage/multiplier
- B.health -= damage_to_do
+ if(B.health > damage_dealt) //this only is going to occur for woodening mutation vines (increased health) or if we nerf scythe damage/multiplier
+ B.take_damage(damage_dealt, I.damtype, "melee", 1)
else
B.wither()
return
-
- if(is_sharp(W))
- damage_to_do *= 4
-
- if(W && W.damtype == "fire")
- damage_to_do *= 4
+ if(is_sharp(I))
+ damage_dealt *= 4
+ if(I.damtype == BURN)
+ damage_dealt *= 4
for(var/datum/spacevine_mutation/SM in mutations)
- damage_to_do = SM.on_hit(src, user, W, damage_to_do) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
+ damage_dealt = SM.on_hit(src, user, I, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
+ take_damage(damage_dealt, I.damtype, "melee", 1)
- health -= damage_to_do
- if(health < 1)
- wither()
+/obj/structure/spacevine/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(damage_amount)
+ playsound(src, 'sound/weapons/slash.ogg', 50, 1)
+ else
+ playsound(src, 'sound/weapons/tap.ogg', 50, 1)
+ if(BURN)
+ playsound(loc, 'sound/items/welder.ogg', 100, 1)
- ..()
+/obj/structure/spacevine/obj_destruction()
+ wither()
/obj/structure/spacevine/Crossed(mob/crosser)
if(isliving(crosser))
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index cee72938fc6..d9574550190 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -119,6 +119,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
sharp = 1
var/extend = 1
+ var/swiping = FALSE
/obj/item/weapon/scythe/suicide_act(mob/user)
user.visible_message("[user] is beheading \himself with the [src.name]! It looks like \he's trying to commit suicide.")
@@ -130,6 +131,21 @@
playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1)
return (BRUTELOSS)
+/obj/item/weapon/scythe/pre_attackby(atom/A, mob/living/user, params)
+ if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user))
+ return ..()
+ else
+ var/turf/user_turf = get_turf(user)
+ var/dir_to_target = get_dir(user_turf, get_turf(A))
+ swiping = TRUE
+ var/static/list/scythe_slash_angles = list(0, 45, 90, -45, -90)
+ for(var/i in scythe_slash_angles)
+ var/turf/T = get_step(user_turf, turn(dir_to_target, i))
+ for(var/obj/structure/spacevine/V in T)
+ if(user.Adjacent(V))
+ melee_attack_chain(user, V)
+ swiping = FALSE
+
/obj/item/weapon/scythe/tele
icon_state = "tscythe0"
item_state = null //no sprite for folded version, like a tele-baton
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index f72d4bfccda..1777bc26407 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -32,7 +32,7 @@
integrity_failure = 50
max_integrity = 100
- armor = list(melee = 0, bullet = 20, laser = 20, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 0, acid = 0)
+ armor = list(melee = 0, bullet = 20, laser = 20, energy = 100, bomb = 0, bio = 100, rad = 100)
// Important hardware (must be installed for computer to work)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 59ae659f227..ce500463ada 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -138,6 +138,8 @@
terminal.connect_to_network()
/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0)
+ if(!armor)
+ armor = list(melee = 20, bullet = 20, laser = 10, energy = 100, bomb = 30, bio = 100, rad = 100)
..()
apcs += src
apcs = sortAtom(apcs)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 57a6e77b660..7a6c648610f 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -16,6 +16,7 @@
icon_state = "tube-construct-stage1"
anchored = 1
layer = 5
+ armor = list(melee = 50, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
var/stage = 1
var/fixture_type = "tube"
var/sheets_refunded = 2
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 5b1fc73e24b..2a66339bfed 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -27,6 +27,7 @@ field_generator power level display
anchored = 0
density = 1
use_power = 0
+ armor = list(melee = 25, bullet = 10, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
var/const/num_power_levels = 6 // Total number of power level icon has
var/power_level = 0
var/active = FG_OFFLINE
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index d6d83255a81..dfbedc07ad2 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -62,6 +62,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
icon_state = "none"
anchored = 0
density = 1
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 0, bomb = 0, bio = 0, rad = 0)
var/obj/machinery/particle_accelerator/control_box/master = null
var/construction_state = 0
var/reference = null
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 1aae13e1f0d..0e06e67f3e8 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -15,6 +15,7 @@
anchored = 1
density = 1
on_blueprints = TRUE
+ armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100)
var/datum/gas_mixture/air_contents // internal reservoir
var/mode = 1 // item mode 0=off 1=charging 2=charged
var/flush = 0 // true if flush handle is pulled
@@ -659,6 +660,7 @@
var/dpdir = 0 // bitmask of pipe directions
dir = 0 // dir will contain dominant direction for junction pipes
var/health = 10 // health points 0-10
+ armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100)
layer = 2.3 // slightly lower than wires and other pipes
var/base_icon_state // initial icon state on map
diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm
index bdd8ca39c90..bdd8c2a9608 100644
--- a/code/modules/vehicle/vehicle.dm
+++ b/code/modules/vehicle/vehicle.dm
@@ -8,6 +8,7 @@
anchored = 0
can_buckle = 1
buckle_lying = 0
+ armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0)
var/keytype = null //item typepath, if non-null an item of this type is needed in your hands to drive this vehicle
var/next_vehicle_move = 0 //used for move delays
var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower
diff --git a/icons/effects/clockwork_effects.dmi b/icons/effects/clockwork_effects.dmi
new file mode 100644
index 00000000000..5d6082dc2bd
Binary files /dev/null and b/icons/effects/clockwork_effects.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index ed29bb274fd..0b17038ade5 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 634b24d3eb5..151b7444519 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/paradise.dme b/paradise.dme
index d87c2bf23db..14306bb981e 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -734,6 +734,7 @@
#include "code\game\objects\effects\spawners\random_spawners.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\effects\spawners\windowspawner.dm"
+#include "code\game\objects\effects\temporary_visuals\clockcult.dm"
#include "code\game\objects\effects\temporary_visuals\cult.dm"
#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm"
#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm"