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"