diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index e1f874254d4..dccf2a0dd23 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -187,7 +187,7 @@
/area/ruin/unpowered)
"z" = (
/obj/item/weapon/shovel,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/engine/cult{
baseturf = /turf/open/floor/plating/lava/smooth
},
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm
index faf5d439792..ce611c6df76 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm
@@ -18,7 +18,7 @@
desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!";
icon_state = "mirror_broke";
pixel_x = -28;
- shattered = 1
+ broken = 1
},
/obj/item/clothing/suit/hooded/bloated_human,
/obj/effect/decal/cleanable/blood,
@@ -31,7 +31,7 @@
desc = "Oh no, seven years of bad luck!";
icon_state = "mirror_broke";
pixel_x = 28;
- shattered = 1
+ broken = 1
},
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/lava/smooth;
@@ -44,7 +44,7 @@
desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!";
icon_state = "mirror_broke";
pixel_x = -28;
- shattered = 1
+ broken = 1
},
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/lava/smooth
@@ -71,7 +71,7 @@
/obj/structure/mirror{
icon_state = "mirror_broke";
pixel_y = 28;
- shattered = 1
+ broken = 1
},
/obj/item/weapon/kitchen/knife/envy,
/turf/open/floor/plating{
@@ -83,7 +83,7 @@
desc = "Oh no, seven years of bad luck!";
icon_state = "mirror_broke";
pixel_x = 28;
- shattered = 1
+ broken = 1
},
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/lava/smooth
@@ -94,7 +94,7 @@
desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!";
icon_state = "mirror_broke";
pixel_x = -28;
- shattered = 1
+ broken = 1
},
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/lava/smooth
@@ -112,7 +112,7 @@
desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!";
icon_state = "mirror_broke";
pixel_x = -28;
- shattered = 1
+ broken = 1
},
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/lava/smooth;
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm
index 103d828b8fa..d531cf28f0a 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm
@@ -88,7 +88,7 @@
name = "pizza spawner"
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/wood{
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface;
initial_gas_mix = "o2=14;n2=23;TEMP=300"
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
index 04afc8e1fb7..54d740040f1 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
@@ -53,7 +53,7 @@
},
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -141,7 +141,7 @@
},
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -336,7 +336,7 @@
/obj/structure/alien/weeds,
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -407,7 +407,7 @@
},
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -426,7 +426,7 @@
/obj/structure/alien/weeds,
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm
index cbcc6691acd..0ba85b500c0 100644
--- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm
+++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm
@@ -116,7 +116,7 @@
"cl" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/open/floor/plasteel/bar,/area/awaymission/BMPship/Midship)
"cm" = (/obj/structure/table,/obj/item/weapon/kitchen/knife,/turf/open/floor/plasteel/bar,/area/awaymission/BMPship/Midship)
"cn" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/turf/open/floor/plasteel/bar,/area/awaymission/BMPship/Midship)
-"co" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb2,/turf/open/floor/plasteel/bar,/area/awaymission/BMPship/Midship)
+"co" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb/cobweb2,/turf/open/floor/plasteel/bar,/area/awaymission/BMPship/Midship)
"cp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor/shutters{id = "packerCargo"},/turf/open/floor/plating,/area/awaymission/BMPship/Aft)
"cq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/carpet,/area/awaymission/BMPship/Fore)
"cr" = (/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice,/turf/open/floor/plasteel/bar,/area/awaymission/BMPship/Midship)
diff --git a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm
index 893af75cac3..5007f108b1a 100644
--- a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm
+++ b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm
@@ -95,7 +95,7 @@
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"u" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"v" = (
diff --git a/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm b/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm
index 4de656779ce..0e72d6cb29d 100644
--- a/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm
@@ -4,11 +4,11 @@
"d" = (/turf/closed/wall/r_wall,/area/ruin/unpowered/no_grav)
"e" = (/turf/open/floor/plasteel/airless,/area/ruin/unpowered/no_grav)
"f" = (/turf/open/floor/plasteel/airless{icon_state = "damaged2"},/area/ruin/unpowered/no_grav)
-"g" = (/obj/machinery/light_construct/small{dir = 1},/turf/open/floor/plasteel/airless{icon_state = "damaged3"},/area/ruin/unpowered/no_grav)
+"g" = (/obj/structure/light_construct/small{dir = 1},/turf/open/floor/plasteel/airless{icon_state = "damaged3"},/area/ruin/unpowered/no_grav)
"h" = (/obj/machinery/computer/teleporter,/turf/open/floor/plasteel/airless,/area/ruin/unpowered/no_grav)
"i" = (/obj/machinery/teleport/station,/turf/open/floor/plasteel/airless,/area/ruin/unpowered/no_grav)
"j" = (/obj/machinery/teleport/hub,/turf/open/floor/plasteel/airless,/area/ruin/unpowered/no_grav)
-"k" = (/obj/machinery/light_construct/small{dir = 4},/turf/open/floor/plating/airless,/area/ruin/unpowered/no_grav)
+"k" = (/obj/structure/light_construct/small{dir = 4},/turf/open/floor/plating/airless,/area/ruin/unpowered/no_grav)
"l" = (/obj/structure/table,/obj/item/weapon/stock_parts/cell{charge = 100;maxcharge = 15000},/turf/open/floor/plasteel/airless,/area/ruin/unpowered/no_grav)
"m" = (/turf/open/floor/plasteel/airless{icon_state = "damaged4"},/area/ruin/unpowered/no_grav)
"n" = (/obj/machinery/power/apc{dir = 0;name = "Worn-out APC";pixel_y = -24},/turf/open/floor/plasteel/airless,/area/ruin/unpowered/no_grav)
diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm
index 3c27dabfd81..30555aca640 100644
--- a/_maps/RandomZLevels/Academy.dmm
+++ b/_maps/RandomZLevels/Academy.dmm
@@ -573,7 +573,7 @@
/turf/open/floor/plasteel/black,
/area/awaymission/academy/headmaster)
"bQ" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/cable{
d1 = 4;
d2 = 8;
@@ -2920,7 +2920,7 @@
},
/area/awaymission/academy/academyaft)
"in" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/cafeteria{
dir = 2
},
@@ -3113,7 +3113,7 @@
/turf/open/floor/wood,
/area/awaymission/academy/academyaft)
"iP" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/engine,
/area/awaymission/academy/academyaft)
"iQ" = (
@@ -3940,7 +3940,7 @@
/turf/open/floor/engine/cult,
/area/awaymission/academy/academycellar)
"kZ" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/effect/decal/cleanable/blood/old,
/obj/effect/decal/remains/human,
/turf/open/floor/engine/cult,
@@ -3965,7 +3965,7 @@
/turf/open/floor/engine/cult,
/area/awaymission/academy/academycellar)
"lf" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/engine/cult,
/area/awaymission/academy/academycellar)
"lg" = (
diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm
index 801d47134b8..a375cabe157 100644
--- a/_maps/RandomZLevels/caves.dmm
+++ b/_maps/RandomZLevels/caves.dmm
@@ -1685,7 +1685,7 @@
/area/awaymission/northblock)
"dD" = (
/obj/structure/table/wood,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/wood{
baseturf = /turf/open/floor/plating/asteroid/basalt
},
@@ -1832,7 +1832,7 @@
"dY" = (
/obj/structure/bed,
/obj/item/weapon/bedsheet,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/effect/landmark{
name = "awaystart"
},
@@ -2122,7 +2122,7 @@
/obj/structure/table,
/obj/item/weapon/gun/energy/kinetic_accelerator,
/obj/item/weapon/gun/energy/kinetic_accelerator,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/basalt
},
diff --git a/_maps/RandomZLevels/centcomAway.dmm b/_maps/RandomZLevels/centcomAway.dmm
index 070b4850138..c4fd8ca737f 100644
--- a/_maps/RandomZLevels/centcomAway.dmm
+++ b/_maps/RandomZLevels/centcomAway.dmm
@@ -2612,7 +2612,7 @@
/area/awaymission/centcomAway/general)
"is" = (
/obj/structure/bookcase,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/grimy,
/area/awaymission/centcomAway/general)
"it" = (
@@ -2899,7 +2899,7 @@
},
/area/awaymission/centcomAway/general)
"jk" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/grimy,
/area/awaymission/centcomAway/general)
"jl" = (
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index 9142670609e..05e42b79b15 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -82,7 +82,7 @@
/obj/structure/alien/weeds,
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -105,7 +105,7 @@
},
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -177,7 +177,7 @@
},
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -536,7 +536,7 @@
},
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -558,7 +558,7 @@
/obj/structure/alien/weeds,
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -1970,7 +1970,7 @@
"cG" = (
/obj/structure/grille{
density = 0;
- destroyed = 1;
+ broken = 1;
icon_state = "brokengrille"
},
/obj/item/stack/rods,
@@ -3285,7 +3285,7 @@
/obj/structure/alien/weeds,
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -3516,7 +3516,7 @@
/obj/structure/alien/weeds,
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -3625,7 +3625,7 @@
},
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -4034,7 +4034,7 @@
},
/obj/structure/alien/weeds{
desc = "A large mottled egg.";
- health = 100;
+ obj_integrity = 100;
icon_state = "egg_hatched";
name = "egg"
},
@@ -5043,7 +5043,7 @@
"gE" = (
/obj/structure/grille{
density = 0;
- destroyed = 1;
+ broken = 1;
icon_state = "brokengrille"
},
/obj/item/stack/rods,
@@ -5744,7 +5744,7 @@
"hx" = (
/obj/structure/grille{
density = 0;
- destroyed = 1;
+ broken = 1;
icon_state = "brokengrille"
},
/obj/item/stack/rods,
@@ -6294,7 +6294,7 @@
desc = "Oh no, seven years of bad luck!";
icon_state = "mirror_broke";
pixel_x = 28;
- shattered = 1
+ broken = 1
},
/turf/open/floor/plasteel/freezer{
heat_capacity = 1e+006
@@ -8056,7 +8056,7 @@
/obj/item/stack/rods,
/obj/structure/grille{
density = 0;
- destroyed = 1;
+ broken = 1;
icon_state = "brokengrille"
},
/obj/item/stack/rods,
@@ -8074,7 +8074,7 @@
"kQ" = (
/obj/structure/grille{
density = 0;
- destroyed = 1;
+ broken = 1;
icon_state = "brokengrille"
},
/obj/item/stack/rods,
@@ -9643,7 +9643,7 @@
"ns" = (
/obj/structure/grille{
density = 0;
- destroyed = 1;
+ broken = 1;
icon_state = "brokengrille"
},
/obj/item/stack/rods,
@@ -9801,7 +9801,7 @@
"nD" = (
/obj/structure/grille{
density = 0;
- destroyed = 1;
+ broken = 1;
icon_state = "brokengrille"
},
/obj/item/stack/rods,
@@ -9908,7 +9908,7 @@
name = "MO19 Arrivals"
})
"nJ" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating{
broken = 1;
heat_capacity = 1e+006;
@@ -10270,7 +10270,7 @@
"oj" = (
/obj/structure/grille{
density = 0;
- destroyed = 1;
+ broken = 1;
icon_state = "brokengrille"
},
/turf/open/floor/mineral/titanium,
diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm
index 3f56227c366..243ef869fe4 100644
--- a/_maps/RandomZLevels/research.dmm
+++ b/_maps/RandomZLevels/research.dmm
@@ -3531,10 +3531,10 @@
"jp" = (
/obj/structure/barricade/wooden{
desc = "A wooden table hastely flipped over for cover.";
- health = 55;
+ obj_integrity = 55;
icon = 'icons/obj/smooth_structures/wood_table.dmi';
icon_state = "wood_table";
- maxhealth = 55;
+ max_integrity = 55;
name = "flipped table"
},
/turf/open/floor/plasteel/yellowsiding{
@@ -3648,10 +3648,10 @@
"jG" = (
/obj/structure/barricade/wooden{
desc = "A wooden table hastely flipped over for cover.";
- health = 55;
+ obj_integrity = 55;
icon = 'icons/obj/smooth_structures/wood_table.dmi';
icon_state = "wood_table";
- maxhealth = 55;
+ max_integrity = 55;
name = "flipped table"
},
/turf/open/floor/plasteel,
@@ -3779,10 +3779,10 @@
"kb" = (
/obj/structure/barricade/wooden{
desc = "A wooden table hastely flipped over for cover.";
- health = 55;
+ obj_integrity = 55;
icon = 'icons/obj/smooth_structures/wood_table.dmi';
icon_state = "wood_table";
- maxhealth = 55;
+ max_integrity = 55;
name = "flipped table"
},
/turf/open/floor/plasteel/yellowsiding,
diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm
index 1ded5e1d37f..4cbac2f8645 100644
--- a/_maps/RandomZLevels/undergroundoutpost45.dmm
+++ b/_maps/RandomZLevels/undergroundoutpost45.dmm
@@ -18069,7 +18069,7 @@
"yN" = (
/obj/structure/grille{
density = 0;
- destroyed = 1;
+ broken = 1;
icon_state = "brokengrille"
},
/turf/open/floor/plasteel/shuttle{
diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm
index 9a7f95d8ccc..0625de04704 100644
--- a/_maps/map_files/BirdStation/BirdStation.dmm
+++ b/_maps/map_files/BirdStation/BirdStation.dmm
@@ -226,7 +226,6 @@
/area/shuttle/syndicate)
"aaG" = (
/obj/machinery/door/poddoor{
- auto_close = 300;
id = "smindicate";
name = "outer blast door"
},
diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm
index 721fc91755e..43d61387abf 100644
--- a/_maps/map_files/DreamStation/dreamstation04.dmm
+++ b/_maps/map_files/DreamStation/dreamstation04.dmm
@@ -2241,7 +2241,6 @@
/area/shuttle/syndicate)
"aeh" = (
/obj/machinery/door/poddoor{
- auto_close = 300;
id = "smindicate";
name = "outer blast door"
},
@@ -5399,7 +5398,6 @@
icon_state = "4-8"
},
/obj/machinery/newscaster{
- hitstaken = 0;
pixel_x = 0;
pixel_y = -32;
tag = "s"
@@ -17038,7 +17036,7 @@
"aJP" = (
/obj/structure/cable/green,
/obj/machinery/computer/monitor,
-/obj/machinery/light_construct,
+/obj/structure/light_construct,
/turf/open/floor/plating,
/area/maintenance/fore)
"aJQ" = (
@@ -24360,7 +24358,6 @@
pixel_y = 0
},
/obj/machinery/newscaster{
- hitstaken = 0;
pixel_x = 0;
pixel_y = -32;
tag = "s"
@@ -25579,7 +25576,7 @@
dir = 4
},
/obj/structure/closet/wardrobe/chemistry_white,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating,
/area/maintenance/asmaint)
"bbl" = (
@@ -30813,7 +30810,6 @@
dir = 4
},
/obj/machinery/newscaster{
- hitstaken = 0;
pixel_x = 0;
pixel_y = -32;
tag = "s"
@@ -35123,7 +35119,6 @@
"btJ" = (
/obj/structure/closet/secure_closet/detective,
/obj/machinery/newscaster{
- hitstaken = 0;
pixel_x = 0;
pixel_y = -32;
tag = "s"
@@ -35478,7 +35473,6 @@
/area/hallway/secondary/exit)
"bup" = (
/obj/machinery/newscaster{
- hitstaken = 0;
pixel_x = -32;
pixel_y = 0;
tag = "w"
@@ -38138,7 +38132,6 @@
/obj/item/weapon/folder/blue,
/obj/item/weapon/stamp/hop,
/obj/machinery/newscaster{
- hitstaken = 0;
pixel_x = 0;
pixel_y = -32;
tag = "s"
@@ -44999,7 +44992,6 @@
/area/crew_quarters/captain)
"bLr" = (
/obj/machinery/newscaster{
- hitstaken = 0;
pixel_x = -32;
pixel_y = 0;
tag = "w"
@@ -70879,7 +70871,7 @@
pixel_y = 24;
req_access_txt = "0"
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating,
/area/maintenance/asmaint2)
"cKy" = (
diff --git a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
index 3b3e3b58934..e7fc86306b0 100644
--- a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
+++ b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
@@ -321,7 +321,7 @@
/obj/machinery/vending/cigarette{
use_power = 0
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/mineral/titanium,
/area/shuttle/abandoned)
"aaZ" = (
@@ -331,7 +331,6 @@
/area/shuttle/abandoned)
"aba" = (
/obj/machinery/door/poddoor{
- auto_close = 300;
id = "smindicate";
name = "outer blast door"
},
@@ -1406,7 +1405,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/mineral/titanium,
/area/shuttle/abandoned)
"acX" = (
@@ -3191,7 +3190,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/bot,
/area/shuttle/abandoned)
"agd" = (
@@ -3809,7 +3808,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/mineral/titanium,
/area/shuttle/abandoned)
"aho" = (
@@ -7956,7 +7955,7 @@
dir = 8;
on = 1
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/item/device/radio/intercom{
dir = 1;
name = "Station Intercom (General)";
@@ -10340,7 +10339,7 @@
d2 = 8;
icon_state = "2-8"
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating,
/area/maintenance/fore)
"atv" = (
@@ -22858,7 +22857,7 @@
},
/area/maintenance/fore)
"aSa" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/chair/stool{
pixel_y = 8
},
@@ -28205,7 +28204,7 @@
icon_state = "2-8"
},
/obj/structure/reagent_dispensers/watertank,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/fpmaint{
@@ -33350,7 +33349,7 @@
/obj/structure/toilet{
dir = 8
},
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 1
},
/turf/open/floor/plasteel{
@@ -33909,7 +33908,7 @@
},
/obj/effect/decal/cleanable/oil,
/obj/item/weapon/cigbutt,
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 4
},
/turf/open/floor/plasteel{
@@ -34753,7 +34752,7 @@
desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!";
icon_state = "mirror_broke";
pixel_x = -28;
- shattered = 1
+ broken = 1
},
/obj/effect/decal/cleanable/vomit/old,
/obj/effect/decal/cleanable/cobweb,
@@ -34803,7 +34802,7 @@
/obj/structure/toilet{
dir = 8
},
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 1
},
/turf/open/floor/plasteel{
@@ -36081,7 +36080,7 @@
desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!";
icon_state = "mirror_broke";
pixel_x = -28;
- shattered = 1
+ broken = 1
},
/obj/item/weapon/cigbutt,
/turf/open/floor/plasteel{
@@ -41684,7 +41683,6 @@
pixel_y = -30
},
/obj/machinery/newscaster{
- hitstaken = 1;
pixel_x = 30
},
/turf/open/floor/plasteel/red/side{
@@ -42257,7 +42255,7 @@
d2 = 8;
icon_state = "2-8"
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating{
broken = 1;
icon_state = "platingdmg3"
@@ -44232,7 +44230,7 @@
/obj/structure/chair/stool{
pixel_y = 8
},
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 8
},
/turf/open/floor/plating{
@@ -44860,7 +44858,7 @@
/area/maintenance/starboard)
"bLc" = (
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 8
},
/obj/effect/spawner/lootdrop/grille_or_trash,
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index a4545d7ad81..09fd391cb4f 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -4485,7 +4485,7 @@
/area/ai_monitored/security/armory)
"ahW" = (
/obj/item/clothing/head/festive,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating,
/area/maintenance/fore)
"ahX" = (
@@ -4504,7 +4504,7 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"aia" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/table,
/obj/item/weapon/stock_parts/manipulator,
/obj/effect/spawner/lootdrop/maintenance,
@@ -5211,7 +5211,7 @@
})
"ajq" = (
/obj/item/stack/sheet/cardboard,
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 1
},
/obj/structure/closet/crate,
@@ -6662,7 +6662,7 @@
name = "Port Maintenance"
})
"alP" = (
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 4
},
/obj/structure/rack{
@@ -7402,7 +7402,7 @@
})
"anb" = (
/obj/structure/table/reinforced,
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 8
},
/obj/item/weapon/paper_bin{
@@ -8659,7 +8659,7 @@
/area/maintenance/starboard)
"apo" = (
/obj/structure/closet,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/item/weapon/reagent_containers/food/drinks/beer{
desc = "Takes you to a whole new level of thinking.";
name = "Meta-Cider"
@@ -8759,7 +8759,7 @@
pixel_x = 32;
pixel_y = 0
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating,
/area/maintenance/auxsolarstarboard)
"apy" = (
@@ -8858,7 +8858,7 @@
/turf/open/floor/plasteel/black,
/area/storage/tech)
"apG" = (
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 4
},
/obj/structure/chair{
@@ -9538,7 +9538,7 @@
})
"aqT" = (
/obj/structure/rack,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/item/weapon/storage/toolbox/emergency,
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
@@ -9574,7 +9574,7 @@
name = "Port Maintenance"
})
"aqX" = (
-/obj/machinery/light_construct/small,
+/obj/structure/light_construct/small,
/obj/item/weapon/toolbox_tiles_sensor,
/turf/open/floor/plating,
/area/maintenance/fpmaint2{
@@ -10959,7 +10959,7 @@
req_access_txt = "0";
specialfunctions = 4
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/machinery/atmospherics/components/unary/vent_pump{
dir = 4;
on = 1
@@ -11839,7 +11839,7 @@
"auK" = (
/obj/item/stack/sheet/cardboard,
/obj/item/device/flashlight,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/starboard)
@@ -14578,7 +14578,7 @@
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-22"
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/wood,
/area/library)
"azw" = (
@@ -17088,7 +17088,7 @@
scrub_N2O = 0;
scrub_Toxins = 0
},
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 4
},
/turf/open/floor/plasteel/floorgrime,
@@ -17837,7 +17837,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating,
/area/maintenance/fpmaint2{
name = "Port Maintenance"
@@ -18623,7 +18623,7 @@
},
/obj/item/weapon/folder,
/obj/item/weapon/folder,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/cult{
dir = 2
},
@@ -19591,7 +19591,7 @@
/turf/open/floor/plasteel,
/area/construction)
"aHE" = (
-/obj/machinery/light_construct{
+/obj/structure/light_construct{
dir = 1
},
/obj/structure/closet/emcloset,
@@ -19631,7 +19631,7 @@
/area/construction)
"aHJ" = (
/obj/structure/closet/toolcloset,
-/obj/machinery/light_construct{
+/obj/structure/light_construct{
dir = 1
},
/turf/open/floor/plasteel,
@@ -21751,7 +21751,7 @@
},
/area/space)
"aLA" = (
-/obj/machinery/light_construct{
+/obj/structure/light_construct{
dir = 8
},
/turf/open/floor/plating,
@@ -21766,7 +21766,7 @@
},
/area/construction)
"aLD" = (
-/obj/machinery/light_construct{
+/obj/structure/light_construct{
dir = 4
},
/obj/machinery/light_switch{
@@ -29013,7 +29013,6 @@
"aYM" = (
/obj/item/weapon/book/manual/wiki/security_space_law,
/obj/machinery/newscaster{
- hitstaken = 1;
pixel_x = 0;
pixel_y = -32
},
@@ -30642,7 +30641,7 @@
/area/hallway/primary/central)
"bbo" = (
/obj/machinery/space_heater,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
@@ -30679,7 +30678,7 @@
/obj/machinery/door/window{
base_state = "rightsecure";
dir = 4;
- health = 300;
+ obj_integrity = 300;
icon_state = "rightsecure";
layer = 4.1;
name = "Secondary AI Core Access";
@@ -30730,7 +30729,7 @@
/obj/machinery/door/window{
base_state = "rightsecure";
dir = 4;
- health = 300;
+ obj_integrity = 300;
icon_state = "rightsecure";
name = "Primary AI Core Access";
req_access_txt = "16"
@@ -30801,7 +30800,7 @@
/obj/machinery/door/window{
base_state = "leftsecure";
dir = 8;
- health = 300;
+ obj_integrity = 300;
icon_state = "leftsecure";
layer = 4.1;
name = "Tertiary AI Core Access";
@@ -40681,7 +40680,7 @@
/obj/machinery/door/window{
base_state = "leftsecure";
dir = 8;
- health = 300;
+ obj_integrity = 300;
icon_state = "leftsecure";
name = "Primary AI Core Access";
req_access_txt = "16"
@@ -44215,7 +44214,7 @@
})
"byc" = (
/obj/structure/closet,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/item/weapon/poster/contraband,
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
@@ -47115,7 +47114,7 @@
name = "Arrivals"
})
"bDi" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
/area/maintenance/fpmaint2{
@@ -47269,7 +47268,7 @@
/turf/open/floor/wood,
/area/library)
"bDB" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/wood,
/area/library)
"bDC" = (
@@ -48897,7 +48896,7 @@
name = "Port Maintenance"
})
"bGw" = (
-/obj/machinery/light_construct{
+/obj/structure/light_construct{
dir = 8
},
/turf/open/floor/wood,
@@ -52847,7 +52846,7 @@
/turf/open/floor/wood,
/area/security/vacantoffice)
"bNk" = (
-/obj/machinery/light_construct{
+/obj/structure/light_construct{
dir = 4
},
/turf/open/floor/wood,
@@ -52903,7 +52902,7 @@
name = "Port Maintenance"
})
"bNq" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/rack{
dir = 8;
layer = 2.9
@@ -54202,7 +54201,7 @@
icon_state = "1-2"
},
/obj/structure/window/reinforced,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/showcase{
desc = "A flimsy model of a standard NanoTrasen automated loyalty implant machine. With secure positioning harnesses and a robotic surgical injector, brain damage and other serious medical anomalies are now up to 60% less likely!";
icon = 'icons/obj/machines/implantchair.dmi';
@@ -55585,7 +55584,7 @@
name = "Port Maintenance"
})
"bRZ" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/closet/emcloset,
/turf/open/floor/plating,
/area/maintenance/fpmaint2{
@@ -55644,7 +55643,7 @@
/obj/structure/table/wood,
/obj/item/weapon/dice/d20,
/obj/item/weapon/dice,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/wood,
/area/library)
"bSh" = (
@@ -60743,7 +60742,7 @@
name = "Aft Maintenance"
})
"caT" = (
-/obj/machinery/light_construct,
+/obj/structure/light_construct,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
@@ -62476,7 +62475,7 @@
d2 = 4;
icon_state = "2-4"
},
-/obj/machinery/light_construct{
+/obj/structure/light_construct{
dir = 8
},
/turf/open/floor/plating,
@@ -62519,7 +62518,7 @@
/obj/structure/rack,
/obj/item/stack/sheet/cardboard,
/obj/item/device/radio/off,
-/obj/machinery/light_construct{
+/obj/structure/light_construct{
dir = 1
},
/obj/effect/spawner/lootdrop/maintenance,
@@ -67171,7 +67170,7 @@
pixel_y = 2
},
/obj/structure/table/wood,
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 1
},
/obj/machinery/newscaster{
@@ -67858,7 +67857,7 @@
pixel_y = 2
},
/obj/structure/table,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/machinery/reagentgrinder{
pixel_y = 4
},
@@ -68772,7 +68771,7 @@
name = "Aft Maintenance"
})
"cou" = (
-/obj/machinery/light_construct/small{
+/obj/structure/light_construct/small{
dir = 4
},
/obj/machinery/computer/security/telescreen/entertainment{
@@ -81331,7 +81330,7 @@
pixel_x = 3;
pixel_y = 2
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/floorgrime,
/area/maintenance/aft{
name = "Aft Maintenance"
@@ -82126,7 +82125,7 @@
dir = 2;
on = 1
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/black,
/area/toxins/server{
name = "\improper Research Division Server Room"
@@ -83334,7 +83333,7 @@
name = "Aft Maintenance"
})
"cMp" = (
-/obj/machinery/light_construct/small,
+/obj/structure/light_construct/small,
/obj/structure/table/wood/poker,
/obj/item/toy/cards/deck,
/obj/structure/sign/poster{
@@ -85018,7 +85017,7 @@
pixel_x = 0;
pixel_y = 25
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/table/wood,
/turf/open/floor/plasteel/vault,
/area/chapel/main)
@@ -85592,7 +85591,7 @@
/obj/structure/flora/ausbushes/palebush,
/obj/structure/window/reinforced{
dir = 5;
- health = 1e+007
+ obj_integrity = 10000
},
/turf/open/floor/grass,
/area/hallway/secondary/exit{
@@ -86277,7 +86276,7 @@
/obj/structure/flora/ausbushes/sunnybush,
/obj/structure/window/reinforced{
dir = 5;
- health = 1e+007
+ obj_integrity = 10000
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -86684,7 +86683,7 @@
pixel_x = -2;
pixel_y = 8
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/table/wood,
/turf/open/floor/plasteel/black,
/area/chapel/main)
@@ -86724,7 +86723,7 @@
},
/area/chapel/main)
"cSd" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/chair/comfy/black{
dir = 8
},
@@ -89481,7 +89480,6 @@
/area/toxins/xenobiology)
"cWS" = (
/obj/machinery/door/poddoor{
- auto_close = 300;
id = "smindicate";
name = "outer blast door"
},
@@ -90912,7 +90910,7 @@
/obj/effect/spawner/lootdrop/maintenance,
/obj/item/weapon/extinguisher,
/obj/item/weapon/extinguisher,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
@@ -91341,7 +91339,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/abandoned)
"daN" = (
@@ -91914,7 +91912,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/mineral/titanium,
/area/shuttle/abandoned)
"dbR" = (
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index b9bf7fc16cf..e1990337384 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -7424,7 +7424,7 @@
"apP" = (
/obj/structure/grille,
/obj/structure/window/fulltile{
- health = 35
+ obj_integrity = 35
},
/turf/open/floor/plating,
/area/maintenance/fpmaint2)
@@ -7499,7 +7499,7 @@
layer = 2.9
},
/obj/item/weapon/storage/briefcase,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/wood,
/area/lawoffice)
"aqc" = (
@@ -7764,7 +7764,7 @@
/turf/open/floor/plating,
/area/maintenance/fsmaint2)
"aqB" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating,
/area/maintenance/fsmaint2)
"aqC" = (
@@ -7995,7 +7995,7 @@
pixel_y = 23
},
/obj/structure/closet/secure_closet/personal/cabinet,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/wood,
/area/crew_quarters/sleep)
"arj" = (
@@ -9541,7 +9541,7 @@
/obj/structure/mirror{
icon_state = "mirror_broke";
pixel_y = 28;
- shattered = 1
+ broken = 1
},
/obj/machinery/iv_drip,
/turf/open/floor/plating,
@@ -9550,7 +9550,7 @@
/obj/structure/mirror{
icon_state = "mirror_broke";
pixel_y = 28;
- shattered = 1
+ broken = 1
},
/obj/item/weapon/shard{
icon_state = "medium"
@@ -9563,7 +9563,7 @@
/turf/open/floor/plating,
/area/maintenance/fpmaint2)
"ava" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/chair,
/obj/item/weapon/reagent_containers/blood/random,
/turf/open/floor/plating,
@@ -10294,7 +10294,7 @@
/turf/open/floor/plating,
/area/maintenance/fsmaint2)
"awE" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/closet/crate,
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
@@ -13644,7 +13644,7 @@
/turf/open/floor/plating,
/area/maintenance/fsmaint2)
"aDX" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
/area/maintenance/fsmaint2)
@@ -15356,7 +15356,7 @@
"aHx" = (
/obj/structure/grille,
/obj/structure/window/fulltile{
- health = 25
+ obj_integrity = 25
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
@@ -33845,13 +33845,12 @@
})
"bxg" = (
/obj/structure/reagent_dispensers/watertank,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/asmaint)
"bxh" = (
/obj/machinery/door/poddoor{
- auto_close = 300;
id = "smindicate";
name = "outer blast door"
},
@@ -34891,7 +34890,7 @@
dir = 2;
on = 1
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/black,
/area/toxins/server)
"bzy" = (
@@ -35689,7 +35688,6 @@
pixel_y = 0
},
/obj/machinery/newscaster{
- hitstaken = 1;
pixel_x = 0;
pixel_y = -32
},
@@ -37692,7 +37690,7 @@
},
/obj/structure/grille,
/obj/structure/window/fulltile{
- health = 25
+ obj_integrity = 25
},
/turf/open/floor/plating,
/area/maintenance/asmaint)
@@ -38950,14 +38948,14 @@
/obj/structure/disposalpipe/segment,
/obj/structure/grille,
/obj/structure/window/fulltile{
- health = 35
+ obj_integrity = 35
},
/turf/open/floor/plating,
/area/maintenance/asmaint)
"bHX" = (
/obj/structure/grille,
/obj/structure/window/fulltile{
- health = 25
+ obj_integrity = 25
},
/turf/open/floor/plating,
/area/maintenance/asmaint)
@@ -39773,7 +39771,7 @@
/turf/open/floor/plating,
/area/maintenance/asmaint)
"bJu" = (
-/obj/machinery/light_construct{
+/obj/structure/light_construct{
dir = 4
},
/turf/open/floor/plasteel,
@@ -40432,7 +40430,7 @@
/turf/open/floor/plating,
/area/maintenance/asmaint)
"bKK" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/cable{
d2 = 8;
icon_state = "0-8"
@@ -41296,7 +41294,7 @@
/turf/open/floor/plating,
/area/maintenance/asmaint2)
"bMC" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
@@ -43282,7 +43280,7 @@
},
/area/security/checkpoint/engineering)
"bRl" = (
-/obj/machinery/light_construct{
+/obj/structure/light_construct{
dir = 8
},
/turf/open/floor/plating,
@@ -45351,7 +45349,7 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"bVE" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/open/floor/plating,
@@ -47218,7 +47216,7 @@
/turf/open/floor/plating,
/area/maintenance/asmaint)
"bZO" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
@@ -50413,7 +50411,7 @@
/obj/structure/rack{
dir = 1
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/asmaint2)
@@ -51921,7 +51919,7 @@
/area/maintenance/starboardsolar)
"cjE" = (
/obj/structure/rack,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
@@ -55188,7 +55186,7 @@
/turf/open/floor/plating,
/area/maintenance/asmaint2)
"cqv" = (
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating,
/area/maintenance/aft)
"cqw" = (
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index 8f8ba1c6da8..8b0b9796ac3 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -3961,7 +3961,7 @@
"ms" = (
/obj/effect/decal/cleanable/blood/splatter,
/obj/structure/rack{
- health = 9999
+ obj_integrity = 9999
},
/obj/item/clothing/suit/space/hardsuit/wizard,
/turf/open/floor/engine/cult,
@@ -5105,8 +5105,8 @@
/area/ctf)
"qd" = (
/obj/structure/window/reinforced/fulltile{
- health = 1e+007;
- maxhealth = 1e+007;
+ obj_integrity = 5000;
+ max_integrity = 5000;
name = "hardened window"
},
/turf/open/floor/plating,
diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm
index 3295aee638a..a6da04a5188 100644
--- a/_maps/shuttles/emergency_narnar.dmm
+++ b/_maps/shuttles/emergency_narnar.dmm
@@ -164,9 +164,6 @@
/area/shuttle/escape)
"G" = (
/obj/structure/extinguisher_cabinet{
- has_extinguisher = null;
- icon_state = "extinguisher_empty";
- opened = 1;
pixel_x = 27;
pixel_y = 0
},
diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm
index 4c7a8f32df9..839c368a103 100644
--- a/_maps/shuttles/ferry_lighthouse.dmm
+++ b/_maps/shuttles/ferry_lighthouse.dmm
@@ -82,7 +82,7 @@
/turf/open/floor/wood,
/area/shuttle/transport)
"as" = (
-/obj/machinery/shield,
+/obj/structure/emergency_shield,
/turf/open/space,
/area/shuttle/transport)
"at" = (
diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm
index 6a59a3ca020..2a63bb714cf 100644
--- a/_maps/shuttles/whiteship_meta.dmm
+++ b/_maps/shuttles/whiteship_meta.dmm
@@ -296,7 +296,7 @@
/obj/effect/spawner/lootdrop/maintenance,
/obj/item/weapon/extinguisher,
/obj/item/weapon/extinguisher,
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
@@ -716,7 +716,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/abandoned)
"br" = (
@@ -1319,7 +1319,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/effect/decal/cleanable/cobweb2,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/mineral/titanium,
/area/shuttle/abandoned)
"cw" = (
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index a9821785a81..d96f8eca685 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -343,13 +343,12 @@ var/list/bloody_footprints_cache = list()
//Fire and Acid stuff, for resistance_flags
#define LAVA_PROOF 1
-#define FIRE_PROOF 2 //not flammable (but may or may not take damage from fire)
-#define ON_FIRE 4
-#define UNACIDABLE 8 //acid can't even appear on it, let alone melt it.
-#define ACID_PROOF 16 //acid stuck on it doesn't melt it.
-#define INDESTRUCTIBLE 32 //doesn't take damage
-#define EMP_PROOF 64 //immune to emp
-
+#define FIRE_PROOF 2 //100% immune to fire damage (but not necessarily to lava or heat)
+#define FLAMMABLE 4
+#define ON_FIRE 8
+#define UNACIDABLE 16 //acid can't even appear on it, let alone melt it.
+#define ACID_PROOF 32 //acid stuck on it doesn't melt it.
+#define INDESTRUCTIBLE 64 //doesn't take damage
//Ghost orbit types:
#define GHOST_ORBIT_CIRCLE "circle"
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index cdd827a3895..2d1535cd464 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -396,7 +396,22 @@ for(var/t in test_times)
return
-
+//for each body zone, gives the corresponding body_parts_covered bitfield
+/proc/body_zone2body_parts_covered(b_zone)
+ b_zone = check_zone(b_zone)
+ switch(b_zone)
+ if("chest")
+ return CHEST
+ if("head")
+ return HEAD
+ if("r_arm")
+ return ARM_RIGHT
+ if("l_arm")
+ return ARM_LEFT
+ if("r_leg")
+ return LEG_RIGHT
+ if("l_leg")
+ return LEG_LEFT
//Turns a Body_parts_covered bitfield into a list of organ/limb names.
//(I challenge you to find a use for this)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index d38f50c01a3..0a555c4e756 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -823,11 +823,11 @@ var/list/WALLITEMS = list(
)
var/list/WALLITEMS_EXTERNAL = list(
- /obj/machinery/camera, /obj/machinery/camera_assembly,
- /obj/machinery/light_construct, /obj/machinery/light)
+ /obj/machinery/camera, /obj/structure/camera_assembly,
+ /obj/structure/light_construct, /obj/machinery/light)
var/list/WALLITEMS_INVERSE = list(
- /obj/machinery/light_construct, /obj/machinery/light)
+ /obj/structure/light_construct, /obj/machinery/light)
/proc/gotwallitem(loc, dir, var/check_external = 0)
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index adfe508f6c8..dc40fa92d96 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -10,11 +10,14 @@
name = ""
icon = 'icons/mob/screen_gen.dmi'
layer = ABOVE_HUD_LAYER
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
appearance_flags = APPEARANCE_UI
var/obj/master = null //A reference to the object in the slot. Grabs or items, generally.
var/datum/hud/hud = null // A reference to the owner HUD, if any.
+/obj/screen/take_damage()
+ return
+
/obj/screen/Destroy()
master = null
return ..()
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index ced66536d87..2b20a5ed50f 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -46,6 +46,8 @@
/obj/item/proc/attack_obj(obj/O, mob/living/user)
if(flags & NOBLUDGEON)
return
+ if(user.a_intent == "help") //so you don't hit a machine with a tool while trying to disassemble it.
+ return
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(O)
O.attacked_by(src, user)
@@ -58,6 +60,7 @@
/obj/attacked_by(obj/item/I, mob/living/user)
if(I.force)
user.visible_message("[user] has hit [src] with [I]!", "You hit [src] with [I]!")
+ take_damage(I.force, I.damtype, "melee", 1)
/mob/living/attacked_by(obj/item/I, mob/living/user)
send_item_attack_message(I, user)
diff --git a/code/controllers/subsystem/acid.dm b/code/controllers/subsystem/acid.dm
new file mode 100644
index 00000000000..23b671bf710
--- /dev/null
+++ b/code/controllers/subsystem/acid.dm
@@ -0,0 +1,42 @@
+var/datum/subsystem/acid/SSacid
+
+/datum/subsystem/acid
+ name = "Acid"
+ priority = 40
+ flags = SS_NO_INIT|SS_BACKGROUND
+
+ var/list/currentrun = list()
+ var/list/processing = list()
+
+/datum/subsystem/acid/New()
+ NEW_SS_GLOBAL(SSacid)
+
+
+/datum/subsystem/acid/stat_entry()
+ ..("P:[processing.len]")
+
+
+/datum/subsystem/acid/fire(resumed = 0)
+ if (!resumed)
+ src.currentrun = processing.Copy()
+
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+
+ while (currentrun.len)
+ var/obj/O = currentrun[currentrun.len]
+ currentrun.len--
+ if (!O || qdeleted(O))
+ processing -= O
+ if (MC_TICK_CHECK)
+ return
+ continue
+
+ if(O.acid_level && O.acid_processing())
+ else
+ O.overlays -= acid_overlay
+ O.priority_overlays -= acid_overlay
+ processing -= O
+
+ if (MC_TICK_CHECK)
+ return
diff --git a/code/controllers/subsystem/fire_burning.dm b/code/controllers/subsystem/fire_burning.dm
new file mode 100644
index 00000000000..2ace744430e
--- /dev/null
+++ b/code/controllers/subsystem/fire_burning.dm
@@ -0,0 +1,42 @@
+var/datum/subsystem/fire_burning/SSfire_burning
+
+/datum/subsystem/fire_burning
+ name = "Fire Burning"
+ priority = 40
+ flags = SS_NO_INIT|SS_BACKGROUND
+
+ var/list/currentrun = list()
+ var/list/processing = list()
+
+/datum/subsystem/fire_burning/New()
+ NEW_SS_GLOBAL(SSfire_burning)
+
+
+/datum/subsystem/fire_burning/stat_entry()
+ ..("P:[processing.len]")
+
+
+/datum/subsystem/fire_burning/fire(resumed = 0)
+ if (!resumed)
+ src.currentrun = processing.Copy()
+
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+
+ while(currentrun.len)
+ var/obj/O = currentrun[currentrun.len]
+ currentrun.len--
+ if (!O || qdeleted(O))
+ processing -= O
+ if (MC_TICK_CHECK)
+ return
+ continue
+
+ if(O.resistance_flags & ON_FIRE)
+ O.take_damage(20, BURN, "fire", 0)
+ else
+ processing -= O
+
+ if (MC_TICK_CHECK)
+ return
+
diff --git a/code/controllers/subsystem/processing/objects.dm b/code/controllers/subsystem/processing/objects.dm
index fbb716ba326..7c4852ea3a2 100644
--- a/code/controllers/subsystem/processing/objects.dm
+++ b/code/controllers/subsystem/processing/objects.dm
@@ -14,14 +14,13 @@ var/datum/subsystem/objects/SSobj
var/list/atom_spawners = list()
var/list/processing = list()
var/list/currentrun = list()
- var/list/burning = list()
/datum/subsystem/objects/New()
NEW_SS_GLOBAL(SSobj)
/datum/subsystem/objects/Initialize(timeofdayl)
trigger_atom_spawners()
- setupGenetics()
+ setupGenetics() //to set the mutations' place in structural enzymes, so monkey.initialize() knows where to put the monkey mutation.
for(var/thing in world)
var/atom/A = thing
A.initialize()
@@ -55,12 +54,6 @@ var/datum/subsystem/objects/SSobj
if (MC_TICK_CHECK)
return
- for(var/obj/burningobj in SSobj.burning)
- if(burningobj && (burningobj.resistance_flags & ON_FIRE))
- if(burningobj.burn_world_time < world.time)
- burningobj.burn()
- else
- SSobj.burning.Remove(burningobj)
/datum/subsystem/objects/proc/setup_template_objects(list/objects)
trigger_atom_spawners(0, ignore_z=TRUE)
@@ -73,5 +66,3 @@ var/datum/subsystem/objects/SSobj
atom_spawners = SSobj.atom_spawners
if (istype(SSobj.processing))
processing = SSobj.processing
- if (istype(SSobj.burning))
- burning = SSobj.burning
\ No newline at end of file
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 1370278bf6d..ccd36422e68 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -172,4 +172,4 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF
\ No newline at end of file
+ resistance_flags = 0
\ No newline at end of file
diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm
index c0fdda870dd..ab9a9539c64 100644
--- a/code/datums/wires/airlock.dm
+++ b/code/datums/wires/airlock.dm
@@ -104,17 +104,21 @@
if(WIRE_POWER1, WIRE_POWER2) // Cut to loose power, repair all to gain power.
if(mend && !is_cut(WIRE_POWER1) && !is_cut(WIRE_POWER2))
A.regainMainPower()
- A.shock(usr, 50)
+ if(usr)
+ A.shock(usr, 50)
else
A.loseMainPower()
- A.shock(usr, 50)
+ if(usr)
+ A.shock(usr, 50)
if(WIRE_BACKUP1, WIRE_BACKUP2) // Cut to loose backup power, repair all to gain backup power.
if(mend && !is_cut(WIRE_BACKUP1) && !is_cut(WIRE_BACKUP2))
A.regainBackupPower()
- A.shock(usr, 50)
+ if(usr)
+ A.shock(usr, 50)
else
A.loseBackupPower()
- A.shock(usr, 50)
+ if(usr)
+ A.shock(usr, 50)
if(WIRE_BOLTS) // Cut to drop bolts, mend does nothing.
if(!mend)
A.bolt()
@@ -136,7 +140,8 @@
else
if(A.secondsElectrified != -1)
A.secondsElectrified = -1
- A.shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
+ if(usr)
+ A.shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
add_logs(usr, A, "electrified")
if(WIRE_SAFETY) // Cut to disable safeties, mend to re-enable.
A.safe = mend
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index ac83c557ddb..56e2f30c386 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -62,11 +62,11 @@
return 0
-/atom/proc/attack_hulk(mob/living/carbon/human/hulk, do_attack_animation = 0)
- if(do_attack_animation)
- hulk.changeNext_move(CLICK_CD_MELEE)
- add_logs(hulk, src, "punched", "hulk powers")
- hulk.do_attack_animation(src)
+/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
+ if(does_attack_animation)
+ user.changeNext_move(CLICK_CD_MELEE)
+ add_logs(user, src, "punched", "hulk powers")
+ user.do_attack_animation(src)
/atom/proc/CheckParts(list/parts_list)
for(var/A in parts_list)
@@ -211,7 +211,7 @@
/atom/proc/blob_act(obj/structure/blob/B)
return
-/atom/proc/fire_act()
+/atom/proc/fire_act(exposed_temperature, exposed_volume)
return
/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked)
@@ -371,7 +371,7 @@ var/list/blood_splatter_icons = list()
/atom/proc/singularity_pull()
return
-/atom/proc/acid_act(acidpwr, toxpwr, acid_volume)
+/atom/proc/acid_act(acidpwr, acid_volume)
return
/atom/proc/emag_act()
@@ -438,4 +438,7 @@ var/list/blood_splatter_icons = list()
/atom/on_varedit(modified_var)
if(!Debug2)
- admin_spawned = TRUE
\ No newline at end of file
+ admin_spawned = TRUE
+
+/atom/proc/mech_melee_attack(obj/mecha/M)
+ return
\ No newline at end of file
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 8cd3b7d2f89..abdbfb5206b 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -76,10 +76,10 @@
/proc/RoundHealth(mob/living/M)
if(M.stat == DEAD || (M.status_flags & FAKEDEATH))
return "health-100" //what's our health? it doesn't matter, we're dead, or faking
- var/maxhealth = M.maxHealth
+ var/maxi_health = M.maxHealth
if(iscarbon(M) && M.health < 0)
- maxhealth = 100 //so crit shows up right for aliens and other high-health carbon mobs; noncarbons don't have crit.
- var/resulthealth = (M.health / maxhealth) * 100
+ maxi_health = 100 //so crit shows up right for aliens and other high-health carbon mobs; noncarbons don't have crit.
+ var/resulthealth = (M.health / maxi_health) * 100
switch(resulthealth)
if(100 to INFINITY)
return "health100"
@@ -302,7 +302,7 @@
var/image/holder = hud_list[DIAG_MECH_HUD]
var/icon/I = icon(icon, icon_state, dir)
holder.pixel_y = I.Height() - world.icon_size
- holder.icon_state = "huddiag[RoundDiagBar(health/initial(health))]"
+ holder.icon_state = "huddiag[RoundDiagBar(obj_integrity/max_integrity)]"
/obj/mecha/proc/diag_hud_set_mechcell()
diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm
index 95fb000a2c8..750e18a087c 100644
--- a/code/game/gamemodes/blob/blob_report.dm
+++ b/code/game/gamemodes/blob/blob_report.dm
@@ -58,19 +58,22 @@
for(var/turf/T in block(locate(1,1,1), locate(world.maxx,world.maxy,1)))
if(isfloorturf(T))
- if(!(T:burnt))
+ var/turf/open/floor/TF = T
+ if(!(TF.burnt))
src.floor += 12
else
src.floor += 1
if(iswallturf(T))
- if(T:intact)
+ var/turf/closed/wall/TW = T
+ if(TW.intact)
src.wall += 2
else
src.wall += 1
if(istype(T, /turf/closed/wall/r_wall))
- if(T:intact)
+ var/turf/closed/wall/r_wall/TRW = T
+ if(TRW.intact)
src.r_wall += 2
else
src.r_wall += 1
@@ -79,8 +82,10 @@
for(var/obj/O in T.contents)
if(istype(O, /obj/structure/window))
src.window += 1
- else if(istype(O, /obj/structure/grille) && (!O:destroyed))
- src.grille += 1
+ else if(istype(O, /obj/structure/grille))
+ var/obj/structure/grille/GR = O
+ if(!GR.broken)
+ src.grille += 1
else if(istype(O, /obj/machinery/door))
src.door += 1
else if(istype(O, /obj/machinery))
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 0a751d1bc8d..66a303d6f16 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -39,9 +39,12 @@
H.color = "#000000"
adjustHealth(-maxHealth*0.0125)
-/mob/living/simple_animal/hostile/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/mob/living/simple_animal/hostile/blob/fire_act(exposed_temperature, exposed_volume)
..()
- adjustFireLoss(Clamp(0.01 * exposed_temperature, 1, 5))
+ if(exposed_temperature)
+ adjustFireLoss(Clamp(0.01 * exposed_temperature, 1, 5))
+ else
+ adjustFireLoss(5)
/mob/living/simple_animal/hostile/blob/CanPass(atom/movable/mover, turf/target, height = 0)
if(istype(mover, /obj/structure/blob))
@@ -87,6 +90,8 @@
verb_yell = "psychically screams"
melee_damage_lower = 2
melee_damage_upper = 4
+ obj_damage = 20
+ environment_smash = 0
attacktext = "hits"
attack_sound = 'sound/weapons/genhit1.ogg'
flying = 1
@@ -204,7 +209,7 @@
damage_coeff = list(BRUTE = 0.5, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
melee_damage_lower = 20
melee_damage_upper = 20
- obj_damage = 20
+ obj_damage = 60
attacktext = "slams"
attack_sound = 'sound/effects/blobattack.ogg'
verb_say = "gurgles"
@@ -234,7 +239,7 @@
damagesources++
if(damagesources)
for(var/i in 1 to damagesources)
- adjustHealth(maxHealth*0.025) //take 2.5% maxhealth as damage when not near the blob or if the naut has no factory, 5% if both
+ adjustHealth(maxHealth*0.025) //take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both
var/list/viewing = list()
for(var/mob/M in viewers(src))
if(M.client)
@@ -277,7 +282,7 @@
..(gibbed)
if(factory)
factory.naut = null //remove this naut from its factory
- factory.maxhealth = initial(factory.maxhealth)
+ factory.max_integrity = initial(factory.max_integrity)
flick("blobbernaut_death", src)
/mob/living/simple_animal/hostile/blob/blobbernaut/independent
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index 082f36b64d5..2bc1f1bb12f 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -3,8 +3,9 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
desc = "A huge, pulsating yellow mass."
- health = 400
- maxhealth = 400
+ obj_integrity = 400
+ max_integrity = 400
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 75, acid = 90)
explosion_block = 6
point_return = -1
health_regen = 0 //we regen in Life() instead of when pulsed
@@ -48,18 +49,15 @@
poi_list -= src
return ..()
-/obj/structure/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- exposed_temperature *= 0.5
- ..()
-
/obj/structure/blob/core/ex_act(severity, target)
var/damage = 50 - 10 * severity //remember, the core takes half brute damage, so this is 20/15/10 damage based on severity
- take_damage(damage, BRUTE)
+ take_damage(damage, BRUTE, "bomb", 0)
-/obj/structure/blob/core/check_health()
- ..()
- if(overmind) //we should have an overmind, but...
- overmind.update_health_hud()
+/obj/structure/blob/core/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, overmind_reagent_trigger = 1)
+ . = ..()
+ if(obj_integrity > 0)
+ if(overmind) //we should have an overmind, but...
+ overmind.update_health_hud()
/obj/structure/blob/core/Life()
if(qdeleted(src))
@@ -70,7 +68,7 @@
if(resource_delay <= world.time)
resource_delay = world.time + 10 // 1 second
overmind.add_points(point_rate)
- health = min(maxhealth, health+core_regen)
+ obj_integrity = min(max_integrity, obj_integrity+core_regen)
if(overmind)
overmind.update_health_hud()
Pulse_Area(overmind, 12, 4, 3)
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
index 99d31d97b7e..cc0749d0c68 100644
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ b/code/game/gamemodes/blob/blobs/factory.dm
@@ -3,8 +3,8 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blob_factory"
desc = "A thick spire of tendrils."
- health = 200
- maxhealth = 200
+ obj_integrity = 200
+ max_integrity = 200
health_regen = 1
point_return = 25
var/list/spores = list()
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
index 60b517b0f6d..9fa7664e8f2 100644
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ b/code/game/gamemodes/blob/blobs/node.dm
@@ -3,8 +3,9 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
desc = "A large, pulsating yellow mass."
- health = 200
- maxhealth = 200
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 65, acid = 90)
health_regen = 3
point_return = 25
@@ -32,10 +33,6 @@
STOP_PROCESSING(SSobj, src)
return ..()
-/obj/structure/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- exposed_temperature *= 0.75
- ..()
-
/obj/structure/blob/node/Life()
Pulse_Area(overmind, 10, 3, 2)
color = null
diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm
index ff6bd736eaf..bcb6d8a8fd7 100644
--- a/code/game/gamemodes/blob/blobs/resource.dm
+++ b/code/game/gamemodes/blob/blobs/resource.dm
@@ -3,8 +3,8 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blob_resource"
desc = "A thin spire of slightly swaying tendrils."
- health = 60
- maxhealth = 60
+ obj_integrity = 60
+ max_integrity = 60
point_return = 15
var/resource_delay = 0
diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm
index b7c8d8192ae..45d40dd019e 100644
--- a/code/game/gamemodes/blob/blobs/shield.dm
+++ b/code/game/gamemodes/blob/blobs/shield.dm
@@ -3,12 +3,14 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blob_shield"
desc = "A solid wall of slightly twitching tendrils."
- health = 150
- maxhealth = 150
+ obj_integrity = 150
+ max_integrity = 150
brute_resist = 0.25
explosion_block = 3
point_return = 4
atmosblock = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 90)
+
/obj/structure/blob/shield/scannerreport()
@@ -16,15 +18,12 @@
return "Will prevent the spread of atmospheric changes."
return "N/A"
-/obj/structure/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- return
-
/obj/structure/blob/shield/core
point_return = 0
/obj/structure/blob/shield/update_icon()
..()
- if(health <= 75)
+ if(obj_integrity <= 75)
icon_state = "blob_shield_damaged"
name = "weakened strong blob"
desc = "A wall of twitching tendrils."
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index e9ab0a757e8..5fb0187ccda 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -104,10 +104,10 @@
/mob/camera/blob/update_health_hud()
if(blob_core)
- hud_used.healths.maptext = "
[round(blob_core.health)]
"
+ hud_used.healths.maptext = "[round(blob_core.obj_integrity)]
"
for(var/mob/living/simple_animal/hostile/blob/blobbernaut/B in blob_mobs)
if(B.hud_used && B.hud_used.blobpwrdisplay)
- B.hud_used.blobpwrdisplay.maptext = "[round(blob_core.health)]
"
+ B.hud_used.blobpwrdisplay.maptext = "[round(blob_core.obj_integrity)]
"
/mob/camera/blob/proc/add_points(points)
blob_points = Clamp(blob_points + points, 0, max_blob_points)
@@ -157,7 +157,7 @@
..()
if(statpanel("Status"))
if(blob_core)
- stat(null, "Core Health: [blob_core.health]")
+ stat(null, "Core Health: [blob_core.obj_integrity]")
stat(null, "Power Stored: [blob_points]/[max_blob_points]")
if(ticker && istype(ticker.mode, /datum/game_mode/blob))
var/datum/game_mode/blob/B = ticker.mode
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index fa7d3a14987..8cdca0ae62d 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -148,13 +148,14 @@
if(B.naut) //if it already made a blobbernaut, it can't do it again
src << "This factory blob is already sustaining a blobbernaut."
return
- if(B.health < B.maxhealth * 0.5)
+ if(B.obj_integrity < B.max_integrity * 0.5)
src << "This factory blob is too damaged to sustain a blobbernaut."
return
if(!can_buy(40))
return
- B.maxhealth = initial(B.maxhealth) * 0.25 //factories that produced a blobbernaut have much lower health
- B.check_health()
+ B.max_integrity = initial(B.max_integrity) * 0.25 //factories that produced a blobbernaut have much lower health
+ B.obj_integrity = min(B.obj_integrity, B.max_integrity)
+ B.update_icon()
B.visible_message("The blobbernaut [pick("rips", "tears", "shreds")] its way out of the factory blob!")
playsound(B.loc, 'sound/effects/splat.ogg', 50, 1)
var/mob/living/simple_animal/hostile/blob/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blob/blobbernaut(get_turf(B))
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 7f2e732eade..fc5ed905fb8 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -9,8 +9,9 @@
anchored = 1
layer = BELOW_MOB_LAYER
var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed.
- var/health = 30
- var/maxhealth = 30
+ obj_integrity = 30
+ max_integrity = 30
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 70)
var/health_regen = 2 //how much health this blob regens when pulsed
var/pulse_timestamp = 0 //we got pulsed when?
var/heal_timestamp = 0 //we got healed when?
@@ -27,11 +28,10 @@
blobs += src //Keep track of the blob in the normal list either way
setDir(pick(cardinal))
update_icon()
- ..(loc)
+ ..()
ConsumeTile()
if(atmosblock)
air_update_turf(1)
- return
/obj/structure/blob/proc/creation_action() //When it's created by the overmind, do this.
return
@@ -45,6 +45,8 @@
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) //Expand() is no longer broken, no check necessary.
return ..()
+/obj/structure/blob/blob_act()
+ return
/obj/structure/blob/Adjacent(var/atom/neighbour)
. = ..()
@@ -79,13 +81,6 @@
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSBLOB)
-/obj/structure/blob/proc/check_health(cause)
- health = Clamp(health, 0, maxhealth)
- if(health <= 0)
- if(overmind)
- overmind.blob_reagent_datum.death_reaction(src, cause)
- qdel(src) //we dead now
-
/obj/structure/blob/update_icon() //Updates color based on overmind color if we have an overmind.
if(overmind)
color = overmind.blob_reagent_datum.color
@@ -133,7 +128,7 @@
if(pulse_timestamp <= world.time)
ConsumeTile()
if(heal_timestamp <= world.time)
- health = min(maxhealth, health+health_regen)
+ obj_integrity = min(max_integrity, obj_integrity+health_regen)
heal_timestamp = world.time + 20
update_icon()
pulse_timestamp = world.time + 10
@@ -210,17 +205,6 @@
blob_attack_animation(T, controller) //if we can't, animate that we attacked
return null
-
-/obj/structure/blob/ex_act(severity, target)
- ..()
- var/damage = 150 - 20 * severity
- take_damage(damage, BRUTE)
-
-/obj/structure/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- ..()
- var/damage = Clamp(0.01 * exposed_temperature, 0, 4)
- take_damage(damage, BURN)
-
/obj/structure/blob/emp_act(severity)
if(severity > 0)
if(overmind)
@@ -232,20 +216,15 @@
..()
if(overmind)
if(overmind.blob_reagent_datum.tesla_reaction(src, power))
- take_damage(power/400, BURN)
+ take_damage(power/400, BURN, "energy")
else
- take_damage(power/400, BURN)
+ take_damage(power/400, BURN, "energy")
/obj/structure/blob/extinguish()
..()
if(overmind)
overmind.blob_reagent_datum.extinguish_reaction(src)
-/obj/structure/blob/bullet_act(var/obj/item/projectile/Proj)
- ..()
- take_damage(Proj.damage, Proj.damage_type, Proj)
- return 0
-
/obj/structure/blob/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/device/analyzer))
user.changeNext_move(CLICK_CD_MELEE)
@@ -266,53 +245,50 @@
/obj/structure/blob/proc/typereport(mob/user)
user << "Blob Type: [uppertext(initial(name))]"
- user << "Health: [health]/[maxhealth]"
+ user << "Health: [obj_integrity]/[max_integrity]"
user << "Effects: [scannerreport()]"
-/obj/structure/blob/attacked_by(obj/item/I, mob/living/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
- visible_message("[user] has attacked the [src.name] with \the [I]!")
- if(I.damtype == BURN)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- take_damage(I.force, I.damtype, user)
-
/obj/structure/blob/attack_animal(mob/living/simple_animal/M)
if("blob" in M.faction) //sorry, but you can't kill the blob as a blobbernaut
return
- M.changeNext_move(CLICK_CD_MELEE)
- M.do_attack_animation(src)
- playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
- visible_message("\The [M] has attacked the [src.name]!")
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- take_damage(damage, M.melee_damage_type, M)
- return
+ ..()
-/obj/structure/blob/attack_alien(mob/living/carbon/alien/humanoid/M)
- M.changeNext_move(CLICK_CD_MELEE)
- M.do_attack_animation(src)
- playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
- visible_message("[M] has slashed the [src.name]!")
- var/damage = rand(15, 30)
- take_damage(damage, BRUTE, M)
- return
-
-/obj/structure/blob/proc/take_damage(damage, damage_type, cause = null, overmind_reagent_trigger = 1)
- switch(damage_type) //blobs only take brute and burn damage
+/obj/structure/blob/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
if(BRUTE)
- damage = max(damage * brute_resist, 0)
+ if(damage_amount)
+ playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
+ else
+ playsound(src, 'sound/weapons/tap.ogg', 50, 1)
if(BURN)
- damage = max(damage * fire_resist, 0)
- if(CLONE) //this is basically a marker for 'don't modify the damage'
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+/obj/structure/blob/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ switch(damage_type)
+ if(BRUTE)
+ damage_amount *= brute_resist
+ if(BURN)
+ damage_amount *= fire_resist
+ if(CLONE)
else
- damage = 0
- if(overmind && overmind_reagent_trigger)
- damage = overmind.blob_reagent_datum.damage_reaction(src, health, damage, damage_type, cause) //pass the blob, its health before damage, the damage being done, the type of damage being done, and the cause.
- health -= damage
- update_icon()
- check_health(cause)
+ return 0
+ var/armor_protection = 0
+ if(damage_flag)
+ armor_protection = armor[damage_flag]
+ damage_amount = round(damage_amount * (100 - armor_protection)*0.01, 0.1)
+ if(overmind && damage_flag)
+ damage_amount = overmind.blob_reagent_datum.damage_reaction(src, damage_amount, damage_type, damage_flag)
+ return damage_amount
+
+/obj/structure/blob/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
+ . = ..()
+ if(. && obj_integrity > 0)
+ update_icon()
+
+/obj/structure/blob/obj_destruction(damage_flag)
+ if(overmind)
+ overmind.blob_reagent_datum.death_reaction(src, damage_flag)
+ ..()
/obj/structure/blob/proc/change_to(type, controller)
if(!ispath(type))
@@ -349,19 +325,19 @@
name = "normal blob"
icon_state = "blob"
luminosity = 0
- health = 21
- maxhealth = 25
+ obj_integrity = 21
+ max_integrity = 25
health_regen = 1
brute_resist = 0.25
/obj/structure/blob/normal/scannerreport()
- if(health <= 15)
+ if(obj_integrity <= 15)
return "Currently weak to brute damage."
return "N/A"
/obj/structure/blob/normal/update_icon()
..()
- if(health <= 15)
+ if(obj_integrity <= 15)
icon_state = "blob_damaged"
name = "fragile blob"
desc = "A thin lattice of slightly twitching tendrils."
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index d0ed5163056..6849bf58545 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -165,7 +165,7 @@
return
if(istype(target, /obj/structure/table))
var/obj/structure/table/T = target
- T.table_destroy()
+ T.deconstruct(FALSE)
else if(istype(target, /obj/machinery/computer))
var/obj/machinery/computer/C = target
diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm
index e9e28c37a4d..3d3bbc634ee 100644
--- a/code/game/gamemodes/changeling/powers/shriek.dm
+++ b/code/game/gamemodes/changeling/powers/shriek.dm
@@ -23,7 +23,7 @@
for(var/obj/machinery/light/L in range(4, user))
L.on = 1
- L.broken()
+ L.break_light_tube()
feedback_add_details("changeling_powers","RS")
return 1
@@ -38,7 +38,7 @@
/obj/effect/proc_holder/changeling/dissonant_shriek/sting_action(mob/user)
for(var/obj/machinery/light/L in range(5, usr))
L.on = 1
- L.broken()
+ L.break_light_tube()
empulse(get_turf(user), 2, 5, 1)
return 1
diff --git a/code/game/gamemodes/clock_cult/clock_items.dm b/code/game/gamemodes/clock_cult/clock_items.dm
index b1bea18a140..1e50517e920 100644
--- a/code/game/gamemodes/clock_cult/clock_items.dm
+++ b/code/game/gamemodes/clock_cult/clock_items.dm
@@ -636,10 +636,10 @@
strip_delay = 50
put_on_delay = 30
body_parts_covered = ARMS
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
siemens_coefficient = 0
permeability_coefficient = 0.05
- armor = list(melee = 80, bullet = 50, laser = -15, energy = 0, bomb = 35, bio = 0, rad = 0, fire = 20, acid = 20)
+ armor = list(melee = 80, bullet = 50, laser = -15, energy = 0, bomb = 35, bio = 0, rad = 0, fire = 70, acid = 20)
/obj/item/clothing/gloves/clockwork/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
if(equipper && !is_servant_of_ratvar(equipper))
@@ -671,7 +671,7 @@
w_class = 3
strip_delay = 50
put_on_delay = 30
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/shoes/clockwork/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
if(equipper && !is_servant_of_ratvar(equipper))
diff --git a/code/game/gamemodes/clock_cult/clock_machines.dm b/code/game/gamemodes/clock_cult/clock_machines.dm
index 4509cf916c8..1082d9e8bb9 100644
--- a/code/game/gamemodes/clock_cult/clock_machines.dm
+++ b/code/game/gamemodes/clock_cult/clock_machines.dm
@@ -138,8 +138,8 @@
active_icon = "mending_motor"
inactive_icon = "mending_motor_inactive"
construction_value = 20
- max_health = 125
- health = 125
+ max_integrity = 125
+ obj_integrity = 125
break_message = "The prism collapses with a heavy thud!"
debris = list(/obj/item/clockwork/alloy_shards/small = 5, \
/obj/item/clockwork/alloy_shards/medium = 1, \
@@ -196,11 +196,11 @@
W.adjustHealth(-15)
else if(istype(M, /obj/structure/destructible/clockwork))
var/obj/structure/destructible/clockwork/C = M
- if(C.health == C.max_health)
+ if(C.obj_integrity == C.max_integrity)
continue
if(!try_use_power(structure_cost))
break
- C.health = min(C.health + 15, C.max_health)
+ C.obj_integrity = min(C.obj_integrity + 15, C.max_integrity)
else if(issilicon(M))
var/mob/living/silicon/S = M
if(S.health == S.maxHealth || S.stat == DEAD || !is_servant_of_ratvar(S))
@@ -243,8 +243,8 @@
active_icon = "mania_motor"
inactive_icon = "mania_motor_inactive"
construction_value = 20
- max_health = 80
- health = 80
+ max_integrity = 80
+ obj_integrity = 80
break_message = "The antenna break off, leaving a pile of shards!"
debris = list(/obj/item/clockwork/alloy_shards/large = 1, \
/obj/item/clockwork/alloy_shards/small = 3, \
@@ -505,8 +505,8 @@
active_icon = "obelisk"
inactive_icon = "obelisk_inactive"
construction_value = 20
- max_health = 150
- health = 150
+ max_integrity = 150
+ obj_integrity = 150
break_message = "The obelisk falls to the ground, undamaged!"
debris = list(/obj/item/clockwork/alloy_shards/small = 3, \
/obj/item/clockwork/component/hierophant_ansible/obelisk = 1)
diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm
index 025c1a14765..3a79edc3139 100644
--- a/code/game/gamemodes/clock_cult/clock_mobs.dm
+++ b/code/game/gamemodes/clock_cult/clock_mobs.dm
@@ -115,11 +115,11 @@
health = 300 //Health is very high, and under most cases it will take enough fatigue to be forced to recall first
maxHealth = 300
speed = 1
+ obj_damage = 40
melee_damage_lower = 10
melee_damage_upper = 10
attacktext = "slashes"
attack_sound = 'sound/weapons/bladeslice.ogg'
- environment_smash = 1
weather_immunities = list("lava")
flying = 1
loot = list(/obj/item/clockwork/component/replicant_alloy/fallen_armor)
diff --git a/code/game/gamemodes/clock_cult/clock_proselytizer.dm b/code/game/gamemodes/clock_cult/clock_proselytizer.dm
index 404452d064d..9b3756e5a63 100644
--- a/code/game/gamemodes/clock_cult/clock_proselytizer.dm
+++ b/code/game/gamemodes/clock_cult/clock_proselytizer.dm
@@ -257,7 +257,7 @@
/obj/structure/grille/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
var/grilletype = /obj/structure/grille/ratvar
var/prosel_time = 15
- if(destroyed)
+ if(broken)
grilletype = /obj/structure/grille/ratvar/broken
prosel_time = 5
return list("operation_time" = prosel_time, "new_obj_type" = grilletype, "alloy_cost" = 0, "spawn_dir" = dir)
@@ -273,10 +273,10 @@
if(!can_be_repaired)
user << "[src] cannot be repaired with a proselytizer!"
return
- if(health == max_health)
+ if(obj_integrity == max_integrity)
user << "[src] is at maximum integrity!"
return
- var/amount_to_heal = max_health - health
+ var/amount_to_heal = max_integrity - obj_integrity
var/healing_for_cycle = min(amount_to_heal, repair_amount)
if(!proselytizer.can_use_alloy(0))
healing_for_cycle = min(healing_for_cycle, proselytizer.stored_alloy)
@@ -288,8 +288,8 @@
"You start repairing [src]...")
//hugeass while because we need to re-check after the do_after
proselytizer.repairing = src
- while(proselytizer && user && src && health != max_health)
- amount_to_heal = max_health - health
+ while(proselytizer && user && src && obj_integrity != max_integrity)
+ amount_to_heal = max_integrity - obj_integrity
if(!amount_to_heal)
break
healing_for_cycle = min(amount_to_heal, repair_amount)
@@ -298,7 +298,7 @@
proselytizer_cost = healing_for_cycle*2
if(!proselytizer.can_use_alloy(proselytizer_cost) || !do_after(user, proselytizer_cost, target = src) || !proselytizer || !proselytizer.can_use_alloy(proselytizer_cost))
break
- amount_to_heal = max_health - health
+ amount_to_heal = max_integrity - obj_integrity
if(!amount_to_heal)
break
healing_for_cycle = min(amount_to_heal, repair_amount)
@@ -307,7 +307,7 @@
proselytizer_cost = healing_for_cycle*2
if(!proselytizer.can_use_alloy(proselytizer_cost))
break
- health += healing_for_cycle
+ obj_integrity += healing_for_cycle
proselytizer.modify_stored_alloy(-proselytizer_cost)
playsound(src, 'sound/machines/click.ogg', 50, 1)
@@ -315,7 +315,7 @@
proselytizer.repairing = null
if(user)
user.visible_message("[user]'s [proselytizer.name] stops covering [src] with black liquid metal.", \
- "You finish repairing [src]. It is now at [health]/[max_health] integrity.")
+ "You finish repairing [src]. It is now at [obj_integrity]/[max_integrity] integrity.")
return
/obj/structure/destructible/clockwork/cache/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm
index ec558de31a1..5bab32a7822 100644
--- a/code/game/gamemodes/clock_cult/clock_ratvar.dm
+++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm
@@ -4,7 +4,6 @@
layer = MASSIVE_OBJ_LAYER
density = FALSE
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
-
/obj/structure/destructible/clockwork/massive/New()
..()
poi_list += src
@@ -20,8 +19,8 @@
name = "Gateway to the Celestial Derelict"
desc = "A massive, thrumming rip in spacetime."
clockwork_desc = "A portal to the Celestial Derelict. Massive and intimidating, it is the only thing that can both transport Ratvar and withstand the massive amount of energy he emits."
- health = 500
- max_health = 500
+ obj_integrity = 500
+ max_integrity = 500
mouse_opacity = 2
icon = 'icons/effects/clockwork_effects.dmi'
icon_state = "nothing"
@@ -59,17 +58,18 @@
countdown = null
. = ..()
-/obj/structure/destructible/clockwork/massive/celestial_gateway/destroyed()
- countdown.stop()
- visible_message("The [src] begins to pulse uncontrollably... you might want to run!")
- world << sound('sound/effects/clockcult_gateway_disrupted.ogg', 0, channel = 8, volume = 50)
- make_glow()
- glow.icon_state = "clockwork_gateway_disrupted"
- takes_damage = FALSE
- sleep(27)
- explosion(src, 1, 3, 8, 8)
+/obj/structure/destructible/clockwork/massive/celestial_gateway/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(!disassembled)
+ countdown.stop()
+ visible_message("The [src] begins to pulse uncontrollably... you might want to run!")
+ world << sound('sound/effects/clockcult_gateway_disrupted.ogg', 0, channel = 8, volume = 50)
+ make_glow()
+ glow.icon_state = "clockwork_gateway_disrupted"
+ resistance_flags |= INDESTRUCTIBLE
+ sleep(27)
+ explosion(src, 1, 3, 8, 8)
qdel(src)
- return 1
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/make_glow()
if(!glow)
@@ -77,12 +77,12 @@
glow.linked = src
/obj/structure/destructible/clockwork/massive/celestial_gateway/ex_act(severity)
- var/damage = max((health * 0.70) / severity, 100) //requires multiple bombs to take down
- take_damage(damage, BRUTE)
+ var/damage = max((obj_integrity * 0.70) / severity, 100) //requires multiple bombs to take down
+ take_damage(damage, BRUTE, "bomb", 0)
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/get_arrival_text(s_on_time)
. = "IMMINENT"
- if(!health)
+ if(!obj_integrity)
. = "DETONATING"
else if(GATEWAY_RATVAR_ARRIVAL - progress_in_seconds > 0)
. = "[round(max((GATEWAY_RATVAR_ARRIVAL - progress_in_seconds) / (GATEWAY_SUMMON_RATE * 0.5), 0), 1)][s_on_time ? "S":""]"
@@ -91,7 +91,7 @@
if(!progress_in_seconds || prob(7))
for(var/M in mob_list)
M << "You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]..."
- if(!health)
+ if(!obj_integrity)
return 0
progress_in_seconds += GATEWAY_SUMMON_RATE
switch(progress_in_seconds)
@@ -116,7 +116,7 @@
if(GATEWAY_RATVAR_ARRIVAL to INFINITY)
if(!purpose_fulfilled)
countdown.stop()
- takes_damage = FALSE
+ resistance_flags |= INDESTRUCTIBLE
purpose_fulfilled = TRUE
make_glow()
animate(glow, transform = matrix() * 1.5, alpha = 255, time = 125)
@@ -191,7 +191,7 @@
icon_state = "ratvar"
pixel_x = -235
pixel_y = -248
- takes_damage = FALSE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
appearance_flags = 0
var/atom/prey //Whatever Ratvar is chasing
var/clashing = FALSE //If Ratvar is FUCKING FIGHTING WITH NAR-SIE
diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm
index 5097607dfbe..c4a9ac43093 100644
--- a/code/game/gamemodes/clock_cult/clock_scripture.dm
+++ b/code/game/gamemodes/clock_cult/clock_scripture.dm
@@ -535,7 +535,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
if(BP.heal_damage(power_damage, power_damage, 1, 0)) //heals one point of burn and brute for every ~100W drained on augumented limbs
H.update_damage_overlays()
else
- if(BP.take_damage(0, power_damage))
+ if(BP.receive_damage(0, power_damage))
H.update_damage_overlays()
else if(isanimal(invoker))
var/mob/living/simple_animal/A = invoker
diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm
index 69aead38fc3..85b8d284827 100644
--- a/code/game/gamemodes/clock_cult/clock_structures.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures.dm
@@ -41,24 +41,16 @@
desc = clockwork_desc
..()
desc = initial(desc)
- if(takes_damage)
+ if(!(resistance_flags & INDESTRUCTIBLE))
var/t_It = they_pronoun(TRUE)
var/t_is = get_is()
- var/servant_message = "[t_It] [t_is] at [health]/[max_health] integrity"
- var/other_message = "[t_It] seems pristine and undamaged"
+ var/servant_message = "[t_It] [t_is] at [obj_integrity]/[max_integrity] integrity"
var/heavily_damaged = FALSE
- var/healthpercent = (health/max_health) * 100
- if(healthpercent >= 100)
- other_message = "[t_It] seems pristine and undamaged"
- else if(healthpercent >= 50)
- other_message = "[t_It] looks slightly dented"
- else if(healthpercent >= 25)
- other_message = "[t_It] appears heavily damaged"
+ var/healthpercent = (obj_integrity/max_integrity) * 100
+ if(healthpercent < 50)
heavily_damaged = TRUE
- else if(healthpercent >= 0)
- other_message = "[t_It] [t_is] falling apart"
- heavily_damaged = TRUE
- user << "[can_see_clockwork ? "[servant_message]":"[other_message]"][heavily_damaged ? "!":"."]"
+ if(can_see_clockwork)
+ user << "[servant_message][heavily_damaged ? "!":"."]"
/obj/structure/destructible/clockwork/cache //Tinkerer's cache: Stores components for later use.
name = "tinkerer's cache"
@@ -68,8 +60,8 @@
icon_state = "tinkerers_cache"
construction_value = 10
break_message = "The cache's fire winks out before it falls in on itself!"
- max_health = 80
- health = 80
+ max_integrity = 80
+ obj_integrity = 80
var/wall_generation_cooldown
var/turf/closed/wall/clockwork/linkedwall //if we've got a linked wall and are producing
@@ -91,8 +83,8 @@
cache_check(i)
return ..()
-/obj/structure/destructible/clockwork/cache/destroyed()
- if(takes_damage)
+/obj/structure/destructible/clockwork/cache/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
for(var/I in src)
var/atom/movable/A = I
A.forceMove(get_turf(src)) //drop any daemons we have
@@ -178,8 +170,8 @@
desc = "A large brass eye with tendrils trailing below it and a wide red iris."
clockwork_desc = "A fragile turret that will deal sustained damage to any non-faithful it sees."
icon_state = "ocular_warden"
- health = 25
- max_health = 25
+ obj_integrity = 25
+ max_integrity = 25
construction_value = 15
layer = HIGH_OBJ_LAYER
break_message = "The warden's eye gives a glare of utter hate before falling dark!"
@@ -189,7 +181,6 @@
var/sight_range = 3
var/atom/movable/target
var/list/idle_messages = list(" sulkily glares around.", " lazily drifts from side to side.", " looks around for something to burn.", " slowly turns in circles.")
- var/mech_damage_cycle = 0 //so that people in mechs don't get murderspammed with messages
/obj/structure/destructible/clockwork/ocular_warden/New()
..()
@@ -220,14 +211,9 @@
L.adjust_fire_stacks(damage_per_tick)
L.IgniteMob()
else if(istype(target,/obj/mecha))
- var/sending_message = FALSE
- if(mech_damage_cycle > 1)
- mech_damage_cycle = 0
- sending_message = TRUE
- else
- mech_damage_cycle++
var/obj/mecha/M = target
- M.take_directional_damage(damage_per_tick, "fire", get_dir(src, M), 0, 1, sending_message)
+ M.take_damage(damage_per_tick, BURN, "melee", 1, get_dir(src, M)) //does about half of standard damage to mechs * whatever their fire armor is
+
setDir(get_dir(get_turf(src), get_turf(target)))
if(!target)
if(validtargets.len)
@@ -265,7 +251,6 @@
/obj/structure/destructible/clockwork/ocular_warden/proc/lose_target()
if(!target)
return 0
- mech_damage_cycle = 0
target = null
visible_message("[src] settles and seems almost disappointed.")
return 1
@@ -275,8 +260,7 @@
construction_value = 0
anchored = 0
density = 0
- takes_damage = FALSE
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/mobtype = /mob/living/simple_animal/hostile/clockwork
var/spawn_message = " is an error and you should yell at whoever spawned this shell."
@@ -324,8 +308,8 @@
name = "massive gear"
icon_state = "wall_gear"
climbable = TRUE
- max_health = 50
- health = 50
+ max_integrity = 50
+ obj_integrity = 50
desc = "A massive brass gear. You could probably secure or unsecure it with a wrench, or just climb over it."
clockwork_desc = "A massive brass gear. You could probably secure or unsecure it with a wrench, just climb over it, or proselytize it into replicant alloy."
break_message = "The gear breaks apart into shards of alloy!"
@@ -389,7 +373,7 @@
anchored = 1
density = 0
opacity = 0
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/clockwork/New()
..()
@@ -697,8 +681,6 @@
icon_state = "sigil"
layer = LOW_OBJ_LAYER
alpha = 50
- resistance_flags = FIRE_PROOF
- burntime = 1
var/affects_servants = FALSE
var/stat_affected = CONSCIOUS
var/resist_string = "glows blinding white" //string for when a null rod blocks its effects, "glows [resist_string]"
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index c01036257ff..a17ccbb04eb 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -7,37 +7,24 @@
debris = list(/obj/item/stack/sheet/runed_metal = 1)
/obj/structure/destructible/cult/examine(mob/user)
- var/can_see_cult = iscultist(user) || isobserver(user)
..()
- if(takes_damage)
- var/t_It = they_pronoun(TRUE)
- var/t_is = get_is()
- var/cultist_message = "[t_It] [t_is] at [health]/[max_health] stability"
- var/other_message = "[t_It] seems extremely stable"
- var/heavily_damaged = FALSE
- var/healthpercent = (health/max_health) * 100
- if(healthpercent >= 100)
- other_message = "[t_It] seems extremely stable"
- else if(healthpercent >= 50)
- other_message = "[t_It] looks slightly unstable"
- else if(healthpercent >= 25)
- other_message = "[t_It] appears very unstable"
- heavily_damaged = TRUE
- else if(healthpercent >= 0)
- other_message = "[t_It] [t_is] glowing faintly and is extremely unstable"
- heavily_damaged = TRUE
- user << "[heavily_damaged ? "":""][can_see_cult ? "[cultist_message]":"[other_message]"][heavily_damaged ? "!":"."]"
+ var/can_see_cult = iscultist(user) || isobserver(user)
+ var/t_It = they_pronoun(TRUE)
+ var/t_is = get_is()
+ if(!(resistance_flags & INDESTRUCTIBLE))
+ if(can_see_cult)
+ user << "[t_It] [t_is] at [round(obj_integrity * 100 / max_integrity)]% stability"
user << "\The [src] is [anchored ? "":"not "]secured to the floor."
if(can_see_cult && cooldowntime > world.time)
- user << "The magic in [src] is too weak, [they_pronoun()] will be ready to use again in [getETA()]."
+ user << "The magic in [src] is too weak, [t_It] will be ready to use again in [getETA()]."
/obj/structure/destructible/cult/attack_animal(mob/living/simple_animal/M)
if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
- if(health < max_health)
- health = min(max_health, health + 5)
+ if(obj_integrity < max_integrity)
+ obj_integrity = min(max_integrity, obj_integrity + 5)
Beam(M, icon_state="sendbeam", time=4)
M.visible_message("[M] repairs \the [src].", \
- "You repair [src], leaving [they_pronoun()] at [health]/[max_health] stability.")
+ "You repair [src], leaving [they_pronoun()] at [round(obj_integrity * 100 / max_integrity)]% stability.")
else
M << "You cannot repair [src], as [they_pronoun()] [get_is()] undamaged!"
else
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 9b14d82cd9e..f32896c536b 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -234,11 +234,7 @@ This file contains the arcane tome files.
priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
for(var/B in spiral_range_turfs(1, user, 1))
var/turf/T = B
- var/obj/machinery/shield/N = new(T)
- N.name = "sanguine barrier"
- N.desc = "A potent shield summoned by cultists to defend their rites."
- N.icon_state = "shield-red"
- N.health = 60
+ var/obj/structure/emergency_shield/sanguine/N = new(T)
shields |= N
else
user << "Nar-Sie does not wish to be summoned!"
@@ -248,7 +244,7 @@ This file contains the arcane tome files.
user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm"))
if(!do_after(user, initial(rune_to_scribe.scribe_delay), target = get_turf(user)))
for(var/V in shields)
- var/obj/machinery/shield/S = V
+ var/obj/structure/emergency_shield/sanguine/S = V
if(S && !qdeleted(S))
qdel(S)
return
@@ -258,7 +254,7 @@ This file contains the arcane tome files.
user.visible_message("[user] creates a strange circle in their own blood.", \
"You finish drawing the arcane markings of the Geometer.")
for(var/V in shields)
- var/obj/machinery/shield/S = V
+ var/obj/structure/emergency_shield/S = V
if(S && !qdeleted(S))
qdel(S)
var/obj/effect/rune/R = new rune_to_scribe(Turf, chosen_keyword)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 3920e4258cb..bc5301373bc 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -21,7 +21,7 @@ To draw a rune, use an arcane tome.
anchored = 1
icon = 'icons/obj/rune.dmi'
icon_state = "1"
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
layer = ABOVE_NORMAL_TURF_LAYER
color = "#FF0000"
@@ -990,17 +990,14 @@ var/list/wall_runes = list()
..()
visible_message("A cloud of red mist forms above [src], and from within steps... a man.")
user << "Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely..."
- var/obj/machinery/shield/N = new(get_turf(src))
- N.name = "Invoker's Shield"
- N.desc = "A weak shield summoned by cultists to protect them while they carry out delicate rituals"
- N.color = "red"
- N.health = 20
- N.mouse_opacity = 0
+ var/turf/T = get_turf(src)
+ var/obj/structure/emergency_shield/invoker/N = new(T)
+
new_human.key = ghost_to_spawn.key
ticker.mode.add_cultist(new_human.mind, 0)
new_human << "You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs."
- while(user in get_turf(src))
+ while(user in T)
if(user.stat)
break
user.apply_damage(0.1, BRUTE)
diff --git a/code/game/gamemodes/devil/imp/imp.dm b/code/game/gamemodes/devil/imp/imp.dm
index 76696ced406..c5f662f5186 100644
--- a/code/game/gamemodes/devil/imp/imp.dm
+++ b/code/game/gamemodes/devil/imp/imp.dm
@@ -26,6 +26,7 @@
health = 200
healable = 0
environment_smash = 1
+ obj_damage = 40
melee_damage_lower = 10
melee_damage_upper = 15
see_in_dark = 8
diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm
index 32c81ff0cad..a636a1d4d98 100644
--- a/code/game/gamemodes/gang/dominator.dm
+++ b/code/game/gamemodes/gang/dominator.dm
@@ -6,9 +6,10 @@
density = 1
anchored = 1
layer = HIGH_OBJ_LAYER
- var/maxhealth = 200
- var/health = 200
- armor = list(melee = 20, bullet = 50, laser = 50, energy = 0, bomb = 10, bio = 100, rad = 100, fire = 10, acid = 0)
+ max_integrity = 300
+ obj_integrity = 300
+ integrity_failure = 100
+ armor = list(melee = 20, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100, fire = 10, acid = 70)
var/datum/gang/gang
var/operating = 0 //0=standby or broken, 1=takeover
var/warned = 0 //if this device has set off the warning at <3 minutes yet
@@ -29,7 +30,6 @@
/obj/machinery/dominator/examine(mob/user)
..()
if(stat & BROKEN)
- user << "It looks completely busted."
return
var/time
@@ -41,7 +41,7 @@
user << "Hostile Takeover of [station_name()] successful. Have a great day."
else
user << "System on standby."
- user << "System Integrity: [round((health/maxhealth)*100,1)]%"
+ user << "System Integrity: [round((obj_integrity/max_integrity)*100,1)]%"
/obj/machinery/dominator/process()
..()
@@ -61,35 +61,41 @@
if(!.)
STOP_PROCESSING(SSmachine, src)
-/obj/machinery/dominator/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/dominator/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
- if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(src, 'sound/effects/bang.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- else
- return
- health -= damage
+ if(damage_amount)
+ playsound(src, 'sound/effects/bang.ogg', 50, 1)
+ else
+ playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
+ if(BURN)
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- if(health > (maxhealth/2))
- if(prob(damage*2))
+/obj/machinery/dominator/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
+ . = ..()
+ if(.)
+ if(obj_integrity/max_integrity > 0.66)
+ if(prob(damage_amount*2))
+ spark_system.start()
+ else if(!(stat & BROKEN))
spark_system.start()
- else if(!(stat & BROKEN))
- spark_system.start()
- add_overlay("damage")
+ cut_overlays()
+ add_overlay("damage")
- if(!(stat & BROKEN))
- if(health <= 0)
+/obj/machinery/dominator/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
+ set_broken()
+
+/obj/machinery/dominator/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(!(stat & BROKEN))
set_broken()
-
- if(health <= -100)
new /obj/item/stack/sheet/plasteel(src.loc)
- qdel(src)
+ qdel(src)
+
+/obj/machinery/dominator/attacked_by(obj/item/I, mob/living/user)
+ add_fingerprint(user)
+ ..()
/obj/machinery/dominator/proc/set_broken()
if(gang)
@@ -130,35 +136,9 @@
return ..()
/obj/machinery/dominator/emp_act(severity)
- take_damage(100, BURN, 0)
+ take_damage(100, BURN, "energy", 0)
..()
-/obj/machinery/dominator/ex_act(severity, target)
- if(target == src)
- qdel(src)
- return
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- take_damage(120, BRUTE, 0)
- if(3)
- take_damage(30, BRUTE, 0)
- return
-
-/obj/machinery/dominator/bullet_act(obj/item/projectile/P)
- . = ..()
- if(P.damage)
- var/damage_amount = P.damage
- if(P.forcedodge)
- damage_amount *= 0.5
- visible_message("[src] was hit by [P].")
- take_damage(damage_amount, P.damage_type, 0)
-
-
-/obj/machinery/dominator/blob_act(obj/structure/blob/B)
- take_damage(110, BRUTE, 0)
-
/obj/machinery/dominator/attack_hand(mob/user)
if(operating || (stat & BROKEN))
examine(user)
@@ -208,16 +188,6 @@
if(G != gang)
G.message_gangtools("Enemy takeover attempt detected in [locname]: Estimated [time] minutes until our defeat.",1,1)
-/obj/machinery/dominator/attack_hulk(mob/user)
- ..(user, 1)
- user.visible_message("[user] smashes [src].",\
- "You punch [src].",\
- "You hear metal being slammed.")
- take_damage(5)
- return 1
-
-/obj/machinery/dominator/attacked_by(obj/item/I, mob/living/user)
- add_fingerprint(user)
- ..()
+
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 940a715f86c..521fd901b81 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -133,7 +133,7 @@
src.verbs -= /mob/living/silicon/ai/proc/upgrade_turrets
//Upgrade AI turrets around the world
for(var/obj/machinery/porta_turret/ai/turret in machines)
- turret.health += 30
+ turret.obj_integrity += 30
turret.eprojectile = /obj/item/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR.
turret.eshot_sound = 'sound/weapons/lasercannonfire.ogg'
src << "Turrets upgraded."
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 7c79ebe648c..7b128975915 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -581,9 +581,8 @@ Congratulations! You are now trained for xenobiology research!"}
can_buckle = 1
buckle_lying = 1
flags = NODECONSTRUCT
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
-/obj/structure/table/optable/abductor/table_destroy()
- return //can't destroy the abductor's only optable.
/obj/structure/bed/abductor
name = "resting contraption"
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index eb208bea4a9..5f95588ac4d 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -199,13 +199,13 @@
owner << "You feel something moving around inside you..."
//spawn cocoon with clone greytide snpc inside
if(ishuman(owner))
- var/obj/effect/cocoon/abductor/C = new (get_turf(owner))
+ var/obj/structure/spider/cocoon/abductor/C = new (get_turf(owner))
C.Copy(owner)
C.Start()
owner.gib()
return
-/obj/effect/cocoon/abductor
+/obj/structure/spider/cocoon/abductor
name = "slimy cocoon"
desc = "Something is moving inside."
icon = 'icons/effects/effects.dmi'
@@ -214,7 +214,7 @@
density = 1
var/hatch_time = 0
-/obj/effect/cocoon/abductor/proc/Copy(mob/living/carbon/human/H)
+/obj/structure/spider/cocoon/abductor/proc/Copy(mob/living/carbon/human/H)
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
clone.hardset_dna(H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.features)
@@ -228,11 +228,11 @@
if(I)
clone.equip_to_slot_if_possible(I,slot)
-/obj/effect/cocoon/abductor/proc/Start()
+/obj/structure/spider/cocoon/abductor/proc/Start()
hatch_time = world.time + 600
START_PROCESSING(SSobj, src)
-/obj/effect/cocoon/abductor/process()
+/obj/structure/spider/cocoon/abductor/process()
if(world.time > hatch_time)
STOP_PROCESSING(SSobj, src)
for(var/mob/M in contents)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 9c06517bd95..f893ad1bb84 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -13,6 +13,7 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "camera"
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/machinery/computer/camera_advanced/abductor/CreateEye()
..()
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
index 58de10d57e7..5539f6a878e 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
@@ -1,6 +1,7 @@
//Common
/obj/machinery/abductor
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/team = 0
/obj/machinery/abductor/proc/IsAgent(mob/living/carbon/human/H)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index db7a20a766f..06be9a116a0 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -83,6 +83,7 @@
hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD)
languages_spoken = SWARMER
languages_understood = SWARMER
+ obj_damage = 0
environment_smash = 0
attacktext = "shocks"
attack_sound = 'sound/effects/EMPulse.ogg'
@@ -412,7 +413,6 @@
icon_state = "integrate"
duration = 5
-
/obj/structure/swarmer //Default swarmer effect object visual feedback
name = "swarmer ui"
desc = null
@@ -420,61 +420,29 @@
icon = 'icons/mob/swarmer.dmi'
icon_state = "ui_light"
layer = MOB_LAYER
-
+ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
luminosity = 1
+ obj_integrity = 30
+ max_integrity = 30
anchored = 1
- var/health = 30
-/obj/structure/swarmer/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/structure/swarmer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- playsound(loc, 'sound/weapons/Egloves.ogg', 80, 1)
+ playsound(loc, 'sound/weapons/Egloves.ogg', 80, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- health -= damage
- if(health <= 0)
- qdel(src)
-
-/obj/structure/swarmer/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type)
-
-/obj/structure/swarmer/attacked_by(obj/item/I, mob/living/user)
- ..()
- take_damage(I.force, I.damtype)
-
-/obj/structure/swarmer/ex_act()
- qdel(src)
-
-/obj/structure/swarmer/blob_act(obj/structure/blob/B)
- qdel(src)
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
/obj/structure/swarmer/emp_act()
qdel(src)
-/obj/structure/swarmer/attack_alien(mob/living/user)
- user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
- take_damage(rand(20,30))
-
-/obj/structure/swarmer/attack_animal(mob/living/simple_animal/S)
- S.do_attack_animation(src)
- S.changeNext_move(CLICK_CD_MELEE)
- if(S.obj_damage)
- take_damage(S.obj_damage, S.melee_damage_type, 1)
- else if(S.melee_damage_upper)
- take_damage(rand(S.melee_damage_lower, S.melee_damage_upper), S.melee_damage_type)
-
/obj/structure/swarmer/trap
name = "swarmer trap"
desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough."
icon_state = "trap"
- luminosity = 1
- health = 10
+ obj_integrity = 10
+ max_integrity = 10
+ density = 0
/obj/structure/swarmer/trap/Crossed(var/atom/movable/AM)
if(isliving(AM))
@@ -516,9 +484,8 @@
desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through."
icon_state = "barricade"
luminosity = 1
- health = 50
- density = 1
- anchored = 1
+ obj_integrity = 50
+ max_integrity = 50
/obj/structure/swarmer/blockade/CanPass(atom/movable/O)
if(isswarmer(O))
diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm
index f1b34bdebf9..38624c9dc54 100644
--- a/code/game/gamemodes/miniantags/morph/morph.dm
+++ b/code/game/gamemodes/miniantags/morph/morph.dm
@@ -21,7 +21,7 @@
maxHealth = 150
health = 150
healable = 0
- environment_smash = 1
+ obj_damage = 50
melee_damage_lower = 20
melee_damage_upper = 20
see_in_dark = 8
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index 2ac221435fc..e424b85fefc 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -28,6 +28,7 @@
health = 200
healable = 0
environment_smash = 1
+ obj_damage = 50
melee_damage_lower = 30
melee_damage_upper = 30
see_in_dark = 8
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index ae966ae1738..6b59f02057f 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -18,6 +18,7 @@ var/bomb_set
icon = 'icons/obj/machines/nuke.dmi'
icon_state = "nuclearbomb_base"
density = 1
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/timer_set = 60
var/default_timer_set = 60
@@ -393,13 +394,10 @@ var/bomb_set
else
. = timer_set
-/obj/machinery/nuclearbomb/ex_act(severity, target)
- return
-
/obj/machinery/nuclearbomb/blob_act(obj/structure/blob/B)
if(exploding)
return
- . = ..()
+ qdel(src)
/obj/machinery/nuclearbomb/tesla_act(var/power)
..()
@@ -490,6 +488,9 @@ This is here to make the tiles around the station mininuke change when it's arme
desc = "Better keep this safe."
icon_state = "nucleardisk"
persistence_replacement = /obj/item/weapon/disk/fakenucleardisk
+ obj_integrity = 250
+ max_integrity = 250
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 30, bio = 0, rad = 0, fire = 90, acid = 70)
/obj/item/weapon/disk/nuclear/New()
..()
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 14e475144e0..88611b5eb6b 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -481,8 +481,9 @@ var/global/list/multiverse = list()
var/obj/item/link = null
var/cooldown_time = 30 //3s
var/cooldown = 0
- burntime = 0
- resistance_flags = 0
+ obj_integrity = 10
+ max_integrity = 10
+ resistance_flags = FLAMMABLE
/obj/item/voodoo/attackby(obj/item/I, mob/user, params)
if(target && cooldown < world.time)
@@ -579,7 +580,7 @@ var/global/list/multiverse = list()
var/area/A = get_area(src)
victim << "You feel a dark presence from [A.name]"
-/obj/item/voodoo/fire_act()
+/obj/item/voodoo/fire_act(exposed_temperature, exposed_volume)
if(target)
target.adjust_fire_stacks(20)
target.IgniteMob()
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index fd21d4a3826..19e8ce9fb6c 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -7,7 +7,8 @@
anchored = 1
var/obj/item/device/pda/storedpda = null
var/list/colorlist = list()
- var/health = 100
+ obj_integrity = 200
+ max_integrity = 200
/obj/machinery/pdapainter/update_icon()
@@ -74,29 +75,16 @@
user << "You repair [src]."
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
stat &= ~BROKEN
- health = initial(health)
+ obj_integrity = max_integrity
update_icon()
else
user << "[src] does not need repairs."
else
return ..()
-/obj/machinery/pdapainter/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- if(!(stat & BROKEN))
- health -= damage
- if(health <= 0)
+/obj/machinery/pdapainter/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(!(stat & BROKEN))
stat |= BROKEN
update_icon()
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index db81c9efeef..f0d948b3948 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -78,12 +78,6 @@
if(occupant && occupant.stat != DEAD)
occupant << "You feel cool air surround you. You go numb as your senses turn inward."
-/obj/machinery/sleeper/attack_animal(mob/living/simple_animal/M)
- if(M.environment_smash)
- M.do_attack_animation(src)
- visible_message("[M.name] smashes [src] apart!")
- qdel(src)
-
/obj/machinery/sleeper/emp_act(severity)
if(is_operational() && occupant)
open_machine()
@@ -176,8 +170,8 @@
if(!occupant)
return
var/amount = occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency
- var/health = occupant.health > min_health || chem == "epinephrine"
- return amount && health
+ var/occ_health = occupant.health > min_health || chem == "epinephrine"
+ return amount && occ_health
/obj/machinery/sleeper/syndie
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 0d6b45e76ad..16bc9f135e4 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -4,6 +4,10 @@
icon_state = "motion3"
layer = PROJECTILE_HIT_THRESHHOLD_LAYER
anchored = 1
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
+
var/uses = 20
var/disabled = 1
var/lethal = 0
diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm
index 7c5abe61c07..56240c6d9b2 100644
--- a/code/game/machinery/airlock_control.dm
+++ b/code/game/machinery/airlock_control.dm
@@ -100,6 +100,7 @@
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "airlock_sensor_off"
name = "airlock sensor"
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
anchored = 1
power_channel = ENVIRON
diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm
index f7b172a4454..f957f81704a 100644
--- a/code/game/machinery/announcement_system.dm
+++ b/code/game/machinery/announcement_system.dm
@@ -13,8 +13,6 @@ var/list/announcement_systems = list()
verb_ask = "queries"
verb_exclaim = "alarms"
- var/broken = 0
-
idle_power_usage = 20
active_power_usage = 50
@@ -63,7 +61,7 @@ var/list/announcement_systems = list()
else
overlays -= pinklight
- if(broken)
+ if(stat & BROKEN)
add_overlay(errorlight)
else
overlays -= errorlight
@@ -84,9 +82,9 @@ var/list/announcement_systems = list()
update_icon()
else if(default_deconstruction_crowbar(P))
return
- else if(istype(P, /obj/item/device/multitool) && panel_open && broken)
+ else if(istype(P, /obj/item/device/multitool) && panel_open && (stat & BROKEN))
user << "You reset [src]'s firmware."
- broken = 0
+ stat &= ~BROKEN
update_icon()
else
return ..()
@@ -117,7 +115,7 @@ var/list/announcement_systems = list()
//config stuff
/obj/machinery/announcement_system/interact(mob/user)
- if(broken)
+ if(stat & BROKEN)
visible_message("[src] buzzes.", "You hear a faint buzz.")
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 1)
return
@@ -131,7 +129,7 @@ var/list/announcement_systems = list()
popup.open()
/obj/machinery/announcement_system/Topic(href, href_list)
- if(broken)
+ if(stat & BROKEN)
visible_message("[src] buzzes.", "You hear a faint buzz.")
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 1)
return
@@ -162,13 +160,13 @@ var/list/announcement_systems = list()
/obj/machinery/announcement_system/attack_ai(mob/living/silicon/ai/user)
if(!isAI(user))
return
- if(broken)
+ if(stat & BROKEN)
user << "[src]'s firmware appears to be malfunctioning!"
return
interact(user)
/obj/machinery/announcement_system/proc/act_up() //does funny breakage stuff
- broken = 1
+ stat |= BROKEN
update_icon()
arrival = pick("#!@%ERR-34%2 CANNOT LOCAT@# JO# F*LE!", "CRITICAL ERROR 99.", "ERR)#: DA#AB@#E NOT F(*ND!")
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index a3cb942cc2e..75d06eadf48 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -10,10 +10,11 @@
var/device_type = null
var/id = null
var/initialized = 0
-
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100, fire = 90, acid = 70)
anchored = 1
use_power = 1
idle_power_usage = 2
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/machinery/button/New(loc, ndir = 0, built = 0)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index f0300b7d706..558c5d02c1d 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -12,8 +12,10 @@
active_power_usage = 10
layer = WALL_OBJ_LAYER
- armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- var/health = 50
+ armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 50)
+ obj_integrity = 100
+ max_integrity = 100
+ integrity_failure = 50
var/list/network = list("SS13")
var/c_tag = null
var/c_tag_order = 999
@@ -22,7 +24,7 @@
var/start_active = 0 //If it ignores the random chance to start broken on round start
var/invuln = null
var/obj/item/device/camera_bug/bug = null
- var/obj/machinery/camera_assembly/assembly = null
+ var/obj/structure/camera_assembly/assembly = null
//OTHER
@@ -112,20 +114,10 @@
..()
qdel(src)//to prevent bomb testing camera from exploding over and over forever
-/obj/machinery/camera/blob_act(obj/structure/blob/B)
- if(B && B.loc == loc)
- take_damage(health, BRUTE, 0)
-
/obj/machinery/camera/ex_act(severity, target)
- if(src.invuln)
+ if(invuln)
return
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- take_damage(50, BRUTE, 0)
- else
- take_damage(rand(30,60), BRUTE, 0)
+ ..()
/obj/machinery/camera/proc/setViewRange(num = 7)
src.view_range = num
@@ -150,7 +142,7 @@
if(panel_open)
if(istype(W, /obj/item/weapon/wirecutters)) //enable/disable the camera
toggle_cam(user, 1)
- health = initial(health) //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex.
+ obj_integrity = max_integrity //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex.
return
else if(istype(W, /obj/item/device/multitool)) //change focus
@@ -161,13 +153,7 @@
else if(istype(W, /obj/item/weapon/weldingtool))
if(weld(W, user))
visible_message("[user] unwelds [src], leaving it as just a frame screwed to the wall.", "You unweld [src], leaving it as just a frame screwed to the wall")
- if(!assembly)
- assembly = new()
- assembly.loc = src.loc
- assembly.state = 1
- assembly.setDir(src.dir)
- assembly = null
- qdel(src)
+ deconstruct(TRUE)
return
else if(istype(W, /obj/item/device/analyzer))
@@ -253,26 +239,31 @@
return ..()
-/obj/machinery/camera/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(src, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(src, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- if(damage < 10) //camera has a damage resistance threshold
- return
- health = max(0, health - damage)
- if(!health && status)
+/obj/machinery/camera/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 12 && !(stat & BROKEN))
+ return 0
+ . = ..()
+
+/obj/machinery/camera/obj_break(damage_flag)
+ if(status && !(flags & NODECONSTRUCT))
triggerCameraAlarm()
toggle_cam(null, 0)
+/obj/machinery/camera/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(disassembled)
+ if(!assembly)
+ assembly = new()
+ assembly.loc = src.loc
+ assembly.state = 1
+ assembly.setDir(dir)
+ assembly = null
+ else
+ var/obj/item/I = new /obj/item/wallframe/camera (loc)
+ I.obj_integrity = I.max_integrity * 0.5
+ new /obj/item/stack/cable_coil(loc, 2)
+ qdel(src)
+
/obj/machinery/camera/update_icon()
if(!status)
icon_state = "[initial(icon_state)]1"
@@ -401,10 +392,6 @@
else
src.SetLuminosity(0)
-/obj/machinery/camera/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type, 0)
-
/obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets.
var/turf/prev_turf
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 94e97a0e39c..87b08024f3f 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -4,19 +4,21 @@
icon = 'icons/obj/monitors.dmi'
icon_state = "cameracase"
materials = list(MAT_METAL=400, MAT_GLASS=250)
- result_path = /obj/machinery/camera_assembly
+ result_path = /obj/structure/camera_assembly
-/obj/machinery/camera_assembly
+/obj/structure/camera_assembly
name = "camera assembly"
desc = "The basic construction for Nanotrasen-Always-Watching-You cameras."
icon = 'icons/obj/monitors.dmi'
icon_state = "camera1"
+ obj_integrity = 150
+ max_integrity = 150
// Motion, EMP-Proof, X-Ray
var/list/obj/item/possible_upgrades = list(/obj/item/device/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/device/analyzer)
var/list/upgrades = list()
var/state = 1
- var/busy = 0
+
/*
1 = Wrenched in place
2 = Welded in place
@@ -24,12 +26,12 @@
4 = Screwdriver panel closed and is fully built (you cannot attach upgrades)
*/
-/obj/machinery/camera_assembly/New(loc, ndir, building)
+/obj/structure/camera_assembly/New(loc, ndir, building)
..()
if(building)
setDir(ndir)
-/obj/machinery/camera_assembly/attackby(obj/item/W, mob/living/user, params)
+/obj/structure/camera_assembly/attackby(obj/item/W, mob/living/user, params)
switch(state)
if(1)
// State 1
@@ -73,14 +75,14 @@
if(istype(W, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- var/input = stripped_input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")
+ var/input = stripped_input(user, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")
if(!input)
- usr << "No input found, please hang up and try your call again!"
+ user << "No input found, please hang up and try your call again!"
return
var/list/tempnetwork = splittext(input, ",")
if(tempnetwork.len < 1)
- usr << "No network found, please hang up and try your call again!"
+ user << "No network found, please hang up and try your call again!"
return
state = 4
@@ -122,19 +124,18 @@
return ..()
-/obj/machinery/camera_assembly/proc/weld(obj/item/weapon/weldingtool/WT, mob/living/user)
- if(busy)
- return 0
+/obj/structure/camera_assembly/proc/weld(obj/item/weapon/weldingtool/WT, mob/living/user)
if(!WT.remove_fuel(0, user))
return 0
-
user << "You start to weld \the [src]..."
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
- busy = 1
if(do_after(user, 20, target = src))
- busy = 0
- if(!WT.isOn())
- return 0
- return 1
- busy = 0
- return 0
\ No newline at end of file
+ if(WT.isOn())
+ playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ return 1
+ return 0
+
+/obj/structure/camera_assembly/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc)
+ qdel(src)
\ No newline at end of file
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index 142f6c21e97..4255cf42eec 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -91,7 +91,7 @@
if(!charging)
return
- charging.loc = loc
+ charging.forceMove(loc)
user << "You telekinetically remove [charging] from [src]."
removecell()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 45934d85022..72b74fe486b 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -370,7 +370,8 @@
go_out()
/obj/machinery/clonepod/emp_act(severity)
- if(prob(100/(severity*efficiency))) malfunction()
+ if(prob(100/(severity*efficiency)))
+ malfunction()
..()
/obj/machinery/clonepod/ex_act(severity, target)
@@ -378,6 +379,13 @@
if(!qdeleted(src))
go_out()
+/obj/machinery/clonepod/deconstruct(disassembled = TRUE)
+ if(occupant)
+ locked = FALSE
+ go_out()
+ ..()
+
+
/*
* Diskette Box
*/
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 955cbf118bb..f62a0be4816 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -15,6 +15,7 @@
user << "You wrench the frame into place."
anchored = 1
state = 1
+ return
if(istype(P, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = P
if(!WT.remove_fuel(0, user))
@@ -29,6 +30,7 @@
var/obj/item/stack/sheet/metal/M = new (loc, 5)
M.add_fingerprint(user)
qdel(src)
+ return
if(1)
if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
@@ -37,6 +39,7 @@
user << "You unfasten the frame."
anchored = 0
state = 0
+ return
if(istype(P, /obj/item/weapon/circuitboard/computer) && !circuit)
if(!user.drop_item())
return
@@ -46,15 +49,17 @@
circuit = P
circuit.add_fingerprint(user)
P.loc = null
+ return
else if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
user << "This frame does not accept circuit boards of this type!"
-
+ return
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "You screw the circuit board into place."
state = 2
icon_state = "2"
+ return
if(istype(P, /obj/item/weapon/crowbar) && circuit)
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
user << "You remove the circuit board."
@@ -63,12 +68,14 @@
circuit.loc = src.loc
circuit.add_fingerprint(user)
circuit = null
+ return
if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "You unfasten the circuit board."
state = 1
icon_state = "1"
+ return
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if(C.get_amount() >= 5)
@@ -82,6 +89,7 @@
icon_state = "3"
else
user << "You need five lengths of cable to wire the frame!"
+ return
if(3)
if(istype(P, /obj/item/weapon/wirecutters))
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
@@ -91,6 +99,7 @@
var/obj/item/stack/cable_coil/A = new (loc)
A.amount = 5
A.add_fingerprint(user)
+ return
if(istype(P, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = P
@@ -106,6 +115,7 @@
user << "You put in the glass panel."
state = 4
src.icon_state = "4"
+ return
if(4)
if(istype(P, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
@@ -114,14 +124,27 @@
icon_state = "3"
var/obj/item/stack/sheet/glass/G = new (loc, 2)
G.add_fingerprint(user)
+ return
if(istype(P, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "You connect the monitor."
var/obj/B = new src.circuit.build_path (src.loc, circuit)
transfer_fingerprints_to(B)
qdel(src)
+ return
+ if(user.a_intent == "harm")
+ return ..()
+/obj/structure/frame/computer/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(state == 4)
+ new /obj/item/weapon/shard(loc)
+ new /obj/item/weapon/shard(loc)
+ if(state >= 3)
+ new /obj/item/stack/cable_coil(loc , 5)
+ ..()
+
/obj/item/weapon/circuitboard
name = "circuit board"
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 2f49e5f59cb..38ef9137c09 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -7,12 +7,15 @@
use_power = 1
idle_power_usage = 300
active_power_usage = 300
+ obj_integrity = 200
+ max_integrity = 200
+ integrity_failure = 100
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 40, acid = 20)
var/obj/item/weapon/circuitboard/computer/circuit = null // if circuit==null, computer can't disassembly
var/processing = 0
var/brightness_on = 2
var/icon_keyboard = "generic_key"
var/icon_screen = "generic"
- var/computer_health = 25
var/clockwork = FALSE
/obj/machinery/computer/New(location, obj/item/weapon/circuitboard/C)
@@ -41,28 +44,6 @@
return 0
return 1
-/obj/machinery/computer/emp_act(severity)
- if(severity == 1)
- take_damage(rand(15,30), BRUTE, 0)
- else
- take_damage(rand(15,25), BRUTE, 0)
- ..()
-
-/obj/machinery/computer/ex_act(severity, target)
- if(target == src)
- qdel(src)
- return
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(25))
- qdel(src)
- else
- take_damage(rand(20,30), BRUTE, 0)
- if(3)
- take_damage(rand(10,30), BRUTE, 0)
-
/obj/machinery/computer/ratvar_act()
if(!clockwork)
clockwork = TRUE
@@ -79,10 +60,6 @@
icon_state = initial(icon_state)
update_icon()
-/obj/machinery/computer/bullet_act(obj/item/projectile/P)
- take_damage(P.damage, P.damage_type, 0)
- ..()
-
/obj/machinery/computer/update_icon()
cut_overlays()
if(stat & NOPOWER)
@@ -108,67 +85,61 @@
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << " You start to disconnect the monitor..."
if(do_after(user, 20/I.toolspeed, target = src))
- deconstruct()
+ deconstruct(TRUE, user)
+ else
+ return ..()
+
+/obj/machinery/computer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(stat & BROKEN)
+ playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
+ else
+ playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ if(BURN)
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+
+/obj/machinery/computer/obj_break(damage_flag)
+ if(circuit && !(flags & NODECONSTRUCT)) //no circuit, no breaking
+ if(!(stat & BROKEN))
+ playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
+ stat |= BROKEN
+ update_icon()
+
+/obj/machinery/computer/emp_act(severity)
+ switch(severity)
+ if(1)
+ if(prob(50))
+ obj_break("energy")
+ if(2)
+ if(prob(10))
+ obj_break("energy")
+ ..()
+
+
+/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user)
+ on_deconstruction()
+ if(!(flags & NODECONSTRUCT))
+ if(circuit) //no circuit, no computer frame
var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
A.circuit = circuit
A.anchored = 1
- circuit = null
- for (var/obj/C in src)
- C.loc = src.loc
- if (stat & BROKEN)
- user << "The broken glass falls out."
+ if(stat & BROKEN)
+ if(user)
+ user << "The broken glass falls out."
+ else
+ playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
new /obj/item/weapon/shard(src.loc)
new /obj/item/weapon/shard(src.loc)
A.state = 3
A.icon_state = "3"
else
- user << "You disconnect the monitor."
+ if(user)
+ user << "You disconnect the monitor."
A.state = 4
A.icon_state = "4"
- qdel(src)
- else
- return ..()
+ circuit = null
+ for(var/obj/C in src)
+ C.forceMove(loc)
-/obj/machinery/computer/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(stat & BROKEN)
- playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
- else
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
- if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- computer_health = max(computer_health - damage, 0)
- if(circuit) //no circuit, no breaking
- if(!computer_health && !(stat & BROKEN))
- playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
- stat |= BROKEN
- update_icon()
-
-
-
-/obj/machinery/computer/deconstruct(mob/user)
- on_deconstruction()
- var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
- A.circuit = circuit
- A.anchored = 1
- circuit = null
- for(var/obj/C in src)
- C.forceMove(loc)
- if(stat & BROKEN)
- if(user)
- user << "The broken glass falls out."
- new /obj/item/weapon/shard(src.loc)
- new /obj/item/weapon/shard(src.loc)
- A.state = 3
- A.icon_state = "3"
- else
- if(user)
- user << "You disconnect the monitor."
- A.state = 4
- A.icon_state = "4"
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm
index abba2eb90ce..ea9437018e0 100644
--- a/code/game/machinery/computer/telecrystalconsoles.dm
+++ b/code/game/machinery/computer/telecrystalconsoles.dm
@@ -9,6 +9,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
icon_keyboard = "tcstation_key"
icon_screen = "syndie"
clockwork = TRUE //it'd look weird, at least if ratvar ever got there
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/////////////////////////////////////////////
/obj/machinery/computer/telecrystals/uplinker
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index def8036d422..ec10b96b79f 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -4,6 +4,8 @@
icon_state = "box_0"
density = 1
anchored = 1
+ obj_integrity = 250
+ max_integrity = 250
var/obj/item/weapon/circuitboard/circuit = null
var/state = 1
@@ -12,6 +14,16 @@
if(circuit)
user << "It has \a [circuit] installed."
+
+/obj/structure/frame/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 5)
+ if(circuit)
+ circuit.forceMove(loc)
+ circuit = null
+ qdel(src)
+
+
/obj/structure/frame/machine
name = "machine frame"
var/list/components = null
@@ -66,10 +78,10 @@
if(1)
if(istype(P, /obj/item/weapon/circuitboard/machine))
user << "The frame needs wiring first!"
-
+ return
else if(istype(P, /obj/item/weapon/circuitboard))
user << "This frame does not accept circuit boards of this type!"
-
+ return
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if(C.get_amount() >= 5)
@@ -83,7 +95,7 @@
icon_state = "box_1"
else
user << "You need five length of cable to wire the frame!"
- return
+ return
if(istype(P, /obj/item/weapon/screwdriver) && !anchored)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user.visible_message("[user] disassembles the frame.", \
@@ -94,6 +106,7 @@
var/obj/item/stack/sheet/metal/M = new (loc, 5)
M.add_fingerprint(user)
qdel(src)
+ return
if(istype(P, /obj/item/weapon/wrench))
user << "You start [anchored ? "un" : ""]securing [name]..."
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
@@ -101,6 +114,7 @@
if(state == 1)
user << "You [anchored ? "un" : ""]secure [name]."
anchored = !anchored
+ return
if(2)
if(istype(P, /obj/item/weapon/wrench))
@@ -109,6 +123,7 @@
if(do_after(user, 40/P.toolspeed, target = src))
user << "You [anchored ? "un" : ""]secure [name]."
anchored = !anchored
+ return
if(istype(P, /obj/item/weapon/circuitboard/machine))
if(!anchored)
@@ -126,9 +141,11 @@
components = list()
req_components = B.req_components.Copy()
update_namelist()
+ return
else if(istype(P, /obj/item/weapon/circuitboard))
user << "This frame does not accept circuit boards of this type!"
+ return
if(istype(P, /obj/item/weapon/wirecutters))
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
@@ -137,6 +154,7 @@
icon_state = "box_0"
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc )
A.amount = 5
+ return
if(3)
if(istype(P, /obj/item/weapon/crowbar))
@@ -155,6 +173,7 @@
req_components = null
components = null
icon_state = "box_1"
+ return
if(istype(P, /obj/item/weapon/screwdriver))
var/component_check = 1
@@ -175,6 +194,7 @@
circuit.loc = null
new_machine.RefreshParts()
qdel(src)
+ return
if(istype(P, /obj/item/weapon/storage/part_replacer) && P.contents.len && get_req_components_amt())
var/obj/item/weapon/storage/part_replacer/replacer = P
@@ -224,12 +244,25 @@
if(!user.drop_item())
break
user << "You add [P] to [src]."
- P.loc = src
+ P.forceMove(src)
components += P
req_components[I]--
return 1
user << "You cannot add that to the machine!"
return 0
+ if(user.a_intent == "harm")
+ return ..()
+
+
+/obj/structure/frame/machine/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(state >= 2)
+ new /obj/item/stack/cable_coil(loc , 5)
+ for(var/X in components)
+ var/obj/item/I = X
+ I.forceMove(loc)
+ ..()
+
//Machine Frame Circuit Boards
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index e04bcd68c55..1fe145e5565 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -13,86 +13,31 @@
desc = "Looks like this would make good cover."
anchored = 1
density = 1
- var/health = 100
- var/maxhealth = 100
+ obj_integrity = 100
+ max_integrity = 100
var/proj_pass_rate = 50 //How many projectiles will pass the cover. Lower means stronger cover
- var/ranged_damage_modifier = 1 //Multiply for ranged damage
var/material = METAL
- var/debris_type
-
-/obj/structure/barricade/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- damage = 0
- health -= damage
- if(health <= 0)
+/obj/structure/barricade/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
make_debris()
- qdel(src)
+ qdel(src)
/obj/structure/barricade/proc/make_debris()
return
-/obj/structure/barricade/attack_animal(mob/living/simple_animal/M)
- M.changeNext_move(CLICK_CD_MELEE)
- M.do_attack_animation(src)
- if(!M.melee_damage_upper && !M.obj_damage || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
- return
- visible_message("[M] [M.attacktext] [src]!")
- add_logs(M, src, "attacked")
- if(M.obj_damage)
- take_damage(M.obj_damage)
- else
- take_damage(M.melee_damage_upper)
-
-/obj/structure/barricade/attack_alien(mob/living/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- user.visible_message("[user] claws at [src]!")
- playsound(user.loc, 'sound/weapons/slash.ogg', 100, 1)
- take_damage(50, BRUTE, 0)
-
/obj/structure/barricade/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/weldingtool) && user.a_intent != "harm" && material == METAL)
var/obj/item/weapon/weldingtool/WT = I
- if(health < maxhealth)
+ if(obj_integrity < max_integrity)
if(WT.remove_fuel(0,user))
user << "You begin repairing [src]..."
playsound(loc, 'sound/items/Welder.ogg', 40, 1)
if(do_after(user, 40/I.toolspeed, target = src))
- health = Clamp(health + 20, 0, maxhealth)
+ obj_integrity = Clamp(obj_integrity + 20, 0, max_integrity)
else
return ..()
-
-/obj/structure/barricade/attacked_by(obj/item/I, mob/living/user)
- ..()
- take_damage(I.force)
-
-/obj/structure/barricade/bullet_act(obj/item/projectile/P)
- . = ..()
- visible_message("\The [src] is hit by [P]!")
- take_damage(P.damage*ranged_damage_modifier)
-
-/obj/structure/barricade/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- take_damage(25, BRUTE, 0)
-
-/obj/structure/barricade/blob_act(obj/structure/blob/B)
- take_damage(25, BRUTE, 0)
-
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
if(height==0)
return 1
@@ -130,8 +75,8 @@
desc = "Bags of sand. Self explanatory."
icon = 'icons/obj/smooth_structures/sandbags.dmi'
icon_state = "sandbags"
- health = 280
- maxhealth = 280
+ obj_integrity = 280
+ max_integrity = 280
proj_pass_rate = 20
pass_flags = LETPASSTHROW
material = SAND
@@ -147,11 +92,10 @@
icon_state = "barrier0"
density = 0
anchored = 0
- health = 180
- maxhealth = 180
+ obj_integrity = 180
+ max_integrity = 180
proj_pass_rate = 20
- ranged_damage_modifier = 0.5
- armor = list(melee = 10, bullet = 50, laser = 50, energy = 0, bomb = 10, bio = 100, rad = 100, fire = 10, acid = 0)
+ armor = list(melee = 10, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100, fire = 10, acid = 0)
/obj/structure/barricade/security/New()
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 4a53e8e7d53..6c5406a31b2 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -29,6 +29,9 @@ var/list/airlock_overlays = list()
name = "airlock"
icon = 'icons/obj/doors/airlocks/station/public.dmi'
icon_state = "closed"
+ obj_integrity = 300
+ max_integrity = 300
+ integrity_failure = 70
var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in.
var/hackProof = 0 // if 1, this door can't be hacked by the AI
@@ -926,33 +929,7 @@ var/list/airlock_overlays = list()
"You start to remove electronics from the airlock assembly...")
if(do_after(user,40/I.toolspeed, target = src))
if(src.loc)
- if(assemblytype)
- var/obj/structure/door_assembly/A = new assemblytype(src.loc)
- A.heat_proof_finished = src.heat_proof //tracks whether there's rglass in
- else
- new /obj/structure/door_assembly/door_assembly_0(src.loc)
- //If you come across a null assemblytype, it will produce the default assembly instead of disintegrating.
-
- if(emagged)
- user << "You discard the damaged electronics."
- qdel(src)
- return
- user << "You remove the airlock electronics."
-
- var/obj/item/weapon/electronics/airlock/ae
- if(!electronics)
- ae = new/obj/item/weapon/electronics/airlock( src.loc )
- if(req_one_access)
- ae.one_access = 1
- ae.accesses = src.req_one_access
- else
- ae.accesses = src.req_access
- else
- ae = electronics
- electronics = null
- ae.loc = src.loc
-
- qdel(src)
+ deconstruct(TRUE, user)
return
else if(hasPower())
user << "The airlock's motors resist your efforts to force it!"
@@ -1218,3 +1195,46 @@ var/list/airlock_overlays = list()
secondsElectrified = 0
open()
safe = TRUE
+
+
+/obj/machinery/door/airlock/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
+ stat |= BROKEN
+ if(!panel_open)
+ panel_open = 1
+ wires.cut_all()
+ update_icon()
+
+/obj/machinery/door/airlock/deconstruct(disassembled = TRUE, mob/user)
+ if(!(flags & NODECONSTRUCT))
+ var/obj/structure/door_assembly/A
+ if(assemblytype)
+ A = new assemblytype(src.loc)
+ A.heat_proof_finished = src.heat_proof //tracks whether there's rglass in
+ else
+ A = new /obj/structure/door_assembly/door_assembly_0(src.loc)
+ //If you come across a null assemblytype, it will produce the default assembly instead of disintegrating.
+
+ if(!disassembled)
+ if(A)
+ A.obj_integrity = A.max_integrity * 0.5
+ else if(emagged)
+ if(user)
+ user << "You discard the damaged electronics."
+ else
+ if(user)
+ user << "You remove the airlock electronics."
+
+ var/obj/item/weapon/electronics/airlock/ae
+ if(!electronics)
+ ae = new/obj/item/weapon/electronics/airlock( src.loc )
+ if(req_one_access)
+ ae.one_access = 1
+ ae.accesses = src.req_one_access
+ else
+ ae.accesses = src.req_access
+ else
+ ae = electronics
+ electronics = null
+ ae.loc = src.loc
+ qdel(src)
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 8ad89e2f465..737386b9e19 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -4,10 +4,14 @@
/obj/machinery/door/airlock/command
icon = 'icons/obj/doors/airlocks/station/command.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_com
+ obj_integrity = 450
+ max_integrity = 450
/obj/machinery/door/airlock/security
icon = 'icons/obj/doors/airlocks/station/security.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_sec
+ obj_integrity = 450
+ max_integrity = 450
/obj/machinery/door/airlock/engineering
icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
@@ -21,6 +25,8 @@
name = "maintenance access"
icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_mai
+ obj_integrity = 250
+ max_integrity = 250
/obj/machinery/door/airlock/mining
name = "mining airlock"
@@ -59,6 +65,8 @@
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_com/glass
glass = 1
+ obj_integrity = 400
+ max_integrity = 400
/obj/machinery/door/airlock/glass_engineering
icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
@@ -71,6 +79,8 @@
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_sec/glass
glass = 1
+ obj_integrity = 400
+ max_integrity = 400
/obj/machinery/door/airlock/glass_medical
icon = 'icons/obj/doors/airlocks/station/medical.dmi'
@@ -136,6 +146,8 @@
icon = 'icons/obj/doors/airlocks/station/diamond.dmi'
var/mineral = "diamond"
assemblytype = /obj/structure/door_assembly/door_assembly_diamond
+ obj_integrity = 1000
+ max_integrity = 1000
/obj/machinery/door/airlock/uranium
name = "uranium airlock"
@@ -241,6 +253,8 @@
overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi'
opacity = 1
assemblytype = /obj/structure/door_assembly/door_assembly_centcom
+ obj_integrity = 1000
+ max_integrity = 1000
//////////////////////////////////
/*
@@ -254,6 +268,8 @@
opacity = 1
assemblytype = /obj/structure/door_assembly/door_assembly_vault
explosion_block = 2
+ obj_integrity = 600
+ max_integrity = 600
//////////////////////////////////
/*
@@ -285,6 +301,8 @@
overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_highsecurity
explosion_block = 2
+ obj_integrity = 500
+ max_integrity = 500
//////////////////////////////////
/*
@@ -307,6 +325,8 @@
explosion_block = 3
hackProof = 1
aiControlDisabled = 1
+ obj_integrity = 700
+ max_integrity = 700
//////////////////////////////////
/*
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index a7b193653d7..9bb28c1175a 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -8,8 +8,9 @@
density = 1
layer = OPEN_DOOR_LAYER
power_channel = ENVIRON
-
- armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 100, acid = 0)
+ obj_integrity = 350
+ max_integrity = 350
+ armor = list(melee = 30, bullet = 30, laser = 20, energy = 20, bomb = 10, bio = 100, rad = 100, fire = 80, acid = 70)
var/secondsElectrified = 0
var/shockedby = list()
@@ -27,6 +28,7 @@
var/locked = 0 //whether the door is bolted or not.
var/assemblytype //the type of door frame to drop during deconstruction
var/auto_close //TO BE REMOVED, no longer used, it's just preventing a runtime with a map var edit.
+ var/datum/effect_system/spark_spread/spark_system
/obj/machinery/door/New()
..()
@@ -37,7 +39,9 @@
update_freelook_sight()
air_update_turf(1)
airlocks += src
- return
+ spark_system = new /datum/effect_system/spark_spread
+ spark_system.set_up(2, 1, src)
+
/obj/machinery/door/Destroy()
@@ -45,6 +49,9 @@
air_update_turf(1)
update_freelook_sight()
airlocks -= src
+ if(spark_system)
+ qdel(spark_system)
+ spark_system = null
return ..()
//process()
@@ -109,28 +116,6 @@
/obj/machinery/door/attack_ai(mob/user)
return src.attack_hand(user)
-
-/obj/machinery/door/attack_paw(mob/user)
- if(user.a_intent != "harm")
- return src.attack_hand(user)
- else
- attack_generic(user, 5)
-
-/obj/machinery/door/proc/attack_generic(mob/user, damage = 0, damage_type = BRUTE)
- if(operating)
- return
- user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
- user.visible_message("[user] smashes against the [src.name]!", \
- "You smash against the [src.name]!")
- take_damage(damage, damage_type)
-
-/obj/machinery/door/attack_slime(mob/living/simple_animal/slime/S)
- if(!S.is_adult)
- attack_generic(S, 0)
- else
- attack_generic(S, 25)
-
/obj/machinery/door/attack_hand(mob/user)
return try_to_activate_door(user)
@@ -174,22 +159,28 @@ obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user)
else
return ..()
-/obj/machinery/door/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/door/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 10)
+ return 0
+ . = ..()
+
+/obj/machinery/door/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
+ . = ..()
+ if(. && obj_integrity > 0)
+ if(damage_amount >= 10 && prob(30))
+ spark_system.start()
+
+/obj/machinery/door/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- if(glass)
- playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
- else
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
+ if(glass)
+ playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
+ else if(damage_amount)
+ playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
+ else
+ playsound(src, 'sound/weapons/tap.ogg', 50, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
-
-
-/obj/machinery/door/blob_act(obj/structure/blob/B)
- if(prob(60))
- qdel(src)
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
/obj/machinery/door/emp_act(severity)
if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) )
@@ -204,15 +195,6 @@ obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user)
/obj/machinery/door/proc/unelectrify()
secondsElectrified = 0
-/obj/machinery/door/ex_act(severity, target)
- if(severity == 3)
- if(prob(80))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, src)
- s.start()
- return
- ..()
-
/obj/machinery/door/update_icon()
if(density)
icon_state = "door1"
@@ -353,3 +335,4 @@ obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user)
/obj/machinery/door/proc/disable_lockdown()
if(!stat) //Opens only powered doors.
open() //Open everything!
+
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 89e61042920..499050f431f 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -14,12 +14,16 @@
icon_state = "door_open"
opacity = 0
density = 0
+ obj_integrity = 300
+ max_integrity = 300
heat_proof = 1
glass = 1
var/nextstate = null
sub_door = 1
closingLayer = CLOSED_FIREDOOR_LAYER
assemblytype = /obj/structure/firelock_frame
+ armor = list(melee = 30, bullet = 30, laser = 20, energy = 20, bomb = 10, bio = 100, rad = 100, fire = 95, acid = 70)
+
/obj/machinery/door/firedoor/Bumped(atom/AM)
if(panel_open || operating)
@@ -52,10 +56,7 @@
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("[user] unfastens [src]'s bolts.", \
"You undo [src]'s floor bolts.")
- var/obj/structure/firelock_frame/F = new assemblytype(get_turf(src))
- F.constructionStep = CONSTRUCTION_PANEL_OPEN
- F.update_icon()
- qdel(src)
+ deconstruct(TRUE)
return
if(istype(C, /obj/item/weapon/screwdriver))
@@ -123,6 +124,18 @@
. = ..()
latetoggle()
+/obj/machinery/door/firedoor/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ var/obj/structure/firelock_frame/F = new assemblytype(get_turf(src))
+ if(disassembled)
+ F.constructionStep = CONSTRUCTION_PANEL_OPEN
+ else
+ F.constructionStep = CONSTRUCTION_WIRES_EXPOSED
+ F.obj_integrity = F.max_integrity * 0.5
+ F.update_icon()
+ qdel(src)
+
+
/obj/machinery/door/firedoor/proc/latetoggle()
if(operating || stat & NOPOWER || !nextstate)
return
@@ -160,12 +173,14 @@
else
return 1
-
/obj/machinery/door/firedoor/heavy
name = "heavy firelock"
icon = 'icons/obj/doors/Doorfire.dmi'
glass = 0
assemblytype = /obj/structure/firelock_frame/heavy
+ obj_integrity = 550
+ max_integrity = 550
+
/obj/item/weapon/electronics/firelock
name = "firelock circuitry"
@@ -217,7 +232,7 @@
return
if(istype(C, /obj/item/weapon/wrench))
if(locate(/obj/machinery/door/firedoor) in get_turf(src))
- user << "There's already a firlock there."
+ user << "There's already a firelock there."
return
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
user.visible_message("[user] starts bolting down [src]...", \
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index f259e2c5cdb..e6c83a4307a 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -8,6 +8,10 @@
explosion_block = 3
heat_proof = 1
safe = 0
+ obj_integrity = 600
+ max_integrity = 600
+ armor = list(melee = 50, bullet = 100, laser = 100, energy = 100, bomb = 50, bio = 100, rad = 100, fire = 100, acid = 70)
+ resistance_flags = FIRE_PROOF
/obj/machinery/door/poddoor/preopen
icon_state = "open"
@@ -36,30 +40,14 @@
//"BLAST" doors are obviously stronger than regular doors when it comes to BLASTS.
/obj/machinery/door/poddoor/ex_act(severity, target)
- if(target == src)
- qdel(src)
+ if(severity == 3)
return
- switch(severity)
- if(1)
- if(prob(80))
- qdel(src)
- else
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, src)
- s.start()
- if(2)
- if(prob(20))
- qdel(src)
- else
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, src)
- s.start()
+ ..()
- if(3)
- if(prob(80))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(2, 1, src)
- s.start()
+/obj/machinery/door/poddoor/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 70) //any melee attack below 70 dmg does nothing
+ return 0
+ . = ..()
/obj/machinery/door/poddoor/do_animate(animation)
switch(animation)
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 8b8e68e0d55..02cb9157938 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -3,9 +3,12 @@
desc = "A strong door."
icon = 'icons/obj/doors/windoor.dmi'
icon_state = "left"
+ resistance_flags = ACID_PROOF
var/base_state = "left"
- var/health = 150 //If you change this, consider changing ../door/window/brigdoor/ health at the bottom of this .dm file
- armor = list(melee = 20, bullet = 50, laser = 50, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 0, acid = 0)
+ obj_integrity = 150 //If you change this, consider changing ../door/window/brigdoor/ health at the bottom of this .dm file
+ max_integrity = 150
+ integrity_failure = 0
+ armor = list(melee = 20, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100, fire = 70, acid = 100)
visible = 0
flags = ON_BORDER
opacity = 0
@@ -34,7 +37,7 @@
density = 0
for(var/I in debris)
qdel(I)
- if(health == 0)
+ if(obj_integrity == 0)
playsound(src, "shatter", 70, 1)
electronics = null
return ..()
@@ -159,40 +162,22 @@
src.operating = 0
return 1
-/obj/machinery/door/window/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/door/window/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
+ playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- health = max(0, src.health - damage)
- if(health <= 0)
- shatter()
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
-/obj/machinery/door/window/proc/shatter()
- if(!(flags & NODECONSTRUCT))
+
+/obj/machinery/door/window/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT) && !disassembled)
for(var/obj/fragment in debris)
fragment.forceMove(get_turf(src))
transfer_fingerprints_to(fragment)
debris -= fragment
qdel(src)
-/obj/machinery/door/window/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(25))
- shatter()
- else
- take_damage(120, BRUTE, 0)
- if(3)
- take_damage(60, BRUTE, 0)
-
/obj/machinery/door/window/narsie_act()
color = "#7D1919"
@@ -200,27 +185,11 @@
new/obj/machinery/door/window/clockwork(src.loc, dir)
qdel(src)
-/obj/machinery/door/window/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(round(P.damage / 2), P.damage_type, 0)
-
/obj/machinery/door/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > T0C + (reinf ? 1600 : 800))
- take_damage(round(exposed_volume / 200), BURN, 0)
+ take_damage(round(exposed_volume / 200), BURN, 0, 0)
..()
-//When an object is thrown at the window
-/obj/machinery/door/window/hitby(atom/movable/AM)
- ..()
- var/tforce = 0
- if(ismob(AM))
- tforce = 40
- else if(isobj(AM))
- var/obj/O = AM
- tforce = O.throwforce
- take_damage(tforce)
-
-
/obj/machinery/door/window/attack_ai(mob/user)
return src.attack_hand(user)
@@ -319,20 +288,14 @@
if("deny")
flick("[src.base_state]deny", src)
-/obj/machinery/door/window/attack_hulk(mob/user)
- ..(user, 1)
- user.visible_message("[user] smashes through the windoor!", \
- "You tear through the windoor!")
- user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- take_damage(health)
-
/obj/machinery/door/window/brigdoor
name = "secure door"
icon_state = "leftsecure"
base_state = "leftsecure"
var/id = null
- health = 300 //Stronger doors for prison (regular window door health is 200)
+ obj_integrity = 300 //Stronger doors for prison (regular window door health is 200)
+ max_integrity = 300
reinf = 1
explosion_block = 1
@@ -362,7 +325,7 @@
return ..()
/obj/machinery/door/window/clockwork/ratvar_act()
- health = initial(health)
+ obj_integrity = max_integrity
/obj/machinery/door/window/clockwork/hasPower()
return TRUE //yup that's power all right
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
index 0934edccff7..7d57bb34aac 100644
--- a/code/game/machinery/droneDispenser.dm
+++ b/code/game/machinery/droneDispenser.dm
@@ -13,8 +13,9 @@
anchored = 1
density = 1
- var/health = 100
- var/max_health = 100
+ obj_integrity = 250
+ max_integrity = 250
+ integrity_failure = 80
// These allow for different icons when creating custom dispensers
var/icon_off = "off"
@@ -54,7 +55,7 @@
/obj/machinery/droneDispenser/New()
..()
- health = max_health
+ obj_integrity = max_integrity
materials = new(src, list(MAT_METAL, MAT_GLASS),
MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2)
@@ -157,9 +158,6 @@
..()
if((mode == DRONE_RECHARGING) && !stat && recharging_text)
user << "[recharging_text]"
- if(stat & BROKEN)
- user << "[src] is smoking and steadily buzzing. \
- It seems to be broken."
if(metal_cost)
user << "It has [materials.amount(MAT_METAL)] \
units of metal stored."
@@ -300,35 +298,26 @@
"You restore [src] to operation.")
stat &= ~BROKEN
- health = max_health
+ obj_integrity = max_integrity
update_icon()
else
return ..()
-/obj/machinery/droneDispenser/take_damage(damage, damage_type = BRUTE,
- sound_effect = TRUE)
- // But why would you hurt the dispenser?
- switch(damage_type)
- if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- else
- return
- health = max(health - damage, 0)
- if(!health && !(stat & BROKEN))
- if(break_message)
- audible_message("[src] \
- [break_message]")
- if(break_sound)
- playsound(src, break_sound, 50, 1)
- stat |= BROKEN
- update_icon()
+/obj/machinery/droneDispenser/obj_break(damage_flag)
+ if(!(flags & NODECONSTRUCT))
+ if(!(stat & BROKEN))
+ if(break_message)
+ audible_message("[src] \
+ [break_message]")
+ if(break_sound)
+ playsound(src, break_sound, 50, 1)
+ stat |= BROKEN
+ update_icon()
+
+/obj/machinery/droneDispenser/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 5)
+ qdel(src)
#undef DRONE_PRODUCTION
#undef DRONE_RECHARGING
diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm
index 867291018b7..9ed4ea26c3c 100644
--- a/code/game/machinery/embedded_controller/access_controller.dm
+++ b/code/game/machinery/embedded_controller/access_controller.dm
@@ -10,6 +10,7 @@
use_power = 1
idle_power_usage = 2
active_power_usage = 4
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/idSelf
/obj/machinery/doorButtons/attackby(obj/O, mob/user)
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 1d9ef9bd082..faf731632d8 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -15,13 +15,16 @@
icon = 'icons/obj/monitors.dmi'
icon_state = "fire0"
anchored = 1
+ obj_integrity = 250
+ max_integrity = 250
+ integrity_failure = 100
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100, fire = 90, acid = 30)
use_power = 1
idle_power_usage = 2
active_power_usage = 6
power_channel = ENVIRON
var/detecting = 1
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
- var/health = 50
/obj/machinery/firealarm/New(loc, dir, building)
@@ -40,7 +43,7 @@
update_icon()
/obj/machinery/firealarm/update_icon()
- src.overlays = list()
+ cut_overlays()
var/area/A = src.loc
A = A.loc
@@ -51,25 +54,23 @@
else
icon_state = "fire0"
- if(stat & NOPOWER)
- return
if(stat & BROKEN)
icon_state = "firex"
return
+ if(stat & NOPOWER)
+ return
+
add_overlay("overlay_[security_level]")
if(detecting)
add_overlay("overlay_[A.fire ? "fire" : "clear"]")
else
add_overlay("overlay_fire")
-/obj/machinery/firealarm/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type, 0)
-
/obj/machinery/firealarm/emp_act(severity)
if(prob(50 / severity))
alarm()
+ ..()
/obj/machinery/firealarm/emag_act(mob/user)
if(!emagged)
@@ -82,6 +83,7 @@
/obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume)
if(!emagged && detecting && !stat && temperature > T0C + 200)
alarm()
+ ..()
/obj/machinery/firealarm/proc/alarm()
if(!is_operational())
@@ -154,9 +156,7 @@
else if (istype(W, /obj/item/weapon/wirecutters))
buildstage = 1
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
- var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil()
- coil.amount = 5
- coil.loc = user.loc
+ new /obj/item/stack/cable_coil(user.loc, 5)
user << "You cut the wires from \the [src]."
update_icon()
return
@@ -204,26 +204,28 @@
return
return ..()
-/obj/machinery/firealarm/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- if(!(stat & BROKEN) && buildstage != 0) //can't break the electronics if there isn't any inside.
- health -= damage
- if(health <= 0)
- stat |= BROKEN
- update_icon()
- else if(prob(33))
- alarm()
+
+/obj/machinery/firealarm/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
+ . = ..()
+ if(.) //damage received
+ if(obj_integrity > 0 && !(stat & BROKEN) && buildstage != 0)
+ if(prob(33))
+ alarm()
+
+/obj/machinery/firealarm/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT) && buildstage != 0) //can't break the electronics if there isn't any inside.
+ stat |= BROKEN
+ update_icon()
+
+/obj/machinery/firealarm/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 1)
+ var/obj/item/I = new /obj/item/weapon/electronics/firealarm(loc)
+ if(!disassembled)
+ I.obj_integrity = I.max_integrity * 0.5
+ new /obj/item/stack/cable_coil(loc, 3)
+ qdel(src)
+
/*
* Party button
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 80ff532d236..99de5c77edc 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -11,6 +11,9 @@
var/last_flash = 0 //Don't want it getting spammed like regular flashes
var/strength = 5 //How weakened targets are when flashed.
var/base_state = "mflash"
+ obj_integrity = 250
+ max_integrity = 250
+ integrity_failure = 100
anchored = 1
/obj/machinery/flasher/portable //Portable version of the flasher. Only flashes when anchored
@@ -33,6 +36,9 @@
/obj/machinery/flasher/Destroy()
remove_from_proximity_list(src, range)
+ if(bulb)
+ qdel(bulb)
+ bulb = null
..()
/obj/machinery/flasher/Move()
@@ -47,7 +53,7 @@
else
icon_state = "[base_state]1"
else
- stat |= ~NOPOWER
+ stat |= NOPOWER
icon_state = "[base_state]1-p"
//Don't want to render prison breaks impossible
@@ -59,7 +65,7 @@
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
if(do_after(user, 30/W.toolspeed, target = src) && bulb)
user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb.")
- bulb.loc = src.loc
+ bulb.forceMove(loc)
bulb = null
power_change()
@@ -68,7 +74,7 @@
if(!user.drop_item())
return
user.visible_message("[user] installs [W] into [src].", "You install [W] into [src].")
- W.loc = src
+ W.forceMove(src)
bulb = W
power_change()
else
@@ -80,11 +86,7 @@
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
if(do_after(user, 40/W.toolspeed, target = src))
user << "You unsecure the flasher frame."
- var/obj/item/wallframe/flasher/F = new(get_turf(src))
- transfer_fingerprints_to(F)
- F.id = id
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
- qdel(src)
+ deconstruct(TRUE)
else
user << "Remove a flashbulb from [src] first!"
else
@@ -94,8 +96,11 @@
/obj/machinery/flasher/attack_ai()
if (anchored)
return flash()
- else
- return
+
+/obj/machinery/flasher/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 10) //any melee attack below 10 dmg does nothing
+ return 0
+ . = ..()
/obj/machinery/flasher/proc/flash()
if (!powered() || !bulb)
@@ -128,14 +133,34 @@
/obj/machinery/flasher/emp_act(severity)
- if(stat & (BROKEN|NOPOWER))
- ..(severity)
- return
- if(bulb && prob(75/severity))
- flash()
- bulb.burn_out()
- power_change()
- ..(severity)
+ if(!(stat & (BROKEN|NOPOWER)))
+ if(bulb && prob(75/severity))
+ flash()
+ bulb.burn_out()
+ power_change()
+ ..()
+
+/obj/machinery/flasher/obj_break(damage_flag)
+ if(!(flags & NODECONSTRUCT))
+ if(!(stat & BROKEN))
+ stat |= BROKEN
+ if(bulb)
+ bulb.burn_out()
+ power_change()
+
+/obj/machinery/flasher/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(bulb)
+ bulb.forceMove(loc)
+ bulb = null
+ if(disassembled)
+ var/obj/item/wallframe/flasher/F = new(get_turf(src))
+ transfer_fingerprints_to(F)
+ F.id = id
+ playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ else
+ new /obj/item/stack/sheet/metal (loc, 2)
+ qdel(src)
/obj/machinery/flasher/portable/HasProximity(atom/movable/AM)
if (last_flash && world.time < last_flash + 150)
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index aa6500e9b37..6545d93f90b 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -39,6 +39,9 @@ var/const/HOLOPAD_MODE = RANGE_BASED
flags = HEAR
languages_spoken = ROBOT | HUMAN
languages_understood = ROBOT | HUMAN
+ obj_integrity = 300
+ max_integrity = 300
+ armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0)
var/list/masters = list()//List of AIs that use the holopad
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 36034138b6f..2f0cf01823e 100644
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -9,6 +9,10 @@
use_power = 1
idle_power_usage = 2
active_power_usage = 4
+ obj_integrity = 300
+ max_integrity = 300
+ armor = list(melee = 50, bullet = 30, laser = 70, energy = 50, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 70)
+ resistance_flags = FIRE_PROOF
/obj/machinery/igniter/attack_ai(mob/user)
return src.attack_hand(user)
@@ -118,8 +122,6 @@
return 1
/obj/machinery/sparker/emp_act(severity)
- if(stat & (BROKEN|NOPOWER))
- ..(severity)
- return
- ignite()
- ..(severity)
\ No newline at end of file
+ if(!(stat & (BROKEN|NOPOWER)))
+ ignite()
+ ..()
\ No newline at end of file
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 51be5c91094..ccc199e0f3e 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -95,6 +95,10 @@
else
return ..()
+/obj/machinery/iv_drip/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc)
+ qdel(src)
/obj/machinery/iv_drip/process()
if(!attached)
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index 2383172069b..4fdd4377a99 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -69,8 +69,6 @@
updateicon()
/obj/machinery/light_switch/emp_act(severity)
- if(stat & (BROKEN|NOPOWER))
- ..(severity)
- return
- power_change()
- ..(severity)
\ No newline at end of file
+ if(!(stat & (BROKEN|NOPOWER)))
+ power_change()
+ ..()
\ No newline at end of file
diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm
index 45b975a89e7..112b8f028cc 100644
--- a/code/game/machinery/limbgrower.dm
+++ b/code/game/machinery/limbgrower.dm
@@ -71,6 +71,7 @@
/obj/machinery/limbgrower/on_deconstruction()
for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
reagents.trans_to(G, G.reagents.maximum_volume)
+ ..()
/obj/machinery/limbgrower/attackby(obj/item/O, mob/user, params)
if (busy)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index d9e78c96da8..ce2ac895743 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -99,6 +99,10 @@ Class Procs:
verb_say = "beeps"
verb_yell = "blares"
pressure_resistance = 15
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
+
var/stat = 0
var/emagged = 0
var/use_power = 1
@@ -149,9 +153,8 @@ Class Procs:
return PROCESS_KILL
/obj/machinery/emp_act(severity)
- if(use_power && stat == 0)
+ if(use_power && !stat)
use_power(7500/severity)
-
PoolOrNew(/obj/effect/overlay/temp/emp, loc)
..()
@@ -166,12 +169,12 @@ Class Procs:
/obj/machinery/proc/dropContents()
var/turf/T = get_turf(src)
for(var/mob/living/L in src)
- L.loc = T
- L.reset_perspective(null)
+ L.forceMove(T)
L.update_canmove() //so the mob falls if he became unconscious inside the machine.
. += L
- T.contents += contents
+ for(var/atom/movable/A in contents)
+ A.forceMove(T)
occupant = null
/obj/machinery/proc/close_machine(mob/living/target = null)
@@ -189,10 +192,6 @@ Class Procs:
updateUsrDialog()
update_icon()
-/obj/machinery/blob_act(obj/structure/blob/B)
- if(density && prob(75))
- qdel(src)
-
/obj/machinery/proc/auto_use_power()
if(!powered(power_channel))
return 0
@@ -240,48 +239,6 @@ Class Procs:
////////////////////////////////////////////////////////////////////////////////////////////
-/obj/machinery/mech_melee_attack(obj/mecha/M)
- M.do_attack_animation(src)
- if(M.damtype == BRUTE || M.damtype == BURN)
- visible_message("[M.name] has hit [src].")
- take_damage(M.force*2, M.damtype) // multiplied by 2 so we can hit machines hard but not be overpowered against mobs.
- return 1
- return 0
-
-/obj/machinery/attacked_by(obj/item/I, mob/living/user)
- ..()
- take_damage(I.force, I.damtype, 1)
-
-/obj/machinery/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
-
-/obj/machinery/attack_alien(mob/living/carbon/alien/humanoid/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- add_hiddenprint(user)
- visible_message("\The [user] slashes at [src]!")
- playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
- take_damage(20, BRUTE, 0)
-
-/obj/machinery/attack_animal(mob/living/simple_animal/M)
- M.changeNext_move(CLICK_CD_MELEE)
- M.do_attack_animation(src)
- if(M.melee_damage_upper || M.obj_damage)
- M.visible_message("[M.name] smashes against \the [src.name].",\
- "You smash against the [src.name].")
- if(M.obj_damage)
- take_damage(M.obj_damage, M.melee_damage_type, 1)
- else
- take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1)
/obj/machinery/attack_paw(mob/living/user)
@@ -292,7 +249,7 @@ Class Procs:
user.do_attack_animation(src)
user.visible_message("[user.name] smashes against \the [src.name] with its paws.",\
"You smash against the [src.name] with your paws.")
- take_damage(4, BRUTE, 1)
+ take_damage(4, BRUTE, "melee", 1)
/obj/machinery/attack_ai(mob/user)
@@ -344,18 +301,27 @@ Class Procs:
. = istype(C) && (panel_open || ignore_panel) && !(flags & NODECONSTRUCT)
if(.)
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
- deconstruct()
+ deconstruct(TRUE)
-/obj/machinery/proc/deconstruct()
- on_deconstruction()
- var/obj/structure/frame/machine/M = new /obj/structure/frame/machine(loc)
- transfer_fingerprints_to(M)
- M.state = 2
- M.icon_state = "box_1"
- for(var/obj/item/I in component_parts)
- I.forceMove(loc)
+/obj/machinery/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ on_deconstruction()
+ if(component_parts && component_parts.len)
+ var/obj/structure/frame/machine/M = new /obj/structure/frame/machine(loc)
+ M.anchored = anchored
+ if(!disassembled)
+ M.obj_integrity = M.max_integrity * 0.5 //the frame is already half broken
+ transfer_fingerprints_to(M)
+ M.state = 2
+ M.icon_state = "box_1"
+ for(var/obj/item/I in component_parts)
+ I.forceMove(loc)
qdel(src)
+/obj/machinery/obj_break(damage_flag)
+ if(!(flags & NODECONSTRUCT))
+ stat |= BROKEN
+
/obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/weapon/screwdriver/S)
if(istype(S) && !(flags & NODECONSTRUCT))
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
@@ -432,6 +398,21 @@ Class Procs:
/obj/machinery/examine(mob/user)
..()
+ if(stat & BROKEN)
+ user << "It looks broken and non functional."
+ if(!(resistance_flags & INDESTRUCTIBLE))
+ if(resistance_flags & ON_FIRE)
+ user << "It's on fire!"
+ var/healthpercent = (obj_integrity/max_integrity) * 100
+ switch(healthpercent)
+ if(100 to INFINITY)
+ user << "It seems pristine and undamaged."
+ if(50 to 100)
+ user << "It looks slightly damaged."
+ if(25 to 50)
+ user << "It appears heavily damaged."
+ if(0 to 25)
+ user << "It's falling apart!"
if(user.research_scanner && component_parts)
display_parts(user)
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index 9b644c909bc..3f8a3c35251 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -10,6 +10,9 @@
level = 1 // underfloor
layer = LOW_OBJ_LAYER
anchored = 1
+ obj_integrity = 500
+ max_integrity = 500
+ armor = list(melee = 70, bullet = 70, laser = 70, energy = 70, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80)
var/open = 0 // true if cover is open
var/locked = 1 // true if controls are locked
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 43dea27aad0..f75846cd36d 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -175,7 +175,10 @@ var/list/obj/machinery/newscaster/allCasters = list()
verb_say = "beeps"
verb_ask = "beeps"
verb_exclaim = "beeps"
- armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
+ obj_integrity = 200
+ max_integrity = 200
+ integrity_failure = 50
var/screen = 0
var/paper_remaining = 15
var/securityCaster = 0
@@ -187,12 +190,10 @@ var/list/obj/machinery/newscaster/allCasters = list()
var/obj/item/weapon/photo/photo = null
var/channel_name = ""
var/c_locked=0
- var/health = 60
var/datum/newscaster/feed_channel/viewing_channel = null
var/allow_comments = 1
luminosity = 0
anchored = 1
- var/hitstaken = 0 //TO BE REMOVED, no longer used, the var is present in a map var edit which must be removed.
/obj/machinery/newscaster/security_unit
name = "security newscaster"
@@ -227,12 +228,13 @@ var/list/obj/machinery/newscaster/allCasters = list()
icon_state = "newscaster_normal"
if(alert)
add_overlay("newscaster_alert")
- switch(health)
- if(45 to 60)
+ var/hp_percent = obj_integrity * 100 /max_integrity
+ switch(hp_percent)
+ if(75 to 100)
return
- if(30 to 45)
+ if(50 to 75)
add_overlay("crack1")
- if(15 to 30)
+ if(25 to 50)
add_overlay("crack2")
else
add_overlay("crack3")
@@ -249,17 +251,9 @@ var/list/obj/machinery/newscaster/allCasters = list()
stat |= NOPOWER
update_icon()
-/obj/machinery/newscaster/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(50))
- qdel(src)
- else
- take_damage(rand(40,80), BRUTE, 0)
- else
- take_damage(rand(20,40), BRUTE, 0)
+/obj/machinery/newscaster/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
+ . = ..()
+ update_icon()
/obj/machinery/newscaster/attack_ai(mob/user)
return attack_hand(user)
@@ -747,6 +741,7 @@ var/list/obj/machinery/newscaster/allCasters = list()
return
user << "You repair [src]."
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ obj_integrity = max_integrity
stat &= ~BROKEN
update_icon()
else
@@ -754,26 +749,28 @@ var/list/obj/machinery/newscaster/allCasters = list()
else
return ..()
-/obj/machinery/newscaster/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/newscaster/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- if(stat & BROKEN)
- playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1)
- else
- playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
+ if(stat & BROKEN)
+ playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1)
+ else
+ playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- if(damage < 15) //so it can't be broken with a small weapon.
- return
- if(!(stat & BROKEN))
- health -= damage
- if(health <= 0)
- stat |= BROKEN
- playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+
+
+/obj/machinery/newscaster/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 2)
+ new /obj/item/weapon/shard(loc)
+ new /obj/item/weapon/shard(loc)
+ qdel(src)
+
+/obj/machinery/newscaster/obj_break()
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
+ stat |= BROKEN
+ playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
update_icon()
@@ -781,7 +778,7 @@ var/list/obj/machinery/newscaster/allCasters = list()
if(user.a_intent != "harm")
user << "The newscaster controls are far too complicated for your tiny brain!"
else
- take_damage(5)
+ take_damage(5, BRUTE, "melee")
/obj/machinery/newscaster/proc/AttachPhoto(mob/user)
if(photo)
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index b4b048ae15c..def17a8198c 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -24,8 +24,10 @@
var/lasercolor = "" //Something to do with lasertag turrets, blame Sieve for not adding a comment.
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
- armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ obj_integrity = 160 //the turret's health
+ max_integrity = 160
+ integrity_failure = 80
+ armor = list(melee = 50, bullet = 30, laser = 30, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 90, acid = 90)
var/locked = 1 //if the turret's behaviour control access is locked
var/controllock = 0 //if the turret responds to control panels
@@ -159,8 +161,9 @@
/obj/machinery/porta_turret/Destroy()
//deletes its own cover with it
- qdel(cover)
- cover = null
+ if(cover)
+ qdel(cover)
+ cover = null
return ..()
@@ -317,12 +320,6 @@
else
return ..()
-/obj/machinery/porta_turret/attacked_by(obj/item/I, mob/user)
- if(I.force)
- user.visible_message("[user] has hit [src] with [I]!", "You hit [src] with [I]!")
- take_damage(I.force * 0.5, I.damtype)
-
-
/obj/machinery/porta_turret/emag_act(mob/user)
if(!emagged)
user << "You short out [src]'s threat assessment circuits."
@@ -336,7 +333,6 @@
/obj/machinery/porta_turret/bullet_act(obj/item/projectile/P)
. = ..()
- take_damage(P.damage, P.damage_type, 0)
if(!disabled)
if(lasercolor == "b")
if(istype(P, /obj/item/projectile/beam/lasertag/redtag))
@@ -366,55 +362,26 @@
..()
-/obj/machinery/porta_turret/ex_act(severity, target)
- if(severity >= 3) //turret dies if an explosion touches it!
- die()
- else
- qdel(src)
+/obj/machinery/porta_turret/take_damage(damage, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
+ . = ..()
+ if(.) //damage received
+ if(prob(30))
+ spark_system.start()
+ if(on && !attacked && !emagged)
+ attacked = 1
+ spawn(60)
+ attacked = 0
-/obj/machinery/porta_turret/attack_animal(mob/living/simple_animal/user)
- user.changeNext_move(CLICK_CD_MELEE)
- if(user.melee_damage_upper == 0)
- user.emote("[user.friendly] [src]")
- else
- user.do_attack_animation(src)
- var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
- take_damage(damage)
+/obj/machinery/porta_turret/deconstruct(disassembled = TRUE)
+ qdel(src)
-/obj/machinery/porta_turret/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- if(sound_effect)
- playsound(loc, 'sound/items/Welder.ogg', 40, 1)
- else
- return
- if(!(stat & BROKEN))
- if(damage > 1) //if the force of impact dealt at least 1 damage, the turret gets pissed off
- if(prob(30))
- spark_system.start()
- if(on && !attacked && !emagged)
- attacked = 1
- spawn(60)
- attacked = 0
- health -= damage
- if(health <= 0)
- die()
-
-/obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0
- health = 0
- density = 0
- stat |= BROKEN //enables the BROKEN bit
- icon_state = "[base_icon_state]Broken"
- invisibility = 0
- spark_system.start() //creates some sparks because they look cool
- density = 1
- qdel(cover) //deletes the cover - no need on keeping it there!
+/obj/machinery/porta_turret/obj_break(damage_flag)
+ if(!(flags & NODECONSTRUCT) && !(stat & BROKEN))
+ stat |= BROKEN //enables the BROKEN bit
+ icon_state = "[base_icon_state]Broken"
+ invisibility = 0
+ spark_system.start() //creates some sparks because they look cool
+ qdel(cover) //deletes the cover - no need on keeping it there!
@@ -676,7 +643,7 @@
return 10 //Syndicate turrets shoot everything not in their faction
/obj/machinery/porta_turret/syndicate/pod
- health = 40
+ obj_integrity = 40
projectile = /obj/item/projectile/bullet/weakbullet3
eprojectile = /obj/item/projectile/bullet/weakbullet3
@@ -704,6 +671,7 @@
var/ailock = 0 // AI cannot use this
req_access = list(access_ai_upload)
var/list/obj/machinery/porta_turret/turrets = list()
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/machinery/turretid/New(loc, ndir = 0, built = 0)
..()
diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm
index bb399096382..5e2a860da13 100644
--- a/code/game/machinery/porta_turret/portable_turret_cover.dm
+++ b/code/game/machinery/porta_turret/portable_turret_cover.dm
@@ -10,9 +10,18 @@
anchored = 1
layer = HIGH_OBJ_LAYER
density = 0
+ obj_integrity = 80
+ max_integrity = 80
var/obj/machinery/porta_turret/parent_turret = null
+/obj/machinery/porta_turret_cover/Destroy()
+ if(parent_turret)
+ parent_turret.cover = null
+ parent_turret.invisibility = 0
+ parent_turret = null
+ return ..()
+
//The below code is pretty much just recoded from the initial turret object. It's necessary but uncommented because it's exactly the same!
//>necessary
//I'm not fixing it because i'm fucking bored of this code already, but someone should just reroute these to the parent turret's procs.
@@ -67,6 +76,15 @@
/obj/machinery/porta_turret_cover/attacked_by(obj/item/I, mob/user)
parent_turret.attacked_by(I, user)
+/obj/machinery/porta_turret_cover/attack_alien(mob/living/carbon/alien/humanoid/user)
+ parent_turret.attack_alien(user)
+
+/obj/machinery/porta_turret_cover/attack_animal(mob/living/simple_animal/user)
+ parent_turret.attack_animal(user)
+
+/obj/machinery/porta_turret_cover/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
+ parent_turret.attack_hulk(user)
+
/obj/machinery/porta_turret_cover/can_be_overridden()
. = 0
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 5254b3b511f..2067cce19f8 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -148,20 +148,17 @@
update_icon()
/obj/machinery/recharger/emp_act(severity)
- if(stat & (NOPOWER|BROKEN) || !anchored)
- ..(severity)
- return
+ if(!(stat & (NOPOWER|BROKEN)) && anchored)
+ if(istype(charging, /obj/item/weapon/gun/energy))
+ var/obj/item/weapon/gun/energy/E = charging
+ if(E.power_supply)
+ E.power_supply.emp_act(severity)
- if(istype(charging, /obj/item/weapon/gun/energy))
- var/obj/item/weapon/gun/energy/E = charging
- if(E.power_supply)
- E.power_supply.emp_act(severity)
-
- else if(istype(charging, /obj/item/weapon/melee/baton))
- var/obj/item/weapon/melee/baton/B = charging
- if(B.bcell)
- B.bcell.charge = 0
- ..(severity)
+ else if(istype(charging, /obj/item/weapon/melee/baton))
+ var/obj/item/weapon/melee/baton/B = charging
+ if(B.bcell)
+ B.bcell.charge = 0
+ ..()
/obj/machinery/recharger/update_icon(using_power = 0) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 32c60b66759..f0bdd30586d 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -53,16 +53,9 @@
open_machine()
/obj/machinery/recharge_station/emp_act(severity)
- if(stat & (BROKEN|NOPOWER))
- ..(severity)
- return
- if(occupant)
- occupant.emp_act(severity)
- open_machine()
- ..(severity)
-
-/obj/machinery/recharge_station/ex_act(severity, target)
- if(occupant)
+ if(!(stat & (BROKEN|NOPOWER)))
+ if(occupant)
+ occupant.emp_act(severity)
open_machine()
..()
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index aa169ff97b6..dd75a88c0b2 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -57,6 +57,9 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/obj/item/device/radio/Radio
var/emergency //If an emergency has been called by this device. Acts as both a cooldown and lets the responder know where it the emergency was triggered from
luminosity = 0
+ obj_integrity = 300
+ max_integrity = 300
+ armor = list(melee = 70, bullet = 30, laser = 30, energy = 30, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 90)
/obj/machinery/requests_console/power_change()
..()
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 39030726ac2..036959b4ec9 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -1,110 +1,95 @@
-/obj/machinery/shield
- name = "emergency energy shield"
- desc = "An energy shield used to contain hull breaches."
- icon = 'icons/effects/effects.dmi'
- icon_state = "shield-old"
- density = 1
- opacity = 0
- anchored = 1
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
- var/const/max_health = 200
- var/health = max_health //The shield can only take so much beating (prevents perma-prisons)
+/obj/structure/emergency_shield
+ name = "emergency energy shield"
+ desc = "An energy shield used to contain hull breaches."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "shield-old"
+ density = 1
+ opacity = 0
+ anchored = 1
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ max_integrity = 200
+ obj_integrity = 200 //The shield can only take so much beating (prevents perma-prisons)
-/obj/machinery/shield/New()
+/obj/structure/emergency_shield/New()
src.setDir(pick(1,2,3,4))
..()
air_update_turf(1)
-/obj/machinery/shield/Destroy()
+/obj/structure/emergency_shield/Destroy()
opacity = 0
density = 0
air_update_turf(1)
return ..()
-/obj/machinery/shield/Move()
+/obj/structure/emergency_shield/Move()
var/turf/T = loc
..()
move_update_air(T)
-/obj/machinery/shield/CanPass(atom/movable/mover, turf/target, height)
+/obj/structure/emergency_shield/CanPass(atom/movable/mover, turf/target, height)
if(!height) return 0
else return ..()
-/obj/machinery/shield/CanAtmosPass(turf/T)
+/obj/structure/emergency_shield/CanAtmosPass(turf/T)
return !density
-/obj/machinery/shield/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type)
-
-/obj/machinery/shield/ex_act(severity, target)
- switch(severity)
- if(1)
- take_damage(rand(180,260), BRUTE, 0)
- if(2)
- take_damage(rand(150,230), BRUTE, 0)
- if(3)
- take_damage(rand(80,150), BRUTE, 0)
-
-/obj/machinery/shield/emp_act(severity)
+/obj/structure/emergency_shield/emp_act(severity)
switch(severity)
if(1)
qdel(src)
if(2)
- take_damage(50, BRUTE, 0)
+ take_damage(50, BRUTE, "energy", 0)
-/obj/machinery/shield/blob_act(obj/structure/blob/B)
- qdel(src)
-
-
-/obj/machinery/shield/hitby(AM as mob|obj)
- var/tforce = 0
- if(ismob(AM))
- tforce = 40
- else
- var/obj/O = AM
- tforce = O.throwforce
- ..()
- take_damage(tforce)
-
-/obj/machinery/shield/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/structure/emergency_shield/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BURN)
- if(sound_effect)
- playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1)
+ playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1)
if(BRUTE)
- if(sound_effect)
- playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1)
- else
- return
- opacity = 1
- spawn(20)
- opacity = 0
- health -= damage
- if(health <= 0)
- qdel(src)
+ playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1)
+
+/obj/structure/emergency_shield/take_damage(damage, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
+ . = ..()
+ if(.) //damage was dealt
+ opacity = 1
+ spawn(20)
+ opacity = 0
+
+/obj/structure/emergency_shield/sanguine
+ name = "sanguine barrier"
+ desc = "A potent shield summoned by cultists to defend their rites."
+ icon_state = "shield-red"
+ obj_integrity = 60
+ max_integrity = 60
+
+/obj/structure/emergency_shield/invoker
+ name = "Invoker's Shield"
+ desc = "A weak shield summoned by cultists to protect them while they carry out delicate rituals"
+ color = "red"
+ obj_integrity = 20
+ max_integrity = 20
+ mouse_opacity = 0
/obj/machinery/shieldgen
- name = "anti-breach shielding projector"
- desc = "Used to seal minor hull breaches."
- icon = 'icons/obj/objects.dmi'
- icon_state = "shieldoff"
- density = 1
- opacity = 0
- anchored = 0
- pressure_resistance = 2*ONE_ATMOSPHERE
- req_access = list(access_engine)
- var/const/max_health = 100
- var/health = max_health
- var/active = 0
- var/list/deployed_shields = list()
- var/locked = 0
- var/shield_range = 4
+ name = "anti-breach shielding projector"
+ desc = "Used to seal minor hull breaches."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "shieldoff"
+ density = 1
+ opacity = 0
+ anchored = 0
+ pressure_resistance = 2*ONE_ATMOSPHERE
+ req_access = list(access_engine)
+ max_integrity = 100
+ obj_integrity = 100
+ var/active = 0
+ var/list/deployed_shields = list()
+ var/locked = 0
+ var/shield_range = 4
/obj/machinery/shieldgen/Destroy()
- for(var/obj/machinery/shield/shield_tile in deployed_shields)
- qdel(shield_tile)
- deployed_shields = null
+ for(var/obj/structure/emergency_shield/ES in deployed_shields)
+ qdel(ES)
+ deployed_shields = list()
return ..()
@@ -116,9 +101,9 @@
update_icon()
for(var/turf/target_tile in range(shield_range, src))
- if(isspaceturf(target_tile) && !(locate(/obj/machinery/shield) in target_tile))
+ if(isspaceturf(target_tile) && !(locate(/obj/structure/emergency_shield) in target_tile))
if(!(stat & BROKEN) || prob(33))
- deployed_shields += new /obj/machinery/shield(target_tile)
+ deployed_shields += new /obj/structure/emergency_shield(target_tile)
/obj/machinery/shieldgen/proc/shields_down()
if(!active)
@@ -127,8 +112,8 @@
active = 0
update_icon()
- for(var/obj/machinery/shield/shield_tile in deployed_shields)
- qdel(shield_tile)
+ for(var/obj/structure/emergency_shield/ES in deployed_shields)
+ qdel(ES)
deployed_shields.Cut()
/obj/machinery/shieldgen/process()
@@ -137,45 +122,12 @@
qdel(pick(deployed_shields))
-/obj/machinery/shieldgen/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- if(sound_effect)
- playsound(loc, 'sound/items/Welder.ogg', 40, 1)
- else
- return
- health = max(health - damage, 0)
- if(health <= 0 && !(stat && BROKEN))
- stat |= BROKEN
- update_icon()
-
-/obj/machinery/shieldgen/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(33))
- qdel(src)
- else
- take_damage(rand(80,120), BRUTE, 0)
- if(3)
- take_damage(rand(40,80), BRUTE, 0)
-
-/obj/machinery/shieldgen/emp_act(severity)
- switch(severity)
- if(1)
- health = 0
+/obj/machinery/shieldgen/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(!(stat && BROKEN))
stat |= BROKEN
locked = pick(0,1)
update_icon()
- if(2)
- take_damage(rand(80,120), BRUTE, 0)
/obj/machinery/shieldgen/attack_hand(mob/user)
if(locked)
@@ -218,7 +170,7 @@
if(coil.get_amount() < 1)
return
coil.use(1)
- health = max_health
+ obj_integrity = max_integrity
stat &= ~BROKEN
user << "You repair \the [src]."
update_icon()
@@ -252,7 +204,7 @@
/obj/machinery/shieldgen/emag_act()
if(!(stat & BROKEN))
stat |= BROKEN
- health = 0
+ obj_integrity = 0
update_icon()
/obj/machinery/shieldgen/update_icon()
@@ -261,27 +213,36 @@
else
icon_state = (stat & BROKEN) ? "shieldoffbr":"shieldoff"
-////FIELD GEN START //shameless copypasta from fieldgen, powersink, and grille
+
+
+
+
+
+
+
+
#define maxstoredpower 500
/obj/machinery/shieldwallgen
- name = "shield generator"
- desc = "A shield generator."
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "Shield_Gen"
- anchored = 0
- density = 1
- req_access = list(access_teleporter)
- flags = CONDUCT
- use_power = 0
- var/active = 0
- var/power = 0
- var/steps = 0
- var/last_check = 0
- var/check_delay = 10
- var/recalc = 0
- var/locked = 1
- var/obj/structure/cable/attached // the attached cable
- var/storedpower = 0
+ name = "shield wall generator"
+ desc = "A shield generator."
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "Shield_Gen"
+ anchored = 0
+ density = 1
+ req_access = list(access_teleporter)
+ flags = CONDUCT
+ use_power = 0
+ obj_integrity = 300
+ max_integrity = 300
+ var/active = 0
+ var/power = 0
+ var/steps = 0
+ var/last_check = 0
+ var/check_delay = 10
+ var/recalc = 0
+ var/locked = 1
+ var/obj/structure/cable/attached // the attached cable
+ var/storedpower = 0
/obj/machinery/shieldwallgen/proc/power()
if(!anchored)
@@ -340,10 +301,8 @@
power()
if(power)
storedpower -= 50 //this way it can survive longer and survive at all
- if(storedpower >= maxstoredpower)
- storedpower = maxstoredpower
- if(storedpower <= 0)
- storedpower = 0
+ storedpower = Clamp(storedpower, 0, maxstoredpower)
+
if(active == 1)
if(!anchored)
@@ -464,29 +423,25 @@
cleanup(8)
return ..()
-/obj/machinery/shieldwallgen/bullet_act(obj/item/projectile/P)
- . = ..()
- storedpower -= P.damage
-
//////////////Containment Field START
/obj/machinery/shieldwall
- name = "shield"
- desc = "An energy shield."
- icon = 'icons/effects/effects.dmi'
- icon_state = "shieldwall"
- anchored = 1
- density = 1
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
- luminosity = 3
- var/needs_power = 0
- var/active = 1
- var/delay = 5
- var/last_active
- var/mob/U
- var/obj/machinery/shieldwallgen/gen_primary
- var/obj/machinery/shieldwallgen/gen_secondary
+ name = "shield wall"
+ desc = "An energy shield."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "shieldwall"
+ anchored = 1
+ density = 1
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ luminosity = 3
+ var/needs_power = 0
+ var/active = 1
+ var/delay = 5
+ var/last_active
+ var/mob/U
+ var/obj/machinery/shieldwallgen/gen_primary
+ var/obj/machinery/shieldwallgen/gen_secondary
/obj/machinery/shieldwall/New(var/obj/machinery/shieldwallgen/A, var/obj/machinery/shieldwallgen/B)
..()
@@ -517,43 +472,42 @@
else
gen_secondary.storedpower -=10
+/obj/machinery/shieldwall/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BURN)
+ playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1)
+ if(BRUTE)
+ playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1)
-/obj/machinery/shieldwall/bullet_act(obj/item/projectile/P)
+//the shield wall is immune to damage but it drains the stored power of the generators.
+/obj/machinery/shieldwall/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
. = ..()
+ if(damage_type == BRUTE || damage_type == BURN)
+ drain_power(damage_amount)
+
+/obj/machinery/shieldwall/proc/drain_power(drain_amount)
if(needs_power)
var/obj/machinery/shieldwallgen/G
if(prob(50))
G = gen_primary
else
G = gen_secondary
- G.storedpower -= P.damage
+ G.storedpower -= drain_amount
+
+/obj/machinery/shieldwall/bullet_act(obj/item/projectile/P)
+ . = ..()
+ drain_power(P.damage)
/obj/machinery/shieldwall/ex_act(severity, target)
if(needs_power)
- var/obj/machinery/shieldwallgen/G
+ var/drain_amount = 20
switch(severity)
- if(1) //big boom
- if(prob(50))
- G = gen_primary
- else
- G = gen_secondary
- G.storedpower -= 200
-
- if(2) //medium boom
- if(prob(50))
- G = gen_primary
- else
- G = gen_secondary
- G.storedpower -= 50
-
- if(3) //lil boom
- if(prob(50))
- G = gen_primary
- else
- G = gen_secondary
- G.storedpower -= 20
- return
+ if(1)
+ drain_amount = 200
+ if(2)
+ drain_amount = 50
+ drain_power(drain_amount)
/obj/machinery/shieldwall/CanPass(atom/movable/mover, turf/target, height=0)
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 988678b30ad..8c78d592598 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -10,6 +10,9 @@
icon_state = "sheater-off"
name = "space heater"
desc = "Made by Space Amish using traditional space techniques, this heater/cooler is guaranteed not to set the station on fire."
+ obj_integrity = 250
+ max_integrity = 250
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100, fire = 80, acid = 10)
var/obj/item/weapon/stock_parts/cell/cell
var/on = FALSE
var/mode = HEATER_MODE_STANDBY
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index a23ec04811d..e6e918aeebf 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -1,4 +1,4 @@
-// SUIT STORAGE UNIT /////////////////close_machine(
+// SUIT STORAGE UNIT /////////////////
/obj/machinery/suit_storage_unit
name = "suit storage unit"
desc = "An industrial unit made to hold space suits. It comes with a built-in UV cauterization mechanism. A small warning label advises that organic matter should not be placed into the unit."
@@ -6,6 +6,8 @@
icon_state = "close"
anchored = 1
density = 1
+ obj_integrity = 250
+ max_integrity = 250
var/obj/item/clothing/suit/space/suit = null
var/obj/item/clothing/head/helmet/space/helmet = null
@@ -112,6 +114,21 @@
storage = new storage_type(src)
update_icon()
+/obj/machinery/suit_storage_unit/Destroy()
+ if(suit)
+ qdel(suit)
+ suit = null
+ if(helmet)
+ qdel(helmet)
+ helmet = null
+ if(mask)
+ qdel(mask)
+ mask = null
+ if(storage)
+ qdel(storage)
+ storage = null
+ return ..()
+
/obj/machinery/suit_storage_unit/update_icon()
cut_overlays()
@@ -151,18 +168,12 @@
storage = null
occupant = null
-/obj/machinery/suit_storage_unit/ex_act(severity, target)
- switch(severity)
- if(1)
- if(prob(50))
- open_machine()
- dump_contents()
- qdel(src)
- if(2)
- if(prob(50))
- open_machine()
- dump_contents()
- qdel(src)
+/obj/machinery/suit_storage_unit/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ open_machine()
+ dump_contents()
+ new /obj/item/stack/sheet/metal (loc, 2)
+ qdel(src)
/obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !Adjacent(A) || !isliving(A))
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 674a3735827..20c1beaa9fe 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -256,7 +256,7 @@
item_state = "eshield0"
w_class = 3
origin_tech = "syndicate=5;combat=6"
- resistance_flags = 0 //Burnable (but the casing isn't)
+ resistance_flags = FLAMMABLE //Burnable (but the casing isn't)
var/adminlog = null
/obj/item/weapon/bombcore/ex_act(severity, target) // Little boom can chain a big boom.
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 16086fc4f7f..4b0603285f8 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -21,6 +21,10 @@
verb_say = "beeps"
verb_ask = "beeps"
verb_exclaim = "beeps"
+ obj_integrity = 300
+ max_integrity = 300
+ integrity_failure = 100
+ armor = list(melee = 20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
var/active = 1 //No sales pitches if off!
var/vend_ready = 1 //Are we ready to vend?? Is it time??
var/vend_delay = 10 //How long does it take to vend?
@@ -138,16 +142,34 @@
refill_inventory(VR, coin_records, COIN_CHARGE)
refill_inventory(VR, hidden_records, CONTRABAND_CHARGE)
-/obj/machinery/vending/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- if(prob(25))
- malfunction()
-/obj/machinery/vending/blob_act(obj/structure/blob/B)
- malfunction()
- ..()
+/obj/machinery/vending/deconstruct(disassembled = TRUE)
+ if(!refill_canister) //the non constructable vendors drop metal instead of a machine frame.
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 3)
+ qdel(src)
+ else
+ ..()
+/obj/machinery/vending/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
+ var/dump_amount = 0
+ for(var/datum/data/vending_product/R in product_records)
+ if(R.amount <= 0) //Try to use a record that actually has something to dump.
+ continue
+ var/dump_path = R.product_path
+ if(!dump_path)
+ continue
+
+ while(R.amount>0)
+ var/obj/O = new dump_path(loc)
+ step(O, pick(alldirs)) //we only drop 20% of the total of each products and spread it
+ R.amount -= 5 //around to not fill the turf with too many objects.
+ dump_amount++
+ if(dump_amount > 15) //so we don't drop too many items (e.g. ClothesMate)
+ break
+ stat |= BROKEN
+ icon_state = "[initial(icon_state)]-broken"
/obj/machinery/vending/proc/build_inventory(list/productlist, hidden=0, req_coin=0, start_empty = null)
for(var/typepath in productlist)
@@ -565,23 +587,6 @@
stat |= NOPOWER
-//Oh no we're malfunctioning! Dump out some product and break.
-/obj/machinery/vending/proc/malfunction()
- for(var/datum/data/vending_product/R in product_records)
- if(R.amount <= 0) //Try to use a record that actually has something to dump.
- continue
- var/dump_path = R.product_path
- if(!dump_path)
- continue
-
- while(R.amount>0)
- new dump_path(loc)
- R.amount--
- continue
-
- stat |= BROKEN
- icon_state = "[initial(icon_state)]-broken"
-
//Somebody cut an important wire and now we're following a new definition of "pitch."
/obj/machinery/vending/proc/throw_item()
var/obj/throw_item = null
@@ -680,6 +685,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/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, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/coffee
name = "\improper Solar's Best Hot Drinks"
@@ -718,7 +725,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/weapon/reagent_containers/food/drinks/coffee = 12,
/obj/item/weapon/tank/internals/emergency_oxygen = 6,
/obj/item/clothing/mask/breath = 6)
-
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/cola
name = "\improper Robust Softdrinks"
@@ -743,6 +751,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
products = list(/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/security = 10,
/obj/item/weapon/cartridge/janitor = 10,/obj/item/weapon/cartridge/signal/toxins = 10,/obj/item/device/pda/heads = 10,
/obj/item/weapon/cartridge/captain = 3,/obj/item/weapon/cartridge/quartermaster = 10)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/liberationstation
name = "\improper Liberation Station"
@@ -758,6 +768,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/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, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/cigarette
name = "\improper ShadyCigs Deluxe"
@@ -791,7 +803,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/weapon/reagent_containers/glass/bottle/epinephrine = 4,/obj/item/weapon/reagent_containers/glass/bottle/morphine = 4,/obj/item/weapon/reagent_containers/glass/bottle/salglu_solution = 3,
/obj/item/weapon/reagent_containers/glass/bottle/toxin = 3,/obj/item/weapon/reagent_containers/syringe/antiviral = 6,/obj/item/weapon/reagent_containers/pill/salbutamol = 2,/obj/item/device/healthanalyzer = 4, /obj/item/device/sensor_device = 2)
contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/morphine = 4,/obj/item/weapon/reagent_containers/pill/charcoal = 6)
-
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
//This one's from bay12
/obj/machinery/vending/plasmaresearch
@@ -812,6 +825,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/weapon/reagent_containers/pill/patch/silver_sulf = 5,/obj/item/weapon/reagent_containers/pill/charcoal = 2,
/obj/item/weapon/reagent_containers/spray/medical/sterilizer = 1)
contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 2,/obj/item/weapon/reagent_containers/pill/morphine = 2)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/security
name = "\improper SecTech"
@@ -824,6 +839,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/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)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/fancy/donut_box = 2)
premium = list(/obj/item/weapon/coin/antagtoken = 1)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/hydronutrients
name = "\improper NutriMax"
@@ -835,6 +852,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
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, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/hydroseeds
name = "\improper MegaSeed Servitor"
@@ -853,7 +872,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
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)
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, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/magivend
name = "\improper MagiVend"
@@ -865,6 +885,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/head/wizard/yellow = 1,/obj/item/clothing/suit/wizrobe/yellow = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/staff = 2)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/autodrobe
name = "\improper AutoDrobe"
@@ -911,6 +933,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "dinnerware"
products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/fork = 6,/obj/item/weapon/kitchen/knife = 6,/obj/item/weapon/kitchen/rollingpin = 2,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/apron/chef = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5,/obj/item/weapon/reagent_containers/food/condiment/saltshaker = 5,/obj/item/weapon/reagent_containers/food/condiment/peppermill = 5,/obj/item/weapon/reagent_containers/glass/bowl = 20)
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, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/sovietsoda
name = "\improper BODA"
@@ -919,6 +943,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
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/filled/soda = 30)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/filled/cola = 20)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/tool
name = "\improper YouTool"
@@ -930,6 +956,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/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, fire = 100, acid = 70)
+ resistance_flags = FIRE_PROOF
/obj/machinery/vending/engivend
name = "\improper Engi-Vend"
@@ -940,6 +968,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
products = list(/obj/item/clothing/glasses/meson/engine = 2,/obj/item/device/multitool = 4,/obj/item/weapon/electronics/airlock = 10,/obj/item/weapon/electronics/apc = 10,/obj/item/weapon/electronics/airalarm = 10,/obj/item/weapon/stock_parts/cell/high = 10, /obj/item/weapon/rcd/loaded = 3, /obj/item/device/geiger_counter = 5)
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, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
//This one's from bay12
/obj/machinery/vending/engineering
@@ -954,6 +984,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/weapon/stock_parts/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
/obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5,
/obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
//This one's from bay12
/obj/machinery/vending/robotics
@@ -966,7 +998,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/weapon/stock_parts/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
/obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/internals/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
/obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
-
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
//DON'T FORGET TO CHANGE THE REFILL SIZE IF YOU CHANGE THE MACHINE'S CONTENTS!
/obj/machinery/vending/clothing
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index d5c1f0da4fe..ac5e7ba1e68 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -241,6 +241,9 @@
state_open = 0 //close the door
update_icon()
+/obj/machinery/washing_machine/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/metal (loc, 2)
+ qdel(src)
/obj/machinery/washing_machine/open_machine(drop = 1)
..()
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index ff1dced21fd..31e557cdba3 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -1,16 +1,14 @@
/obj/mecha/combat
force = 30
internal_damage_threshold = 50
- 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 = 0, bomb = 20, bio = 0, rad = 0, fire = 0, acid = 0)
+ armor = list(melee = 30, bullet = 30, laser = 15, energy = 20, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 100)
/obj/mecha/combat/CheckParts(atom/holder)
..()
var/obj/item/weapon/stock_parts/capacitor/C = locate() in holder
var/obj/item/weapon/stock_parts/scanning_module/SM = locate() in holder
step_energy_drain = 20 - (5 * SM.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best
- var/DR = damage_absorption["energy"]
- damage_absorption["energy"] = DR - (C.rating / 10) //Each level of capacitor protects the mech against emp by 10%
+ armor["energy"] += (C.rating * 10) //Each level of capacitor protects the mech against emp by 10%
qdel(C)
qdel(SM)
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index b9aa9037743..ced8b5bee4a 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -4,10 +4,10 @@
icon_state = "durand"
step_in = 4
dir_in = 1 //Facing North.
- health = 400
+ obj_integrity = 400
+ max_integrity = 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, fire = 0, acid = 0)
+ armor = list(melee = 40, bullet = 35, laser = 15, energy = 10, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 100)
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 1992d48671e..597ed7827a2 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -4,10 +4,9 @@
icon_state = "gygax"
step_in = 3
dir_in = 1 //Facing North.
- health = 250
+ obj_integrity = 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 = 40, bullet = 35, laser = 15, energy = 10, bomb = 20, bio = 0, rad = 0, fire = 0, acid = 0)
+ armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
max_temperature = 25000
infra_luminosity = 6
wreckage = /obj/structure/mecha_wreckage/gygax
@@ -19,10 +18,9 @@
desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications."
name = "\improper Dark Gygax"
icon_state = "darkgygax"
- health = 300
+ obj_integrity = 300
deflect_chance = 15
- damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8)
- armor = list(melee = 40, bullet = 40, laser = 50, energy = 35, bomb = 20, bio = 0, rad = 0, fire = 0, acid = 0)
+ armor = list(melee = 40, bullet = 40, laser = 50, energy = 35, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 100)
max_temperature = 35000
leg_overload_coeff = 100
operation_req_access = list(access_syndicate)
diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm
index 1dc45391ca1..61de8129602 100644
--- a/code/game/mecha/combat/honker.dm
+++ b/code/game/mecha/combat/honker.dm
@@ -3,10 +3,11 @@
name = "\improper H.O.N.K"
icon_state = "honker"
step_in = 3
- health = 140
+ obj_integrity = 140
+ max_integrity = 140
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, fire = 100, acid = 100)
max_temperature = 25000
infra_luminosity = 5
operation_req_access = list(access_theatre)
@@ -27,7 +28,7 @@
*/
/obj/mecha/combat/honker/get_stats_part()
- var/integrity = health/initial(health)*100
+ var/integrity = obj_integrity/max_integrity*100
var/cell_charge = get_charge()
var/datum/gas_mixture/int_tank_air = internal_tank.return_air()
var/tank_pressure = internal_tank ? round(int_tank_air.return_pressure(),0.01) : "None"
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 441577a9c2c..fd1021b8b69 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -3,12 +3,12 @@
name = "\improper Marauder"
icon_state = "marauder"
step_in = 5
- health = 500
+ obj_integrity = 500
+ max_integrity = 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, fire = 0, acid = 0)
+ armor = list(melee = 50, bullet = 55, laser = 40, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100)
max_temperature = 60000
- resistance_flags = LAVA_PROOF |FIRE_PROOF | ACID_PROOF
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
infra_luminosity = 3
operation_req_access = list(access_cent_specops)
wreckage = /obj/structure/mecha_wreckage/marauder
@@ -47,7 +47,7 @@
icon_state = "seraph"
operation_req_access = list(access_cent_specops)
step_in = 3
- health = 550
+ obj_integrity = 550
wreckage = /obj/structure/mecha_wreckage/seraph
internal_damage_threshold = 20
force = 55
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index b05a01435f1..74a758bce0b 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -5,10 +5,10 @@
step_in = 2
dir_in = 2 //Facing South.
step_energy_drain = 3
- health = 200
+ obj_integrity = 200
+ max_integrity = 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, fire = 0, acid = 0)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100)
max_temperature = 25000
infra_luminosity = 3
wreckage = /obj/structure/mecha_wreckage/phazon
diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm
index d25d67f4af3..0f23b7ea224 100644
--- a/code/game/mecha/combat/reticence.dm
+++ b/code/game/mecha/combat/reticence.dm
@@ -4,10 +4,10 @@
icon_state = "reticence"
step_in = 2
dir_in = 1 //Facing North.
- health = 100
+ obj_integrity = 100
+ max_integrity = 100
deflect_chance = 3
- 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, fire = 0, acid = 0)
+ armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
max_temperature = 15000
wreckage = /obj/structure/mecha_wreckage/reticence
operation_req_access = list(access_theatre)
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index a1daa55e41b..7e8481cb7d7 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -248,8 +248,8 @@
chassis.clearInternalDamage(int_dam_flag)
repaired = 1
break
- if(health_boost<0 || chassis.health < initial(chassis.health))
- chassis.health += min(health_boost, initial(chassis.health)-chassis.health)
+ if(health_boost<0 || chassis.obj_integrity < chassis.max_integrity)
+ chassis.obj_integrity += min(health_boost, chassis.max_integrity-chassis.obj_integrity)
repaired = 1
if(repaired)
if(!chassis.use_power(energy_drain))
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index 5f7135cdc57..b0830304f46 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -114,7 +114,7 @@
if(recharge_port && !qdeleted(recharge_port))
data["recharge_port"] = list("mech" = null)
if(recharge_port.recharging_mech && !qdeleted(recharge_port.recharging_mech))
- data["recharge_port"]["mech"] = list("health" = recharge_port.recharging_mech.health, "maxhealth" = initial(recharge_port.recharging_mech.health), "cell" = null)
+ data["recharge_port"]["mech"] = list("health" = recharge_port.recharging_mech.obj_integrity, "max_integrity" = recharge_port.recharging_mech.max_integrity, "cell" = null)
if(recharge_port.recharging_mech.cell && !qdeleted(recharge_port.recharging_mech.cell))
data["recharge_port"]["mech"]["cell"] = list(
"critfail" = recharge_port.recharging_mech.cell.crit_fail,
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 62f50eb2c42..a8642407f7c 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -29,11 +29,10 @@
var/step_in = 10 //make a step in step_in/10 sec.
var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South.
var/step_energy_drain = 10
- var/health = 300 //health is health
+ obj_integrity = 300 //obj_integrity is health
+ max_integrity = 300
var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
- //the values in this list show how much damage will pass through, not how much will be absorbed.
- var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1)
- armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
var/list/facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.5)
var/obj/item/weapon/stock_parts/cell/cell
var/state = 0
@@ -240,7 +239,7 @@
/obj/mecha/examine(mob/user)
..()
- var/integrity = health/initial(health)*100
+ var/integrity = obj_integrity*100/max_integrity
switch(integrity)
if(85 to 100)
user << "It's fully intact."
@@ -256,8 +255,6 @@
user << "It's equipped with:"
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
user << "\icon[ME] [ME]"
- return
-
//processing internal damage, temperature, air regulation, alert updates, lights power use.
/obj/mecha/process()
@@ -276,7 +273,7 @@
if(cabin_air && cabin_air.return_volume()>0)
cabin_air.temperature = min(6000+T0C, cabin_air.return_temperature()+rand(10,15))
if(cabin_air.return_temperature() > max_temperature/2)
- take_damage(4/round(max_temperature/cabin_air.return_temperature(),0.1),"fire")
+ take_damage(4/round(max_temperature/cabin_air.return_temperature(),0.1), BURN, 0, 0)
if(internal_damage & MECHA_INT_TEMP_CONTROL)
internal_temp_regulation = 0
@@ -342,7 +339,7 @@
else
occupant.throw_alert("charge",/obj/screen/alert/emptycell)
- var/integrity = health/initial(health)*100
+ var/integrity = obj_integrity/max_integrity*100
switch(integrity)
if(30 to 45)
occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 1)
@@ -568,7 +565,7 @@
/obj/mecha/proc/check_for_internal_damage(list/possible_int_damage,ignore_threshold=null)
if(!islist(possible_int_damage) || isemptylist(possible_int_damage)) return
if(prob(20))
- if(ignore_threshold || health*100/initial(health) < internal_damage_threshold)
+ if(ignore_threshold || obj_integrity*100/max_integrity < internal_damage_threshold)
for(var/T in possible_int_damage)
if(internal_damage & T)
possible_int_damage -= T
@@ -576,7 +573,7 @@
if(int_dam_flag)
setInternalDamage(int_dam_flag)
if(prob(5))
- if(ignore_threshold || health*100/initial(health)You cannot get in the [name], it has been destroyed!"
else if(occupant)
user << "[occupant] was faster! Try better next time, loser."
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 0fc08605bcf..a252f25ad08 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -72,7 +72,7 @@
var/obj/mecha/M = src.loc
var/cell_charge = M.get_charge()
var/answer = {"Name: [M.name]
- Integrity: [M.health/initial(M.health)*100]%
+ Integrity: [M.obj_integrity/M.max_integrity*100]%
Cell charge: [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"]
Airtank: [M.return_pressure()]kPa
Pilot: [M.occupant||"None"]
diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm
index 24391c95550..a8c31514f66 100644
--- a/code/game/mecha/mecha_defense.dm
+++ b/code/game/mecha/mecha_defense.dm
@@ -8,174 +8,128 @@
return facing_modifiers[FRONT_ARMOUR]
return 1 //always return non-0
+/obj/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
+ . = ..()
+ if(. && obj_integrity > 0)
+ spark_system.start()
+ switch(damage_flag)
+ if("fire")
+ check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL))
+ if("melee")
+ check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
+ else
+ check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT))
+ if(. >= 5 || prob(33))
+ occupant_message("Taking damage!")
+ log_append_to_last("Took [damage_amount] points of damage. Damage type: \"[damage_type]\".",1)
-/obj/mecha/proc/take_damage(amount, type="brute", booster_deflection_modifier = 1, booster_damage_modifier = 1, send_message = 1)
+/obj/mecha/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ . = ..()
+ var/booster_deflection_modifier = 1
+ var/booster_damage_modifier = 1
+ if(damage_flag == "bullet" || damage_flag == "laser" || damage_flag == "energy")
+ for(var/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/B in equipment)
+ if(B.projectile_react())
+ booster_deflection_modifier = B.deflect_coeff
+ booster_damage_modifier = B.damage_coeff
+ break
+ else if(damage_flag == "melee")
+ for(var/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/B in equipment)
+ if(B.attack_react())
+ booster_deflection_modifier *= B.deflect_coeff
+ booster_damage_modifier *= B.damage_coeff
+ break
+
+ if(attack_dir)
+ var/facing_modifier = get_armour_facing(dir2angle(attack_dir) - dir2angle(src))
+ booster_damage_modifier /= facing_modifier
+ booster_deflection_modifier *= facing_modifier
if(prob(deflect_chance * booster_deflection_modifier))
visible_message("[src]'s armour deflects the attack!")
log_append_to_last("Armor saved.")
return 0
- if(amount)
- var/damage = absorbDamage(amount,type)
- damage = damage * booster_damage_modifier
- health -= damage
- update_health()
- if(send_message)
- occupant_message("Taking damage!")
- log_append_to_last("Took [damage] points of damage. Damage type: \"[type]\".",1)
- return 1
+ if(.)
+ . *= booster_damage_modifier
-/obj/mecha/proc/take_directional_damage(amount, type="brute", adir = 0, booster_deflection_modifier = 1, booster_damage_modifier = 1, send_message = 1)
- var/facing_modifier = get_armour_facing(dir2angle(adir) - dir2angle(src))
-
- booster_damage_modifier /= facing_modifier
- booster_deflection_modifier *= facing_modifier
-
- return take_damage(amount, type, booster_deflection_modifier, booster_damage_modifier, send_message)
-
-
-/obj/mecha/proc/absorbDamage(damage,damage_type)
- var/coeff = 1
- if(damage_absorption[damage_type])
- coeff = damage_absorption[damage_type]
- return damage*coeff
-
-
-/obj/mecha/proc/update_health()
- if(health > 0)
- spark_system.start()
- else
- qdel(src)
-
-/obj/mecha/attack_hulk(mob/living/carbon/human/user)
- ..(user, 1)
- take_directional_damage(15, "brute", get_dir(src, user))
- check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
- user.visible_message("[user] hits [name]. The metal creaks and bends.")
-
-/obj/mecha/attack_hand(mob/living/user as mob)
+/obj/mecha/attack_hand(mob/living/user)
user.changeNext_move(CLICK_CD_MELEE) // Ugh. Ideally we shouldn't be setting cooldowns outside of click code.
user.do_attack_animation(src)
log_message("Attack by hand/paw. Attacker - [user].",1)
user.visible_message("[user] hits [name]. Nothing happens","You hit [name] with no visible effect.")
log_append_to_last("Armor saved.")
- return
/obj/mecha/attack_paw(mob/user as mob)
return attack_hand(user)
-/obj/mecha/attack_alien(mob/living/user as mob)
+/obj/mecha/attack_alien(mob/living/user)
log_message("Attack by alien. Attacker - [user].",1)
- user.changeNext_move(CLICK_CD_MELEE) //Now stompy alien killer mechs are actually scary to aliens!
- user.do_attack_animation(src)
- take_directional_damage(15, "brute", get_dir(src, user))
- check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
- playsound(loc, 'sound/weapons/slash.ogg', 50, 1, -1)
- visible_message("The [user] slashes at [name]'s armor!")
+ playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
+ attack_generic(user, 15, BRUTE, "melee", 0)
-/obj/mecha/attack_animal(mob/living/simple_animal/user as mob)
+/obj/mecha/attack_animal(mob/living/simple_animal/user)
log_message("Attack by simple animal. Attacker - [user].",1)
- user.changeNext_move(CLICK_CD_MELEE)
if(!user.melee_damage_upper && !user.obj_damage)
user.emote("[user.friendly] [src]")
+ return 0
else
- user.do_attack_animation(src)
- var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
+ var/play_soundeffect = 1
+ if(user.environment_smash)
+ play_soundeffect = 0
+ playsound(src, 'sound/effects/bang.ogg', 50, 1)
+ var/animal_damage = rand(user.melee_damage_lower,user.melee_damage_upper)
if(user.obj_damage)
- damage = user.obj_damage
- take_directional_damage(damage, "brute", get_dir(src, user))
- check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
- visible_message("[user] [user.attacktext] [src]!")
+ animal_damage = user.obj_damage
+ animal_damage = min(animal_damage, 20*user.environment_smash)
+ attack_generic(user, animal_damage, user.melee_damage_type, "melee", play_soundeffect)
add_logs(user, src, "attacked")
+ return 1
+
+
+
+/obj/mecha/attack_hulk(mob/living/carbon/human/user)
+ if(user.a_intent == "harm")
+ log_message("Attack by hulk. Attacker - [user].",1)
+ user.changeNext_move(CLICK_CD_MELEE)
+ add_logs(user, src, "punched", "hulk powers")
+ user.do_attack_animation(src)
+ user.visible_message("[user] hits [name]. The metal creaks and bends.")
+ take_damage(15, BRUTE, "melee", 0, get_dir(src, user))
+
+/obj/mecha/blob_act(obj/structure/blob/B)
+ take_damage(30, BRUTE, "melee", 0, get_dir(src, B))
/obj/mecha/attack_tk()
return
/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper
log_message("Hit by [A].",1)
- var/deflection = 1
- var/dam_coeff = 1
- var/counter_tracking = 0
- for(var/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/B in equipment)
- if(B.projectile_react())
- deflection = B.deflect_coeff
- dam_coeff = B.damage_coeff
- counter_tracking = 1
- break
- if(istype(A, /obj/item/mecha_parts/mecha_tracking))
- if(!counter_tracking)
- A.forceMove(src)
- visible_message("The [A] fastens firmly to [src].")
- return
- else
- deflection = 100 //will bounce off
-
- if(isobj(A))
- var/obj/O = A
- if(O.throwforce)
- visible_message("[name] is hit by [A].")
- take_directional_damage(O.throwforce, "brute", get_dir(src, A), deflection, dam_coeff)
- check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
- return
+ . = ..()
-/obj/mecha/bullet_act(var/obj/item/projectile/Proj) //wrapper
+/obj/mecha/bullet_act(obj/item/projectile/Proj) //wrapper
log_message("Hit by projectile. Type: [Proj.name]([Proj.flag]).",1)
- var/deflection = 1
- var/dam_coeff = 1
- for(var/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/B in equipment)
- if(B.projectile_react())
- deflection = B.deflect_coeff
- dam_coeff = B.damage_coeff
- break
-
- if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
- visible_message("[name] is hit by [Proj].")
- take_directional_damage(Proj.damage*dam_coeff,Proj.flag, turn(Proj.dir, 180), deflection, dam_coeff)
- check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT))
- Proj.on_hit(src)
+ . = ..()
/obj/mecha/ex_act(severity, target)
log_message("Affected by explosion of severity: [severity].",1)
if(prob(deflect_chance))
severity++
log_append_to_last("Armor saved, changing severity to [severity].")
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if (prob(30))
- qdel(src)
- else
- take_damage(initial(health)/2)
- check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
- if(3)
- if (prob(5))
- qdel(src)
- else
- take_damage(initial(health)/5)
- check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
- return
-
-/obj/mecha/blob_act(obj/structure/blob/B)
- take_directional_damage(30, "brute", get_dir(src, B))
+ . = ..(severity, target)
/obj/mecha/emp_act(severity)
if(get_charge())
use_power((cell.charge/3)/(severity*2))
- take_damage(30 / severity,"energy")
+ take_damage(30 / severity, BURN, "energy", 1)
log_message("EMP detected",1)
check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
- return
/obj/mecha/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature>max_temperature)
log_message("Exposed to dangerous temperature.",1)
- take_damage(5,"fire")
- check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL))
- return
-
+ take_damage(5, BURN, 0, 1)
/obj/mecha/attackby(obj/item/W as obj, mob/user as mob, params)
@@ -271,14 +225,14 @@
else if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm")
user.changeNext_move(CLICK_CD_MELEE)
var/obj/item/weapon/weldingtool/WT = W
- if(healthYou repair the damaged gas tank."
else
user.visible_message("[user] repairs some damage to [name].")
- health += min(10, initial(health)-health)
+ obj_integrity += min(10, max_integrity-obj_integrity)
else
user << "The welder must be on for this task!"
return 1
@@ -298,21 +252,7 @@
/obj/mecha/attacked_by(obj/item/I, mob/living/user)
log_message("Attacked by [I]. Attacker - [user]")
- var/deflection = deflect_chance
- var/dam_coeff = 1
- for(var/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/B in equipment)
- if(B.attack_react())
- deflection *= B.deflect_coeff
- dam_coeff *= B.damage_coeff
- break
- if(prob(deflection))
- user << "\The [I.name] bounces off [name]'s armor."
- log_append_to_last("Armor saved.")
- else
- user.visible_message("[user] hits [src] with [I].", "You hit [src] with [I].")
- take_directional_damage(round(I.force*dam_coeff),I.damtype, get_dir(src, user))
- check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
-
+ ..()
/obj/mecha/proc/mech_toxin_damage(mob/living/target)
playsound(src, 'sound/effects/spray2.ogg', 50, 1)
@@ -323,17 +263,7 @@
target.reagents.add_reagent("toxin", force/2.5)
-/atom/proc/mech_melee_attack(obj/mecha/M)
- return
-
/obj/mecha/mech_melee_attack(obj/mecha/M)
- if(M.damtype =="brute")
- playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
- else if(M.damtype == "fire")
- playsound(src, 'sound/items/Welder.ogg', 50, 1)
- else
- return
- visible_message("[M.name] has hit [src].")
- take_directional_damage(M.force, damtype, get_dir(src, M))
- add_logs(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
- return
\ No newline at end of file
+ if(M.damtype == BRUTE || M.damtype == BURN)
+ add_logs(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
+ . = ..()
\ No newline at end of file
diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm
index 8084c64a43d..0f6623141c1 100644
--- a/code/game/mecha/mecha_topic.dm
+++ b/code/game/mecha/mecha_topic.dm
@@ -69,7 +69,7 @@
/obj/mecha/proc/get_stats_part()
- var/integrity = health/initial(health)*100
+ var/integrity = obj_integrity/max_integrity*100
var/cell_charge = get_charge()
var/datum/gas_mixture/int_tank_air = internal_tank.return_air()
var/tank_pressure = internal_tank ? round(int_tank_air.return_pressure(),0.01) : "None"
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index efb5b3d31b4..f9ae636dff9 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -4,7 +4,8 @@
icon_state = "odysseus"
step_in = 3
max_temperature = 15000
- health = 120
+ obj_integrity = 120
+ max_integrity = 120
wreckage = /obj/structure/mecha_wreckage/odysseus
internal_damage_threshold = 35
deflect_chance = 15
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index b9d693deb91..84155a23b7e 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -6,11 +6,11 @@
var/hi_pres_step_in = 4 //step_in while in high pressure.
var/lo_pres_step_in = 2 //step_in while in low/zero pressure.
max_temperature = 20000
- health = 200
+ obj_integrity = 200
+ max_integrity = 200
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 = 0, bomb = 40, bio = 0, rad = 0, fire = 0, acid = 0)
+ armor = list(melee = 40, bullet = 20, laser = 10, energy = 20, bomb = 40, bio = 0, rad = 0, fire = 100, acid = 100)
max_equip = 6
wreckage = /obj/structure/mecha_wreckage/ripley
var/list/cargo = new
@@ -29,7 +29,6 @@
/obj/mecha/working/ripley/Destroy()
for(var/i=1, i <= hides, i++)
new /obj/item/stack/sheet/animalhide/goliath_hide(loc) //If a goliath-plated ripley gets killed, all the plates drop
- damage_absorption["brute"] = initial(damage_absorption["brute"])
for(var/atom/movable/A in cargo)
A.loc = loc
step_rand(A)
@@ -63,11 +62,11 @@
name = "\improper APLU \"Firefighter\""
icon_state = "firefighter"
max_temperature = 65000
- health = 250
- resistance_flags = LAVA_PROOF |FIRE_PROOF | ACID_PROOF
+ obj_integrity = 250
+ max_integrity = 250
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_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 = 0, bomb = 60, bio = 0, rad = 0, fire = 0, acid = 0)
+ armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100)
max_equip = 5 // More armor, less tools
wreckage = /obj/structure/mecha_wreckage/ripley/firefighter
diff --git a/code/game/objects/effects/alien_acid.dm b/code/game/objects/effects/alien_acid.dm
index d95106c2210..96b1406a0b6 100644
--- a/code/game/objects/effects/alien_acid.dm
+++ b/code/game/objects/effects/alien_acid.dm
@@ -15,73 +15,92 @@
density = 0
opacity = 0
anchored = 1
- resistance_flags = FIRE_PROOF | UNACIDABLE
- var/atom/target
- var/ticks = 0
- var/target_strength = 0
+ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ layer = ABOVE_NORMAL_TURF_LAYER
+ var/turf/target
-/obj/effect/acid/New(loc, targ)
+/obj/effect/acid/New(loc, acid_pwr, acid_amt)
..(loc)
- target = targ
+
+ target = get_turf(src)
+
+ if(acid_amt)
+ acid_level = min(acid_amt*acid_pwr, 12000) //capped so the acid effect doesn't last a half hour on the floor.
//handle APCs and newscasters and stuff nicely
- pixel_x = target.pixel_x
- pixel_y = target.pixel_y
+ pixel_x = target.pixel_x + rand(-4,4)
+ pixel_y = target.pixel_y + rand(-4,4)
- if(isturf(target)) //Turfs take twice as long to take down.
- target_strength = 640
- else
- target_strength = 320
- tick()
+ START_PROCESSING(SSobj, src)
-/obj/effect/acid/proc/tick()
+/obj/effect/acid/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ target = null
+ return ..()
+
+/obj/effect/acid/process()
+ . = 1
if(!target)
qdel(src)
+ return 0
- ticks++
+ if(prob(5))
+ playsound(loc, 'sound/items/Welder.ogg', 100, 1)
- if(ticks >= target_strength)
- target.visible_message("[target] collapses under its own weight into a puddle of goop and undigested debris!")
-
- if(istype(target, /obj/structure/closet))
- var/obj/structure/closet/T = target
- T.dump_contents()
- qdel(target)
-
- if(ismineralturf(target))
- var/turf/closed/mineral/M = target
- M.ChangeTurf(M.baseturf)
-
- if(isfloorturf(target))
- var/turf/open/floor/F = target
- F.ChangeTurf(F.baseturf)
-
- if(iswallturf(target))
- var/turf/closed/wall/W = target
- W.dismantle_wall(1)
-
- else
- qdel(target)
+ for(var/obj/O in target)
+ if(prob(20) && !(resistance_flags & UNACIDABLE))
+ if(O.acid_level < acid_level*0.3)
+ var/acid_used = min(acid_level*0.05, 20)
+ O.acid_act(10, acid_used)
+ acid_level = max(0, acid_level - acid_used*10)
+ acid_level = max(acid_level - (5 + 2*round(sqrt(acid_level))), 0)
+ if(acid_level <= 0)
qdel(src)
- return
+ return 0
- x = target.x
- y = target.y
- z = target.z
+/obj/effect/acid/Crossed(AM as mob|obj)
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(FLYING in H.dna.species.specflags)
+ return
+ else if(isanimal(L))
+ var/mob/living/simple_animal/SA = L
+ if(SA.flying)
+ return
+ if(L.m_intent != "walk" && prob(40))
+ var/acid_used = min(acid_level*0.05, 20)
+ if(L.acid_act(10, acid_used, "feet"))
+ acid_level = max(0, acid_level - acid_used*10)
+ playsound(L, 'sound/weapons/sear.ogg', 50, 1)
+ L << "[src] burns you!"
- switch(target_strength - ticks)
- if(480)
- visible_message("[target] is holding up against the acid!")
- if(320)
- visible_message("[target] is being melted by the acid!")
- if(160)
- visible_message("[target] is struggling to withstand the acid!")
- if(80)
- visible_message("[target] begins to crumble under the acid!")
+/obj/effect/acid/alien
+ var/target_strength = 60
- spawn(1)
- if(src)
- tick()
+
+/obj/effect/acid/alien/process()
+ . = ..()
+ if(.)
+ if(prob(45))
+ playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+ target_strength--
+ if(target_strength <= 0)
+ target.visible_message("[target] collapses under its own weight into a puddle of goop and undigested debris!")
+ target.acid_melt()
+ qdel(src)
+ else
+
+ switch(target_strength)
+ if(48)
+ visible_message("[target] is holding up against the acid!")
+ if(32)
+ visible_message("[target] is being melted by the acid!")
+ if(16)
+ visible_message("[target] is struggling to withstand the acid!")
+ if(8)
+ visible_message("[target] begins to crumble under the acid!")
\ No newline at end of file
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index e2b248cb28d..918c4251a88 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -103,7 +103,7 @@ list(name = "- Carbon Dioxide", desc = " This informational poster teaches the v
desc = "You probably shouldn't be holding this."
icon = 'icons/obj/contraband.dmi'
force = 0
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/serial_number = 0
var/obj/structure/sign/poster/resulting_poster = null //The poster that will be created is initialised and stored through contraband/poster's constructor
var/official = 0
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index 885ab1d6be1..97df69802f6 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -52,25 +52,16 @@
gender = NEUTER
layer = WALL_OBJ_LAYER
icon_state = "cobweb1"
+ resistance_flags = FLAMMABLE
-/obj/effect/decal/cleanable/cobweb/fire_act()
- qdel(src)
-
-/obj/effect/decal/cleanable/cobweb2
- name = "cobweb"
- desc = "Somebody should remove that."
- gender = NEUTER
- layer = WALL_OBJ_LAYER
+/obj/effect/decal/cleanable/cobweb/cobweb2
icon_state = "cobweb2"
-/obj/effect/decal/cleanable/cobweb2/fire_act()
- qdel(src)
-
-/obj/effect/decal/cleanable/molten_item
+/obj/effect/decal/cleanable/molten_object
name = "gooey grey mass"
desc = "It looks like a melted... something."
gender = NEUTER
- icon = 'icons/obj/chemical.dmi'
+ icon = 'icons/effects/effects.dmi'
icon_state = "molten"
mergeable_decal = 0
@@ -150,9 +141,13 @@
gender = PLURAL
mergeable_decal = 0
+/obj/effect/decal/cleanable/shreds/ex_act(severity, target)
+ if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion.
+ qdel(src)
+
/obj/effect/decal/cleanable/shreds/New()
- pixel_x = rand(-5, 5)
- pixel_y = rand(-5, 5)
+ pixel_x = rand(-10, 10)
+ pixel_y = rand(-10, 10)
..()
/obj/effect/decal/cleanable/salt
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index d6f40add970..963165efe99 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -46,6 +46,8 @@
src.reagents.chem_temp = min(src.reagents.chem_temp + added_heat, hotness)
src.reagents.handle_reactions()
user << "You heat [src] with [W]!"
+ else
+ return ..()
/obj/effect/decal/cleanable/ex_act()
if(reagents)
@@ -53,7 +55,7 @@
R.on_ex_act()
..()
-/obj/effect/decal/cleanable/fire_act()
+/obj/effect/decal/cleanable/fire_act(exposed_temperature, exposed_volume)
if(reagents)
reagents.chem_temp += 30
reagents.handle_reactions()
diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm
index d54b26ea358..416056f20c7 100644
--- a/code/game/objects/effects/decals/decal.dm
+++ b/code/game/objects/effects/decals/decal.dm
@@ -1,6 +1,11 @@
/obj/effect/decal
name = "decal"
anchored = 1
+ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/decal/ex_act(severity, target)
- qdel(src)
\ No newline at end of file
+ qdel(src)
+
+/obj/effect/decal/fire_act(exposed_temperature, exposed_volume)
+ if(!(resistance_flags & FIRE_PROOF)) //non fire proof decal or being burned by lava
+ qdel(src)
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index 3911ce019a1..ad098d196f6 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -57,6 +57,10 @@
for(var/obj/O in range(0,src))
if(O.type == src.type)
continue
+ if(isturf(O.loc))
+ var/turf/T = O.loc
+ if(T.intact && O.level == 1) //hidden under the floor
+ continue
reagents.reaction(O, VAPOR, fraction)
var/hit = 0
for(var/mob/living/L in range(0,src))
@@ -177,7 +181,8 @@
name = "foamed metal"
desc = "A lightweight foamed metal wall."
gender = PLURAL
- var/metal = 1 // 1=aluminium, 2=iron
+ obj_integrity = 20
+ max_integrity = 20
/obj/structure/foamedmetal/New()
..()
@@ -189,76 +194,16 @@
air_update_turf(1)
return ..()
-
/obj/structure/foamedmetal/Move()
var/turf/T = loc
..()
move_update_air(T)
-
-/obj/structure/foamedmetal/proc/updateicon()
- if(metal == 1)
- icon_state = "metalfoam"
- else
- icon_state = "ironfoam"
-
-
-/obj/structure/foamedmetal/ex_act(severity, target)
- qdel(src)
-
-
-/obj/structure/foamedmetal/blob_act(obj/structure/blob/B)
- qdel(src)
-
-
-/obj/structure/foamedmetal/bullet_act()
- ..()
- if(metal==1 || prob(50))
- qdel(src)
-
-
/obj/structure/foamedmetal/attack_paw(mob/user)
attack_hand(user)
-
-/obj/structure/foamedmetal/attack_animal(mob/living/simple_animal/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
+/obj/structure/foamedmetal/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
playsound(src.loc, 'sound/weapons/tap.ogg', 100, 1)
- if(user.environment_smash >= 1)
- user.do_attack_animation(src)
- user << "You smash apart the foam wall."
- qdel(src)
-
-/obj/structure/foamedmetal/attack_hulk(mob/living/carbon/human/user)
- ..(user, 1)
- playsound(src.loc, 'sound/weapons/tap.ogg', 100, 1)
- if(prob(75 - metal*25))
- user.visible_message("[user] smashes through the foamed metal!", \
- "You smash through the metal foam wall!")
- qdel(src)
- return 1
-
-/obj/structure/foamedmetal/attack_alien(mob/living/carbon/alien/humanoid/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- playsound(src.loc, 'sound/weapons/tap.ogg', 100, 1)
- if(prob(75 - metal*25))
- user.visible_message("[user] smashes through the foamed metal!", \
- "You smash through the metal foam wall!")
- qdel(src)
-
-/obj/structure/foamedmetal/attack_slime(mob/living/simple_animal/slime/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- playsound(src.loc, 'sound/weapons/tap.ogg', 100, 1)
- if(!user.is_adult)
- attack_hand(user)
- return
- if(prob(75 - metal*25))
- user.visible_message("[user] smashes through the foamed metal!", \
- "You smash through the metal foam wall!")
- qdel(src)
/obj/structure/foamedmetal/attack_hand(mob/user)
user.changeNext_move(CLICK_CD_MELEE)
@@ -266,24 +211,13 @@
user << "You hit the metal foam but bounce off it!"
playsound(src.loc, 'sound/weapons/tap.ogg', 100, 1)
-
-/obj/structure/foamedmetal/attacked_by(obj/item/I, mob/living/user)
- playsound(src.loc, 'sound/weapons/tap.ogg', 100, 1) //the item attack sound is muffled by the foam.
- if(prob(I.force*20 - metal*25))
- user.visible_message("[user] smashes through the foamed metal!", \
- "You smash through the foamed metal with \the [I]!")
- qdel(src)
- else
- user << "You hit the metal foam to no effect!"
-
/obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5)
return !density
/obj/structure/foamedmetal/CanAtmosPass()
return !density
-
-
/obj/structure/foamedmetal/iron
+ obj_integrity = 50
+ max_integrity = 50
icon_state = "ironfoam"
- metal = 2
\ No newline at end of file
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index c74b9a0cc42..7d34bd40957 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -227,6 +227,8 @@
for(var/atom/movable/AM in T)
if(AM.type == src.type)
continue
+ if(T.intact && AM.level == 1) //hidden under the floor
+ continue
reagents.reaction(AM, TOUCH, fraction)
reagents.reaction(T, TOUCH, fraction)
diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm
index 51d8f30feb8..e0abc98490e 100644
--- a/code/game/objects/effects/effects.dm
+++ b/code/game/objects/effects/effects.dm
@@ -1,9 +1,41 @@
//objects in /obj/effect should never be things that are attackable, use obj/structure instead.
//Effects are mostly temporary visual effects like sparks, smoke, as well as decals, etc...
-
/obj/effect
icon = 'icons/effects/effects.dmi'
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+/obj/effect/attackby(obj/item/I, mob/living/user, params)
+ return
+/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
+ return
+
+/obj/effect/fire_act(exposed_temperature, exposed_volume)
+ return
+
+/obj/effect/acid_act()
+ return
+
+/obj/effect/mech_melee_attack(obj/mecha/M)
+ return 0
+
+/obj/effect/blob_act()
+ return
+
+/obj/effect/ex_act(severity, target)
+ if(target == src)
+ qdel(src)
+ else
+ switch(severity)
+ if(1)
+ qdel(src)
+ if(2)
+ if(prob(60))
+ qdel(src)
+ if(3)
+ if(prob(25))
+ qdel(src)
+
+/obj/effect/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
+ return 0
diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm
index f33bb7cd3a3..09f8878c709 100644
--- a/code/game/objects/effects/glowshroom.dm
+++ b/code/game/objects/effects/glowshroom.dm
@@ -13,7 +13,8 @@ var/list/blacklisted_glowshroom_turfs = typecacheof(list(
icon = 'icons/obj/lighting.dmi'
icon_state = "glowshroom" //replaced in New
layer = ABOVE_NORMAL_TURF_LAYER
- var/endurance = 30
+ obj_integrity = 30
+ max_integrity = 30
var/potency = 30
var/delay = 1200
var/floor = 0
@@ -89,7 +90,9 @@ obj/structure/glowshroom/glowcap
child.potency = max(potency + rand(-3,6), 0)
child.yield = max(yield + rand(-1,2), 0)
child.delay = max(delay + rand(-30,60), 0)
- child.endurance = max(endurance + rand(-3,6), 1)
+ var/newhealth = max(obj_integrity + rand(-3,6), 1)
+ child.obj_integrity = newhealth
+ child.max_integrity = newhealth
child.generation = generation + 1
CHECK_TICK
@@ -126,34 +129,17 @@ obj/structure/glowshroom/glowcap
floor = 1
return 1
-/obj/structure/glowshroom/attacked_by(obj/item/I, mob/user)
- ..()
- if(I.damtype != STAMINA)
- endurance -= I.force
- CheckEndurance()
-
-/obj/structure/glowshroom/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(50))
- qdel(src)
- if(3)
- if(prob(5))
- qdel(src)
+/obj/structure/glowshroom/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ if(damage_type == BURN && damage_amount)
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
/obj/structure/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
- endurance -= 5
- CheckEndurance()
+ take_damage(5, BURN, 0, 0)
-/obj/structure/glowshroom/proc/CheckEndurance()
- if(endurance <= 0)
- qdel(src)
-
-/obj/structure/glowshroom/acid_act(acidpwr, toxpwr, acid_volume)
+/obj/structure/glowshroom/acid_act(acidpwr, acid_volume)
+ . = 1
visible_message("[src] melts away!")
- var/obj/effect/decal/cleanable/molten_item/I = new (get_turf(src))
+ var/obj/effect/decal/cleanable/molten_object/I = new (get_turf(src))
I.desc = "Looks like this was \an [src] some time ago."
qdel(src)
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 93a16e2b624..639b2de74c1 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -22,7 +22,6 @@
icon_state = "nothing"
anchored = 1
layer = ABOVE_MOB_LAYER
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
mouse_opacity = 0
var/duration = 10 //in deciseconds
var/randomdir = TRUE
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index 09efd978b5e..d2aff6fb3ec 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -5,46 +5,27 @@
desc = "it's stringy and sticky"
anchored = 1
density = 0
- var/health = 15
+ obj_integrity = 15
-//similar to weeds, but only barfed out by nurses manually
-/obj/structure/spider/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if (prob(50))
- qdel(src)
- if(3)
- if (prob(5))
- qdel(src)
-/obj/structure/spider/attacked_by(obj/item/I, mob/user)
- ..()
- var/damage = I.force
- take_damage(damage, I.damtype, 1)
-/obj/structure/spider/bullet_act(obj/item/projectile/P)
+/obj/structure/spider/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ if(damage_type == BURN)//the stickiness of the web mutes all attack sounds except fire damage type
+ playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+
+
+/obj/structure/spider/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee")
+ switch(damage_type)
+ if(BURN)
+ damage_amount *= 2
+ if(BRUTE)
+ damage_amount *= 0.25
. = ..()
- take_damage(P.damage, P.damage_type, 0)
-
-/obj/structure/spider/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BURN)
- damage *= 2
- if(sound_effect)
- playsound(loc, 'sound/items/Welder.ogg', 100, 1)
- if(BRUTE)//the stickiness of the web mutes all attack sounds except fire damage type
- damage *= 0.25
- else
- return
- health -= damage
- if(health <= 0)
- qdel(src)
/obj/structure/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
- take_damage(5, BURN, 0)
+ take_damage(5, BURN, 0, 0)
/obj/structure/spider/stickyweb
icon_state = "stickyweb1"
@@ -99,7 +80,7 @@
icon_state = "spiderling"
anchored = 0
layer = PROJECTILE_HIT_THRESHHOLD_LAYER
- health = 3
+ obj_integrity = 3
var/amount_grown = 0
var/grow_as = null
var/obj/machinery/atmospherics/components/unary/vent_pump/entry_vent
@@ -198,7 +179,7 @@
name = "cocoon"
desc = "Something wrapped in silky spider web"
icon_state = "cocoon1"
- health = 60
+ obj_integrity = 60
/obj/structure/spider/cocoon/New()
icon_state = pick("cocoon1","cocoon2","cocoon3")
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index d5a551f6fb4..534dd1e27c0 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -20,6 +20,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
var/icon/alternate_worn_icon = null//If this is set, update_icons() will find on mob (WORN, NOT INHANDS) states in this file instead, primary use: badminnery/events
var/alternate_worn_layer = null//If this is set, update_icons() will force the on mob state (WORN, NOT INHANDS) onto this layer, instead of it's default
+ obj_integrity = 150
+ max_integrity = 150
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+
var/hitsound = null
var/throwhitsound = null
var/w_class = 3
@@ -120,12 +124,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
if(B && B.loc == loc)
qdel(src)
-/obj/item/ex_act(severity, target)
- if(severity == 1 || target == src)
- qdel(src)
- if(!qdeleted(src))
- contents_explosion(severity, target)
-
//user: The mob that is suiciding
//damagetype: The type of damage the item will inflict on the user
//BRUTELOSS = 1
@@ -220,21 +218,30 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
return
if(resistance_flags & ON_FIRE)
- var/mob/living/carbon/human/H = user
- if(istype(H))
- if(H.gloves && (H.gloves.max_heat_protection_temperature > 360))
+ var/mob/living/carbon/C = user
+ if(istype(C))
+ if(C.gloves && (C.gloves.max_heat_protection_temperature > 360))
extinguish()
user << "You put out the fire on [src]."
else
user << "You burn your hand on [src]!"
- var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
- if(affecting && affecting.take_damage( 0, 5 )) // 5 burn damage
- H.update_damage_overlays()
-
+ var/obj/item/bodypart/affecting = C.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
+ if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
+ C.update_damage_overlays()
return
else
extinguish()
+ if(acid_level > 20 && !ismob(loc))// so we can still remove the clothes on us that have acid.
+ var/mob/living/carbon/C = user
+ if(istype(C))
+ if(!C.gloves || (!(C.gloves.resistance_flags & (UNACIDABLE|ACID_PROOF))))
+ user << "The acid on [src] burns your hand!"
+ var/obj/item/bodypart/affecting = C.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
+ if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
+ C.update_damage_overlays()
+
+
if(istype(loc, /obj/item/weapon/storage))
//If the item is in a storage item, take it out
var/obj/item/weapon/storage/S = loc
@@ -501,36 +508,6 @@ obj/item/proc/item_action_slot_check(slot, mob/user)
throw_at_fast(S,14,3, spin=0)
else ..()
-/obj/item/acid_act(acidpwr, acid_volume)
- . = 1
- if(resistance_flags & UNACIDABLE)
- return
-
- var/meltingpwr = acid_volume*acidpwr
- var/melting_threshold = 100
- if(meltingpwr <= melting_threshold) // so a single unit can't melt items. You need 5.1+ unit for fluoro and 10.1+ for sulphuric
- return
- for(var/V in armor)
- if(armor[V] > 0)
- .-- //it survives the acid...
- break
- if(. && prob(min(meltingpwr/10,90))) //chance to melt depends on acid power and volume.
- var/turf/T = get_turf(src)
- if(T)
- var/obj/effect/decal/cleanable/molten_item/I = new (T)
- I.pixel_x = rand(-16,16)
- I.pixel_y = rand(-16,16)
- I.desc = "Looks like this was \an [src] some time ago."
- if(istype(src,/obj/item/weapon/storage))
- var/obj/item/weapon/storage/S = src
- S.do_quick_empty() //melted storage item drops its content.
- qdel(src)
- else
- for(var/armour_value in armor) //but is weakened
- armor[armour_value] = max(armor[armour_value]-min(acidpwr,meltingpwr/10),0)
- if(!findtext(desc, "it looks slightly melted...")) //it looks slightly melted... it looks slightly melted... it looks slightly melted... etc.
- desc += " it looks slightly melted..." //needs a space at the start, formatting
-
/obj/item/throw_impact(atom/A)
var/itempush = 1
if(w_class < 4)
@@ -591,3 +568,32 @@ obj/item/proc/item_action_slot_check(slot, mob/user)
//when an item modify our speech spans when in our active hand. Override this to modify speech spans.
/obj/item/proc/get_held_item_speechspans(mob/living/carbon/user)
return
+
+/obj/item/hitby(atom/movable/AM)
+ return
+
+/obj/item/attack_hulk(mob/living/carbon/human/user)
+ return 0
+
+/obj/item/attack_animal(mob/living/simple_animal/M)
+ return 0
+
+/obj/item/mech_melee_attack(obj/mecha/M)
+ return 0
+
+/obj/item/burn()
+ if(!qdeleted(src))
+ var/turf/T = get_turf(src)
+ var/obj/effect/decal/cleanable/ash/A = new()
+ A.desc = "Looks like this used to be a [name] some time ago."
+ A.forceMove(T) //so the ash decal is deleted if on top of lava.
+ ..()
+
+/obj/item/acid_melt()
+ if(!qdeleted(src))
+ var/turf/T = get_turf(src)
+ var/obj/effect/decal/cleanable/molten_object/MO = new (T)
+ MO.pixel_x = rand(-16,16)
+ MO.pixel_y = rand(-16,16)
+ MO.desc = "Looks like this was \an [src] some time ago."
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index c5ae2345881..c30b0ed2f5d 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -35,9 +35,10 @@
if(msg)
light(msg)
-/obj/item/candle/fire_act()
+/obj/item/candle/fire_act(exposed_temperature, exposed_volume)
if(!src.lit)
light() //honk
+ ..()
/obj/item/candle/proc/light(show_message)
if(!src.lit)
diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm
index 2a02f5f8139..f7f4864fbb8 100644
--- a/code/game/objects/items/cardboard_cutouts.dm
+++ b/code/game/objects/items/cardboard_cutouts.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/cardboard_cutout.dmi'
icon_state = "cutout_basic"
w_class = 4
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
// Possible restyles for the cutout;
// add an entry in change_appearance() if you add to here
var/list/possible_appearances = list("Assistant", "Clown", "Mime",
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 017a6076c8b..df9bed4e4e8 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -14,6 +14,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
w_class = 1
slot_flags = SLOT_ID | SLOT_BELT
origin_tech = "programming=2"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
//Main variables
var/owner = null // String name of owner
diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm
index 53e40bfba80..cbdc878dcb3 100644
--- a/code/game/objects/items/devices/instruments.dm
+++ b/code/game/objects/items/devices/instruments.dm
@@ -1,8 +1,9 @@
//copy pasta of the space piano, don't hurt me -Pete
/obj/item/device/instrument
name = "generic instrument"
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 100
+ max_integrity = 100
var/datum/song/handheld/song
var/instrumentId = "generic"
var/instrumentExt = "ogg"
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 605caa32cd0..42560a9804a 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -47,9 +47,9 @@
mytape = null
update_icon()
-/obj/item/device/taperecorder/fire_act()
+/obj/item/device/taperecorder/fire_act(exposed_temperature, exposed_volume)
mytape.ruin() //Fires destroy the tape
- return()
+ ..()
/obj/item/device/taperecorder/attack_hand(mob/user)
if(loc == user)
@@ -248,8 +248,9 @@
var/list/timestamp = list()
var/ruined = 0
-/obj/item/device/tape/fire_act()
+/obj/item/device/tape/fire_act(exposed_temperature, exposed_volume)
ruin()
+ ..()
/obj/item/device/tape/attack_self(mob/user)
if(!ruined)
diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm
index 4f6fa7ad3f0..91f64ccebe5 100644
--- a/code/game/objects/items/religion.dm
+++ b/code/game/objects/items/religion.dm
@@ -58,7 +58,7 @@
w_class = 4 //bulky
slowdown = 2.0 //gotta pretend we're balanced.
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list(melee = 50, bullet = 50, laser = 50, energy = 40, bomb = 60, bio = 0, rad = 0)
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 40, bomb = 60, bio = 0, rad = 0, fire = 60, acid = 60)
/obj/item/clothing/suit/armor/plate/crusader/red
icon_state = "crusader-red"
@@ -72,7 +72,7 @@
icon_state = "crusader"
w_class = 3 //normal
flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE
- armor = list(melee = 50, bullet = 50, laser = 50, energy = 40, bomb = 60, bio = 0, rad = 0)
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 40, bomb = 60, bio = 0, rad = 0, fire = 60, acid = 60)
/obj/item/clothing/head/helmet/plate/crusader/blue
icon_state = "crusader-blue"
@@ -86,7 +86,7 @@
desc = "A religious-looking hat."
alternate_worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
flags = 0
- armor = list(melee = 60, bullet = 60, laser = 60, energy = 50, bomb = 70, bio = 50, rad = 50) //religion protects you from disease and radiation, honk.
+ armor = list(melee = 60, bullet = 60, laser = 60, energy = 50, bomb = 70, bio = 50, rad = 50, fire = 60, acid = 60) //religion protects you from disease and radiation, honk.
worn_x_dimension = 64
worn_y_dimension = 64
@@ -143,7 +143,7 @@
desc = "Metal boots, they look heavy."
icon_state = "crusader"
w_class = 3 //normal
- armor = list(melee = 50, bullet = 50, laser = 50, energy = 40, bomb = 60, bio = 0, rad = 0) //does this even do anything on boots?
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 40, bomb = 60, bio = 0, rad = 0, fire = 60, acid = 60) //does this even do anything on boots?
flags = NOSLIP
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm
index 948aeff5910..847c205b60b 100644
--- a/code/game/objects/items/stacks/cash.dm
+++ b/code/game/objects/items/stacks/cash.dm
@@ -10,7 +10,7 @@
throw_speed = 2
throw_range = 2
w_class = 1
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/value = 1
/obj/item/stack/spacecash/c10
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 27c78cd1bbe..e7f16358c8b 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -7,8 +7,9 @@
w_class = 1
throw_speed = 3
throw_range = 7
- resistance_flags = 0
- burntime = 5
+ resistance_flags = FLAMMABLE
+ obj_integrity = 40
+ max_integrity = 40
var/heal_brute = 0
var/heal_burn = 0
var/stop_bleeding = 0
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index a7f84608ffe..728c6d0d48a 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -15,6 +15,8 @@
icon_state = "sheet-glass"
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
origin_tech = "materials=1"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 100)
+ resistance_flags = ACID_PROOF
/obj/item/stack/sheet/glass/cyborg
materials = list()
@@ -137,6 +139,8 @@
icon_state = "sheet-rglass"
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
origin_tech = "materials=2"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 100)
+ resistance_flags = ACID_PROOF
/obj/item/stack/sheet/rglass/cyborg
materials = list()
@@ -282,6 +286,10 @@
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
attack_verb = list("stabbed", "slashed", "sliced", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
+ resistance_flags = ACID_PROOF
+ armor = list(melee = 100, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 100)
+ obj_integrity = 40
+ max_integrity = 40
var/cooldown = 0
sharpness = IS_SHARP
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index d7d8f3e66ba..4e5960697ad 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -135,8 +135,9 @@ var/global/list/datum/stack_recipe/uranium_recipes = list ( \
singular_name = "plasma sheet"
origin_tech = "plasmatech=2;materials=2"
sheettype = "plasma"
- resistance_flags = 0
- burntime = 5
+ resistance_flags = FLAMMABLE
+ obj_integrity = 100
+ max_integrity = 100
materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT)
var/global/list/datum/stack_recipe/plasma_recipes = list ( \
@@ -159,7 +160,7 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \
else
return ..()
-/obj/item/stack/sheet/mineral/plasma/fire_act()
+/obj/item/stack/sheet/mineral/plasma/fire_act(exposed_temperature, exposed_volume)
atmos_spawn_air("plasma=[amount*10];TEMP=1000")
qdel(src)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 78b27c7a287..beff0bb8cab 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -61,6 +61,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
throwforce = 10
flags = CONDUCT
origin_tech = "materials=1"
+ resistance_flags = FIRE_PROOF
/obj/item/stack/sheet/metal/ratvar_act()
new /obj/item/stack/sheet/brass(loc, amount)
@@ -104,6 +105,8 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
throwforce = 10
flags = CONDUCT
origin_tech = "materials=2"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 80)
+ resistance_flags = FIRE_PROOF
/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
recipes = plasteel_recipes
@@ -146,7 +149,8 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
icon = 'icons/obj/items.dmi'
origin_tech = "materials=1;biotech=1"
sheettype = "wood"
- resistance_flags = 0
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0)
+ resistance_flags = FLAMMABLE
/obj/item/stack/sheet/mineral/wood/New(var/loc, var/amount=null)
recipes = wood_recipes
@@ -183,7 +187,7 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \
singular_name = "cloth roll"
icon_state = "sheet-cloth"
origin_tech = "materials=2"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
force = 0
throwforce = 0
@@ -216,7 +220,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
singular_name = "cardboard sheet"
icon_state = "sheet-card"
origin_tech = "materials=1"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/stack/sheet/cardboard/New(var/loc, var/amount=null)
recipes = cardboard_recipes
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 39f50a2d1c2..8e8cb737265 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -79,7 +79,7 @@
icon_state = "tile_grass"
origin_tech = "biotech=1"
turf_type = /turf/open/floor/grass
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
//Wood
@@ -90,7 +90,7 @@
icon_state = "tile-wood"
origin_tech = "biotech=1"
turf_type = /turf/open/floor/wood
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
//Carpets
@@ -100,7 +100,7 @@
desc = "A piece of carpet. It is the same size as a floor tile."
icon_state = "tile-carpet"
turf_type = /turf/open/floor/carpet
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/stack/tile/fakespace
@@ -109,7 +109,7 @@
desc = "A piece of carpet with a convincing star pattern."
icon_state = "tile_space"
turf_type = /turf/open/floor/fakespace
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/stack/tile/fakespace/loaded
amount = 30
@@ -167,6 +167,8 @@
flags = CONDUCT
turf_type = /turf/open/floor/plasteel
mineralType = "metal"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
+ resistance_flags = FIRE_PROOF
/obj/item/stack/tile/plasteel/cyborg
desc = "The ground you walk on." //Not the usual floor tile desc as that refers to throwing, Cyborgs can't do that - RR
diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm
index b90798aeb33..1836c559713 100644
--- a/code/game/objects/items/stacks/wrap.dm
+++ b/code/game/objects/items/stacks/wrap.dm
@@ -12,7 +12,7 @@
flags = NOBLUDGEON
amount = 25
max_amount = 25
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/stack/wrapping_paper/Destroy()
if(!amount)
@@ -32,7 +32,7 @@
flags = NOBLUDGEON
amount = 25
max_amount = 25
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/proc/can_be_package_wrapped() //can the item be wrapped with package wrapper into a delivery package
return 1
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 79f51f68e45..7fad3b35eb6 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -277,7 +277,7 @@
item_state = "arm_blade"
attack_verb = list("pricked", "absorbed", "gored")
w_class = 2
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/*
@@ -337,7 +337,7 @@
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
-/obj/item/toy/snappop/fire_act()
+/obj/item/toy/snappop/fire_act(exposed_temperature, exposed_volume)
pop_burst()
/obj/item/toy/snappop/throw_impact(atom/hit_atom)
@@ -638,8 +638,9 @@
/obj/item/toy/cards
- resistance_flags = 0
- burntime = 5
+ resistance_flags = FLAMMABLE
+ obj_integrity = 50
+ max_integrity = 50
var/parentdeck = null
var/deckstyle = "nanotrasen"
var/card_hitsound = null
@@ -873,8 +874,7 @@
newobj.card_throw_speed = sourceobj.card_throw_speed
newobj.card_throw_range = sourceobj.card_throw_range
newobj.card_attack_verb = sourceobj.card_attack_verb
- if(sourceobj.resistance_flags & FIRE_PROOF)
- newobj.resistance_flags |= FIRE_PROOF
+ newobj.resistance_flags = sourceobj.resistance_flags
/obj/item/toy/cards/singlecard
name = "card"
@@ -991,7 +991,7 @@
card_throw_speed = 3
card_throw_range = 7
card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut")
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/*
* Fake nuke
@@ -1051,7 +1051,7 @@
item_state = "carp_plushie"
w_class = 2
attack_verb = list("bitten", "eaten", "fin slapped")
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/bitesound = 'sound/weapons/bite.ogg'
//Attack mob
@@ -1161,7 +1161,7 @@
icon_state = "toy_mouse"
w_class = 2.0
var/cooldown = 0
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/*
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index aeea6c170d0..f1f38450d91 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -3,7 +3,7 @@
icon = 'icons/obj/janitor.dmi'
desc = "This is rubbish."
w_class = 1
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/trash/raisins
name = "\improper 4no raisins"
@@ -40,7 +40,7 @@
/obj/item/trash/plate
name = "plate"
icon_state = "plate"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/trash/pistachios
name = "pistachios pack"
@@ -53,7 +53,7 @@
/obj/item/trash/tray
name = "tray"
icon_state = "tray"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/trash/candle
name = "candle"
@@ -63,7 +63,7 @@
/obj/item/trash/can
name = "crushed can"
icon_state = "cola"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/trash/attack(mob/M, mob/living/user)
return
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 7f974faaf42..b42ea177b89 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -21,6 +21,8 @@ RCD
materials = list(MAT_METAL=100000)
origin_tech = "engineering=4;materials=2"
req_access_txt = "11"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
var/datum/effect_system/spark_spread/spark_system
var/matter = 0
var/max_matter = 160
diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm
index ab6c2cae1ec..d7de33121f7 100644
--- a/code/game/objects/items/weapons/RPD.dm
+++ b/code/game/objects/items/weapons/RPD.dm
@@ -133,6 +133,8 @@ var/global/list/RPD_recipes=list(
w_class = 3
materials = list(MAT_METAL=75000, MAT_GLASS=37500)
origin_tech = "engineering=4;materials=2"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
var/datum/effect_system/spark_spread/spark_system
var/working = 0
var/p_type = PIPE_SIMPLE
diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm
index 76772fbf2a6..880c78145e4 100644
--- a/code/game/objects/items/weapons/RSF.dm
+++ b/code/game/objects/items/weapons/RSF.dm
@@ -12,6 +12,7 @@ RSF
density = 0
anchored = 0
flags = NOBLUDGEON
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
var/matter = 0
var/mode = 1
w_class = 3
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index bd400f6ddce..ae47d2f0172 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -77,6 +77,8 @@
icon_state = "id"
item_state = "card-id"
slot_flags = SLOT_ID
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/mining_points = 0 //For redeeming at mining equipment vendors
var/list/access = list()
var/registered_name = null // The name registered_name on the card
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 96f223e59cb..ae9fe307c69 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -34,7 +34,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
open_flame(heat)
-/obj/item/weapon/match/fire_act()
+/obj/item/weapon/match/fire_act(exposed_temperature, exposed_volume)
matchignite()
/obj/item/weapon/match/proc/matchignite()
@@ -248,7 +248,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
return ..()
-/obj/item/clothing/mask/cigarette/fire_act()
+/obj/item/clothing/mask/cigarette/fire_act(exposed_temperature, exposed_volume)
light()
/obj/item/clothing/mask/cigarette/is_hot()
@@ -448,6 +448,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
slot_flags = SLOT_BELT
var/lit = 0
heat = 1500
+ resistance_flags = FIRE_PROOF
/obj/item/weapon/lighter/greyscale
name = "cheap lighter"
diff --git a/code/game/objects/items/weapons/courtroom.dm b/code/game/objects/items/weapons/courtroom.dm
index e2f9b2fd21d..734a0428179 100644
--- a/code/game/objects/items/weapons/courtroom.dm
+++ b/code/game/objects/items/weapons/courtroom.dm
@@ -11,7 +11,7 @@
throwforce = 6
w_class = 2
attack_verb = list("bashed", "battered", "judged", "whacked")
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/gavelhammer/suicide_act(mob/user)
user.visible_message("[user] has sentenced \himself to death with the [src.name]! It looks like \he's trying to commit suicide.")
@@ -26,7 +26,7 @@
force = 2
throwforce = 2
w_class = 1
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/gavelblock/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/gavelhammer))
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index b43514eb2cb..d23ce40ffc6 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -11,6 +11,7 @@
w_class = 4
origin_tech = "biotech=4"
actions_types = list(/datum/action/item_action/toggle_paddles)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
var/on = 0 //if the paddles are equipped (1) or on the defib (0)
var/safety = 1 //if you can zap people with the defibs on harm mode
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 0e4a15a74ba..17688f30031 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -14,6 +14,7 @@
materials = list(MAT_METAL=90)
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
dog_fashion = /datum/dog_fashion/back
+ resistance_flags = FIRE_PROOF
var/max_water = 50
var/last_use = 1
var/safety = 1
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 9dbfce86b95..deeb9245b1b 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -12,6 +12,7 @@
w_class = 3
materials = list(MAT_METAL=500)
origin_tech = "combat=1;plasmatech=2;engineering=2"
+ resistance_flags = FIRE_PROOF
var/status = 0
var/throw_amount = 100
var/lit = 0 //on or off
diff --git a/code/game/objects/items/weapons/gift.dm b/code/game/objects/items/weapons/gift.dm
index ffeeefe3865..6da16cb6e4a 100644
--- a/code/game/objects/items/weapons/gift.dm
+++ b/code/game/objects/items/weapons/gift.dm
@@ -13,7 +13,7 @@
icon = 'icons/obj/storage.dmi'
icon_state = "giftdeliverypackage3"
item_state = "gift1"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/a_gift/New()
..()
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index 4328f3bb274..8c393a65bed 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -9,15 +9,18 @@
throw_range = 7
flags = CONDUCT
slot_flags = SLOT_BELT
- resistance_flags = 0
- burntime = 5
+ resistance_flags = FLAMMABLE
+ obj_integrity = 40
+ max_integrity = 40
var/active = 0
var/det_time = 50
var/display_timer = 1
-/obj/item/weapon/grenade/burn()
- prime()
- ..()
+/obj/item/weapon/grenade/deconstruct(disassembled = TRUE)
+ if(!disassembled)
+ prime()
+ if(!qdeleted(src))
+ qdel(src)
/obj/item/weapon/grenade/proc/clown_check(mob/living/carbon/human/user)
if(user.disabilities & CLUMSY && prob(50))
diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm
index 16a355a1258..3672e2fb90f 100644
--- a/code/game/objects/items/weapons/grenades/smokebomb.dm
+++ b/code/game/objects/items/weapons/grenades/smokebomb.dm
@@ -26,7 +26,6 @@
for(var/obj/structure/blob/B in view(8,src))
var/damage = round(30/(get_dist(B,src)+1))
- B.health -= damage
- B.update_icon()
+ B.take_damage(damage, BURN, "melee", 0)
sleep(80)
qdel(src)
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 7951045eb84..762832bd4e8 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -18,6 +18,7 @@
materials = list(MAT_METAL=500)
origin_tech = "engineering=3;combat=3"
breakouttime = 600 //Deciseconds = 60s = 1 minute
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
var/cuffsound = 'sound/weapons/handcuffs.ogg'
var/trashtype = null //for disposable cuffs
diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm
index c2693b246b2..043f625f5df 100644
--- a/code/game/objects/items/weapons/holosign_creator.dm
+++ b/code/game/objects/items/weapons/holosign_creator.dm
@@ -14,7 +14,7 @@
var/list/signs = list()
var/max_signs = 10
var/creation_time = 0 //time to create a holosign in deciseconds.
- var/holosign_type = /obj/effect/overlay/holograph/wetsign
+ var/holosign_type = /obj/structure/holosign/wetsign
var/holocreator_busy = 0 //to prevent placing multiple holo barriers at once
/obj/item/weapon/holosign_creator/afterattack(atom/target, mob/user, flag)
@@ -22,7 +22,7 @@
if(!check_allowed_items(target, 1))
return
var/turf/T = get_turf(target)
- var/obj/effect/overlay/holograph/H = locate(holosign_type) in T
+ var/obj/structure/holosign/H = locate(holosign_type) in T
if(H)
user << "You use [src] to deactivate [H]."
qdel(H)
@@ -62,7 +62,7 @@
name = "security holobarrier projector"
desc = "A holographic projector that creates holographic security barriers."
icon_state = "signmaker_sec"
- holosign_type = /obj/effect/overlay/holograph/barrier
+ holosign_type = /obj/structure/holosign/barrier
creation_time = 30
max_signs = 6
@@ -70,7 +70,7 @@
name = "engineering holobarrier projector"
desc = "A holographic projector that creates holographic engineering barriers."
icon_state = "signmaker_engi"
- holosign_type = /obj/effect/overlay/holograph/barrier/engineering
+ holosign_type = /obj/structure/holosign/barrier/engineering
creation_time = 30
max_signs = 6
@@ -79,7 +79,7 @@
desc = "A holographic projector that creates fragile energy fields"
creation_time = 5
max_signs = 9
- holosign_type = /obj/effect/overlay/holograph/barrier/cyborg
+ holosign_type = /obj/structure/holosign/barrier/cyborg
var/shock = 0
/obj/item/weapon/holosign_creator/cyborg/attack_self(mob/user)
@@ -88,7 +88,7 @@
if(shock)
user <<"You clear all active holograms, and reset your projector to normal."
- holosign_type = /obj/effect/overlay/holograph/barrier/cyborg
+ holosign_type = /obj/structure/holosign/barrier/cyborg
creation_time = 5
if(signs.len)
for(var/H in signs)
@@ -97,7 +97,7 @@
return
else if(R.emagged&&!shock)
user <<"You clear all active holograms, and overload your energy projector!"
- holosign_type = /obj/effect/overlay/holograph/barrier/cyborg/hacked
+ holosign_type = /obj/structure/holosign/barrier/cyborg/hacked
creation_time = 30
if(signs.len)
for(var/H in signs)
@@ -114,148 +114,3 @@
qdel(H)
user << "You clear all active holograms."
-/obj/effect/overlay/holograph
- icon = 'icons/effects/effects.dmi'
- anchored = 1
- var/holo_integrity = 1
- armor = list(melee = 0, bullet = 50, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- var/obj/item/weapon/holosign_creator/projector
-
-/obj/effect/overlay/holograph/New(loc, source_projector)
- if(source_projector)
- projector = source_projector
- projector.signs += src
- ..()
-
-/obj/effect/overlay/holograph/Destroy()
- if(projector)
- projector.signs -= src
- projector = null
- return ..()
-
-/obj/effect/overlay/holograph/attacked_by(obj/item/I, mob/user)
- ..()
- take_damage(I.force * 0.5, I.damtype)
-
-/obj/effect/overlay/holograph/blob_act(obj/structure/blob/B)
- qdel(src)
-
-/obj/effect/overlay/holograph/attack_animal(mob/living/simple_animal/M)
- if(!M.melee_damage_upper && !M.obj_damage)
- return
- attack_generic(5, M)
-
-/obj/effect/overlay/holograph/attack_alien(mob/living/carbon/alien/A)
- attack_generic(5, A)
-
-/obj/effect/overlay/holograph/attack_hand(mob/living/user)
- attack_generic(1, user)
-
-/obj/effect/overlay/holograph/mech_melee_attack(obj/mecha/M)
- M.do_attack_animation(src)
- playsound(loc, 'sound/weapons/Egloves.ogg', 80, 1)
- visible_message("[M.name] has hit [src].")
- qdel(src)
-
-/obj/effect/overlay/holograph/attack_slime(mob/living/simple_animal/slime/S)
- if(S.is_adult)
- attack_generic(5, S)
- else
- attack_generic(2, S)
-
-/obj/effect/overlay/holograph/proc/attack_generic(damage_amount, mob/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- user.visible_message("[user] hits [src].", \
- "You hit [src]." )
- take_damage(damage_amount)
-
-/obj/effect/overlay/holograph/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(damage && sound_effect)
- playsound(loc, 'sound/weapons/Egloves.ogg', 80, 1)
- if(BURN)
- if(damage && sound_effect)
- playsound(loc, 'sound/weapons/Egloves.ogg', 80, 1)
- else
- return
- holo_integrity -= damage
- if(holo_integrity <= 0)
- qdel(src)
-
-/obj/effect/overlay/holograph/hitby(atom/movable/AM)
- ..()
- var/tforce = 1
- if(ismob(AM))
- tforce = 5
- else if(isobj(AM))
- var/obj/item/I = AM
- tforce = max(1, I.throwforce * 0.2)
- take_damage(tforce)
-
-/obj/effect/overlay/holograph/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage * 0.5, P.damage_type)
-
-/obj/effect/overlay/holograph/wetsign
- name = "wet floor sign"
- desc = "The words flicker as if they mean nothing."
- icon_state = "holosign"
-
-/obj/effect/overlay/holograph/barrier
- name = "holo barrier"
- desc = "A short holographic barrier which can only be passed by walking."
- icon_state = "holosign_sec"
- pass_flags = LETPASSTHROW
- density = 1
- holo_integrity = 4
-
-/obj/effect/overlay/holograph/barrier/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(!density)
- return 1
- if(air_group || (height==0))
- return 1
- if(mover.pass_flags & (PASSGLASS|PASSTABLE|PASSGRILLE))
- return 1
- if(iscarbon(mover))
- var/mob/living/carbon/C = mover
- if(C.m_intent == "walk")
- return 1
-
-/obj/effect/overlay/holograph/barrier/engineering
- icon_state = "holosign_engi"
-
-/obj/effect/overlay/holograph/barrier/cyborg
- name = "Energy Field"
- desc = "A fragile energy field that blocks movement"
- density = 1
- holo_integrity = 1
-
-/obj/effect/overlay/holograph/barrier/cyborg/CanPass()
- return 0
-
-/obj/effect/overlay/holograph/barrier/cyborg/hacked
- name = "Charged Energy Field"
- desc = "A powerful energy field that blocks movement. Energy arcs off it"
- holo_integrity = 3
- var/shockcd = 0
-
-/obj/effect/overlay/holograph/barrier/cyborg/hacked/proc/cooldown()
- shockcd = FALSE
-
-/obj/effect/overlay/holograph/barrier/cyborg/hacked/attack_hand(mob/living/user)
- if(!shockcd)
- if(ismob(user))
- var/mob/living/M = user
- M.electrocute_act(15,"Energy Barrier", safety=1)
- shockcd = TRUE
- addtimer(src, "cooldown", 10)
-
-/obj/effect/overlay/holograph/barrier/cyborg/hacked/Bumped(atom/user)
- if(!shockcd)
- if(ismob(user))
- var/mob/living/M = user
- M.electrocute_act(15,"Energy Barrier", safety=1)
- shockcd = TRUE
- addtimer(src, "cooldown", 10)
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index ee4a454f671..4b9189cbe1d 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -25,6 +25,7 @@
flags = CONDUCT
attack_verb = list("attacked", "stabbed", "poked")
hitsound = 'sound/weapons/bladeslice.ogg'
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
var/datum/reagent/forkload //used to eat omelette
/obj/item/weapon/kitchen/fork/attack(mob/living/carbon/M, mob/living/carbon/user)
@@ -63,6 +64,7 @@
materials = list(MAT_METAL=12000)
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP_ACCURATE
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/weapon/kitchen/knife/attack(mob/living/carbon/M, mob/living/carbon/user)
if(user.zone_selected == "eyes")
@@ -140,6 +142,7 @@
materials = list()
origin_tech = "biotech=3;combat=2"
attack_verb = list("shanked", "shivved")
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
/obj/item/weapon/kitchen/rollingpin
name = "rolling pin"
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index b9d3a17e023..4e4bc94f7e7 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -7,6 +7,10 @@
w_class = 2
var/w_class_on = 4
heat = 3500
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30)
+ resistance_flags = FIRE_PROOF
/obj/item/weapon/melee/energy/suicide_act(mob/user)
user.visible_message(pick("[user] is slitting \his stomach open with [src]! It looks like \he's trying to commit seppuku.", \
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index de00af41d6f..a3f2621f37a 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -9,7 +9,7 @@
throw_range = 7
w_class = 3
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/mopping = 0
var/mopcount = 0
var/mopcap = 5
diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm
index 1b51fdd88ad..ac24af721ce 100644
--- a/code/game/objects/items/weapons/paint.dm
+++ b/code/game/objects/items/weapons/paint.dm
@@ -10,8 +10,9 @@
item_color = "FFFFFF"
item_state = "paintcan"
w_class = 3
- resistance_flags = 0
- burntime = 5
+ resistance_flags = FLAMMABLE
+ obj_integrity = 100
+ max_integrity = 100
var/paintleft = 10
/obj/item/weapon/paint/red
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 6ba69175bf4..3dba89c7f87 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -9,6 +9,7 @@
item_state = "bulldog"
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 60, acid = 50)
var/maxWeightClass = 20 //The max weight of items that can fit into the cannon
var/loadedWeightClass = 0 //The weight of items currently in the cannon
var/obj/item/weapon/tank/internals/tank = null //The gas tank that is drawn from to fire things
diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm
index 4748b109a2b..37efb4ad832 100644
--- a/code/game/objects/items/weapons/powerfist.dm
+++ b/code/game/objects/items/weapons/powerfist.dm
@@ -10,6 +10,8 @@
throw_range = 7
w_class = 3
origin_tech = "combat=5;powerstorage=3;syndicate=3"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 40)
+ resistance_flags = FIRE_PROOF
var/click_delay = 1.5
var/fisto_setting = 1
var/gasperfist = 3
diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm
index 45d3b2e6d60..6060aec8d4c 100644
--- a/code/game/objects/items/weapons/scrolls.dm
+++ b/code/game/objects/items/weapons/scrolls.dm
@@ -9,7 +9,7 @@
throw_speed = 3
throw_range = 7
origin_tech = "bluespace=6"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/teleportation_scroll/apprentice
name = "lesser scroll of teleportation"
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 1f510031439..0161515d54e 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, fire = 80, acid = 70)
/obj/item/weapon/shield/riot
name = "riot shield"
@@ -48,7 +49,7 @@
item_state = "buckler"
materials = list()
origin_tech = "materials=1;combat=3;biotech=2"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
block_chance = 30
/obj/item/weapon/shield/energy
diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm
index 9950d25a61d..24824f7cd4f 100644
--- a/code/game/objects/items/weapons/signs.dm
+++ b/code/game/objects/items/weapons/signs.dm
@@ -5,7 +5,7 @@
force = 5
w_class = 4
attack_verb = list("bashed","smacked")
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/label = ""
var/last_wave = 0
diff --git a/code/game/objects/items/weapons/singularityhammer.dm b/code/game/objects/items/weapons/singularityhammer.dm
index 27d91f15d16..6b51397ff53 100644
--- a/code/game/objects/items/weapons/singularityhammer.dm
+++ b/code/game/objects/items/weapons/singularityhammer.dm
@@ -12,6 +12,8 @@
w_class = 5
var/charged = 5
origin_tech = "combat=4;bluespace=4;plasmatech=7"
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 0, bomb = 50, bio = 0, rad = 0, fire = 100, acid = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/weapon/twohanded/singularityhammer/New()
..()
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 6255c1ebe13..3c46834224e 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -19,8 +19,9 @@
max_w_class = 3
max_combined_w_class = 21
storage_slots = 21
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 100
+ max_integrity = 100
/obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W, mob/user, params)
playsound(src.loc, "rustle", 50, 1, -5)
@@ -37,9 +38,11 @@
icon_state = "holdingpack"
max_w_class = 6
max_combined_w_class = 35
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
var/pshoom = 'sound/items/PSHOOM.ogg'
var/alt_sound = 'sound/items/PSHOOM_2.ogg'
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 60, acid = 50)
+
/obj/item/weapon/storage/backpack/holding/suicide_act(mob/user)
user.visible_message("[user] is jumping into [src]! It looks like \he's trying to commit suicide.")
@@ -141,14 +144,14 @@
desc = "It's a special backpack made exclusively for Nanotrasen officers."
icon_state = "captainpack"
item_state = "captainpack"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/weapon/storage/backpack/industrial
name = "industrial backpack"
desc = "It's a tough backpack for the daily grind of station life."
icon_state = "engiepack"
item_state = "engiepack"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/weapon/storage/backpack/botany
name = "botany backpack"
@@ -173,7 +176,7 @@
desc = "A specially designed backpack. It's fire resistant and smells vaguely of plasma."
icon_state = "toxpack"
item_state = "toxpack"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/weapon/storage/backpack/virology
name = "virology backpack"
@@ -196,7 +199,7 @@
name = "leather satchel"
desc = "It's a very fancy satchel made with fine leather."
icon_state = "satchel"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/weapon/storage/backpack/satchel/leather/withwallet/New()
..()
@@ -207,7 +210,7 @@
desc = "A tough satchel with extra pockets."
icon_state = "satchel-eng"
item_state = "engiepack"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/weapon/storage/backpack/satchel/med
name = "medical satchel"
@@ -238,7 +241,7 @@
desc = "Useful for holding research materials."
icon_state = "satchel-tox"
item_state = "satchel-tox"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/weapon/storage/backpack/satchel/hyd
name = "botanist satchel"
@@ -263,7 +266,7 @@
desc = "An exclusive satchel for Nanotrasen officers."
icon_state = "satchel-cap"
item_state = "captainpack"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/weapon/storage/backpack/satchel/flat
name = "smuggler's satchel"
@@ -328,7 +331,7 @@
desc = "A large dufflebag for holding extra captainly goods."
icon_state = "duffle-captain"
item_state = "duffle-captain"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/weapon/storage/backpack/dufflebag/med
name = "medical dufflebag"
@@ -347,7 +350,7 @@
desc = "A large dufflebag for holding extra tools and supplies."
icon_state = "duffle-eng"
item_state = "duffle-eng"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/weapon/storage/backpack/dufflebag/drone
name = "drone dufflebag"
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index ea0d4721f78..7bf1b3e476c 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -113,7 +113,7 @@
max_w_class = 3
w_class = 1
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
////////
@@ -294,7 +294,7 @@
max_w_class = 3
w_class = 4 //Bigger than a book because physics
can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/book, /obj/item/weapon/spellbook)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/*
* Trays - Agouri
@@ -364,7 +364,7 @@
w_class = 1
preposition = "in"
can_hold = list(/obj/item/weapon/reagent_containers/pill, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/*
* Biowaste bag (mostly for xenobiologists)
@@ -380,4 +380,4 @@
w_class = 1
preposition = "in"
can_hold = list(/obj/item/slime_extract, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/blood, /obj/item/weapon/reagent_containers/hypospray/medipen, /obj/item/trash/deadmouse)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm
index 0b93ec1fb7a..fb83d85e1a1 100644
--- a/code/game/objects/items/weapons/storage/book.dm
+++ b/code/game/objects/items/weapons/storage/book.dm
@@ -6,7 +6,7 @@
throw_speed = 2
throw_range = 5
w_class = 3
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/title = "book"
/obj/item/weapon/storage/book/attack_self(mob/user)
user << "The pages of [title] have been cut out!"
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 99c11c88f3b..d8e8a8cfd0c 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -25,7 +25,7 @@
desc = "It's just an ordinary box."
icon_state = "box"
item_state = "syringe_kit"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/foldable = /obj/item/stack/sheet/cardboard
@@ -634,7 +634,7 @@
desc = "A sack neatly crafted out of paper."
icon_state = "paperbag_None"
item_state = "paperbag_None"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
foldable = null
var/design = NODESIGN
diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm
index a540ed7080c..8a94a7a6a53 100644
--- a/code/game/objects/items/weapons/storage/briefcase.dm
+++ b/code/game/objects/items/weapons/storage/briefcase.dm
@@ -11,8 +11,9 @@
max_w_class = 3
max_combined_w_class = 21
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 150
+ max_integrity = 150
var/folder_path = /obj/item/weapon/folder //this is the path of the folder that gets spawned in New()
/obj/item/weapon/storage/briefcase/New()
@@ -42,8 +43,9 @@
max_w_class = 3
max_combined_w_class = 21
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 150
+ max_integrity = 150
/obj/item/weapon/storage/briefcase/sniperbundle/New()
..()
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 6111e75fe85..72acca6b996 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -17,7 +17,7 @@
icon = 'icons/obj/food/containers.dmi'
icon_state = "donutbox6"
name = "donut box"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/icon_type = "donut"
var/spawn_type = null
var/fancy_open = FALSE
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 1f169b0db52..0fc24a85698 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -342,7 +342,7 @@
//Call this proc to handle the removal of an item from the storage item. The item will be moved to the atom sent as new_target
-/obj/item/weapon/storage/proc/remove_from_storage(obj/item/W, atom/new_location, burn = 0)
+/obj/item/weapon/storage/proc/remove_from_storage(obj/item/W, atom/new_location)
if(!istype(W))
return 0
@@ -369,14 +369,13 @@
W.on_exit_storage(src)
update_icon()
W.mouse_opacity = initial(W.mouse_opacity)
- if(burn)
- W.fire_act()
return 1
-/obj/item/weapon/storage/empty_object_contents(burn, src.loc)
+/obj/item/weapon/storage/deconstruct(disassembled = TRUE)
for(var/obj/item/Item in contents)
- remove_from_storage(Item, src.loc, burn)
+ remove_from_storage(Item, src.loc)
+ qdel(src)
//This proc is called when you want to place an item into the storage item.
/obj/item/weapon/storage/attackby(obj/item/W, mob/user, params)
diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm
index 3dd8d772de1..9ac9ec9e81b 100644
--- a/code/game/objects/items/weapons/storage/wallets.dm
+++ b/code/game/objects/items/weapons/storage/wallets.dm
@@ -4,7 +4,7 @@
storage_slots = 4
icon_state = "wallet"
w_class = 2
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
can_hold = list(
/obj/item/stack/spacecash,
/obj/item/weapon/card,
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index b5a5175d0b0..c4118cce190 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -9,6 +9,8 @@
w_class = 3
origin_tech = "combat=2"
attack_verb = list("beaten")
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 50, bio = 0, rad = 0, fire = 80, acid = 80)
+
var/stunforce = 7
var/status = 0
var/obj/item/weapon/stock_parts/cell/high/bcell = null
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index ba3361b4c4e..18b428f311d 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -10,6 +10,7 @@
throw_speed = 1
throw_range = 4
actions_types = list(/datum/action/item_action/set_internals)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 80, acid = 30)
var/datum/gas_mixture/air_contents = null
var/distribute_pressure = ONE_ATMOSPHERE
var/integrity = 3
@@ -102,6 +103,15 @@
qdel(src)
+/obj/item/weapon/tank/deconstruct(disassembled = TRUE)
+ if(!disassembled)
+ var/turf/T = get_turf(src)
+ if(T)
+ T.assume_air(air_contents)
+ air_update_turf()
+ playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
+ qdel(src)
+
/obj/item/weapon/tank/suicide_act(mob/user)
var/mob/living/carbon/human/H = user
user.visible_message("[user] is putting the [src]'s valve to their lips! I don't think they're gonna stop!")
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index 9cd88a660a9..b641a999de8 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -9,6 +9,10 @@
slot_flags = SLOT_BACK
slowdown = 1
actions_types = list(/datum/action/item_action/toggle_mister)
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30)
+ resistance_flags = FIRE_PROOF
var/obj/item/weapon/noz
var/on = 0
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index b0b0e8ac781..f0480362db0 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -134,6 +134,8 @@ 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, fire = 100, acid = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/active_portals = 0
/obj/item/weapon/hand_tele/attack_self(mob/user)
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 8b3816cc3dd..7e0f3b1c966 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -28,6 +28,7 @@
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
toolspeed = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
/obj/item/weapon/wrench/suicide_act(mob/user)
user.visible_message("[user] is beating \himself to death with the [src.name]! It looks like \he's trying to commit suicide.")
@@ -103,6 +104,7 @@
attack_verb = list("stabbed")
hitsound = 'sound/weapons/bladeslice.ogg'
toolspeed = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
/obj/item/weapon/screwdriver/suicide_act(mob/user)
user.visible_message(pick("[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.", \
@@ -161,6 +163,7 @@
attack_verb = list("pinched", "nipped")
hitsound = 'sound/items/Wirecutter.ogg'
toolspeed = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
/obj/item/weapon/wirecutters/New(loc, var/param_color = null)
..()
@@ -216,7 +219,8 @@
throw_speed = 3
throw_range = 5
w_class = 2
-
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30)
+ resistance_flags = FIRE_PROOF
materials = list(MAT_METAL=70, MAT_GLASS=30)
origin_tech = "engineering=1;plasmatech=1"
@@ -552,6 +556,7 @@ obj/item/weapon/weldingtool/proc/switched_off(mob/user)
origin_tech = "engineering=1;combat=1"
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
toolspeed = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
/obj/item/weapon/crowbar/suicide_act(mob/user)
user.visible_message("[user] is beating \himself to death with the [src.name]! It looks like \he's trying to commit suicide.")
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 6890ef0f7a9..ec802e17b6e 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -118,6 +118,7 @@
icon_state = "offhand"
w_class = 5
flags = ABSTRACT
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/item/weapon/twohanded/offhand/unwield()
qdel(src)
@@ -173,6 +174,10 @@
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30)
+ resistance_flags = FIRE_PROOF
/obj/item/weapon/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "fireaxe[wielded]"
@@ -187,10 +192,10 @@
if(wielded) //destroys windows and grilles in one hit
if(istype(A,/obj/structure/window))
var/obj/structure/window/W = A
- W.shatter()
+ W.take_damage(400, BRUTE, "melee", 0)
else if(istype(A,/obj/structure/grille))
var/obj/structure/grille/G = A
- G.take_damage(16)
+ G.take_damage(40, BRUTE, "melee", 0)
/*
@@ -216,6 +221,10 @@
item_color = "green"
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 75
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
+ resistance_flags = FIRE_PROOF
var/hacked = 0
/obj/item/weapon/twohanded/dualsaber/New()
@@ -265,7 +274,7 @@
return ..()
return 0
-/obj/item/weapon/twohanded/dualsaber/attack_hulk(mob/living/carbon/human/user) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up
+/obj/item/weapon/twohanded/dualsaber/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up
if(wielded)
user << "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!"
return 1
@@ -350,6 +359,9 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
sharpness = IS_SHARP
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
var/obj/item/weapon/grenade/explosive = null
var/war_cry = "AAAAARGH!!!"
@@ -494,6 +506,10 @@
attack_verb = list("attacked", "impaled", "pierced")
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30)
+ resistance_flags = FIRE_PROOF
/obj/item/weapon/twohanded/pitchfork/demonic
name = "demonic pitchfork"
diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm
index 29b76b0a746..eaf89e512e8 100644
--- a/code/game/objects/items/weapons/vending_items.dm
+++ b/code/game/objects/items/weapons/vending_items.dm
@@ -11,7 +11,7 @@
throw_speed = 1
throw_range = 7
w_class = 4
-
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 30)
var/charges = list(0, 0, 0) //how many restocking "charges" the refill has for standard/contraband/coin products
var/init_charges = list(0, 0, 0)
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index f5b4175f753..06c1518d179 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -34,6 +34,10 @@
throw_speed = 3
throw_range = 7
attack_verb = list("banned")
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
+ resistance_flags = FIRE_PROOF
/obj/item/weapon/banhammer/suicide_act(mob/user)
user.visible_message("[user] is hitting \himself with the [src.name]! It looks like \he's trying to ban \himself from life.")
@@ -74,6 +78,10 @@
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50
sharpness = IS_SHARP
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/item/weapon/claymore/suicide_act(mob/user)
user.visible_message("[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.")
@@ -245,6 +253,10 @@ var/highlander_claymores = 0
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50
sharpness = IS_SHARP
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/item/weapon/katana/cursed
slot_flags = null
@@ -307,6 +319,7 @@ var/highlander_claymores = 0
embedded_fall_chance = 0 //Hahaha!
sharpness = IS_SHARP
materials = list(MAT_METAL=500, MAT_GLASS=500)
+ resistance_flags = FIRE_PROOF
/obj/item/weapon/switchblade
@@ -323,6 +336,7 @@ var/highlander_claymores = 0
origin_tech = "engineering=3;combat=2"
hitsound = 'sound/weapons/Genhit.ogg'
attack_verb = list("stubbed", "poked")
+ resistance_flags = FIRE_PROOF
var/extended = 0
/obj/item/weapon/switchblade/attack_self(mob/user)
@@ -393,14 +407,14 @@ var/highlander_claymores = 0
w_class = 2
armour_penetration = 100
attack_verb = list("bludgeoned", "whacked", "disciplined")
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/staff/broom
name = "broom"
desc = "Used for sweeping, and flying into the night while cackling. Black cat not included."
icon = 'icons/obj/wizard.dmi'
icon_state = "broom"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/staff/stick
name = "stick"
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
new file mode 100644
index 00000000000..b60057a63c6
--- /dev/null
+++ b/code/game/objects/obj_defense.dm
@@ -0,0 +1,236 @@
+
+//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)
+ 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)
+ if(damage_amount >= 1)
+ . = damage_amount
+ obj_integrity = max(obj_integrity - damage_amount, 0)
+ if(obj_integrity <= 0)
+ obj_destruction(damage_flag)
+ else if(integrity_failure)
+ if(obj_integrity <= integrity_failure)
+ obj_break(damage_flag)
+
+//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)
+ switch(damage_type)
+ if(BRUTE)
+ if(BURN)
+ else
+ return 0
+ var/armor_protection = 0
+ if(damage_flag)
+ armor_protection = armor[damage_flag]
+ 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)
+ switch(damage_type)
+ if(BRUTE)
+ if(damage_amount)
+ playsound(src, 'sound/weapons/smash.ogg', 50, 1)
+ else
+ playsound(src, 'sound/weapons/tap.ogg', 50, 1)
+ 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/ex_act(severity, target)
+ ..() //contents explosion
+ if(target == src)
+ qdel(src)
+ return
+ switch(severity)
+ if(1)
+ qdel(src)
+ if(2)
+ take_damage(rand(100, 250), BRUTE, "bomb", 0)
+ if(3)
+ take_damage(rand(10, 90), BRUTE, "bomb", 0)
+
+/obj/bullet_act(obj/item/projectile/P)
+ . = ..()
+ visible_message("[src] is hit by \a [P]!")
+ playsound(src, P.hitsound, 50, 1)
+ take_damage(P.damage, P.damage_type, P.flag, 0, turn(P.dir, 180))
+
+
+/obj/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
+ if(user.a_intent == "harm")
+ ..(user, 1)
+ visible_message("[user] smashes [src]!")
+ if(density)
+ playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
+ user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ else
+ playsound(src, 'sound/effects/bang.ogg', 50, 1)
+ take_damage(150, BRUTE, "melee", 0, get_dir(src, user))
+ return 1
+ return 0
+
+/obj/blob_act(obj/structure/blob/B)
+ take_damage(400, BRUTE, "melee", 0, get_dir(src, B))
+
+/obj/proc/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) //used by attack_alien, attack_animal, and attack_slime
+ user.do_attack_animation(src)
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.visible_message("[user] smashes into [src]!")
+ take_damage(damage_amount, damage_type, damage_flag, sound_effect, get_dir(src, user))
+
+/obj/attack_alien(mob/living/carbon/alien/humanoid/user)
+ playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
+ attack_generic(user, 60, BRUTE, "melee", 0)
+
+/obj/attack_animal(mob/living/simple_animal/M)
+ if(!M.melee_damage_upper && !M.obj_damage)
+ M.emote("[M.friendly] [src]")
+ return 0
+ else
+ var/play_soundeffect = 1
+ if(M.environment_smash)
+ play_soundeffect = 0
+ playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
+ if(M.obj_damage)
+ attack_generic(M, M.obj_damage, M.melee_damage_type, "melee", play_soundeffect)
+ else
+ attack_generic(M, rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, "melee", play_soundeffect)
+ return 1
+
+/obj/attack_slime(mob/living/simple_animal/slime/user)
+ if(!user.is_adult)
+ return
+ attack_generic(user, rand(10, 15), "melee", 1)
+
+/obj/mech_melee_attack(obj/mecha/M)
+ M.do_attack_animation(src)
+ switch(damtype)
+ if(BRUTE)
+ playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
+ if(BURN)
+ playsound(src, 'sound/items/Welder.ogg', 50, 1)
+ else
+ return 0
+ visible_message("[M.name] has hit [src].")
+ return take_damage(M.force*3, M.damtype, "melee", 0, get_dir(src, M)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs.
+
+/obj/singularity_act()
+ ex_act(1)
+ if(src && !qdeleted(src))
+ qdel(src)
+ return 2
+
+
+///// ACID
+
+var/global/image/acid_overlay = image("icon" = 'icons/effects/effects.dmi', "icon_state" = "acid")
+
+//the obj's reaction when touched by acid
+/obj/acid_act(acidpwr, acid_volume)
+ if(!(resistance_flags & UNACIDABLE) && acid_volume)
+
+ if(!acid_level)
+ SSacid.processing[src] = src
+ add_overlay(acid_overlay, 1)
+ var/acid_cap = acidpwr * 300 //so we cannot use huge amounts of weak acids to do as well as strong acids.
+ if(acid_level < acid_cap)
+ acid_level = min(acid_level + acidpwr * acid_volume, acid_cap)
+ return 1
+
+//the proc called by the acid subsystem to process the acid that's on the obj
+/obj/proc/acid_processing()
+ . = 1
+ if(!(resistance_flags & ACID_PROOF))
+ for(var/armour_value in armor)
+ if(armour_value != "acid" && armour_value != "fire")
+ armor[armour_value] = max(armor[armour_value] - round(sqrt(acid_level)*0.1), 0)
+ if(prob(33))
+ playsound(loc, 'sound/items/Welder.ogg', 150, 1)
+ take_damage(min(1 + round(sqrt(acid_level)*0.3), 300), BURN, "acid", 0)
+
+ acid_level = max(acid_level - (5 + 3*round(sqrt(acid_level))), 0)
+ if(!acid_level)
+ return 0
+
+//called when the obj is destroyed by acid.
+/obj/proc/acid_melt()
+ var/location = loc
+ SSacid.processing -= src
+ var/remaining_acid = acid_level
+ var/list/contained = contents
+ deconstruct(FALSE)
+ if(isturf(location))
+ var/turf/T = location
+ for(var/obj/item/I in contained)
+ if(I.loc == T) //we acid the items that used to be inside src and ended up on the turf
+ I.acid_act(10, 0.1 * remaining_acid/T.contents.len)
+
+
+//// FIRE
+
+/obj/fire_act(exposed_temperature, exposed_volume)
+ if(exposed_temperature && !(resistance_flags & FIRE_PROOF))
+ take_damage(Clamp(0.02 * exposed_temperature, 0, 20), BURN, "fire", 0)
+ if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE))
+ resistance_flags |= ON_FIRE
+ SSfire_burning.processing[src] = src
+ add_overlay(fire_overlay)
+ return 1
+
+//called when the obj is destroyed by fire
+/obj/proc/burn()
+ var/location = loc
+ var/list/contained = contents
+ if(resistance_flags & ON_FIRE)
+ SSfire_burning.processing -= src
+ deconstruct(FALSE)
+ if(isturf(location))
+ var/turf/T = location
+ for(var/obj/item/I in contained)
+ if(I.loc == T) //we burn the items that used to be inside src and ended up on the turf
+ I.fire_act()
+
+/obj/proc/extinguish()
+ if(resistance_flags & ON_FIRE)
+ resistance_flags &= ~ON_FIRE
+ overlays -= fire_overlay
+ SSfire_burning.processing -= src
+
+
+
+/obj/proc/tesla_act(var/power)
+ being_shocked = 1
+ var/power_bounced = power / 2
+ tesla_zap(src, 3, power_bounced)
+ addtimer(src, "reset_shocked", 10)
+
+/obj/proc/reset_shocked()
+ being_shocked = 0
+
+//the obj is deconstructed into pieces, whether through careful disassembly or when destroyed.
+/obj/proc/deconstruct(disassembled = TRUE)
+ 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 == "acid")
+ acid_melt()
+ else if(damage_flag == "fire")
+ burn()
+ else
+ deconstruct(FALSE)
\ No newline at end of file
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 6603dfd6926..ddc903ef8f0 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -9,11 +9,15 @@
var/damtype = "brute"
var/force = 0
- var/list/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- var/resistance_flags = FIRE_PROOF // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
+ var/list/armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ var/obj_integrity = 500
+ var/max_integrity = 500
+ var/integrity_failure = 0 //0 if we have no special broken behavior
+
+ var/resistance_flags = 0 // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
+
+ var/acid_level = 0 //how much acid is on that obj
- var/burntime = 10 //How long it takes to burn to ashes, in seconds
- var/burn_world_time //What world time the object will burn up completely
var/being_shocked = 0
var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart?
@@ -21,6 +25,8 @@
var/persistence_replacement = null //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset.
var/is_frozen = FALSE
+
+
/obj/New()
..()
@@ -153,15 +159,6 @@
/obj/proc/hide(h)
return
-/obj/ex_act(severity, target)
- if(severity == 1 || target == src)
- qdel(src)
- else if(severity == 2)
- if(prob(50))
- qdel(src)
- if(!qdeleted(src))
- ..()
-
//If a mob logouts/logins in side of an object you can use this proc
/obj/proc/on_log()
..()
@@ -169,19 +166,11 @@
var/obj/Loc=loc
Loc.on_log()
-/obj/singularity_act()
- ex_act(1)
- if(src && !qdeleted(src))
- qdel(src)
- return 2
/obj/singularity_pull(S, current_size)
if(!anchored || current_size >= STAGE_FIVE)
step_towards(src,S)
-/obj/proc/Deconstruct()
- qdel(src)
-
/obj/get_spans()
return ..() | SPAN_ROBOT
@@ -189,43 +178,6 @@
var/turf/T = get_turf(src)
return T.storage_contents_dump_act(src_object, user)
-/obj/fire_act(global_overlay=1)
- if(!(resistance_flags & (FIRE_PROOF|ON_FIRE)))
- resistance_flags |= ON_FIRE
- SSobj.burning += src
- burn_world_time = world.time + burntime*rand(10,20)
- if(global_overlay)
- add_overlay(fire_overlay)
- return 1
-
-/obj/proc/burn()
- empty_object_contents(1, src.loc)
- var/obj/effect/decal/cleanable/ash/A = new(src.loc)
- A.desc = "Looks like this used to be a [name] some time ago."
- SSobj.burning -= src
- qdel(src)
-
-/obj/proc/extinguish()
- if(resistance_flags & ON_FIRE)
- resistance_flags &= ~ON_FIRE
- overlays -= fire_overlay
- SSobj.burning -= src
-
-/obj/proc/empty_object_contents(burn = 0, new_loc = src.loc)
- for(var/obj/item/Item in contents) //Empty out the contents
- Item.loc = new_loc
- if(burn)
- Item.fire_act() //Set them on fire, too
-
-/obj/proc/tesla_act(power, explosive = FALSE)
- being_shocked = 1
- var/power_bounced = power / 2
- tesla_zap(src, 3, power_bounced, explosive)
- addtimer(src, "reset_shocked", 10)
-
-/obj/proc/reset_shocked()
- being_shocked = 0
-
/obj/proc/CanAStarPass()
. = !density
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index d162b55b7c5..2cf309254a0 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -1,10 +1,14 @@
/obj/structure
icon = 'icons/obj/structures.dmi'
pressure_resistance = 8
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
+ obj_integrity = 300
+ max_integrity = 300
var/climb_time = 20
var/climb_stun = 2
var/climbable = FALSE
var/mob/structureclimber
+ var/broken = 0 //similar to machinery's stat BROKEN
/obj/structure/New()
..()
@@ -15,10 +19,6 @@
if(ticker)
cameranet.updateVisibility(src)
-/obj/structure/blob_act(obj/structure/blob/B)
- if(density && prob(50))
- qdel(src)
-
/obj/structure/Destroy()
if(ticker)
cameranet.updateVisibility(src)
@@ -28,13 +28,6 @@
queue_smooth_neighbors(src)
return ..()
-/obj/structure/mech_melee_attack(obj/mecha/M)
- M.do_attack_animation(src)
- if(M.damtype == BRUTE || M.damtype == BURN)
- visible_message("[M.name] has hit [src].")
- return 1
- return 0
-
/obj/structure/attack_hand(mob/user)
. = ..()
add_fingerprint(user)
@@ -52,10 +45,6 @@
..()
add_fingerprint(usr)
-/obj/structure/proc/deconstruct(forced = FALSE)
- qdel(src)
-
-
/obj/structure/MouseDrop_T(atom/movable/O, mob/user)
. = ..()
if(!climbable)
@@ -97,3 +86,21 @@
user << "You fail to climb onto [src]."
density = 1
structureclimber = null
+
+/obj/structure/examine(mob/user)
+ ..()
+ if(!(resistance_flags & INDESTRUCTIBLE))
+ if(resistance_flags & ON_FIRE)
+ user << "It's on fire!"
+ var/healthpercent = (obj_integrity/max_integrity) * 100
+ if(broken)
+ user << "It looks broken."
+ switch(healthpercent)
+ if(100 to INFINITY)
+ user << "It seems pristine and undamaged."
+ if(50 to 100)
+ user << "It looks slightly damaged."
+ if(25 to 50)
+ user << "It appears heavily damaged."
+ if(0 to 25)
+ user << "It's falling apart!"
\ No newline at end of file
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index e1bcccebac1..79be989d0d6 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -4,6 +4,8 @@
name = "\improper AI core"
icon = 'icons/mob/AI.dmi'
icon_state = "0"
+ obj_integrity = 500
+ max_integrity = 500
var/state = 0
var/datum/ai_laws/laws = new()
var/obj/item/weapon/circuitboard/circuit = null
@@ -13,6 +15,15 @@
..()
laws.set_laws_config()
+/obj/structure/AIcore/Destroy()
+ if(circuit)
+ qdel(circuit)
+ circuit = null
+ if(brain)
+ brain.forceMove(loc)
+ brain = null
+ return ..()
+
/obj/structure/AIcore/attackby(obj/item/P, mob/user, params)
switch(state)
if(0)
@@ -99,8 +110,7 @@
user << "You remove the cables."
state = 2
icon_state = "2"
- var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc )
- A.amount = 5
+ new /obj/item/stack/cable_coil(loc, 5)
return
if(istype(P, /obj/item/stack/sheet/rglass))
@@ -166,7 +176,7 @@
if(istype(P, /obj/item/weapon/crowbar) && brain)
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
user << "You remove the brain."
- brain.loc = loc
+ brain.forceMove(loc)
brain = null
icon_state = "3"
return
@@ -192,6 +202,18 @@
return
return ..()
+
+/obj/structure/AIcore/deconstruct(disassembled = TRUE)
+ if(state == 4)
+ new /obj/item/stack/sheet/rglass(loc, 2)
+ if(state >= 3)
+ new /obj/item/stack/cable_coil(loc, 5)
+ if(circuit)
+ circuit.forceMove(loc)
+ circuit = null
+ new /obj/item/stack/sheet/plasteel( loc, 4)
+ qdel(src)
+
/obj/structure/AIcore/deactivated
name = "inactive AI"
icon = 'icons/mob/AI.dmi'
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index 0c8f5237e05..27167d31012 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -9,40 +9,28 @@
/obj/structure/alien
icon = 'icons/mob/alien.dmi'
- var/health = 100
+ obj_integrity = 100
+ max_integrity = 100
-/obj/structure/alien/attacked_by(obj/item/I, mob/user)
- ..()
- var/damage = I.force
- switch(I.damtype)
- if(BRUTE)
- damage *= 0.25
- if(BURN)
- damage *= 2
- else
- damage = 0 //stamina damage does no damage
- take_damage(damage, I.damtype)
+/obj/structure/alien/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee")
+ switch(damage_type)
+ if(BRUTE)
+ damage_amount *= 0.25
+ if(BURN)
+ damage_amount *= 2
+ . = ..()
-/obj/structure/alien/proc/take_damage(amount, damage_type = BRUTE, sound_effect = 1)
+/obj/structure/alien/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
+ if(damage_amount)
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
+ else
+ playsound(src, 'sound/weapons/tap.ogg', 50, 1)
if(BURN)
- if(sound_effect)
+ if(damage_amount)
playsound(loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- health = max(health - amount, 0)
- if(!health)
- Break()
-
-/obj/structure/alien/proc/Break()
- qdel(src)
-
-/obj/structure/alien/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type)
/*
* Generic alien stuff, not related to the purple lizards but still alien-like
@@ -54,8 +42,9 @@
icon = 'icons/obj/fluff.dmi'
icon_state = "gelmound"
-/obj/structure/alien/gelpod/Break()
- new/obj/effect/mob_spawn/human/corpse/damaged(get_turf(src))
+/obj/structure/alien/gelpod/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new/obj/effect/mob_spawn/human/corpse/damaged(get_turf(src))
qdel(src)
/*
@@ -70,7 +59,8 @@
opacity = 1
anchored = 1
canSmoothWith = list(/obj/structure/alien/resin)
- health = 200
+ obj_integrity = 200
+ max_integrity = 200
smooth = SMOOTH_TRUE
var/resintype = null
@@ -106,37 +96,11 @@
icon = 'icons/obj/smooth_structures/alien/resin_membrane.dmi'
icon_state = "membrane0"
opacity = 0
- health = 160
+ obj_integrity = 160
+ max_integrity = 160
resintype = "membrane"
canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane)
-/obj/structure/alien/resin/ex_act(severity, target)
- switch(severity)
- if(1)
- take_damage(150, BRUTE, 0)
- if(2)
- take_damage(100, BRUTE, 0)
- if(3)
- take_damage(50, BRUTE, 0)
-
-/obj/structure/alien/blob_act(obj/structure/blob/B)
- take_damage(50, BRUTE, 0)
-
-/obj/structure/alien/resin/hitby(atom/movable/AM)
- ..()
- var/tforce = 0
- if(!isobj(AM))
- tforce = 10
- else
- var/obj/O = AM
- tforce = O.throwforce
- take_damage(tforce)
-
-/obj/structure/alien/resin/attack_hulk(mob/living/carbon/human/user)
- ..(user, 1)
- user.visible_message("[user] destroys [src]!")
- take_damage(200)
-
/obj/structure/alien/resin/attack_paw(mob/user)
return attack_hand(user)
@@ -147,17 +111,6 @@
user.visible_message("[user] claws at the resin!")
take_damage(50)
-/obj/structure/alien/resin/attack_animal(mob/living/simple_animal/M)
- M.changeNext_move(CLICK_CD_MELEE)
- M.do_attack_animation(src)
- if(!M.melee_damage_upper && !M.obj_damage)
- return
- visible_message("[M] [M.attacktext] [src]!")
- if(M.obj_damage)
- take_damage(M.obj_damage, M.melee_damage_type)
- else
- take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type)
-
/obj/structure/alien/resin/CanPass(atom/movable/mover, turf/target, height=0)
return !density
@@ -176,7 +129,8 @@
density = 0
layer = TURF_LAYER
icon_state = "weeds"
- health = 15
+ obj_integrity = 15
+ max_integrity = 15
var/obj/structure/alien/weeds/node/linked_node = null
canSmoothWith = list(/obj/structure/alien/weeds, /turf/closed/wall)
smooth = SMOOTH_MORE
@@ -229,7 +183,7 @@
/obj/structure/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
- take_damage(5, BURN, 0)
+ take_damage(5, BURN, 0, 0)
//Weed nodes
@@ -266,7 +220,8 @@
icon_state = "egg_growing"
density = 0
anchored = 1
- health = 100
+ obj_integrity = 100
+ max_integrity = 100
var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive
layer = MOB_LAYER
@@ -334,16 +289,18 @@
remove_from_proximity_list(src, 1)
..()
-/obj/structure/alien/egg/Break()
- if(status != BURST && status != BURSTING)
- Burst()
- else if(status == BURST)
- qdel(src) //Remove the egg after it has been hit after bursting.
-
+/obj/structure/alien/egg/deconstruct()
+ if(!(flags & NODECONSTRUCT))
+ if(status != BURST && status != BURSTING)
+ Burst()
+ else if(status == BURST)
+ qdel(src) //Remove the egg after it has been hit after bursting.
+ else
+ qdel(src)
/obj/structure/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 500)
- take_damage(5, BURN, 0)
+ take_damage(5, BURN, 0, 0)
/obj/structure/alien/egg/HasProximity(atom/movable/AM)
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index 53351dab39e..07e16b77988 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -9,8 +9,9 @@
icon = 'icons/obj/artstuff.dmi'
icon_state = "easel"
density = 1
- resistance_flags = 0
- burntime = 15
+ resistance_flags = FLAMMABLE
+ obj_integrity = 60
+ max_integrity = 60
var/obj/item/weapon/canvas/painting = null
@@ -51,7 +52,7 @@ var/global/list/globalBlankCanvases[AMT_OF_CANVASES]
desc = "draw out your soul on this canvas!"
icon = 'icons/obj/artstuff.dmi'
icon_state = "11x11"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/whichGlobalBackup = 1 //List index
/obj/item/weapon/canvas/nineteenXnineteen
diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm
index 0a0e00016bc..1a80c9b782a 100644
--- a/code/game/objects/structures/barsigns.dm
+++ b/code/game/objects/structures/barsigns.dm
@@ -4,9 +4,12 @@
icon = 'icons/obj/barsigns.dmi'
icon_state = "empty"
req_access = list(access_bar)
+ obj_integrity = 500
+ max_integrity = 500
+ integrity_failure = 250
+ armor = list(melee = 20, bullet = 20, laser = 20, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
var/list/barsigns=list()
var/list/hiddensigns
- var/broken = 0
var/emagged = 0
var/state = 0
var/prev_sign = ""
@@ -43,6 +46,22 @@
+/obj/structure/sign/barsign/obj_break(damage_flag)
+ if(!broken && !(flags & NODECONSTRUCT))
+ broken = 1
+
+/obj/structure/sign/barsign/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/metal (loc, 2)
+ new /obj/item/stack/cable_coil (loc, 2)
+ qdel(src)
+
+/obj/structure/sign/barsign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ if(BURN)
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+
/obj/structure/sign/barsign/attack_ai(mob/user)
return src.attack_hand(user)
diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm
index 645551d494d..351ab2e2539 100644
--- a/code/game/objects/structures/beds_chairs/alien_nest.dm
+++ b/code/game/objects/structures/beds_chairs/alien_nest.dm
@@ -5,7 +5,8 @@
desc = "It's a gruesome pile of thick, sticky resin shaped like a nest."
icon = 'icons/obj/smooth_structures/alien/nest.dmi'
icon_state = "nest"
- var/health = 100
+ obj_integrity = 120
+ max_integrity = 120
smooth = SMOOTH_TRUE
can_be_unanchored = 0
canSmoothWith = null
@@ -81,22 +82,10 @@
M.layer = initial(M.layer)
overlays -= nest_overlay
-/obj/structure/bed/nest/attacked_by(obj/item/I, mob/user)
- ..()
- take_damage(I.force, I.damtype)
-
-/obj/structure/bed/nest/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/structure/bed/nest/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
+ playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
if(BURN)
- if(sound_effect)
- playsound(loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- health -= damage
- if(health <=0)
- density = 0
- qdel(src)
+ playsound(loc, 'sound/items/Welder.ogg', 100, 1)
diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm
index e77f9a7845e..b5110331b10 100644
--- a/code/game/objects/structures/beds_chairs/bed.dm
+++ b/code/game/objects/structures/beds_chairs/bed.dm
@@ -15,41 +15,26 @@
anchored = 1
can_buckle = 1
buckle_lying = 1
- resistance_flags = 0
- burntime = 30
+ resistance_flags = FLAMMABLE
+ obj_integrity = 100
+ max_integrity = 100
+ integrity_failure = 30
var/buildstacktype = /obj/item/stack/sheet/metal
var/buildstackamount = 2
-/obj/structure/bed/deconstruct()
- if(buildstacktype)
- new buildstacktype(loc,buildstackamount)
+/obj/structure/bed/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(buildstacktype)
+ new buildstacktype(loc,buildstackamount)
..()
/obj/structure/bed/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/bed/attack_animal(mob/living/simple_animal/M)//No more buckling hostile mobs to chairs to render them immobile forever
- if(M.environment_smash)
- deconstruct()
-
-/obj/structure/bed/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- return
- if(2)
- if(prob(70))
- deconstruct()
- return
- if(3)
- if(prob(50))
- deconstruct()
- return
-
/obj/structure/bed/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench) && !(flags&NODECONSTRUCT))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- deconstruct()
+ deconstruct(TRUE)
else
return ..()
@@ -61,7 +46,7 @@
icon = 'icons/obj/rollerbed.dmi'
icon_state = "down"
anchored = 0
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
var/foldabletype = /obj/item/roller
/obj/structure/bed/roller/MouseDrop(over_object, src_location, over_location)
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 65e2d09eac2..6494225fedc 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -6,7 +6,10 @@
anchored = 1
can_buckle = 1
buckle_lying = 0 //you sit in a chair, not lay
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
+ obj_integrity = 250
+ max_integrity = 250
+ integrity_failure = 25
var/buildstacktype = /obj/item/stack/sheet/metal
var/buildstackamount = 1
var/item_chair = /obj/item/chair // if null it can't be picked up
@@ -24,21 +27,6 @@
/obj/structure/chair/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/chair/attack_animal(mob/living/simple_animal/M)//No more buckling hostile mobs to chairs to render them immobile forever
- if(M.environment_smash)
- deconstruct()
-
-/obj/structure/chair/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(70))
- deconstruct()
- if(3)
- if(prob(50))
- deconstruct()
-
/obj/structure/chair/narsie_act()
if(prob(20))
var/obj/structure/chair/wood/W = new/obj/structure/chair/wood(get_turf(src))
@@ -118,8 +106,9 @@
icon_state = "wooden_chair"
name = "wooden chair"
desc = "Old is never too old to not be in fashion."
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 70
+ max_integrity = 70
buildstacktype = /obj/item/stack/sheet/mineral/wood
buildstackamount = 3
item_chair = /obj/item/chair/wood
@@ -139,8 +128,9 @@
desc = "It looks comfy.\nAlt-click to rotate it clockwise."
icon_state = "comfychair"
color = rgb(255,255,255)
- resistance_flags = 0
- burntime = 30
+ resistance_flags = FLAMMABLE
+ obj_integrity = 70
+ max_integrity = 70
buildstackamount = 2
var/image/armrest = null
item_chair = null
@@ -308,8 +298,9 @@
name = "wooden chair"
icon_state = "wooden_chair_toppled"
item_state = "woodenchair"
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 70
+ max_integrity = 70
hitsound = 'sound/weapons/genhit1.ogg'
origin_type = /obj/structure/chair/wood
break_chance = 50
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 9bbe254094f..74687887a76 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -17,7 +17,7 @@ LINEN BINS
throw_range = 2
w_class = 1
item_color = "white"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
dog_fashion = /datum/dog_fashion/head/ghost
@@ -205,8 +205,9 @@ LINEN BINS
icon = 'icons/obj/structures.dmi'
icon_state = "linenbin-full"
anchored = 1
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 70
+ max_integrity = 70
var/amount = 10
var/list/sheets = list()
var/obj/item/hidden = null
@@ -231,17 +232,12 @@ LINEN BINS
else
icon_state = "linenbin-full"
-/obj/structure/bedsheetbin/fire_act()
- if(!amount)
- return
+/obj/structure/bedsheetbin/fire_act(exposed_temperature, exposed_volume)
+ if(amount)
+ amount = 0
+ update_icon()
..()
-/obj/structure/bedsheetbin/burn()
- amount = 0
- extinguish()
- update_icon()
- return
-
/obj/structure/bedsheetbin/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/bedsheet))
if(!user.drop_item())
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 72889a0a672..167cc876486 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -10,10 +10,12 @@
var/opened = FALSE
var/welded = FALSE
var/locked = FALSE
- var/broken = FALSE
var/large = TRUE
var/wall_mounted = 0 //never solid (You can always pass over it)
- var/health = 100
+ obj_integrity = 200
+ max_integrity = 200
+ integrity_failure = 50
+ armor = list(melee = 20, bullet = 10, laser = 10, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 70, acid = 60)
var/breakout_time = 2
var/lastbang
var/can_weld_shut = TRUE
@@ -188,25 +190,14 @@
else
return open(user)
-/obj/structure/closet/ex_act(severity, target)
- contents_explosion(severity, target)
- if(loc && ispath(material_drop) && !(flags & NODECONSTRUCT))
+/obj/structure/closet/deconstruct(disassembled = TRUE)
+ if(ispath(material_drop) && !(flags & NODECONSTRUCT))
new material_drop(loc)
qdel(src)
- ..()
-/obj/structure/closet/bullet_act(obj/item/projectile/P)
- ..()
- if(P.damage_type == BRUTE || P.damage_type == BURN)
- health -= P.damage
- if(health <= 0)
- qdel(src)
-
-/obj/structure/closet/attack_animal(mob/living/simple_animal/user)
- if(user.environment_smash)
- user.do_attack_animation(src)
- visible_message("[user] destroys \the [src].")
- qdel(src)
+/obj/structure/closet/obj_break(damage_flag)
+ if(!broken && !(flags & NODECONSTRUCT))
+ bust_open()
/obj/structure/closet/attackby(obj/item/weapon/W, mob/user, params)
if(user in src)
@@ -226,9 +217,7 @@
visible_message("[user] slices apart \the [src].",
"You cut \the [src] apart with \the [WT].",
"You hear welding.")
- var/turf/T = get_turf(src)
- new material_drop(T)
- qdel(src)
+ deconstruct(TRUE)
return 0
else if(user.drop_item())
W.forceMove(loc)
@@ -367,16 +356,19 @@
if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) )
return
//we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting
- welded = 0 //applies to all lockers lockers
- locked = 0 //applies to critter crates and secure lockers only
- broken = 1 //applies to secure lockers only
user.visible_message("[user] successfully broke out of [src]!",
"You successfully break out of [src]!")
- open()
+ bust_open()
else
if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
user << "You fail to break out of [src]!"
+/obj/structure/closet/proc/bust_open()
+ welded = 0 //applies to all lockers lockers
+ locked = 0 //applies to critter crates and secure lockers only
+ broken = 1 //applies to secure lockers only
+ open()
+
/obj/structure/closet/AltClick(mob/user)
..()
if(!user.canUseTopic(src, be_close=TRUE))
diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
index 80f9282f457..f0f690d843c 100644
--- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
+++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
@@ -2,10 +2,10 @@
name = "large cardboard box"
desc = "Just a box..."
icon_state = "cardboard"
- health = 10
mob_storage_capacity = 1
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 70
+ max_integrity = 70
can_weld_shut = 0
cutting_tool = /obj/item/weapon/wirecutters
open_sound = 'sound/effects/rustle2.ogg'
@@ -59,9 +59,9 @@
name = "large metal box"
desc = "THE COWARDS! THE FOOLS!"
icon_state = "metalbox"
- health = 500
+ obj_integrity = 500
mob_storage_capacity = 5
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
move_speed_multiplier = 2
cutting_tool = /obj/item/weapon/weldingtool
open_sound = 'sound/machines/click.ogg'
diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
index 3d9a7a36790..72a4c988a4c 100644
--- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm
+++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
@@ -2,8 +2,9 @@
name = "cabinet"
desc = "Old will forever be in fashion."
icon_state = "cabinet"
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 70
+ max_integrity = 70
/obj/structure/closet/acloset
name = "strange closet"
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index bcfc691703a..47c168cd1ec 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -121,8 +121,9 @@
name = "coffin"
desc = "It's a burial receptacle for the dearly departed."
icon_state = "coffin"
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 70
+ max_integrity = 70
/obj/structure/closet/wardrobe/red
name = "security wardrobe"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
index 59a88859d99..ec8952b8524 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
@@ -2,8 +2,9 @@
name = "booze storage"
req_access = list(access_bar)
icon_state = "cabinet"
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 70
+ max_integrity = 70
/obj/structure/closet/secure_closet/bar/New()
..()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index 22773137de4..6625bc6a2ee 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -25,8 +25,9 @@
/obj/structure/closet/secure_closet/personal/cabinet
icon_state = "cabinet"
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 70
+ max_integrity = 70
/obj/structure/closet/secure_closet/personal/cabinet/New()
..()
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 6b16c70b7ba..b1c1e889a50 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
@@ -3,5 +3,12 @@
desc = "It's a card-locked storage unit."
locked = 1
icon_state = "secure"
- health = 200
+ obj_integrity = 250
+ max_integrity = 250
+ armor = list(melee = 30, bullet = 50, laser = 50, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80)
secure = 1
+
+/obj/structure/closet/secure_closet/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 20)
+ return 0
+ . = ..()
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 785aeaacdc3..8b1219c0f44 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -157,8 +157,9 @@
name = "\proper detective's cabinet"
req_access = list(access_forensics_lockers)
icon_state = "cabinet"
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 70
+ max_integrity = 70
/obj/structure/closet/secure_closet/detective/New()
..()
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index a28c8b3ebfd..850e07b9e93 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -5,7 +5,8 @@
icon_state = "human_male"
density = 1
anchored = 1
- health = 0 //destroying the statue kills the mob within
+ obj_integrity = 200
+ max_integrity = 200
var/intialTox = 0 //these are here to keep the mob from taking damage from things that logically wouldn't affect a rock
var/intialFire = 0 //it's a little sloppy I know but it was this or the GODMODE flag. Lesser of two evils.
var/intialBrute = 0
@@ -23,7 +24,8 @@
L.faction += "mimic" //Stops mimics from instaqdeling people in statues
L.visible_message("[L]'s skin rapidly turns to marble!", "Your body freezes up! Can't... move... can't... think...")
- health = L.health + 100 //stoning damaged mobs will result in easier to shatter statues
+ obj_integrity = L.health + 100 //stoning damaged mobs will result in easier to shatter statues
+ max_integrity = obj_integrity
intialTox = L.getToxLoss()
intialFire = L.getFireLoss()
intialBrute = L.getBruteLoss()
@@ -42,7 +44,7 @@
icon_state = "corgi"
desc = "If it takes forever, I will wait for you..."
- if(health == 0) //meaning if the statue didn't find a valid target
+ if(obj_integrity == 0) //meaning if the statue didn't find a valid target
qdel(src)
return
@@ -84,9 +86,9 @@
O.loc = src.loc
for(var/mob/living/M in src)
- M.loc = src.loc
+ M.forceMove(loc)
M.disabilities -= MUTE
- M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob
+ M.take_overall_damage((M.health - obj_integrity + 100)) //any new damage the statue incurred is transfered to the mob
M.faction -= "mimic"
M.reset_perspective(null)
@@ -111,25 +113,6 @@
/obj/structure/closet/statue/toggle()
return
-/obj/structure/closet/statue/bullet_act(obj/item/projectile/Proj)
- health -= Proj.damage
- if(health <= 0)
- shatter()
-
-/obj/structure/closet/statue/attack_animal(mob/living/simple_animal/user)
- if(user.environment_smash)
- shatter()
-
-/obj/structure/closet/statue/blob_act(obj/structure/blob/B)
- shatter()
-
-/obj/structure/closet/statue/attacked_by(obj/item/I, mob/living/user)
- if(I.damtype != STAMINA)
- health -= I.force
- visible_message("[user] strikes [src] with [I].")
- if(health <= 0)
- shatter()
-
/obj/structure/closet/statue/MouseDrop_T()
return
@@ -145,9 +128,10 @@
/obj/structure/closet/statue/update_icon()
return
-/obj/structure/closet/statue/proc/shatter()
- for(var/mob/living/M in src)
- M.dust()
+/obj/structure/closet/statue/deconstruct(disassembled = TRUE)
+ if(!disassembled)
+ for(var/mob/living/M in src)
+ M.dust()
dump_contents()
visible_message("[src] shatters!.")
qdel(src)
diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm
index 3b809f74f9f..bac428d5d1f 100644
--- a/code/game/objects/structures/crates_lockers/crates/secure.dm
+++ b/code/game/objects/structures/crates_lockers/crates/secure.dm
@@ -4,7 +4,14 @@
icon_state = "securecrate"
secure = 1
locked = 1
- health = 1000
+ obj_integrity = 500
+ max_integrity = 500
+ armor = list(melee = 30, bullet = 50, laser = 50, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80)
+
+/obj/structure/closet/crate/secure/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 25)
+ return 0
+ . = ..()
/obj/structure/closet/crate/secure/update_icon()
..()
diff --git a/code/game/objects/structures/destructible_structures.dm b/code/game/objects/structures/destructible_structures.dm
index 688715f5202..d002991c576 100644
--- a/code/game/objects/structures/destructible_structures.dm
+++ b/code/game/objects/structures/destructible_structures.dm
@@ -1,89 +1,17 @@
/obj/structure/destructible //a base for destructible structures
- var/max_health = 100
- var/health = 100
- var/takes_damage = TRUE //If the structure can be damaged
+ max_integrity = 100
+ obj_integrity = 100
var/break_message = "The strange, admin-y structure breaks!" //The message shown when a structure breaks
var/break_sound = 'sound/magic/clockwork/invoke_general.ogg' //The sound played when a structure breaks
var/list/debris = null //Parts left behind when a structure breaks, takes the form of list(path = amount_to_spawn)
-/obj/structure/destructible/proc/take_damage(amount, damage_type)
- var/static/list/physical_damage_types = list(BRUTE = TRUE, BURN = TRUE)
- if(!takes_damage || !amount || !damage_type || !physical_damage_types[damage_type])
- return 0
- health = max(0, health - amount)
- if(!health)
- destroyed()
- return amount
-
-/obj/structure/destructible/proc/destroyed()
- if(!takes_damage)
- return 0
- if(islist(debris))
- for(var/I in debris)
- for(var/i in 1 to debris[I])
- new I (get_turf(src))
+/obj/structure/destructible/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(islist(debris))
+ for(var/I in debris)
+ for(var/i in 1 to debris[I])
+ new I (get_turf(src))
visible_message(break_message)
playsound(src, break_sound, 50, 1)
qdel(src)
return 1
-
-/obj/structure/destructible/burn()
- SSobj.burning -= src
- if(takes_damage)
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- visible_message("[src] is warped by the heat!")
- take_damage(rand(50, 100), BURN)
-
-/obj/structure/destructible/ex_act(severity)
- var/damage = 0
- switch(severity)
- if(1)
- damage = max_health //100% max health lost
- if(2)
- damage = max_health * (0.01 * rand(50, 70)) //50-70% max health lost
- if(3)
- damage = max_health * (0.01 * rand(10, 30)) //10-30% max health lost
- if(damage)
- take_damage(damage, BRUTE)
-
-/obj/structure/destructible/bullet_act(obj/item/projectile/P)
- . = ..()
- visible_message("[src] is hit by \a [P]!")
- playsound(src, P.hitsound, 50, 1)
- take_damage(P.damage, P.damage_type)
-
-/obj/structure/destructible/proc/attack_generic(mob/user, damage = 0, damage_type = BRUTE) //used by attack_alien, attack_animal, and attack_slime
- user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
- user.visible_message("[user] smashes into [src]!")
- take_damage(damage, damage_type)
-
-/obj/structure/destructible/attack_alien(mob/living/user)
- playsound(src, 'sound/weapons/bladeslice.ogg', 50, 1)
- attack_generic(user, 15)
-
-/obj/structure/destructible/attack_animal(mob/living/simple_animal/M)
- if(!M.melee_damage_upper && !M.obj_damage)
- return
- playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
- if(M.obj_damage)
- attack_generic(M, M.obj_damage, M.melee_damage_type)
- else
- attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
-
-/obj/structure/destructible/attack_slime(mob/living/simple_animal/slime/user)
- if(!user.is_adult)
- return
- playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
- attack_generic(user, rand(10, 15))
-
-/obj/structure/destructible/attacked_by(obj/item/I, mob/living/user)
- . = ..()
- var/turf/T = get_turf(src)
- if(take_damage(I.force, I.damtype))
- playsound(T, I.hitsound, 50, 1)
-
-/obj/structure/destructible/mech_melee_attack(obj/mecha/M)
- if(..())
- playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
- take_damage(M.force, M.damtype)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 0194e0d9f40..6d974be8c2e 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -5,9 +5,11 @@
desc = "A display case for prized possessions."
density = 1
anchored = 1
- resistance_flags = FIRE_PROOF | ACID_PROOF
- var/health = 30
- var/destroyed = 0
+ resistance_flags = ACID_PROOF
+ armor = list(melee = 30, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 70, acid = 100)
+ obj_integrity = 200
+ max_integrity = 200
+ integrity_failure = 50
var/obj/item/showpiece = null
var/alert = 0
var/open = 0
@@ -20,17 +22,6 @@
showpiece = new start_showpiece_type (src)
update_icon()
-/obj/structure/displaycase/ex_act(severity, target)
- switch(severity)
- if (1)
- new /obj/item/weapon/shard( src.loc )
- dump()
- qdel(src)
- if (2)
- take_damage(rand(10,20), BRUTE, 0)
- if (3)
- take_damage(5, BRUTE, 0)
-
/obj/structure/displaycase/examine(mob/user)
..()
if(showpiece)
@@ -39,48 +30,45 @@
user << "Hooked up with an anti-theft system."
-/obj/structure/displaycase/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type, 0)
-
/obj/structure/displaycase/proc/dump()
if (showpiece)
showpiece.loc = src.loc
showpiece = null
-/obj/structure/displaycase/blob_act(obj/structure/blob/B)
- take_damage(30)
-
-/obj/structure/displaycase/hitby(atom/movable/AM)
- ..()
- if(isobj(AM))
- var/obj/item/I = AM
- take_damage(I.throwforce * 0.2)
-
-/obj/structure/displaycase/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/structure/displaycase/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- health = max( health - damage, 0)
- if(!health && !destroyed)
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+
+/obj/structure/displaycase/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ dump()
+ if(!disassembled)
+ new /obj/item/weapon/shard( src.loc )
+ trigger_alarm()
+ qdel(src)
+
+/obj/structure/displaycase/obj_break(damage_flag)
+ if(!broken && !(flags & NODECONSTRUCT))
density = 0
- destroyed = 1
+ broken = 1
new /obj/item/weapon/shard( src.loc )
playsound(src, "shatter", 70, 1)
update_icon()
+ trigger_alarm()
- //Activate Anti-theft
- if(alert)
- var/area/alarmed = get_area(src)
- alarmed.burglaralert(src)
- playsound(src, "sound/effects/alert.ogg", 50, 1)
+/obj/structure/displaycase/proc/trigger_alarm()
+ //Activate Anti-theft
+ if(alert)
+ var/area/alarmed = get_area(src)
+ alarmed.burglaralert(src)
+ playsound(src, "sound/effects/alert.ogg", 50, 1)
+/*
+
+*/
/obj/structure/displaycase/proc/is_directional(atom/A)
try
@@ -88,6 +76,7 @@
catch
return 0
return 1
+
/obj/structure/displaycase/proc/get_flat_icon_directional(atom/A)
//Get flatIcon even if dir is mismatched for directionless icons
//SLOW
@@ -107,7 +96,7 @@
I = icon('icons/obj/stationobjs.dmi',"glassbox_open")
else
I = icon('icons/obj/stationobjs.dmi',"glassbox0")
- if(destroyed)
+ if(broken)
I = icon('icons/obj/stationobjs.dmi',"glassboxb0")
if(showpiece)
var/icon/S = get_flat_icon_directional(showpiece)
@@ -117,7 +106,7 @@
return
/obj/structure/displaycase/attackby(obj/item/weapon/W, mob/user, params)
- if(W.GetID() && electronics && !destroyed)
+ if(W.GetID() && electronics && !broken)
if(allowed(user))
user << "You [open ? "close":"open"] the [src]"
open = !open
@@ -125,7 +114,7 @@
else
user << "Access denied."
else if(!alert && istype(W,/obj/item/weapon/crowbar))
- if(destroyed)
+ if(broken)
if(showpiece)
user << "Remove the displayed object first."
else
@@ -143,49 +132,26 @@
showpiece = W
user << "You put [W] on display"
update_icon()
- else if(istype(W, /obj/item/stack/sheet/glass) && destroyed)
+ else if(istype(W, /obj/item/stack/sheet/glass) && broken)
var/obj/item/stack/sheet/glass/G = W
if(G.get_amount() < 2)
user << "You need two glass sheets to fix the case!"
return
- user << "You start fixing the [src]..."
+ user << "You start fixing [src]..."
if(do_after(user, 20, target = src))
G.use(2)
- destroyed = 0
- health = initial(health)
+ broken = 0
+ obj_integrity = max_integrity
update_icon()
else
return ..()
-/obj/structure/displaycase/attacked_by(obj/item/weapon/W, mob/living/user)
- ..()
- take_damage(W.force, W.damtype)
-
/obj/structure/displaycase/attack_paw(mob/user)
return src.attack_hand(user)
-/obj/structure/displaycase/attack_alien(mob/living/carbon/alien/humanoid/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- visible_message("\The [user] slashes at [src]!")
- playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
- take_damage(20, BRUTE, 0)
-
-/obj/structure/displaycase/attack_animal(mob/living/simple_animal/M)
- M.changeNext_move(CLICK_CD_MELEE)
- M.do_attack_animation(src)
- if(M.melee_damage_upper || M.obj_damage)
- M.visible_message("[M.name] smashes against \the [src.name].",\
- "You smash against the [src.name].")
- if(M.obj_damage)
- take_damage(M.obj_damage, M.melee_damage_type, 1)
- else
- take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1)
-
-
/obj/structure/displaycase/attack_hand(mob/user)
user.changeNext_move(CLICK_CD_MELEE)
- if (showpiece && (destroyed || open))
+ if (showpiece && (broken || open))
dump()
user << "You deactivate the hover field built into the case."
src.add_fingerprint(user)
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 2941bf9c3c5..bf2a6435626 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -5,6 +5,8 @@
var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
anchored = 0
density = 1
+ obj_integrity = 200
+ max_integrity = 200
var/state = 0
var/mineral = null
var/typetext = ""
@@ -495,18 +497,7 @@
if( !WT.isOn() )
return
user << "You disassemble the airlock assembly."
- new /obj/item/stack/sheet/metal(get_turf(src), 4)
- if (mineral)
- if (mineral == "glass")
- if (heat_proof_finished)
- new /obj/item/stack/sheet/rglass(get_turf(src))
- else
- new /obj/item/stack/sheet/glass(get_turf(src))
- else
- var/M = text2path("/obj/item/stack/sheet/mineral/[mineral]")
- new M(get_turf(src))
- new M(get_turf(src))
- qdel(src)
+ deconstruct(TRUE)
else if(istype(W, /obj/item/weapon/wrench))
if(!anchored )
@@ -684,4 +675,26 @@
add_overlay(get_airlock_overlay("fill_construction", icon))
else
add_overlay(get_airlock_overlay("[material]_construction", overlays_file))
- add_overlay(get_airlock_overlay("panel_c[state+1]", overlays_file))
\ No newline at end of file
+ add_overlay(get_airlock_overlay("panel_c[state+1]", overlays_file))
+
+
+/obj/structure/door_assembly/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ var/turf/T = get_turf(src)
+ var/metal_amt = 4
+ if(!disassembled)
+ metal_amt = rand(2,4)
+ new /obj/item/stack/sheet/metal(T, metal_amt)
+ if(mineral)
+ if (mineral == "glass")
+ if(disassembled)
+ if (heat_proof_finished)
+ new /obj/item/stack/sheet/rglass(T)
+ else
+ new /obj/item/stack/sheet/glass(T)
+ else
+ new /obj/item/weapon/shard(T)
+ else
+ var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]")
+ new mineral_path(T, 2)
+ qdel(src)
\ No newline at end of file
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index c766dc13a2f..4ec8001ebd7 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -5,7 +5,10 @@
icon_state = "extinguisher_closed"
anchored = 1
density = 0
- var/obj/item/weapon/extinguisher/has_extinguisher
+ obj_integrity = 200
+ max_integrity = 200
+ integrity_failure = 50
+ var/obj/item/weapon/extinguisher/stored_extinguisher
var/opened = 0
/obj/structure/extinguisher_cabinet/New(loc, ndir, building)
@@ -17,25 +20,16 @@
opened = 1
icon_state = "extinguisher_empty"
else
- has_extinguisher = new /obj/item/weapon/extinguisher(src)
-
-/obj/structure/extinguisher_cabinet/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- return
- if(2)
- if(prob(50))
- if(has_extinguisher)
- has_extinguisher.loc = src.loc
- qdel(src)
- return
- if(3)
- return
+ stored_extinguisher = new /obj/item/weapon/extinguisher(src)
+/obj/structure/extinguisher_cabinet/Destroy()
+ if(stored_extinguisher)
+ qdel(stored_extinguisher)
+ stored_extinguisher = null
+ return ..()
/obj/structure/extinguisher_cabinet/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/wrench) && !has_extinguisher)
+ if(istype(I, /obj/item/weapon/wrench) && !stored_extinguisher)
user << "You start unsecuring [name]..."
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
if(do_after(user, 60/I.toolspeed, target = src))
@@ -48,63 +42,92 @@
if(iscyborg(user) || isalien(user))
return
if(istype(I, /obj/item/weapon/extinguisher))
- if(!has_extinguisher && opened)
+ if(!stored_extinguisher && opened)
if(!user.drop_item())
return
contents += I
- has_extinguisher = I
+ stored_extinguisher = I
user << "You place [I] in [src]."
else
- opened = !opened
+ toggle_cabinet(user)
+ else if(user.a_intent != "harm")
+ toggle_cabinet(user)
else
- opened = !opened
- update_icon()
+ return ..()
/obj/structure/extinguisher_cabinet/attack_hand(mob/user)
if(iscyborg(user) || isalien(user))
return
- if(has_extinguisher)
- user.put_in_hands(has_extinguisher)
- user << "You take [has_extinguisher] from [src]."
- has_extinguisher = null
+ if(stored_extinguisher)
+ user.put_in_hands(stored_extinguisher)
+ user << "You take [stored_extinguisher] from [src]."
+ stored_extinguisher = null
opened = 1
+ playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
+ update_icon()
else
- opened = !opened
- update_icon()
+ toggle_cabinet(user)
+
/obj/structure/extinguisher_cabinet/attack_tk(mob/user)
- if(has_extinguisher)
- has_extinguisher.loc = loc
- user << "You telekinetically remove [has_extinguisher] from [src]."
- has_extinguisher = null
+ if(stored_extinguisher)
+ stored_extinguisher.forceMove(loc)
+ user << "You telekinetically remove [stored_extinguisher] from [src]."
+ stored_extinguisher = null
opened = 1
+ playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
+ update_icon()
else
- opened = !opened
- update_icon()
+ toggle_cabinet(user)
+
/obj/structure/extinguisher_cabinet/attack_paw(mob/user)
attack_hand(user)
- return
/obj/structure/extinguisher_cabinet/AltClick(mob/living/user)
if(user.incapacitated() || !Adjacent(user) || !istype(user))
return
- opened = !opened
- update_icon()
+ toggle_cabinet(user)
+
+/obj/structure/extinguisher_cabinet/proc/toggle_cabinet(mob/user)
+ if(opened && broken)
+ user << "[src] is broken open."
+ else
+ playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
+ opened = !opened
+ update_icon()
/obj/structure/extinguisher_cabinet/update_icon()
if(!opened)
icon_state = "extinguisher_closed"
return
- if(has_extinguisher)
- if(istype(has_extinguisher, /obj/item/weapon/extinguisher/mini))
+ if(stored_extinguisher)
+ if(istype(stored_extinguisher, /obj/item/weapon/extinguisher/mini))
icon_state = "extinguisher_mini"
else
icon_state = "extinguisher_full"
else
icon_state = "extinguisher_empty"
+/obj/structure/extinguisher_cabinet/obj_break(damage_flag)
+ if(!broken && !(flags & NODECONSTRUCT))
+ broken = 1
+ opened = 0
+ update_icon()
+ if(stored_extinguisher)
+ stored_extinguisher.forceMove(loc)
+ stored_extinguisher = null
+
+
+/obj/structure/extinguisher_cabinet/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal (loc, 2)
+ if(stored_extinguisher)
+ stored_extinguisher.forceMove(loc)
+ stored_extinguisher = null
+ qdel(src)
+
/obj/item/wallframe/extinguisher_cabinet
name = "extinguisher cabinet frame"
desc = "Used for building wall-mounted extinguisher cabinets."
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 5de0247b4e2..9d7dfc42686 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -14,6 +14,8 @@
var/opening = 0
density = 1
opacity = 1
+ obj_integrity = 100
+ max_integrity = 100
canSmoothWith = list(
/turf/closed/wall,
@@ -65,14 +67,6 @@
air_update_turf(1)
opening = 0
-/obj/structure/falsewall/attack_animal(mob/living/simple_animal/user)
- if(user.environment_smash)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
- visible_message("[user] smashes [src] apart!")
- deconstruct()
-
/obj/structure/falsewall/proc/do_the_flick()
if(density)
smooth = SMOOTH_FALSE
@@ -128,18 +122,19 @@
else
return ..()
-/obj/structure/falsewall/proc/dismantle(mob/user, drop_girder)
+/obj/structure/falsewall/proc/dismantle(mob/user, disassembled = TRUE)
user.visible_message("[user] dismantles the false wall.", "You dismantle the false wall.")
playsound(src, 'sound/items/Welder.ogg', 100, 1)
- deconstruct(drop_girder)
+ deconstruct(disassembled)
-/obj/structure/falsewall/deconstruct(drop_girder)
- if(drop_girder)
- new girder_type(loc)
- if(mineral_amount)
- for(var/i in 1 to mineral_amount)
- new mineral(loc)
- ..()
+/obj/structure/falsewall/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(disassembled)
+ new girder_type(loc)
+ if(mineral_amount)
+ for(var/i in 1 to mineral_amount)
+ new mineral(loc)
+ qdel(src)
/obj/structure/falsewall/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
return 0
@@ -220,6 +215,8 @@
mineral = /obj/item/stack/sheet/mineral/diamond
walltype = /turf/closed/wall/mineral/diamond
canSmoothWith = list(/obj/structure/falsewall/diamond, /turf/closed/wall/mineral/diamond)
+ obj_integrity = 800
+ max_integrity = 800
/obj/structure/falsewall/plasma
name = "plasma wall"
diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm
index f7b3ce72098..aa127a88443 100644
--- a/code/game/objects/structures/fireaxe.dm
+++ b/code/game/objects/structures/fireaxe.dm
@@ -6,20 +6,37 @@
icon_state = "fireaxe"
anchored = 1
density = 0
- armor = list(melee = 50, bullet = 20, laser = 0, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 0, acid = 0)
+ armor = list(melee = 50, bullet = 20, laser = 0, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 90, acid = 50)
var/locked = 1
var/open = 0
- var/health = 60
+ obj_integrity = 150
+ max_integrity = 150
+ integrity_failure = 50
/obj/structure/fireaxecabinet/New()
..()
update_icon()
+/obj/structure/fireaxecabinet/Destroy()
+ if(fireaxe)
+ qdel(fireaxe)
+ fireaxe = null
+ return ..()
+
/obj/structure/fireaxecabinet/attackby(obj/item/I, mob/user, params)
if(iscyborg(user) || istype(I,/obj/item/device/multitool))
toggle_lock(user)
- return
- if(open || health <= 0)
+ else if(istype(I, /obj/item/stack/sheet/glass) && broken)
+ var/obj/item/stack/sheet/glass/G = I
+ if(G.get_amount() < 2)
+ user << "You need two glass sheets to fix [src]!"
+ return
+ user << "You start fixing [src]..."
+ if(do_after(user, 20, target = src) && G.use(2))
+ broken = 0
+ obj_integrity = max_integrity
+ update_icon()
+ else if(open || broken)
if(istype(I, /obj/item/weapon/twohanded/fireaxe) && !fireaxe)
var/obj/item/weapon/twohanded/fireaxe/F = I
if(F.wielded)
@@ -28,68 +45,56 @@
if(!user.drop_item())
return
fireaxe = F
- src.contents += F
+ F.forceMove(loc)
user << "You place the [F.name] back in the [name]."
update_icon()
return
- else if(health > 0)
+ else if(!broken)
toggle_open()
else
return ..()
-/obj/structure/fireaxecabinet/attacked_by(obj/item/I, mob/living/user)
- ..()
- take_damage(I.force, I.damtype)
-
-/obj/structure/fireaxecabinet/proc/take_damage(damage, damage_type, sound_effect = 1)
- if(open)
- return
+/obj/structure/fireaxecabinet/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- if(health <= 0)
- playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 90, 1)
- else
- playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
- if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- if(damage < 10)
- return
- if(health > 0)
- health -= damage
- update_icon()
- if(health <= 0)
- playsound(src, 'sound/effects/Glassbr3.ogg', 100, 1)
-
-
-/obj/structure/fireaxecabinet/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(50) && fireaxe)
- fireaxe.loc = src.loc
- qdel(src)
+ if(broken)
+ playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 90, 1)
else
- take_damage(rand(30,70), BRUTE, 0)
- if(3)
- take_damage(rand(10,30), BRUTE, 0)
+ playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
+ if(BURN)
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
-/obj/structure/fireaxecabinet/bullet_act(obj/item/projectile/P)
+/obj/structure/fireaxecabinet/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
+ if(open)
+ return
. = ..()
- take_damage(P.damage, P.damage_type, 0)
+ if(.)
+ update_icon()
+/obj/structure/fireaxecabinet/obj_break(damage_flag)
+ if(!broken && !(flags & NODECONSTRUCT))
+ update_icon()
+ broken = TRUE
+ playsound(src, 'sound/effects/Glassbr3.ogg', 100, 1)
+ new /obj/item/weapon/shard(loc)
+ new /obj/item/weapon/shard(loc)
+
+/obj/structure/fireaxecabinet/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(fireaxe && loc)
+ fireaxe.forceMove(loc)
+ fireaxe = null
+ new /obj/item/stack/sheet/metal(loc, 2)
+ qdel(src)
/obj/structure/fireaxecabinet/blob_act(obj/structure/blob/B)
if(fireaxe)
fireaxe.forceMove(loc)
+ fireaxe = null
qdel(src)
/obj/structure/fireaxecabinet/attack_hand(mob/user)
- if(open || health <= 0)
+ if(open || broken)
if(fireaxe)
user.put_in_hands(fireaxe)
fireaxe = null
@@ -108,20 +113,6 @@
/obj/structure/fireaxecabinet/attack_paw(mob/living/user)
attack_hand(user)
-/obj/structure/fireaxecabinet/attack_alien(mob/living/user)
- user.visible_message("[user] slashes [src].")
- take_damage(20)
-
-/obj/structure/fireaxecabinet/attack_animal(mob/living/simple_animal/M)
- if(!M.melee_damage_upper && !M.obj_damage)
- return
- M.visible_message("[M] smashes against [src].", \
- "You smash against [src].")
- if(M.obj_damage)
- take_damage(M.obj_damage, M.melee_damage_type)
- else
- take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type)
-
/obj/structure/fireaxecabinet/attack_ai(mob/user)
toggle_lock(user)
return
@@ -131,17 +122,19 @@
if(fireaxe)
add_overlay("axe")
if(!open)
- switch(health)
- if(-INFINITY to 0)
- add_overlay("glass4")
- if(1 to 20)
- add_overlay("glass3")
- if(21 to 40)
- add_overlay("glass2")
- if(41 to 59)
- add_overlay("glass1")
- if(60)
- add_overlay("glass")
+ var/hp_percent = obj_integrity/max_integrity * 100
+ if(broken)
+ add_overlay("glass4")
+ else
+ switch(hp_percent)
+ if(-INFINITY to 40)
+ add_overlay("glass3")
+ if(40 to 60)
+ add_overlay("glass2")
+ if(60 to 80)
+ add_overlay("glass1")
+ if(80 to INFINITY)
+ add_overlay("glass")
if(locked)
add_overlay("locked")
else
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index f9f4b0d0d95..d3b78110830 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -1,6 +1,7 @@
/obj/structure/flora
- resistance_flags = 0
- burntime = 30
+ resistance_flags = FLAMMABLE
+ obj_integrity = 150
+ max_integrity = 150
anchored = 1
//trees
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 82333932cbc..7209637f484 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -13,6 +13,8 @@
var/state = GIRDER_NORMAL
var/girderpasschance = 20 // percentage chance that a projectile passes through the girder.
var/can_displace = TRUE //If the girder can be moved around by wrenching it
+ obj_integrity = 200
+ max_integrity = 200
/obj/structure/girder/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
@@ -264,32 +266,11 @@
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSGRILLE)
-/obj/structure/girder/attack_animal(mob/living/simple_animal/M)
- if(M.environment_smash)
- if(state != GIRDER_DISPLACED)
- var/obj/structure/girder/displaced/D = new (loc)
- transfer_fingerprints_to(D)
- qdel(src)
-
-
-/obj/structure/girder/blob_act(obj/structure/blob/B)
- if(prob(40))
- qdel(src)
-
-/obj/structure/girder/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if (prob(70))
- var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
- new remains(loc)
- qdel(src)
- if(3)
- if (prob(40))
- var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
- new remains(loc)
- qdel(src)
+/obj/structure/girder/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
+ new remains(loc)
+ qdel(src)
/obj/structure/girder/narsie_act()
if(prob(25))
@@ -302,27 +283,17 @@
anchored = 0
state = GIRDER_DISPLACED
girderpasschance = 25
+ obj_integrity = 120
+ max_integrity = 120
/obj/structure/girder/reinforced
name = "reinforced girder"
icon_state = "reinforced"
state = GIRDER_REINF
girderpasschance = 0
+ obj_integrity = 350
+ max_integrity = 350
-/obj/structure/girder/reinforced/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if (prob(50))
- var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
- new remains(loc)
- qdel(src)
- if(3)
- if (prob(20))
- var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
- new remains(loc)
- qdel(src)
//////////////////////////////////////////// cult girder //////////////////////////////////////////////
@@ -396,15 +367,7 @@
/obj/structure/girder/cult/narsie_act()
return
-/obj/structure/girder/cult/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(30))
- new/obj/item/stack/sheet/runed_metal/(get_turf(src), 1)
- qdel(src)
- if(3)
- if(prob(5))
- new/obj/item/stack/sheet/runed_metal/(get_turf(src), 1)
- qdel(src)
+/obj/structure/girder/cult/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new/obj/item/stack/sheet/runed_metal/(get_turf(src), 1)
+ qdel(src)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index f3cbde713e8..e6365b97c83 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -8,9 +8,10 @@
flags = CONDUCT
pressure_resistance = 5*ONE_ATMOSPHERE
layer = BELOW_OBJ_LAYER
- var/health = 10
armor = list(melee = 50, bullet = 70, laser = 70, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 0, acid = 0)
- var/destroyed = 0
+ obj_integrity = 50
+ max_integrity = 50
+ integrity_failure = 20
var/obj/item/stack/rods/stored
/obj/structure/grille/New()
@@ -18,24 +19,13 @@
stored = new/obj/item/stack/rods(src)
stored.amount = 2
-/obj/structure/grille/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- else
- take_damage(rand(5,10), BRUTE, 0)
-
/obj/structure/grille/ratvar_act()
- if(destroyed)
+ if(broken)
new /obj/structure/grille/ratvar/broken(src.loc)
else
new /obj/structure/grille/ratvar(src.loc)
qdel(src)
-/obj/structure/grille/blob_act(obj/structure/blob/B)
- if(!destroyed)
- Break()
-
/obj/structure/grille/Bumped(atom/user)
if(ismob(user))
shock(user, 70)
@@ -44,10 +34,11 @@
/obj/structure/grille/attack_paw(mob/user)
attack_hand(user)
-/obj/structure/grille/attack_hulk(mob/living/carbon/human/user)
- ..(user, 1)
- shock(user, 70)
- take_damage(5)
+/obj/structure/grille/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
+ if(user.a_intent == "harm")
+ if(!shock(user, 70))
+ ..(user, 1)
+ return 1
/obj/structure/grille/attack_hand(mob/living/user)
user.changeNext_move(CLICK_CD_MELEE)
@@ -56,7 +47,7 @@
"You hit [src].", \
"You hear twisting metal.")
if(!shock(user, 70))
- take_damage(rand(1,2))
+ take_damage(rand(5,10), BRUTE, "melee", 1)
/obj/structure/grille/attack_alien(mob/living/user)
user.do_attack_animation(src)
@@ -65,36 +56,8 @@
"You mangle [src].", \
"You hear twisting metal.")
if(!shock(user, 70))
- take_damage(5)
+ take_damage(20, BRUTE, "melee", 1)
-/obj/structure/grille/attack_slime(mob/living/simple_animal/slime/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- if(!user.is_adult)
- return
-
- user.visible_message("[user] smashes against [src].", \
- "You smash against [src].", \
- "You hear twisting metal.")
- take_damage(rand(1,2))
-
-/obj/structure/grille/attack_animal(var/mob/living/simple_animal/M)
- M.changeNext_move(CLICK_CD_MELEE)
- if(!M.melee_damage_upper && !M.obj_damage || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
- return
- M.do_attack_animation(src)
- M.visible_message("[M] smashes against [src].", \
- "You smash against [src].", \
- "You hear twisting metal.")
- if(M.obj_damage)
- take_damage(M.obj_damage, M.melee_damage_type)
- else
- take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type)
-
-
-/obj/structure/grille/mech_melee_attack(obj/mecha/M)
- if(..())
- take_damage(M.force * 0.5, M.damtype)
/obj/structure/grille/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0) return 1
@@ -112,35 +75,13 @@
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSGRILLE)
-/obj/structure/grille/bullet_act(var/obj/item/projectile/Proj)
- . = ..()
- take_damage(Proj.damage*0.3, Proj.damage_type)
-
-/obj/structure/grille/Deconstruct()
- if(!loc) //if already qdel'd somehow, we do nothing
- return
- if(!(flags&NODECONSTRUCT))
- transfer_fingerprints_to(stored)
- var/turf/T = loc
- stored.loc = T
- ..()
-
-/obj/structure/grille/proc/Break()
- icon_state = "broken[initial(icon_state)]"
- density = 0
- destroyed = 1
- stored.amount = 1
- if(!(flags&NODECONSTRUCT))
- var/obj/item/stack/rods/newrods = new(loc)
- transfer_fingerprints_to(newrods)
-
/obj/structure/grille/attackby(obj/item/weapon/W, mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
add_fingerprint(user)
if(istype(W, /obj/item/weapon/wirecutters))
if(!shock(user, 100))
playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
- Deconstruct()
+ deconstruct()
else if((istype(W, /obj/item/weapon/screwdriver)) && (istype(loc, /turf) || anchored))
if(!shock(user, 90))
playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
@@ -148,21 +89,21 @@
user.visible_message("[user] [anchored ? "fastens" : "unfastens"] [src].", \
"You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor.")
return
- else if(istype(W, /obj/item/stack/rods) && destroyed)
+ else if(istype(W, /obj/item/stack/rods) && broken)
var/obj/item/stack/rods/R = W
if(!shock(user, 90))
user.visible_message("[user] rebuilds the broken grille.", \
"You rebuild the broken grille.")
- health = 10
+ obj_integrity = max_integrity
density = 1
- destroyed = 0
+ broken = 0
icon_state = initial(icon_state)
R.use(1)
return
//window placing begin
else if(istype(W, /obj/item/stack/sheet/rglass) || istype(W, /obj/item/stack/sheet/glass))
- if (!destroyed)
+ if (!broken)
var/obj/item/stack/ST = W
if (ST.get_amount() < 2)
user << "You need at least two sheets of glass for that!"
@@ -176,7 +117,7 @@
return
user << "You start placing the window..."
if(do_after(user,20, target = src))
- if(!src.loc || !anchored) //Grille destroyed or unanchored while waiting
+ if(!src.loc || !anchored) //Grille broken or unanchored while waiting
return
for(var/obj/structure/window/WINDOW in loc) //Another window already installed on grille
return
@@ -197,38 +138,41 @@
else if(istype(W, /obj/item/weapon/shard) || !shock(user, 70))
return ..()
-
-/obj/structure/grille/attacked_by(obj/item/I, mob/living/user)
- ..()
- take_damage(I.force * 0.3, I.damtype)
-
-/obj/structure/grille/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/structure/grille/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
- if(BURN)
- if(sound_effect)
- playsound(loc, 'sound/items/welder.ogg', 80, 1)
if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- else
- return
- health -= damage
- if(health <= 0)
- if(!destroyed)
- Break()
- else
- if(health <= -6)
- Deconstruct()
+ if(damage_amount)
+ playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
+ else
+ playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
+ if(BURN)
+ playsound(loc, 'sound/items/welder.ogg', 80, 1)
+
+
+/obj/structure/grille/deconstruct(disassembled = TRUE)
+ if(!loc) //if already qdel'd somehow, we do nothing
+ return
+ if(!(flags&NODECONSTRUCT))
+ transfer_fingerprints_to(stored)
+ var/turf/T = loc
+ stored.forceMove(T)
+ ..()
+
+/obj/structure/grille/obj_break()
+ if(!broken && !(flags & NODECONSTRUCT))
+ icon_state = "broken[initial(icon_state)]"
+ density = 0
+ broken = 1
+ stored.amount = 1
+ var/obj/item/stack/rods/newrods = new(loc)
+ transfer_fingerprints_to(newrods)
// shock user with probability prb (if all connections & power are working)
// returns 1 if shocked, 0 otherwise
/obj/structure/grille/proc/shock(mob/user, prb)
- if(!anchored || destroyed) // anchored/destroyed grilles are never connected
+ if(!anchored || broken) // anchored/broken grilles are never connected
return 0
if(!prob(prb))
return 0
@@ -247,27 +191,20 @@
return 0
/obj/structure/grille/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(!destroyed)
+ if(!broken)
if(exposed_temperature > T0C + 1500)
- take_damage(1)
+ take_damage(1, BURN, 0, 0)
..()
/obj/structure/grille/hitby(AM as mob|obj)
- ..()
- var/tforce = 0
- if(ismob(AM))
- tforce = 5
- else if(isobj(AM))
- if(prob(50))
- var/obj/item/I = AM
- tforce = max(0, I.throwforce * 0.5)
- else if(anchored && !destroyed)
+ 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(src.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.
- take_damage(tforce)
+ return ..()
/obj/structure/grille/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
return 0
@@ -275,8 +212,8 @@
/obj/structure/grille/broken // Pre-broken grilles for map placement
icon_state = "brokengrille"
density = 0
- health = 0
- destroyed = 1
+ obj_integrity = 20
+ broken = 1
/obj/structure/grille/broken/New()
..()
@@ -290,7 +227,7 @@
/obj/structure/grille/ratvar/New()
..()
change_construction_value(1)
- if(destroyed)
+ if(broken)
PoolOrNew(/obj/effect/overlay/temp/ratvar/grille/broken, get_turf(src))
else
PoolOrNew(/obj/effect/overlay/temp/ratvar/grille, get_turf(src))
@@ -312,8 +249,8 @@
/obj/structure/grille/ratvar/broken
density = 0
- health = 0
- destroyed = 1
+ obj_integrity = 20
+ broken = 1
/obj/structure/grille/ratvar/broken/New()
..()
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
new file mode 100644
index 00000000000..ac8ad9d02e0
--- /dev/null
+++ b/code/game/objects/structures/holosign.dm
@@ -0,0 +1,101 @@
+
+//holographic signs and barriers
+
+/obj/structure/holosign
+ name = "holo sign"
+ icon = 'icons/effects/effects.dmi'
+ anchored = 1
+ obj_integrity = 1
+ max_integrity = 1
+ armor = list(melee = 0, bullet = 50, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0, fire = 20, acid = 20)
+ var/obj/item/weapon/holosign_creator/projector
+
+/obj/structure/holosign/New(loc, source_projector)
+ if(source_projector)
+ projector = source_projector
+ projector.signs += src
+ ..()
+
+/obj/structure/holosign/Destroy()
+ if(projector)
+ projector.signs -= src
+ projector = null
+ return ..()
+
+/obj/structure/holosign/attack_hand(mob/living/user)
+ user.do_attack_animation(src)
+ user.changeNext_move(CLICK_CD_MELEE)
+ take_damage(5 , BRUTE, "melee", 1)
+
+/obj/structure/holosign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ playsound(loc, 'sound/weapons/Egloves.ogg', 80, 1)
+ if(BURN)
+ playsound(loc, 'sound/weapons/Egloves.ogg', 80, 1)
+
+
+/obj/structure/holosign/wetsign
+ name = "wet floor sign"
+ desc = "The words flicker as if they mean nothing."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "holosign"
+
+/obj/structure/holosign/barrier
+ name = "holo barrier"
+ desc = "A short holographic barrier which can only be passed by walking."
+ icon_state = "holosign_sec"
+ pass_flags = LETPASSTHROW
+ density = 1
+ obj_integrity = 20
+ max_integrity = 20
+ var/allow_walk = 1 //can we pass through it on walk intent
+
+/obj/structure/holosign/barrier/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(!density)
+ return 1
+ if(air_group || (height==0))
+ return 1
+ if(mover.pass_flags & (PASSGLASS|PASSTABLE|PASSGRILLE))
+ return 1
+ if(iscarbon(mover))
+ var/mob/living/carbon/C = mover
+ if(allow_walk && C.m_intent == "walk")
+ return 1
+
+/obj/structure/holosign/barrier/engineering
+ icon_state = "holosign_engi"
+
+/obj/structure/holosign/barrier/cyborg
+ name = "Energy Field"
+ desc = "A fragile energy field that blocks movement"
+ density = 1
+ obj_integrity = 1
+ max_integrity = 1
+ allow_walk = 0
+
+/obj/structure/holosign/barrier/cyborg/hacked
+ name = "Charged Energy Field"
+ desc = "A powerful energy field that blocks movement. Energy arcs off it"
+ obj_integrity = 10
+ max_integrity = 10
+ var/shockcd = 0
+
+/obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown()
+ shockcd = FALSE
+
+/obj/structure/holosign/barrier/cyborg/hacked/attack_hand(mob/living/user)
+ if(!shockcd)
+ if(ismob(user))
+ var/mob/living/M = user
+ M.electrocute_act(15,"Energy Barrier", safety=1)
+ shockcd = TRUE
+ addtimer(src, "cooldown", 10)
+
+/obj/structure/holosign/barrier/cyborg/hacked/Bumped(atom/user)
+ if(!shockcd)
+ if(ismob(user))
+ var/mob/living/M = user
+ M.electrocute_act(15,"Energy Barrier", safety=1)
+ shockcd = TRUE
+ addtimer(src, "cooldown", 10)
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index 56e81172352..99593f51ebe 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -7,6 +7,8 @@
desc = "The frame of a meat spike."
density = 1
anchored = 0
+ obj_integrity = 200
+ max_integrity = 200
/obj/structure/kitchenspike_frame/attackby(obj/item/I, mob/user, params)
add_fingerprint(user)
@@ -48,6 +50,8 @@
anchored = 1
buckle_lying = 0
can_buckle = 1
+ obj_integrity = 250
+ max_integrity = 250
/obj/structure/kitchenspike/attack_paw(mob/user)
@@ -60,10 +64,7 @@
playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
if(do_after(user, 20/I.toolspeed, target = src))
user << "You pry the spikes out of the frame."
- new /obj/item/stack/rods(loc, 4)
- var/obj/F = new /obj/structure/kitchenspike_frame(src.loc,)
- transfer_fingerprints_to(F)
- qdel(src)
+ deconstruct(TRUE)
else
user << "You can't do that while something's on the spike!"
else
@@ -136,3 +137,12 @@
unbuckle_mob(M,force=1)
M.emote("scream")
M.AdjustWeakened(10)
+
+/obj/structure/kitchenspike/deconstruct(disassembled = TRUE)
+ if(disassembled)
+ var/obj/F = new /obj/structure/kitchenspike_frame(src.loc,)
+ transfer_fingerprints_to(F)
+ else
+ new /obj/item/stack/sheet/metal(src.loc, 4)
+ new /obj/item/stack/rods(loc, 4)
+ qdel(src)
\ No newline at end of file
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index bf40a96002b..418243dd85b 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -5,7 +5,9 @@
icon_state = "lattice"
density = 0
anchored = 1
- armor = list(melee = 100, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 50)
+ obj_integrity = 50
+ max_integrity = 50
layer = LATTICE_LAYER //under pipes
var/obj/item/stack/rods/stored
canSmoothWith = list(/obj/structure/lattice,
@@ -30,37 +32,25 @@
/obj/structure/lattice/blob_act(obj/structure/blob/B)
return
-/obj/structure/lattice/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- return
- if(2)
- qdel(src)
- return
- if(3)
- return
- else
- return
-
/obj/structure/lattice/attackby(obj/item/C, mob/user, params)
if(istype(C, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = C
if(WT.remove_fuel(0, user))
user << "Slicing [name] joints ..."
- Deconstruct()
+ deconstruct()
else
var/turf/T = get_turf(src)
return T.attackby(C, user) //hand this off to the turf instead (for building plating, catwalks, etc)
-/obj/structure/lattice/Deconstruct()
- stored.loc = get_turf(src)
- stored = null
- ..()
+/obj/structure/lattice/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ stored.forceMove(get_turf(src))
+ stored = null
+ qdel(src)
/obj/structure/lattice/singularity_pull(S, current_size)
if(current_size >= STAGE_FOUR)
- Deconstruct()
+ deconstruct()
/obj/structure/lattice/catwalk
name = "catwalk"
@@ -73,12 +63,12 @@
/obj/structure/lattice/catwalk/Move()
var/turf/T = loc
for(var/obj/structure/cable/C in T)
- C.Deconstruct()
+ C.deconstruct()
..()
-/obj/structure/lattice/catwalk/Deconstruct()
+/obj/structure/lattice/catwalk/deconstruct()
var/turf/T = loc
for(var/obj/structure/cable/C in T)
- C.Deconstruct()
+ C.deconstruct()
..()
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 520aba8873e..d32b5e3b687 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -14,7 +14,9 @@
var/state = 0 //closed, 1 == open
var/isSwitchingStates = 0
var/close_delay = -1 //-1 if does not auto close.
- var/hardness = 1
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 50, acid = 50)
var/sheetType = /obj/item/stack/sheet/metal
var/sheetAmount = 7
var/openSound = 'sound/effects/stonedoor_openclose.ogg'
@@ -126,63 +128,33 @@
if(istype(W,/obj/item/weapon/pickaxe))
var/obj/item/weapon/pickaxe/digTool = W
user << "You start digging the [name]..."
- if(do_after(user,digTool.digspeed*hardness, target = src) && src)
+ if(do_after(user,digTool.digspeed*(1+round(max_integrity*0.01)), target = src) && src)
user << "You finish digging."
- Dismantle()
+ deconstruct(TRUE)
else if(user.a_intent != "harm")
attack_hand(user)
else
return ..()
-/obj/structure/mineral_door/attacked_by(obj/item/I, mob/user)
- ..()
- if(I.damtype != STAMINA)
- hardness -= I.force/100
- CheckHardness()
-
-/obj/structure/mineral_door/bullet_act(obj/item/projectile/Proj)
- hardness -= Proj.damage
- ..()
- CheckHardness()
-
-/obj/structure/mineral_door/proc/CheckHardness()
- if(hardness <= 0)
- Dismantle(1)
-
-/obj/structure/mineral_door/proc/Dismantle(devastated = 0)
+/obj/structure/mineral_door/deconstruct(disassembled = TRUE)
var/turf/T = get_turf(src)
- if(!devastated)
- for(var/i in 1 to sheetAmount)
- new sheetType(T)
+ if(disassembled)
+ new sheetType(T, sheetAmount)
else
- for(var/i in 3 to sheetAmount)
- new sheetType(T)
+ new sheetType(T, max(sheetAmount - 2, 1))
qdel(src)
-/obj/structure/mineral_door/ex_act(severity = 1)
- switch(severity)
- if(1)
- Dismantle(1)
- if(2)
- if(prob(20))
- Dismantle(1)
- else
- hardness--
- CheckHardness()
- if(3)
- hardness -= 0.1
- CheckHardness()
-
-
/obj/structure/mineral_door/iron
name = "iron door"
- hardness = 3
+ obj_integrity = 300
+ max_integrity = 300
/obj/structure/mineral_door/silver
name = "silver door"
icon_state = "silver"
sheetType = /obj/item/stack/sheet/mineral/silver
- hardness = 3
+ obj_integrity = 300
+ max_integrity = 300
/obj/structure/mineral_door/gold
name = "gold door"
@@ -193,14 +165,16 @@
name = "uranium door"
icon_state = "uranium"
sheetType = /obj/item/stack/sheet/mineral/uranium
- hardness = 3
+ obj_integrity = 300
+ max_integrity = 300
luminosity = 2
/obj/structure/mineral_door/sandstone
name = "sandstone door"
icon_state = "sandstone"
sheetType = /obj/item/stack/sheet/mineral/sandstone
- hardness = 0.5
+ obj_integrity = 100
+ max_integrity = 100
/obj/structure/mineral_door/transparent
opacity = 0
@@ -228,20 +202,21 @@
/obj/structure/mineral_door/transparent/plasma/proc/TemperatureAct()
atmos_spawn_air("plasma=500;TEMP=1000")
- Dismantle(1)
+ deconstruct(FALSE)
/obj/structure/mineral_door/transparent/diamond
name = "diamond door"
icon_state = "diamond"
sheetType = /obj/item/stack/sheet/mineral/diamond
- hardness = 10
+ obj_integrity = 1000
+ max_integrity = 1000
/obj/structure/mineral_door/wood
name = "wood door"
icon_state = "wood"
- hardness = 1
openSound = 'sound/effects/doorcreaky.ogg'
closeSound = 'sound/effects/doorcreaky.ogg'
sheetType = /obj/item/stack/sheet/mineral/wood
- resistance_flags = 0
- burntime = 30
+ resistance_flags = FLAMMABLE
+ obj_integrity = 200
+ max_integrity = 200
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index f6c5c6691d4..4df0630d7b9 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -6,11 +6,13 @@
icon_state = "mirror"
density = 0
anchored = 1
- var/shattered = 0
+ obj_integrity = 200
+ max_integrity = 200
+ integrity_failure = 100
/obj/structure/mirror/attack_hand(mob/user)
- if(shattered || !Adjacent(user))
+ if(broken || !Adjacent(user))
return
if(ishuman(user))
@@ -41,22 +43,23 @@
H.update_hair()
-/obj/structure/mirror/proc/shatter()
- icon_state = "mirror_broke"
- playsound(src, "shatter", 70, 1)
- desc = "Oh no, seven years of bad luck!"
- shattered = 1
-
-
-/obj/structure/mirror/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type, 0)
+/obj/structure/mirror/obj_break(damage_flag)
+ if(!broken && !(flags & NODECONSTRUCT))
+ icon_state = "mirror_broke"
+ playsound(src, "shatter", 70, 1)
+ desc = "Oh no, seven years of bad luck!"
+ broken = 1
+/obj/structure/mirror/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(!disassembled)
+ new /obj/item/weapon/shard( src.loc )
+ qdel(src)
/obj/structure/mirror/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/weldingtool) && user.a_intent != "harm")
var/obj/item/weapon/weldingtool/WT = I
- if(shattered)
+ if(broken)
user.changeNext_move(CLICK_CD_MELEE)
if(WT.remove_fuel(0, user))
user << "You begin repairing [src]..."
@@ -65,57 +68,19 @@
if(!user || !WT || !WT.isOn())
return
user << "You repair [src]."
- shattered = 0
+ broken = 0
icon_state = initial(icon_state)
desc = initial(desc)
else
return ..()
-/obj/structure/mirror/attacked_by(obj/item/I, mob/living/user)
- ..()
- take_damage(I.force, I.damtype)
-
-/obj/structure/mirror/ex_act(severity)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(50))
- qdel(src)
- else
- take_damage(5)
- if(3)
- if(prob(75))
- take_damage(5)
-
-/obj/structure/mirror/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/structure/mirror/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
+ playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
if(BURN)
- else
- return
- if(!shattered)
- if(damage)
- shatter()
- else if(sound_effect)
- playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
+ playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
-/obj/structure/mirror/proc/attack_generic(mob/living/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- user.visible_message("[user] smashes [src]!")
- take_damage(5)
-
-/obj/structure/mirror/attack_alien(mob/living/user)
- attack_generic(user)
-
-/obj/structure/mirror/attack_animal(mob/living/simple_animal/M)
- if(!M.melee_damage_upper && !M.obj_damage)
- return
- attack_generic(M)
-
-/obj/structure/mirror/attack_slime(mob/living/user)
- attack_generic(user)
/obj/structure/mirror/magic
name = "magic mirror"
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index c16ae3f1401..5f1441e38f5 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -17,6 +17,8 @@
icon_state = "morgue1"
density = 1
anchored = 1
+ obj_integrity = 400
+ max_integrity = 400
var/obj/structure/tray/connected = null
var/locked = 0
@@ -77,6 +79,10 @@
else
return ..()
+/obj/structure/bodycontainer/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/metal (loc, 5)
+ qdel(src)
+
/obj/structure/bodycontainer/container_resist()
open()
@@ -202,9 +208,10 @@ var/global/list/crematoriums = new/list()
new /obj/effect/decal/cleanable/ash(src)
sleep(30)
- locked = 0
- update_icon()
- playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) //you horrible people
+ if(!qdeleted(src))
+ locked = 0
+ update_icon()
+ playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) //you horrible people
/*
@@ -219,6 +226,8 @@ var/global/list/crematoriums = new/list()
var/obj/structure/bodycontainer/connected = null
anchored = 1
pass_flags = LETPASSTHROW
+ obj_integrity = 350
+ max_integrity = 350
/obj/structure/tray/Destroy()
if(connected)
@@ -227,6 +236,10 @@ var/global/list/crematoriums = new/list()
connected = null
return ..()
+/obj/structure/tray/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/metal (loc, 2)
+ qdel(src)
+
/obj/structure/tray/attack_paw(mob/user)
return src.attack_hand(user)
diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm
index de2b2a7d24e..c58b11f2186 100644
--- a/code/game/objects/structures/noticeboard.dm
+++ b/code/game/objects/structures/noticeboard.dm
@@ -5,6 +5,8 @@
icon_state = "nboard00"
density = 0
anchored = 1
+ obj_integrity = 150
+ max_integrity = 150
var/notices = 0
/obj/structure/noticeboard/initialize()
@@ -76,4 +78,8 @@
else
usr << browse("[P.name][P.info]", "window=[P.name]")
onclose(usr, "[P.name]")
- return
+
+/obj/structure/noticeboard/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal (loc, 1)
+ qdel(src)
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index bf634f55443..5ee7786c3a9 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -4,17 +4,24 @@
opacity = 0
density = 0
layer = SIGN_LAYER
+ obj_integrity = 100
+ max_integrity = 100
+ armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/structure/sign/basic
name = "blank sign"
desc = "How can signs be real if our eyes aren't real?"
icon_state = "backing"
-/obj/structure/sign/ex_act(severity, target)
- qdel(src)
-
-/obj/structure/sign/blob_act(obj/structure/blob/B)
- qdel(src)
+/obj/structure/sign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(damage_amount)
+ playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
+ else
+ playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
+ if(BURN)
+ playsound(loc, 'sound/items/welder.ogg', 80, 1)
/obj/structure/sign/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/wrench))
@@ -87,7 +94,7 @@
icon = 'icons/obj/decals.dmi'
icon_state = "backing"
w_class = 3
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/sign_path = /obj/structure/sign/basic //the type of sign that will be created when placed on a turf
/obj/item/sign_backing/afterattack(atom/target, mob/user, proximity)
@@ -105,6 +112,8 @@
/obj/structure/sign/map
name = "station map"
desc = "A framed picture of the station."
+ obj_integrity = 500
+ max_integrity = 500
/obj/structure/sign/map/left
icon_state = "map-left"
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index acbaa96531b..fdf0ca8a919 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -8,7 +8,7 @@
icon_state = ""
density = 1
anchored = 0
- var/health = 100
+ obj_integrity = 100
var/oreAmount = 7
var/mineralType = "metal"
@@ -53,7 +53,7 @@
return
user.visible_message("[user] slices apart the [name].", \
"You slice apart the [name].")
- Dismantle(1)
+ deconstruct(FALSE)
else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer))
var/obj/item/weapon/pickaxe/drill/jackhammer/D = W
@@ -74,14 +74,10 @@
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
user.visible_message("[user] slices apart the [name].", \
"You slice apart the [name]!")
- Dismantle(1)
+ deconstruct(FALSE)
else
return ..()
-/obj/structure/statue/attacked_by(obj/item/I, mob/living/user)
- ..()
- take_damage(I.force, I.damtype)
-
/obj/structure/statue/attack_hand(mob/living/user)
user.changeNext_move(CLICK_CD_MELEE)
add_fingerprint(user)
@@ -91,62 +87,33 @@
/obj/structure/statue/CanAtmosPass()
return !density
-/obj/structure/statue/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type, 0)
-
-/obj/structure/statue/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- if(sound_effect)
- playsound(loc, 'sound/items/Welder.ogg', 40, 1)
+/obj/structure/statue/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(disassembled)
+ if (mineralType == "metal")
+ var/ore = /obj/item/stack/sheet/metal
+ for(var/i = 1, i <= oreAmount, i++)
+ new ore(get_turf(src))
+ else
+ var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
+ for(var/i = 1, i <= oreAmount, i++)
+ new ore(get_turf(src))
else
- return
- health -= damage
- if(health <= 0)
- Dismantle(1)
-
-/obj/structure/statue/proc/Dismantle(devastated = 0)
- if(!devastated)
- if (mineralType == "metal")
- var/ore = /obj/item/stack/sheet/metal
- for(var/i = 1, i <= oreAmount, i++)
- new ore(get_turf(src))
- else
- var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
- for(var/i = 1, i <= oreAmount, i++)
- new ore(get_turf(src))
- else
- if (mineralType == "metal")
- var/ore = /obj/item/stack/sheet/metal
- for(var/i = 3, i <= oreAmount, i++)
- new ore(get_turf(src))
- else
- var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
- for(var/i = 3, i <= oreAmount, i++)
- new ore(get_turf(src))
+ if (mineralType == "metal")
+ var/ore = /obj/item/stack/sheet/metal
+ for(var/i = 3, i <= oreAmount, i++)
+ new ore(get_turf(src))
+ else
+ var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
+ for(var/i = 3, i <= oreAmount, i++)
+ new ore(get_turf(src))
qdel(src)
-/obj/structure/statue/ex_act(severity = 1)
- switch(severity)
- if(1)
- Dismantle(1)
- if(2)
- take_damage(rand(60,110), BRUTE, 0)
- if(3)
- take_damage(10, BRUTE, 0)
-
//////////////////////////////////////STATUES/////////////////////////////////////////////////////////////
////////////////////////uranium///////////////////////////////////
/obj/structure/statue/uranium
- health = 300
+ obj_integrity = 300
luminosity = 2
mineralType = "uranium"
var/last_event = 0
@@ -191,7 +158,7 @@
////////////////////////////plasma///////////////////////////////////////////////////////////////////////
/obj/structure/statue/plasma
- health = 200
+ obj_integrity = 200
mineralType = "plasma"
desc = "This statue is suitably made from plasma."
@@ -231,7 +198,7 @@
/obj/structure/statue/plasma/proc/PlasmaBurn()
atmos_spawn_air("plasma=400;TEMP=1000")
- Dismantle(1)
+ deconstruct(FALSE)
/obj/structure/statue/plasma/proc/ignite(exposed_temperature)
if(exposed_temperature > 300)
@@ -240,7 +207,7 @@
//////////////////////gold///////////////////////////////////////
/obj/structure/statue/gold
- health = 300
+ obj_integrity = 300
mineralType = "gold"
desc = "This is a highly valuable statue made from gold."
@@ -267,7 +234,7 @@
//////////////////////////silver///////////////////////////////////////
/obj/structure/statue/silver
- health = 300
+ obj_integrity = 300
mineralType = "silver"
desc = "This is a valuable statue made from silver."
@@ -294,7 +261,7 @@
/////////////////////////diamond/////////////////////////////////////////
/obj/structure/statue/diamond
- health = 1000
+ obj_integrity = 1000
mineralType = "diamond"
desc = "This is a very expensive diamond statue"
@@ -313,7 +280,7 @@
////////////////////////bananium///////////////////////////////////////
/obj/structure/statue/bananium
- health = 300
+ obj_integrity = 300
mineralType = "bananium"
desc = "A bananium statue with a small engraving:'HOOOOOOONK'."
var/spam_flag = 0
@@ -348,7 +315,7 @@
/////////////////////sandstone/////////////////////////////////////////
/obj/structure/statue/sandstone
- health = 50
+ obj_integrity = 50
mineralType = "sandstone"
/obj/structure/statue/sandstone/assistant
@@ -366,7 +333,7 @@
/////////////////////snow/////////////////////////////////////////
/obj/structure/statue/snow
- health = 50
+ obj_integrity = 50
mineralType = "snow"
/obj/structure/statue/snow/snowman
diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm
index 5a86a818633..e6affabaab5 100644
--- a/code/game/objects/structures/table_frames.dm
+++ b/code/game/objects/structures/table_frames.dm
@@ -17,6 +17,8 @@
density = 0
anchored = 0
layer = PROJECTILE_HIT_THRESHHOLD_LAYER
+ obj_integrity = 100
+ max_integrity = 100
var/framestack = /obj/item/stack/rods
var/framestackamount = 2
@@ -26,9 +28,7 @@
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
if(do_after(user, 30/I.toolspeed, target = src))
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- for(var/i = 1, i <= framestackamount, i++)
- new framestack(get_turf(src))
- qdel(src)
+ deconstruct(TRUE)
else if(istype(I, /obj/item/stack/sheet/plasteel))
var/obj/item/stack/sheet/plasteel/P = I
if(P.get_amount() < 1)
@@ -77,6 +77,10 @@
else
return ..()
+/obj/structure/table_frame/deconstruct(disassembled = TRUE)
+ new framestack(get_turf(src), framestackamount)
+ qdel(src)
+
/obj/structure/table_frame/narsie_act()
if(prob(20))
new /obj/structure/table_frame/wood(src.loc)
@@ -96,7 +100,7 @@
icon_state = "wood_frame"
framestack = /obj/item/stack/sheet/mineral/wood
framestackamount = 2
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/structure/table_frame/wood/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/stack/sheet/mineral/wood))
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 067ea45c404..14c70be238a 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -29,7 +29,9 @@
var/buildstackamount = 1
var/framestackamount = 2
var/deconstruction_ready = 1
- var/health = 100
+ obj_integrity = 100
+ max_integrity = 100
+ integrity_failure = 30
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced)
@@ -44,18 +46,6 @@
queue_smooth(src)
queue_smooth_neighbors(src)
-/obj/structure/table/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- take_damage(rand(80,120), BRUTE, 0)
- if(3)
- take_damage(rand(40,80), BRUTE, 0)
-
-/obj/structure/table/blob_act(obj/structure/blob/B)
- take_damage(rand(75,150), BRUTE, 0)
-
/obj/structure/table/narsie_act()
if(prob(20))
new /obj/structure/table/wood(src.loc)
@@ -63,44 +53,10 @@
/obj/structure/table/ratvar_act()
new /obj/structure/table/reinforced/brass(src.loc)
-/obj/structure/table/mech_melee_attack(obj/mecha/M)
- playsound(src.loc, 'sound/weapons/punch4.ogg', 50, 1)
- visible_message("[M.name] smashes [src]!")
- take_damage(200, M.damtype, 0)
-
-/obj/structure/table/attack_alien(mob/living/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- playsound(src.loc, 'sound/weapons/bladeslice.ogg', 50, 1)
- visible_message("[user] slices [src]!")
- take_damage(100, BRUTE, 0)
-
-
-/obj/structure/table/attack_animal(mob/living/simple_animal/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- if(user.melee_damage_upper || user.obj_damage)
- var/dmg_dealt = user.melee_damage_upper
- if(user.obj_damage)
- dmg_dealt = user.obj_damage
- if(user.environment_smash)
- dmg_dealt = 100
- visible_message("[user] smashes [src]!")
- playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1)
- take_damage(dmg_dealt, user.melee_damage_type, 0)
-
/obj/structure/table/attack_paw(mob/user)
attack_hand(user)
-/obj/structure/table/attack_hulk(mob/living/carbon/human/user)
- ..(user, 1)
- playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
- visible_message("[user] smashes [src]!")
- user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- take_damage(rand(180,280), BRUTE, 0)
- return 1
-
/obj/structure/table/attack_hand(mob/living/user)
if(user.a_intent == "grab" && user.pulling && isliving(user.pulling))
var/mob/living/pushed_mob = user.pulling
@@ -118,10 +74,6 @@
/obj/structure/table/attack_tk() // no telehulk sorry
return
-/obj/structure/table/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type, 0)
-
/obj/structure/table/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0)
return 1
@@ -151,11 +103,18 @@
/obj/structure/table/attackby(obj/item/I, mob/user, params)
if(!(flags & NODECONSTRUCT))
if(istype(I, /obj/item/weapon/screwdriver) && deconstruction_ready)
- table_deconstruct(user, 1)
+ user << "You start disassembling [src]..."
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20, target = src))
+ deconstruct(TRUE)
return
if(istype(I, /obj/item/weapon/wrench) && deconstruction_ready)
- table_deconstruct(user, 0)
+ user << "You start deconstructing [src]..."
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ if(do_after(user, 40, target = src))
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ deconstruct(TRUE, 1)
return
if(istype(I, /obj/item/weapon/storage/bag/tray))
@@ -185,62 +144,18 @@
else
return ..()
-/obj/structure/table/attacked_by(obj/item/I, mob/living/user)
- ..()
- take_damage(I.force, I.damtype)
-/obj/structure/table/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- if(sound_effect)
- playsound(loc, 'sound/items/Welder.ogg', 40, 1)
- else
- return
- health -= damage
- if(health <= 0)
- table_destroy()
-
-/*
- * TABLE DESTRUCTION/DECONSTRUCTION
- */
-
-
-
-/obj/structure/table/proc/table_destroy()
+/obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
if(!(flags & NODECONSTRUCT))
var/turf/T = get_turf(src)
- for(var/i = 1, i <= framestackamount, i++)
- new framestack(T)
- for(var/i = 1, i <= buildstackamount, i++)
- new buildstack(T)
+ new buildstack(T, buildstackamount)
+ if(!wrench_disassembly)
+ new frame(T)
+ else
+ new framestack(T, framestackamount)
qdel(src)
-/obj/structure/table/proc/table_deconstruct(mob/user, disassembling = 0)
- if(flags & NODECONSTRUCT)
- return
- if(disassembling)
- user << "You start disassembling [src]..."
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
- new frame(src.loc)
- for(var/i = 1, i <= buildstackamount, i++)
- new buildstack(get_turf(src))
- qdel(src)
- else
- user << "You start deconstructing [src]..."
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 40, target = src))
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- table_destroy()
-
-
/*
* Glass tables
*/
@@ -251,7 +166,10 @@
icon_state = "glass_table"
buildstack = /obj/item/stack/sheet/glass
canSmoothWith = null
- health = 50
+ obj_integrity = 70
+ max_integrity = 70
+ resistance_flags = ACID_PROOF
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 100)
var/list/debris = list()
/obj/structure/table/glass/New()
@@ -298,6 +216,20 @@
M.Weaken(5)
qdel(src)
+/obj/structure/table/glass/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
+ if(!(flags & NODECONSTRUCT))
+ if(disassembled)
+ ..()
+ return
+ else
+ var/turf/T = get_turf(src)
+ playsound(T, "shatter", 50, 1)
+ for(var/X in debris)
+ var/atom/movable/AM = X
+ AM.forceMove(T)
+ debris -= AM
+ qdel(src)
+
/obj/structure/table/glass/narsie_act()
color = NARSIE_WINDOW_COLOUR
for(var/obj/item/weapon/shard/S in debris)
@@ -315,8 +247,9 @@
frame = /obj/structure/table_frame/wood
framestack = /obj/item/stack/sheet/mineral/wood
buildstack = /obj/item/stack/sheet/mineral/wood
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 70
+ max_integrity = 70
canSmoothWith = list(/obj/structure/table/wood,
/obj/structure/table/wood/poker,
/obj/structure/table/wood/bar)
@@ -348,10 +281,6 @@
icon = 'icons/obj/smooth_structures/fancy_table.dmi' //so that the tables place correctly in the map editor
..()
-/obj/structure/table/wood/fancy/burn() //basically made out of metal
- new frame(loc)
- qdel(src)
-
/*
* Reinforced tables
*/
@@ -363,8 +292,10 @@
deconstruction_ready = 0
buildstack = /obj/item/stack/sheet/plasteel
canSmoothWith = list(/obj/structure/table/reinforced, /obj/structure/table)
- health = 200
- armor = list(melee = 10, bullet = 10, laser = 10, energy = 100, bomb = 20, bio = 0, rad = 0, fire = 0, acid = 70)
+ obj_integrity = 200
+ max_integrity = 200
+ integrity_failure = 50
+ armor = list(melee = 10, bullet = 30, laser = 30, energy = 100, bomb = 20, bio = 0, rad = 0, fire = 80, acid = 70)
/obj/structure/table/reinforced/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/weldingtool))
@@ -406,7 +337,7 @@
animate(src, color = previouscolor, time = 8)
/obj/structure/table/reinforced/brass/ratvar_act()
- health = initial(health)
+ obj_integrity = max_integrity
/*
* Surgery Tables
@@ -463,27 +394,8 @@
density = 1
anchored = 1
pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.
- var/health = 20
-
-/obj/structure/rack/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(50))
- rack_destroy()
- else
- qdel(src)
- if(3)
- take_damage(rand(5,25), BRUTE, 0)
-
-/obj/structure/rack/blob_act(obj/structure/blob/B)
- rack_destroy()
-
-
-/obj/structure/rack/mech_melee_attack(obj/mecha/M)
- if(..())
- take_damage(M.force*2)
+ obj_integrity = 20
+ max_integrity = 20
/obj/structure/rack/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0) return 1
@@ -512,7 +424,7 @@
/obj/structure/rack/attackby(obj/item/weapon/W, mob/user, params)
if (istype(W, /obj/item/weapon/wrench) && !(flags&NODECONSTRUCT))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- rack_destroy()
+ deconstruct(TRUE)
return
if(user.a_intent == "harm")
return ..()
@@ -520,78 +432,35 @@
W.Move(loc)
return 1
-/obj/structure/rack/attacked_by(obj/item/I, mob/living/user)
- ..()
- take_damage(I.force, I.damtype)
-
/obj/structure/rack/attack_paw(mob/living/user)
attack_hand(user)
-/obj/structure/rack/attack_hulk(mob/living/carbon/human/user)
- ..(user, 1)
- rack_destroy()
- return 1
-
/obj/structure/rack/attack_hand(mob/living/user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
user.visible_message("[user] kicks [src].", \
"You kick [src].")
- take_damage(rand(4,8), BRUTE)
-
-/obj/structure/rack/attack_alien(mob/living/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- playsound(src.loc, 'sound/weapons/bladeslice.ogg', 50, 1)
- visible_message("[user] slices [src] apart.")
- rack_destroy()
-
-
-/obj/structure/rack/attack_animal(mob/living/simple_animal/user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- if(user.melee_damage_upper || user.obj_damage)
- var/dmg_dealt = user.melee_damage_upper
- if(user.obj_damage)
- dmg_dealt = user.obj_damage
- if(user.environment_smash)
- playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
- visible_message("[user] smashes [src] apart.")
- rack_destroy()
- else
- take_damage(dmg_dealt, user.melee_damage_type)
+ take_damage(rand(4,8), BRUTE, "melee", 1)
/obj/structure/rack/attack_tk() // no telehulk sorry
return
-/obj/structure/rack/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type, 0)
-
-/obj/structure/rack/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/structure/rack/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/items/dodgeball.ogg', 80, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
+ if(damage_amount)
+ playsound(loc, 'sound/items/dodgeball.ogg', 80, 1)
+ else
+ playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
if(BURN)
- if(sound_effect)
- playsound(loc, 'sound/items/Welder.ogg', 40, 1)
- else
- return
- health -= damage
- if(health <= 0)
- rack_destroy()
-
+ playsound(loc, 'sound/items/Welder.ogg', 40, 1)
/*
* Rack destruction
*/
-/obj/structure/rack/proc/rack_destroy()
+/obj/structure/rack/deconstruct(disassembled = TRUE)
if(!(flags&NODECONSTRUCT))
density = 0
var/obj/item/weapon/rack_parts/newparts = new(loc)
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index 17c4d9861ac..1a95786b56a 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -7,6 +7,8 @@
icon_state = "dispenser"
density = 1
anchored = 1
+ obj_integrity = 300
+ max_integrity = 300
var/oxygentanks = TANK_DISPENSER_CAPACITY
var/plasmatanks = TANK_DISPENSER_CAPACITY
@@ -48,6 +50,9 @@
oxygentanks++
else
full = TRUE
+ else if(istype(I, /obj/item/weapon/wrench))
+ default_unfasten_wrench(user, I, time = 20)
+ return
else if(user.a_intent != "harm")
user << "[I] does not fit into [src]."
return
@@ -95,4 +100,13 @@
. = TRUE
update_icon()
+
+/obj/structure/tank_dispenser/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ for(var/X in src)
+ var/obj/item/I = X
+ I.forceMove(loc)
+ new /obj/item/stack/sheet/metal (loc, 2)
+ qdel(src)
+
#undef TANK_DISPENSER_CAPACITY
\ No newline at end of file
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 69f0fbc1fbd..35f7a4c56f1 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -274,6 +274,7 @@
if(istype(O,/obj/item))
var/obj/item/I = O
+ I.acid_level = 0
I.extinguish()
@@ -371,6 +372,9 @@
else
wash_obj(G)
+/obj/machinery/shower/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/metal (loc, 3)
+ qdel(src)
/obj/machinery/shower/proc/check_heat(mob/living/carbon/C)
if(watertemp == "freezing")
@@ -494,12 +498,18 @@
return 1
busy = 0
O.clean_blood()
+ O.acid_level = 0
user.visible_message("[user] washes [O] using [src].", \
"You wash [O] using [src].")
return 1
else
return ..()
+/obj/structure/sink/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/metal (loc, 3)
+ qdel(src)
+
+
/obj/structure/sink/kitchen
name = "kitchen sink"
@@ -538,7 +548,6 @@
density = 0
var/open = TRUE
-
/obj/structure/curtain/proc/toggle()
open = !open
update_icon()
@@ -561,3 +570,16 @@
toggle()
..()
+/obj/structure/curtain/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/cloth (loc, 3)
+ qdel(src)
+
+/obj/structure/curtain/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(damage_amount)
+ playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
+ else
+ playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
+ if(BURN)
+ playsound(loc, 'sound/items/welder.ogg', 80, 1)
\ No newline at end of file
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index f6a9cd7b922..008ae109c1d 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -7,8 +7,8 @@
pressure_resistance = 4*ONE_ATMOSPHERE
anchored = 1 //initially is 0 for tile smoothing
flags = ON_BORDER
- var/maxhealth = 25
- var/health = 0
+ max_integrity = 25
+ obj_integrity = 25
var/ini_dir = null
var/state = 0
var/reinf = 0
@@ -19,6 +19,8 @@
var/image/crack_overlay
var/list/debris = list()
can_be_unanchored = 1
+ resistance_flags = ACID_PROOF
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 100)
/obj/structure/window/examine(mob/user)
..()
@@ -26,7 +28,7 @@
/obj/structure/window/New(Loc,re=0)
..()
- health = maxhealth
+ obj_integrity = max_integrity
if(re)
reinf = re
if(reinf)
@@ -52,22 +54,6 @@
debris += new /obj/item/stack/rods(src, rods)
-/obj/structure/window/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type, 0)
-
-/obj/structure/window/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- shatter()
- if(3)
- take_damage(rand(25,75), BRUTE, 0)
-
-/obj/structure/window/blob_act(obj/structure/blob/B)
- take_damage(rand(75,150), BRUTE, 0)
-
/obj/structure/window/narsie_act()
color = NARSIE_WINDOW_COLOUR
for(var/obj/item/weapon/shard/shard in debris)
@@ -82,7 +68,7 @@
/obj/structure/window/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
- shatter()
+ deconstruct(FALSE)
/obj/structure/window/setDir(direct)
if(!fulltile)
@@ -106,35 +92,16 @@
return 0
return 1
-
-/obj/structure/window/hitby(AM as mob|obj)
- ..()
- var/tforce = 0
- if(ismob(AM))
- tforce = 40
-
- else if(isobj(AM))
- var/obj/item/I = AM
- tforce = I.throwforce
- if(reinf)
- tforce *= 0.25
- take_damage(tforce)
-
/obj/structure/window/attack_tk(mob/user)
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("Something knocks on [src].")
add_fingerprint(user)
playsound(loc, 'sound/effects/Glassknock.ogg', 50, 1)
-/obj/structure/window/attack_hulk(mob/living/carbon/human/user)
+/obj/structure/window/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(!can_be_reached(user))
- return
- ..(user, 1)
- user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
- user.visible_message("[user] smashes through [src]!")
- add_fingerprint(user)
- take_damage(50)
- return 1
+ return 1
+ ..()
/obj/structure/window/attack_hand(mob/user)
if(!can_be_reached(user))
@@ -148,31 +115,10 @@
return attack_hand(user)
-/obj/structure/window/proc/attack_generic(mob/user, damage = 0, damage_type = BRUTE) //used by attack_alien, attack_animal, and attack_slime
+/obj/structure/window/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) //used by attack_alien, attack_animal, and attack_slime
if(!can_be_reached(user))
return
- user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
- user.visible_message("[user] smashes into [src]!")
- take_damage(damage, damage_type)
-
-/obj/structure/window/attack_alien(mob/living/user)
- attack_generic(user, 15)
-
-/obj/structure/window/attack_animal(mob/living/simple_animal/M)
- if(!M.melee_damage_upper && !M.obj_damage)
- return
- if(M.obj_damage)
- attack_generic(M, M.obj_damage, M.melee_damage_type)
- else
- attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
-
-
-/obj/structure/window/attack_slime(mob/living/simple_animal/slime/user)
- if(!user.is_adult)
- return
- attack_generic(user, rand(10, 15))
-
+ ..()
/obj/structure/window/attackby(obj/item/I, mob/living/user, params)
if(!can_be_reached(user))
@@ -181,12 +127,12 @@
add_fingerprint(user)
if(istype(I, /obj/item/weapon/weldingtool) && user.a_intent == "help")
var/obj/item/weapon/weldingtool/WT = I
- if(health < maxhealth)
+ if(obj_integrity < max_integrity)
if(WT.remove_fuel(0,user))
user << "You begin repairing [src]..."
playsound(loc, 'sound/items/Welder.ogg', 40, 1)
if(do_after(user, 40/I.toolspeed, target = src))
- health = maxhealth
+ obj_integrity = max_integrity
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
update_nearby_icons()
user << "You repair [src]."
@@ -256,14 +202,10 @@
return
return ..()
-
-/obj/structure/window/attacked_by(obj/item/I, mob/living/user)
- ..()
- take_damage(I.force, I.damtype)
-
/obj/structure/window/mech_melee_attack(obj/mecha/M)
- if(..())
- take_damage(M.force, M.damtype)
+ if(!can_be_reached())
+ return
+ ..()
/obj/structure/window/proc/can_be_reached(mob/user)
@@ -274,35 +216,35 @@
return 0
return 1
-/obj/structure/window/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- if(reinf)
- damage *= 0.5
+/obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
+ . = ..()
+ if(.) //received damage
+ update_nearby_icons()
+
+/obj/structure/window/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
+ if(damage_amount)
+ playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ else
+ playsound(src, 'sound/weapons/tap.ogg', 50, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- health -= damage
- update_nearby_icons()
- if(health <= 0)
- shatter()
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
-/obj/structure/window/proc/shatter()
+
+/obj/structure/window/deconstruct(disassembled = TRUE)
if(qdeleted(src))
return
- playsound(src, "shatter", 70, 1)
- var/turf/T = loc
+ if(!disassembled)
+ playsound(src, "shatter", 70, 1)
+ var/turf/T = loc
- if(!(flags & NODECONSTRUCT))
- for(var/i in debris)
- var/obj/item/I = i
+ if(!(flags & NODECONSTRUCT))
+ for(var/i in debris)
+ var/obj/item/I = i
- I.loc = T
- transfer_fingerprints_to(I)
+ I.loc = T
+ transfer_fingerprints_to(I)
qdel(src)
update_nearby_icons()
@@ -402,7 +344,7 @@
if(!fulltile)
return
- var/ratio = health / maxhealth
+ var/ratio = obj_integrity / max_integrity
ratio = Ceiling(ratio*4) * 25
if(smooth)
@@ -416,7 +358,7 @@
/obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > T0C + (reinf ? 1600 : 800))
- take_damage(round(exposed_volume / 100), BURN, 0)
+ take_damage(round(exposed_volume / 100), BURN, 0, 0)
..()
/obj/structure/window/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
@@ -434,8 +376,8 @@
name = "reinforced window"
icon_state = "rwindow"
reinf = 1
- armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 100, fire = 0, acid = 0)
- maxhealth = 50
+ armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 100, fire = 80, acid = 100)
+ max_integrity = 50
explosion_block = 1
/obj/structure/window/reinforced/tinted
@@ -448,13 +390,13 @@
icon_state = "fwindow"
-/* Full Tile Windows (more health) */
+/* Full Tile Windows (more obj_integrity) */
/obj/structure/window/fulltile
icon = 'icons/obj/smooth_structures/window.dmi'
icon_state = "window"
dir = NORTHEAST
- maxhealth = 50
+ max_integrity = 50
fulltile = 1
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile)
@@ -463,7 +405,7 @@
icon = 'icons/obj/smooth_structures/reinforced_window.dmi'
icon_state = "r_window"
dir = NORTHEAST
- maxhealth = 100
+ max_integrity = 100
fulltile = 1
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile)
@@ -481,7 +423,7 @@
/obj/structure/window/reinforced/fulltile/ice
icon = 'icons/obj/smooth_structures/rice_window.dmi'
icon_state = "ice_window"
- maxhealth = 150
+ max_integrity = 150
canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/reinforced/fulltile/ice)
level = 3
@@ -491,11 +433,11 @@
icon = 'icons/obj/smooth_structures/shuttle_window.dmi'
icon_state = "shuttle_window"
dir = NORTHEAST
- maxhealth = 100
+ max_integrity = 100
wtype = "shuttle"
fulltile = 1
reinf = 1
- armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 100, fire = 0, acid = 0)
+ armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 100, fire = 80, acid = 100)
smooth = SMOOTH_TRUE
canSmoothWith = null
explosion_block = 1
@@ -512,7 +454,7 @@
desc = "A paper-thin pane of translucent yet reinforced brass."
icon = 'icons/obj/smooth_structures/clockwork_window.dmi'
icon_state = "clockwork_window_single"
- maxhealth = 100
+ max_integrity = 100
explosion_block = 2 //fancy AND hard to destroy. the most useful combination.
var/made_glow = FALSE
@@ -546,7 +488,7 @@
return ..()
/obj/structure/window/reinforced/clockwork/ratvar_act()
- health = maxhealth
+ obj_integrity = max_integrity
update_icon()
return 0
@@ -563,4 +505,4 @@
canSmoothWith = null
fulltile = 1
dir = NORTHEAST
- maxhealth = 150
+ max_integrity = 150
diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm
index 086ab95e10c..6fae87f145f 100644
--- a/code/game/shuttle_engines.dm
+++ b/code/game/shuttle_engines.dm
@@ -2,6 +2,7 @@
/obj/structure/shuttle
name = "shuttle"
icon = 'icons/turf/shuttle.dmi'
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/structure/shuttle/engine
name = "engine"
diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm
index 23b37751181..e22fb4fa86e 100644
--- a/code/game/turfs/closed.dm
+++ b/code/game/turfs/closed.dm
@@ -10,6 +10,9 @@
icon = 'icons/turf/walls.dmi'
explosion_block = 50
+/turf/closed/indestructible/acid_act(acidpwr, acid_volume, acid_id)
+ return 0
+
/turf/closed/indestructible/oldshuttle
name = "strange shuttle wall"
icon = 'icons/turf/shuttleold.dmi'
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 4385b13c8d3..2e8cc58622e 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -182,3 +182,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
/turf/open/floor/initialize()
..()
MakeDirty()
+
+/turf/open/floor/acid_melt()
+ ChangeTurf(baseturf)
+
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 91c259c7061..a5d13a2f3d5 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -272,16 +272,15 @@
for(var/thing in thing_to_check)
if(isobj(thing))
var/obj/O = thing
- if(O.resistance_flags & LAVA_PROOF || O.throwing)
- continue
- if(istype(O, /obj/effect/decal/cleanable/ash)) //So we don't get stuck burning the same ash pile forever
- qdel(O)
+ if((O.resistance_flags & (LAVA_PROOF|ON_FIRE|INDESTRUCTIBLE)) || O.throwing)
continue
. = 1
- if(O.resistance_flags & FIRE_PROOF)
- O.resistance_flags &= ~FIRE_PROOF //Even fireproof things burn up in lava
-
- O.fire_act()
+ if(!(O.resistance_flags & FLAMMABLE))
+ O.resistance_flags |= FLAMMABLE //Even fireproof things burn up in lava
+ O.resistance_flags = ~FIRE_PROOF
+ if(O.armor["fire"] > 50) //obj with 100% fire armor still get slowly burned away.
+ O.armor["fire"] = 50
+ O.fire_act(10000, 1000)
else if (isliving(thing))
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index aec76bc3ba0..6f5c4cb53b8 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -108,14 +108,13 @@
dismantle_wall(1)
return
-/turf/closed/wall/attack_hulk(mob/user)
+/turf/closed/wall/attack_hulk(mob/user, does_attack_animation = 0)
..(user, 1)
if(prob(hardness))
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
user << text("You smash through the wall.")
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
dismantle_wall(1)
-
else
playsound(src, 'sound/effects/bang.ogg', 50, 1)
user << text("You punch the wall.")
@@ -266,3 +265,7 @@
/turf/closed/wall/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
return 0
+
+/turf/closed/wall/acid_melt()
+ dismantle_wall(1)
+
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index f48eb683c59..950236f982c 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -173,4 +173,8 @@
/turf/open/space/is_transition_turf()
if(destination_x || destination_y || destination_z)
- return 1
\ No newline at end of file
+ return 1
+
+
+/turf/open/space/acid_act(acidpwr, acid_volume)
+ return 0
\ No newline at end of file
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 2c4c0577749..3a522e10267 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -155,7 +155,7 @@
if(!can_have_cabling())
for(var/obj/structure/cable/C in contents)
- C.Deconstruct()
+ C.deconstruct()
queue_smooth_neighbors(src)
@@ -212,7 +212,7 @@
M.adjustBruteLoss(damage)
M.Paralyse(damage/5)
for(var/obj/mecha/M in src)
- M.take_damage(damage*2, "brute")
+ M.take_damage(damage*2, BRUTE, "melee", 1)
/turf/proc/Bless()
flags |= NOJAUNT
@@ -328,3 +328,24 @@
/turf/proc/is_transition_turf()
return
+
+
+/turf/acid_act(acidpwr, acid_volume)
+ . = 1
+ var/has_acid_effect = 0
+ for(var/obj/O in src)
+ if(intact && O.level == 1) //hidden under the floor
+ continue
+ if(istype(O, /obj/effect/acid))
+ var/obj/effect/acid/A = O
+ A.acid_level = min(A.level + acid_volume * acidpwr, 12000)//capping acid level to limit power of the acid
+ has_acid_effect = 1
+ continue
+ O.acid_act(acidpwr, acid_volume)
+ if(!has_acid_effect)
+ new /obj/effect/acid(src, acidpwr, acid_volume)
+
+
+/turf/proc/acid_melt()
+ return
+
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index cce111cdbfb..1065b1fa29c 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -389,7 +389,7 @@
feedback_add_details("admin_secrets_fun_used","BO")
message_admins("[key_name_admin(usr)] broke all lights")
for(var/obj/machinery/light/L in machines)
- L.broken()
+ L.break_light_tube()
if("anime")
if(!check_rights(R_FUN))
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index 31ecea937bd..833068afdab 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -59,7 +59,7 @@
affecting = H.get_bodypart(type)
H.Stun(3)
if(affecting)
- if(affecting.take_damage(1, 0))
+ if(affecting.receive_damage(1, 0))
H.update_damage_overlays()
else if(ismouse(target))
var/mob/living/simple_animal/mouse/M = target
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index 7ce4eba77b1..326ff220334 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -69,6 +69,8 @@
if(!istype(location) || !(location.air))
return 0
+ location.active_hotspot = src
+
if(volume > CELL_VOLUME*0.95)
bypassing = 1
else
@@ -87,9 +89,9 @@
location.assume_air(affected)
for(var/A in loc)
- var/atom/item = A
- if(item && item != src) // It's possible that the item is deleted in temperature_expose
- item.fire_act(null, temperature, volume)
+ var/atom/AT = A
+ if(AT && AT != src) // It's possible that the item is deleted in temperature_expose
+ AT.fire_act(temperature, volume)
return 0
@@ -175,4 +177,4 @@
/obj/effect/hotspot/Crossed(mob/living/L)
..()
if(isliving(L))
- L.fire_act()
+ L.fire_act(temperature, volume)
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 9d2c5627bc2..f73dc6b4cc9 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -55,6 +55,11 @@
active_power_usage = 8
power_channel = ENVIRON
req_access = list(access_atmospherics)
+ obj_integrity = 250
+ max_integrity = 250
+ integrity_failure = 80
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 90, acid = 30)
+ resistance_flags = 0
var/danger_level = 0
var/mode = AALARM_MODE_SCRUBBING
@@ -628,8 +633,7 @@
if(istype(W, /obj/item/weapon/wirecutters) && panel_open && wires.is_all_cut())
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
user << "You cut the final wires."
- var/obj/item/stack/cable_coil/cable = new /obj/item/stack/cable_coil(loc)
- cable.amount = 5
+ new /obj/item/stack/cable_coil(loc, 5)
buildstage = 1
update_icon()
return
@@ -713,4 +717,17 @@
return
emagged = TRUE
visible_message("Sparks fly out of the [src]!", "You emag the [src], disabling its safeties.")
- playsound(src.loc, 'sound/effects/sparks4.ogg', 50, 1)
\ No newline at end of file
+ playsound(src.loc, 'sound/effects/sparks4.ogg', 50, 1)
+
+/obj/machinery/airalarm/obj_break(damage_flag)
+ ..()
+ update_icon()
+
+/obj/machinery/airalarm/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 2)
+ var/obj/item/I = new /obj/item/weapon/electronics/airalarm(loc)
+ if(!disassembled)
+ I.obj_integrity = I.max_integrity * 0.5
+ new /obj/item/stack/cable_coil(loc, 3)
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 0101bd9d415..a3bb43227bc 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -16,6 +16,10 @@ Pipelines + Other Objects -> Pipe network
power_channel = ENVIRON
on_blueprints = TRUE
layer = GAS_PIPE_LAYER //under wires
+ armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 100, acid = 70)
+ resistance_flags = FIRE_PROOF
+ obj_integrity = 200
+ max_integrity = 200
var/nodealert = 0
var/can_unwrench = 0
var/initialize_directions = 0
@@ -152,11 +156,10 @@ Pipelines + Other Objects -> Pipe network
//You unwrenched a pipe full of pressure? Let's splat you into the wall, silly.
if(unsafe_wrenching)
unsafe_pressure_release(user, internal_pressure)
- Deconstruct()
+ deconstruct(TRUE)
else
return ..()
-
/obj/machinery/atmospherics/proc/can_unwrench(mob/user)
return can_unwrench
@@ -179,13 +182,16 @@ Pipelines + Other Objects -> Pipe network
user.visible_message("[user] is sent flying by pressure!","The pressure sends you flying!")
user.throw_at(target, range, speed)
-/obj/machinery/atmospherics/Deconstruct()
- if(can_unwrench)
- stored.loc = src.loc
- transfer_fingerprints_to(stored)
- stored = null
-
- qdel(src)
+/obj/machinery/atmospherics/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(can_unwrench)
+ if(stored)
+ stored.forceMove(loc)
+ if(!disassembled)
+ stored.obj_integrity = stored.max_integrity * 0.5
+ transfer_fingerprints_to(stored)
+ stored = null
+ ..()
/obj/machinery/atmospherics/proc/getpipeimage(iconset, iconstate, direction, col=rgb(255,255,255))
@@ -226,7 +232,7 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
- Deconstruct()
+ deconstruct(FALSE)
//Find a connecting /obj/machinery/atmospherics in specified direction
@@ -288,3 +294,9 @@ Pipelines + Other Objects -> Pipe network
//Used for certain children of obj/machinery/atmospherics to not show pipe vision when mob is inside it.
/obj/machinery/atmospherics/proc/can_see_pipes()
return 1
+
+/obj/machinery/atmospherics/fire_act(exposed_temperature, exposed_volume)
+ var/turf/T = src.loc
+ if(T && T.intact && level == 1) //protected from fire when hidden behind a floor.
+ return
+ ..()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 9ec331734ac..e5c82a06462 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -4,6 +4,9 @@
icon_state = "cell-off"
density = 1
anchored = 1
+ obj_integrity = 350
+ max_integrity = 350
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 30, acid = 30)
var/on = FALSE
state_open = FALSE
@@ -50,9 +53,16 @@
conduction_coefficient = initial(conduction_coefficient) * C
/obj/machinery/atmospherics/components/unary/cryo_cell/Destroy()
- beaker = null
+ if(beaker)
+ qdel(beaker)
+ beaker = null
return ..()
+/obj/machinery/atmospherics/components/unary/cryo_cell/on_deconstruction()
+ if(beaker)
+ beaker.forceMove(loc)
+ beaker = null
+
/obj/machinery/atmospherics/components/unary/cryo_cell/update_icon()
if(panel_open)
icon_state = "cell-o"
@@ -137,7 +147,7 @@
on = FALSE
..()
if(beaker)
- beaker.loc = src
+ beaker.forceMove(src)
/obj/machinery/atmospherics/components/unary/cryo_cell/close_machine(mob/living/carbon/user)
if((isnull(user) || istype(user)) && state_open && !panel_open)
@@ -253,7 +263,7 @@
. = TRUE
if("ejectbeaker")
if(beaker)
- beaker.loc = loc
+ beaker.forceMove(loc)
beaker = null
. = TRUE
update_icon()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
index cee595c5466..af070c4091b 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
@@ -4,6 +4,8 @@
icon_state = "generic"
name = "pressure tank"
desc = "A large vessel containing pressurized gas."
+ obj_integrity = 800
+ max_integrity = 800
var/volume = 10000 //in liters, 1 meters by 1 meters by 2 meters
density = 1
var/gas_type = 0
@@ -46,4 +48,4 @@
var/datum/gas_mixture/air_contents = AIR1
air_contents.assert_gases("o2", "n2")
air_contents.gases["o2"][MOLES] = AIR_CONTENTS * 0.2
- air_contents.gases["n2"][MOLES] = AIR_CONTENTS * 0.8
\ No newline at end of file
+ air_contents.gases["n2"][MOLES] = AIR_CONTENTS * 0.8
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index 74a0a279188..2a62684c873 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -6,6 +6,9 @@
var/icon_state_open = "cold_off"
density = TRUE
anchored = TRUE
+ obj_integrity = 300
+ max_integrity = 300
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 80, acid = 30)
var/on = FALSE
var/min_temperature = 0
diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm
index 4f94c2a2b4e..4bde239d26c 100644
--- a/code/modules/atmospherics/machinery/other/meter.dm
+++ b/code/modules/atmospherics/machinery/other/meter.dm
@@ -11,6 +11,10 @@
use_power = 1
idle_power_usage = 2
active_power_usage = 4
+ obj_integrity = 150
+ max_integrity = 150
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 40, acid = 0)
+
/obj/machinery/meter/New()
..()
diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
index 9585fb6b8fb..8f6467cd09a 100644
--- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
@@ -1,4 +1,4 @@
-/obj/machinery/atmospherics/pipe/heat_exchanging/
+/obj/machinery/atmospherics/pipe/heat_exchanging
icon = 'icons/obj/atmospherics/pipes/heat.dmi'
level = 2
var/initialize_directions_he
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index fc412840ebe..6401feaf454 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -97,4 +97,9 @@
N.update_icon()
/obj/machinery/atmospherics/pipe/returnPipenets()
- . = list(parent)
\ No newline at end of file
+ . = list(parent)
+
+/obj/machinery/atmospherics/pipe/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 12)
+ return 0
+ . = ..()
\ No newline at end of file
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index df48ca85a8d..0e722acfba4 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -17,8 +17,10 @@
var/gas_type = ""
var/release_pressure = ONE_ATMOSPHERE
- armor = list(melee = 50, bullet = 50, laser = 50, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 10, acid = 0)
- var/health = 100
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 80, acid = 50)
+ obj_integrity = 250
+ max_integrity = 250
+ integrity_failure = 100
pressure_resistance = 7 * ONE_ATMOSPHERE
var/temperature_resistance = 1000 + T0C
var/starter_temp
@@ -182,40 +184,56 @@
/obj/machinery/portable_atmospherics/canister/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > temperature_resistance)
- take_damage(5, BRUTE, 0)
+ take_damage(5, BURN, 0)
-/obj/machinery/portable_atmospherics/canister/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+
+/obj/machinery/portable_atmospherics/canister/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(!(stat & BROKEN))
+ canister_break()
+ if(disassembled)
+ new /obj/item/stack/sheet/metal (loc, 10)
else
- return
- if(stat & BROKEN)
+ new /obj/item/stack/sheet/metal (loc, 5)
+ qdel(src)
+
+/obj/machinery/portable_atmospherics/canister/attackby(obj/item/weapon/W, mob/user, params)
+ if(user.a_intent != "harm" && istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(stat & BROKEN)
+ if(!WT.remove_fuel(0, user))
+ return
+ playsound(loc, 'sound/items/Welder.ogg', 40, 1)
+ user << "You begin cutting [src] apart..."
+ if(do_after(user, 30, target = src))
+ deconstruct(TRUE)
+ else
+ user << "You cannot slice [src] apart when it isn't broken."
+ return 1
+ else
+ return ..()
+
+/obj/machinery/portable_atmospherics/canister/obj_break(damage_flag)
+ if((stat & BROKEN) || (flags & NODECONSTRUCT))
return
- health = max( health - damage, 0)
- if(!health)
- disconnect()
- var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles())
- var/turf/T = get_turf(src)
- T.assume_air(expelled_gas)
- air_update_turf()
+ canister_break()
- stat |= BROKEN
- density = 0
- playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
- update_icon()
- investigate_log("was destroyed.", "atmos")
+/obj/machinery/portable_atmospherics/canister/proc/canister_break()
+ disconnect()
+ var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles())
+ var/turf/T = get_turf(src)
+ T.assume_air(expelled_gas)
+ air_update_turf()
- if(holding)
- holding.loc = T
- holding = null
+ stat |= BROKEN
+ density = 0
+ playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
+ update_icon()
+ investigate_log("was destroyed.", "atmos")
+
+ if(holding)
+ holding.forceMove(T)
+ holding = null
/obj/machinery/portable_atmospherics/canister/process_atmos()
..()
@@ -236,39 +254,6 @@
air_update_turf() // Update the environment if needed.
update_icon()
-/obj/machinery/portable_atmospherics/canister/blob_act(obj/structure/blob/B)
- take_damage(100, BRUTE, 0)
-
-/obj/machinery/portable_atmospherics/canister/burn()
- take_damage(health, BURN, 1)
- ..()
-
-/obj/machinery/portable_atmospherics/canister/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage / 2, P.damage_type, 0)
-
-/obj/machinery/portable_atmospherics/canister/ex_act(severity, target)
- switch(severity)
- if(1)
- if((stat & BROKEN) || prob(30))
- qdel(src)
- else
- take_damage(100, BRUTE, 0)
- if(2)
- if(stat & BROKEN)
- qdel(src)
- else
- take_damage(rand(40, 110), BRUTE, 0)
- if(3)
- take_damage(rand(15, 40), BRUTE, 0)
-
-/obj/machinery/portable_atmospherics/canister/attacked_by(obj/item/I, mob/user)
- if(I.force)
- user.visible_message("[user] has hit [src] with [I]!", "You hit [src] with [I]!")
- investigate_log("was smacked with \a [I] by [key_name(user)].", "atmos")
- add_fingerprint(user)
- take_damage(I.force, I.damtype, 1)
-
/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index 11e65a78165..49baa0e1bf4 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -2,6 +2,10 @@
name = "portable_atmospherics"
icon = 'icons/obj/atmos.dmi'
use_power = 0
+ obj_integrity = 250
+ max_integrity = 250
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 60, acid = 30)
+
var/datum/gas_mixture/air_contents
var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port
@@ -106,4 +110,12 @@
else if(istype(W, /obj/item/device/analyzer) && Adjacent(user))
atmosanalyzer_scan(air_contents, user)
else
- return ..()
\ No newline at end of file
+ return ..()
+
+/obj/machinery/portable_atmospherics/attacked_by(obj/item/I, mob/user)
+ if(I.force < 10 && !(stat & BROKEN))
+ take_damage(0)
+ else
+ investigate_log("was smacked with \a [I] by [key_name(user)].", "atmos")
+ add_fingerprint(user)
+ ..()
\ No newline at end of file
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index 8a77545144c..abe092702fa 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -7,7 +7,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
icon_state = "off"
density = 1
anchored = 1
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/active = 0
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index 585453a1849..e1bf0b85a37 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -57,17 +57,22 @@
icon = 'icons/obj/cult.dmi'
icon_state = "forge"
anchored = 1
- var/health = 200
+ obj_integrity = 200
+ max_integrity = 200
var/mob/living/current_wizard = null
var/next_check = 0
var/cooldown = 600
var/faction = "wizard"
- var/broken = 0
var/braindead_check = 0
/obj/structure/academy_wizard_spawner/New()
START_PROCESSING(SSobj, src)
+/obj/structure/academy_wizard_spawner/Destroy()
+ if(!broken)
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
/obj/structure/academy_wizard_spawner/process()
if(next_check < world.time)
if(!current_wizard)
@@ -127,28 +132,12 @@
give_control()
-/obj/structure/academy_wizard_spawner/proc/update_status()
- if(health<0)
+/obj/structure/academy_wizard_spawner/deconstruct(disassembled = TRUE)
+ if(!broken)
+ broken = 1
visible_message("[src] breaks down!")
icon_state = "forge_off"
STOP_PROCESSING(SSobj, src)
- broken = 1
-
-/obj/structure/academy_wizard_spawner/attackby(obj/item/weapon/W, mob/living/user, params)
- add_fingerprint(user)
- user.changeNext_move(CLICK_CD_MELEE)
- if(!broken)
- health -= W.force
- update_status()
- ..()
-
-/obj/structure/academy_wizard_spawner/bullet_act(obj/item/projectile/Proj)
- if(!broken)
- if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
- health -= Proj.damage
- update_status()
- ..()
- return
/datum/outfit/wizard/academy
name = "Academy Wizard"
diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm
index 2f386c471e2..7fbb1dc0f47 100644
--- a/code/modules/awaymissions/mission_code/Cabin.dm
+++ b/code/modules/awaymissions/mission_code/Cabin.dm
@@ -62,7 +62,7 @@
active = FALSE
toggleFirepit()
-/obj/structure/firepit/fire_act()
+/obj/structure/firepit/fire_act(exposed_temperature, exposed_volume)
if(!active)
active = TRUE
toggleFirepit()
diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm
index 75d240ec777..329978827af 100644
--- a/code/modules/awaymissions/mission_code/challenge.dm
+++ b/code/modules/awaymissions/mission_code/challenge.dm
@@ -22,6 +22,7 @@
icon_state = "emitter"
anchored = 1
density = 1
+ resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF
use_power = 0
idle_power_usage = 0
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index b57b4ad5927..8068b0ea9aa 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -159,8 +159,8 @@
origin_tech = "syndicate=2"
sensor_mode = 0 //Hey who's this guy on the Syndicate Shuttle??
random_sensor = 0
- resistance_flags = FIRE_PROOF
- armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/under/chameleon/New()
..()
@@ -176,8 +176,8 @@
item_state = "armor"
blood_overlay_type = "armor"
origin_tech = "syndicate=2"
- resistance_flags = FIRE_PROOF
- armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/suit/chameleon/New()
..()
@@ -192,8 +192,8 @@
icon_state = "meson"
item_state = "meson"
origin_tech = "syndicate=2"
- resistance_flags = FIRE_PROOF
- armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/glasses/chameleon/New()
..()
@@ -208,8 +208,8 @@
icon_state = "yellow"
item_state = "ygloves"
- resistance_flags = FIRE_PROOF
- armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/gloves/chameleon/New()
..()
@@ -224,8 +224,8 @@
icon_state = "greysoft"
item_color = "grey"
- resistance_flags = FIRE_PROOF
- armor = list(melee = 5, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 5, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
var/datum/action/item_action/chameleon/change/chameleon_action = null
@@ -256,8 +256,8 @@
desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate
icon_state = "gas_alt"
item_state = "gas_alt"
- resistance_flags = FIRE_PROOF
- armor = list(melee = 5, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ resistance_flags = 0
+ armor = list(melee = 5, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
@@ -307,9 +307,9 @@
permeability_coefficient = 0.05
flags = NOSLIP
origin_tech = "syndicate=2"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
pockets = /obj/item/weapon/storage/internal/pocket/shoes
- armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/shoes/chameleon/New()
..()
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 510a3a523ed..b10df45b782 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -1,6 +1,10 @@
/obj/item/clothing
name = "clothing"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
+ obj_integrity = 150
+ max_integrity = 150
+ integrity_failure = 80
+ var/damaged_clothes = 0 //similar to machine's BROKEN stat and structure's broken var
var/flash_protect = 0 //Malk: What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS
var/tint = 0 //Malk: Sets the item's level of visual impairment tint, normally set to the same as flash_protect
var/up = 0 // but seperated to allow items to protect but not impair vision, like space helmets
@@ -59,6 +63,13 @@
return ..()
/obj/item/clothing/attackby(obj/item/W, mob/user, params)
+ if(damaged_clothes && istype(W, /obj/item/stack/sheet/cloth))
+ var/obj/item/stack/sheet/cloth/C = W
+ C.use(1)
+ update_clothes_damaged_state(FALSE)
+ obj_integrity = max_integrity
+ user << "You fix the damages on [src] with [C]."
+ return 1
if(pockets)
return pockets.attackby(W, user, params)
else
@@ -110,6 +121,34 @@
user.vars[variable] = user_vars_to_edit[variable]
+/obj/item/clothing/examine(mob/user)
+ ..()
+ if(damaged_clothes)
+ user << "It looks damaged!"
+
+/obj/item/clothing/obj_break(damage_flag)
+ if(!damaged_clothes)
+ update_clothes_damaged_state(TRUE)
+
+var/list/damaged_clothes_icons = list()
+
+/obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE)
+ var/index = "\ref[initial(icon)]-[initial(icon_state)]"
+ if(damaging)
+ damaged_clothes = 1
+ var/icon/damaged_clothes_icon = damaged_clothes_icons[index]
+ if(!damaged_clothes_icon)
+ damaged_clothes_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply damaged effect to the initial icon_state for each object
+ damaged_clothes_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
+ damaged_clothes_icon.Blend(icon('icons/effects/item_damage.dmi', "itemdamaged"), ICON_MULTIPLY) //adds damage effect and the remaining white areas become transparant
+ damaged_clothes_icon = fcopy_rsc(damaged_clothes_icon)
+ damaged_clothes_icons[index] = damaged_clothes_icon
+ add_overlay(damaged_clothes_icon, 1)
+ else
+ damaged_clothes = 0
+ overlays -= damaged_clothes_icons[index]
+ priority_overlays -= damaged_clothes_icons[index]
+
//Ears: currently only used for headsets and earmuffs
/obj/item/clothing/ears
@@ -117,7 +156,7 @@
w_class = 1
throwforce = 0
slot_flags = SLOT_EARS
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/ears/earmuffs
name = "earmuffs"
@@ -127,7 +166,7 @@
flags = EARBANGPROTECT
strip_delay = 15
put_on_delay = 25
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
//Glasses
/obj/item/clothing/glasses
@@ -145,7 +184,7 @@
var/vision_correction = 0 //does wearing these glasses correct some of our vision defects?
strip_delay = 20
put_on_delay = 25
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/*
SEE_SELF // can see self, no matter what
SEE_MOBS // can see all mobs, no matter what
@@ -175,9 +214,17 @@ BLIND // can't see anything
/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedgloves")
if(blood_DNA)
. += image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands")
+/obj/item/clothing/gloves/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_gloves()
+
// Called just before an attack_hand(), in mob/UnarmedAttack()
/obj/item/clothing/gloves/proc/Touch(atom/A, proximity)
return 0 // return 1 to cancel attack_hand()
@@ -195,9 +242,18 @@ BLIND // can't see anything
/obj/item/clothing/head/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedhelmet")
if(blood_DNA)
. += image("icon"='icons/effects/blood.dmi', "icon_state"="helmetblood")
+/obj/item/clothing/head/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_head()
+
+
//Mask
/obj/item/clothing/mask
name = "mask"
@@ -213,8 +269,18 @@ BLIND // can't see anything
/obj/item/clothing/mask/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)
- if(blood_DNA && (body_parts_covered & HEAD))
- . += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood")
+ if(body_parts_covered & HEAD)
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedmask")
+ if(blood_DNA)
+ . += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood")
+
+/obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_wear_mask()
+
//Override this to modify speech like luchador masks.
/obj/item/clothing/mask/proc/speechModification(message)
@@ -276,9 +342,16 @@ BLIND // can't see anything
else
bloody = bloody_shoes[BLOOD_STATE_HUMAN]
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedshoe")
if(bloody)
. += image("icon"='icons/effects/blood.dmi', "icon_state"="shoeblood")
+/obj/item/clothing/shoes/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_shoes()
/obj/item/clothing/shoes/clean_blood()
..()
@@ -306,9 +379,17 @@ BLIND // can't see anything
/obj/item/clothing/suit/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damaged[blood_overlay_type]")
if(blood_DNA)
. += image("icon"='icons/effects/blood.dmi', "icon_state"="[blood_overlay_type]blood")
+/obj/item/clothing/suit/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_wear_suit()
+
//Spacesuit
//Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together.
// Meaning the the suit is defined directly after the corrisponding helmet. Just like below!
@@ -319,7 +400,7 @@ BLIND // can't see anything
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
item_state = "spaceold"
permeability_coefficient = 0.01
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50, fire = 0, acid = 70)
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50, fire = 80, acid = 70)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
@@ -329,7 +410,7 @@ BLIND // can't see anything
strip_delay = 50
put_on_delay = 50
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/suit/space
name = "space suit"
@@ -343,7 +424,7 @@ BLIND // can't see anything
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals)
slowdown = 1
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50, fire = 0, acid = 70)
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50, fire = 80, acid = 70)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
@@ -351,7 +432,7 @@ BLIND // can't see anything
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
strip_delay = 80
put_on_delay = 80
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
//Under clothing
@@ -376,6 +457,9 @@ BLIND // can't see anything
. = list()
if(!isinhands)
+
+ if(damaged_clothes)
+ . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damageduniform")
if(blood_DNA)
. += image("icon"='icons/effects/blood.dmi', "icon_state"="uniformblood")
if(hastie)
@@ -387,6 +471,11 @@ BLIND // can't see anything
tI.color = hastie.color
. += tI
+/obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_w_uniform()
/obj/item/clothing/under/New()
if(random_sensor)
@@ -464,7 +553,11 @@ BLIND // can't see anything
/obj/item/clothing/under/examine(mob/user)
..()
- switch(src.sensor_mode)
+ if(adjusted == ALT_STYLE)
+ user << "Alt-click on [src] to wear it normally."
+ else
+ user << "Alt-click on [src] to wear it casually."
+ switch(sensor_mode)
if(0)
user << "Its sensors appear to be disabled."
if(1)
@@ -573,13 +666,6 @@ BLIND // can't see anything
body_parts_covered |= CHEST
return adjusted
-/obj/item/clothing/under/examine(mob/user)
- ..()
- if(src.adjusted == ALT_STYLE)
- user << "Alt-click on [src] to wear it normally."
- else
- user << "Alt-click on [src] to wear it casually."
-
/obj/item/clothing/proc/weldingvisortoggle() //Malk: proc to toggle welding visors on helmets, masks, goggles, etc.
if(!can_use(usr))
return
@@ -605,3 +691,14 @@ BLIND // can't see anything
if(!user.incapacitated())
return 1
return 0
+
+
+/obj/item/clothing/obj_destruction(damage_flag)
+ if(damage_flag == "bomb" || damage_flag == "melee")
+ var/turf/T = get_turf(src)
+ spawn(1) //so the shred survives potential turf change from the explosion.
+ var/obj/effect/decal/cleanable/shreds/Shreds = new(T)
+ Shreds.desc = "The sad remains of what used to be [name]."
+ deconstruct(FALSE)
+ else
+ ..()
\ No newline at end of file
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 05206e37108..35098f19800 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -56,7 +56,8 @@
scan_reagents = 1 //You can see reagents while wearing science goggles
actions_types = list(/datum/action/item_action/toggle_research_scanner)
glass_colour_type = /datum/client_colour/glass_colour/purple
- resistance_flags = FIRE_PROOF | ACID_PROOF
+ resistance_flags = ACID_PROOF
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 100)
/obj/item/clothing/glasses/science/item_action_slot_check(slot)
if(slot == slot_glasses)
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 8dc34e005c4..ec0cec172db 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -6,7 +6,7 @@
siemens_coefficient = 0
permeability_coefficient = 0.05
item_color="yellow"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly."
@@ -16,7 +16,7 @@
siemens_coefficient = 1 //Set to a default of 1, gets overridden in New()
permeability_coefficient = 0.05
item_color="yellow"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/gloves/color/fyellow/New()
..()
@@ -32,7 +32,7 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
var/can_be_cut = 1
/obj/item/clothing/gloves/color/black/hos
@@ -70,7 +70,7 @@
desc = "These gloves will protect the wearer from electric shock."
siemens_coefficient = 0
permeability_coefficient = 0.05
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/gloves/color/rainbow
name = "rainbow gloves"
@@ -146,6 +146,7 @@
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
strip_delay = 60
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 50)
/obj/item/clothing/gloves/color/latex
name = "latex gloves"
@@ -156,7 +157,7 @@
permeability_coefficient = 0.01
item_color="white"
transfer_prints = TRUE
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/gloves/color/latex/nitrile
name = "nitrile gloves"
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 47e4f799474..e3b688e9cb4 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -21,8 +21,8 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 30)
+ resistance_flags = 0
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 30)
/obj/item/clothing/gloves/combat
name = "combat gloves"
@@ -36,8 +36,8 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 50)
+ resistance_flags = 0
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 50)
/obj/item/clothing/gloves/bracer
@@ -53,5 +53,5 @@
cold_protection = ARMS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
armor = list(melee = 15, bullet = 35, laser = 35, energy = 20, bomb = 35, bio = 35, rad = 35, fire = 0, acid = 0)
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index 5e61b69a2eb..70dfabdcfcb 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -68,7 +68,7 @@
desc = "A collectable welding helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this helmet is done so at the owner's own risk!"
icon_state = "welding"
item_state = "welding"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/head/collectable/slime
name = "collectable slime hat"
@@ -137,11 +137,11 @@
desc = "Go Red! I mean Green! I mean Red! No Green!"
icon_state = "thunderdome"
item_state = "thunderdome"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/head/collectable/swat
name = "collectable SWAT helmet"
desc = "That's not real blood. That's red paint." //Reference to the actual description
icon_state = "swat"
item_state = "swat"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 7ea5150f4d1..1d9d2da01a1 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -6,7 +6,7 @@
var/brightness_on = 4 //luminosity when on
var/on = 0
item_color = "yellow" //Determines used sprites: hardhat[on]_[item_color] and hardhat[on]_[item_color]2 (lying down sprite)
- armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20, fire = 0, acid = 50)
+ armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20, fire = 100, acid = 50)
flags_inv = 0
actions_types = list(/datum/action/item_action/toggle_helmet_light)
resistance_flags = FIRE_PROOF
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 337442a674e..65c6ab20bc6 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -4,14 +4,14 @@
icon_state = "helmet"
flags = HEADBANGPROTECT
item_state = "helmet"
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 30,energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
flags_inv = HIDEEARS
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
flags_cover = HEADCOVERSEYES
dog_fashion = /datum/dog_fashion/head/helmet
@@ -20,9 +20,6 @@
/obj/item/clothing/head/helmet/New()
..()
-/obj/item/clothing/head/helmet/emp_act(severity)
- ..()
-
/obj/item/clothing/head/helmet/sec
can_flashlight = 1
@@ -31,7 +28,7 @@
desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "helmetalt"
item_state = "helmetalt"
- armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0, fire = 50, acid = 50)
can_flashlight = 1
dog_fashion = null
@@ -48,7 +45,7 @@
alt_toggle_message = "You push the visor up on"
can_toggle = 1
flags = HEADBANGPROTECT
- armor = list(melee = 41, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 41, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0, fire = 50, acid = 50)
flags_inv = HIDEEARS|HIDEFACE
strip_delay = 80
actions_types = list(/datum/action/item_action/toggle)
@@ -102,7 +99,7 @@
desc = "An extremely robust, space-worthy helmet in a nefarious red and black stripe pattern."
icon_state = "swatsyndie"
item_state = "swatsyndie"
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20, fire = 20, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20, fire = 50, acid = 50)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -123,7 +120,7 @@
flags_inv = HIDEEARS|HIDEHAIR
icon_state = "thunderdome"
item_state = "thunderdome"
- armor = list(melee = 40, bullet = 30, laser = 25,energy = 10, bomb = 25, bio = 10, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 25,energy = 10, bomb = 25, bio = 10, rad = 0, fire = 50, acid = 50)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -136,7 +133,8 @@
desc = "An ancient helmet made of bronze and leather."
flags_inv = HIDEEARS|HIDEHAIR
flags_cover = HEADCOVERSEYES
- armor = list(melee = 25, bullet = 0, laser = 25, energy = 10, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 25, bullet = 0, laser = 25, energy = 10, bomb = 10, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
icon_state = "roman"
item_state = "roman"
strip_delay = 100
@@ -212,7 +210,7 @@
desc = "An intimidating tribal helmet, it doesn't look very comfortable."
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES
- armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 10, bio = 5, rad = 20, fire = 20, acid = 20)
+ armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 10, bio = 5, rad = 20, fire = 40, acid = 20)
icon_state = "skull"
item_state = "skull"
strip_delay = 100
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index f013c37db74..ebde71d8005 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -26,7 +26,7 @@
icon_state = "captain"
item_state = "that"
flags_inv = 0
- armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
strip_delay = 60
dog_fashion = /datum/dog_fashion/head/captain
@@ -44,7 +44,7 @@
name = "head of personnel's cap"
icon_state = "hopcap"
desc = "The symbol of true bureaucratic micromanagement."
- armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
dog_fashion = /datum/dog_fashion/head/hop
//Chaplain
@@ -59,7 +59,7 @@
name = "detective's fedora"
desc = "There's only one man who can sniff out the dirty stench of crime, and he's likely wearing this hat."
icon_state = "detective"
- armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 50)
var/candy_cooldown = 0
pockets = /obj/item/weapon/storage/internal/pocket/small/detective
dog_fashion = /datum/dog_fashion/head/detective
@@ -96,7 +96,7 @@
name = "head of security cap"
desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
- armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0, fire = 0, acid = 60)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0, fire = 50, acid = 60)
strip_delay = 80
/obj/item/clothing/head/HoS/beret
@@ -108,7 +108,7 @@
name = "warden's police hat"
desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts."
icon_state = "policehelm"
- armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 60)
+ armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 30, acid = 60)
strip_delay = 60
dog_fashion = /datum/dog_fashion/head/warden
@@ -116,7 +116,7 @@
name = "security beret"
desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficent protection."
icon_state = "beret_badge"
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 30,energy = 10, bomb = 25, bio = 0, rad = 0, fire = 20, acid = 50)
strip_delay = 60
dog_fashion = null
@@ -129,7 +129,7 @@
name = "warden's beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "wardenberet"
- armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 30, acid = 50)
strip_delay = 60
/obj/item/clothing/head/beret/sec/navyofficer
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 4ebcd8a4a27..b61d1c18f5a 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -6,7 +6,7 @@
desc = "It's good to be emperor."
item_state = "that"
flags_inv = 0
- armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
strip_delay = 80
/obj/item/clothing/head/powdered_wig
@@ -222,7 +222,7 @@
throw_range = 5
w_class = 2
attack_verb = list("warned", "cautioned", "smashed")
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/head/santa
name = "santa hat"
@@ -264,7 +264,8 @@
name = "crown"
desc = "A crown fit for a king, a petty king maybe."
icon_state = "crown"
- armor = list(melee = 15, bullet = 0, laser = 0,energy = 15, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 15, bullet = 0, laser = 0,energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/head/crown/fancy
name = "magnificent crown"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 6d623c22c39..94ca9b8ed5f 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -21,7 +21,7 @@
// var/up = 0
flash_protect = 2
tint = 2
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 60)
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 60)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
actions_types = list(/datum/action/item_action/toggle)
visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index eb52e83640f..4aac0629f34 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -120,7 +120,7 @@
desc = "It's a robust baseball hat in tasteful red colour."
icon_state = "secsoft"
item_color = "sec"
- armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 20, acid = 50)
strip_delay = 60
dog_fashion = null
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 7c79e261c96..115ab7bd6ed 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -12,7 +12,7 @@
actions_types = list(/datum/action/item_action/adjust)
flags_cover = MASKCOVERSMOUTH
visor_flags_cover = MASKCOVERSMOUTH
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/mask/breath/attack_self(mob/user)
adjustmask(user)
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 7ba9af72bf7..48cc4e4c238 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -9,7 +9,7 @@
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
// **** Welding gas mask ****
@@ -20,13 +20,14 @@
materials = list(MAT_METAL=4000, MAT_GLASS=2000)
flash_protect = 2
tint = 2
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 55)
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 55)
origin_tech = "materials=2;engineering=3"
actions_types = list(/datum/action/item_action/toggle)
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = MASKCOVERSEYES
visor_flags_inv = HIDEEYES
visor_flags_cover = MASKCOVERSEYES
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/mask/gas/welding/attack_self()
toggle()
@@ -61,7 +62,7 @@
icon_state = "clown"
item_state = "clown_hat"
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
actions_types = list(/datum/action/item_action/adjust)
dog_fashion = /datum/dog_fashion/head/clown
@@ -93,7 +94,7 @@
icon_state = "sexyclown"
item_state = "sexyclown"
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/mask/gas/mime
name = "mime mask"
@@ -102,7 +103,7 @@
icon_state = "mime"
item_state = "mime"
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
actions_types = list(/datum/action/item_action/adjust)
/obj/item/clothing/mask/gas/mime/attack_self(mob/user)
@@ -132,7 +133,7 @@
icon_state = "monkeymask"
item_state = "monkeymask"
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/mask/gas/sexymime
name = "sexy mime mask"
@@ -141,7 +142,7 @@
icon_state = "sexymime"
item_state = "sexymime"
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/mask/gas/death_commando
name = "Death Commando Mask"
@@ -152,7 +153,7 @@
name = "cyborg visor"
desc = "Beep boop."
icon_state = "death"
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/mask/gas/owl_mask
name = "owl mask"
@@ -160,7 +161,7 @@
icon_state = "owl"
flags = MASKINTERNALS
flags_cover = MASKCOVERSEYES
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/mask/gas/carp
name = "carp mask"
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 03e8fd31c83..15abf2b8940 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -28,7 +28,7 @@
visor_flags_cover = MASKCOVERSMOUTH
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.01
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0, fire = 0, acid = 0)
actions_types = list(/datum/action/item_action/adjust)
/obj/item/clothing/mask/surgical/attack_self(mob/user)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 4fc5182db7c..c5f6436a484 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -17,9 +17,9 @@
desc = "High speed, low drag combat boots."
icon_state = "jackboots"
item_state = "jackboots"
- armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0, fire = 0, acid = 50)
+ armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0, fire = 70, acid = 50)
strip_delay = 70
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
pockets = /obj/item/weapon/storage/internal/pocket/shoes
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
@@ -27,7 +27,7 @@
desc = "High speed, no drag combat boots."
permeability_coefficient = 0.01
flags = NOSLIP
- armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30, fire = 0, acid = 50)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30, fire = 90, acid = 50)
/obj/item/clothing/shoes/sandal
desc = "A pair of rather plain, wooden sandals."
@@ -51,8 +51,8 @@
slowdown = SHOES_SLOWDOWN+1
strip_delay = 50
put_on_delay = 50
- resistance_flags = FIRE_PROOF
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 75)
+ resistance_flags = 0
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 40, acid = 75)
/obj/item/clothing/shoes/galoshes/dry
name = "absorbent galoshes"
@@ -90,7 +90,7 @@
item_color = "hosred"
strip_delay = 50
put_on_delay = 50
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
pockets = /obj/item/weapon/storage/internal/pocket/shoes
/obj/item/clothing/shoes/jackboots/fast
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index be717658e23..17142d8bb46 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -4,7 +4,8 @@
icon_state = "chronohelmet"
item_state = "chronohelmet"
slowdown = 1
- armor = list(melee = 60, bullet = 30/*bullet through the visor*/, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 95, acid = 95)
+ armor = list(melee = 60, bullet = 30/*bullet through the visor*/, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 100, acid = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/clothing/suit/space/chronos/suit = null
/obj/item/clothing/head/helmet/space/chronos/dropped()
@@ -23,7 +24,8 @@
icon_state = "chronosuit"
item_state = "chronosuit"
actions_types = list(/datum/action/item_action/toggle)
- armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 95, acid = 95)
+ armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 100, acid = 1000)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/list/chronosafe_items = list(/obj/item/weapon/chrono_eraser, /obj/item/weapon/gun/energy/chrono_gun)
var/list/hands_nodrop = list()
var/obj/item/clothing/head/helmet/space/chronos/helmet = null
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 9378fbf2b4a..c09fdb06c03 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -4,6 +4,8 @@
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
+ obj_integrity = 200
+ max_integrity = 200
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 50, acid = 75)
var/basestate = "hardsuit"
var/brightness_on = 4 //luminosity when on
@@ -80,6 +82,7 @@
var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit
var/obj/item/weapon/tank/jetpack/suit/jetpack = null
+
/obj/item/clothing/suit/space/hardsuit/New()
if(jetpack && ispath(jetpack))
jetpack = new jetpack(src)
@@ -142,16 +145,18 @@
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
- armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 50, acid = 75)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 100, acid = 75)
item_color = "engineering"
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/space/hardsuit/engine
name = "engineering hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
- armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 50, acid = 75)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 100, acid = 75)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine
+ resistance_flags = FIRE_PROOF
//Atmospherics
/obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
@@ -319,7 +324,7 @@
alt_desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
- armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70, fire = 95, acid = 100)
+ armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70, fire = 100, acid = 100)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
visor_flags_inv = 0
@@ -335,7 +340,7 @@
icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
- armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70, fire = 95, acid = 100)
+ armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70, fire = 100, acid = 100)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -414,7 +419,7 @@
desc = "A prototype helmet designed for research in a hazardous, low pressure environment. Scientific data flashes across the visor."
icon_state = "hardsuit0-rd"
item_color = "rd"
- resistance_flags = FIRE_PROOF | ACID_PROOF
+ resistance_flags = ACID_PROOF
var/onboard_hud_enabled = 0 //stops conflicts with another diag HUD
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 100, bio = 100, rad = 60, fire = 60, acid = 80)
@@ -495,7 +500,8 @@
icon_state = "capspace"
item_state = "capspacehelmet"
desc = "A special hardsuit helmet designed for only the most fashionable of military figureheads."
- armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 95)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
actions_types = list()
/obj/item/clothing/head/helmet/space/hardsuit/captain/attack_self()
@@ -507,7 +513,8 @@
icon_state = "caparmor"
item_state = "capspacesuit"
allowed = list(/obj/item/weapon/tank/internals, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
- armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 95)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/captain
//Clown
@@ -545,7 +552,7 @@
icon_state = "hardsuit-hos"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
- armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50, fire = 95, acid = 100)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50, fire = 100, acid = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
var/current_charges = 3
var/max_charges = 3 //How many charges total the shielding has
@@ -662,7 +669,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
item_color = "syndi"
- armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50, fire = 95, acid = 100)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50, fire = 100, acid = 100)
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
slowdown = 0
@@ -678,7 +685,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
item_color = "syndi"
- armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50, fire = 95, acid = 100)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50, fire = 100, acid = 100)
///SWAT version
/obj/item/clothing/suit/space/hardsuit/shielded/swat
@@ -690,10 +697,9 @@
max_charges = 4
current_charges = 4
recharge_delay = 15
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 95, acid = 95)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF | ACID_PROOF
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/swat
dog_fashion = /datum/dog_fashion/back/deathsquad
@@ -703,8 +709,7 @@
icon_state = "deathsquad"
item_state = "deathsquad"
item_color = "syndi"
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 95, acid = 95)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
- resistance_flags = ACID_PROOF
actions_types = list()
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 895b1ef9dc1..afea89290f2 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -49,7 +49,7 @@ Contains:
icon_state = "heavy"
item_state = "swat_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/kitchen/knife/combat)
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20, fire = 60, acid = 75)
+ armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20, fire = 100, acid = 100)
strip_delay = 120
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -59,7 +59,7 @@ Contains:
icon_state = "beret_badge"
flags = STOPSPRESSUREDMAGE
flags_inv = 0
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 80, acid = 80)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -74,7 +74,7 @@ Contains:
flags_inv = 0
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 80, acid = 80)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index fedbd537c0b..fc09409ff9e 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -5,7 +5,8 @@
name = "plasmaman suit"
desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0, fire = 95, acid = 75)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0, fire = 100, acid = 75)
+ resistance_flags = FIRE_PROOF
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
var/next_extinguish = 0
@@ -41,5 +42,7 @@
item_color = "plasma" //needed for the helmet lighting
item_state = "plasmaman-helm"
strip_delay = 80
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0, fire = 100, acid = 75)
+ resistance_flags = FIRE_PROOF
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 18bc250016c..1fbde88b1ce 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -7,8 +7,10 @@
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
strip_delay = 60
put_on_delay = 40
- resistance_flags = FIRE_PROOF
- armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 50)
+ obj_integrity = 200
+ max_integrity = 200
+ resistance_flags = 0
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/suit/armor/vest
name = "armor"
@@ -16,7 +18,7 @@
icon_state = "armoralt"
item_state = "armoralt"
blood_overlay_type = "armor"
- armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 75)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 75)
dog_fashion = /datum/dog_fashion/back
/obj/item/clothing/suit/armor/vest/alt
@@ -34,7 +36,7 @@
icon_state = "hos"
item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
- armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 0, acid = 90)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 70, acid = 90)
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
strip_delay = 80
@@ -56,7 +58,7 @@
cold_protection = CHEST|GROIN|ARMS|HANDS
heat_protection = CHEST|GROIN|ARMS|HANDS
strip_delay = 70
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
dog_fashion = null
/obj/item/clothing/suit/armor/vest/warden/alt
@@ -80,8 +82,9 @@
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = CHEST|GROIN
- armor = list(melee = 50, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 90, acid = 90)
+ armor = list(melee = 50, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 100, acid = 90)
dog_fashion = null
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/armor/vest/capcarapace/alt
name = "captain's parade jacket"
@@ -127,7 +130,8 @@
icon_state = "armor_reflec"
item_state = "armor_reflec"
blood_overlay_type = "armor"
- armor = list(melee = 10, bullet = 10, laser = 60, energy = 50, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 50)
+ armor = list(melee = 10, bullet = 10, laser = 60, energy = 50, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
+ resistance_flags = FIRE_PROOF
var/hit_reflect_chance = 40
/obj/item/clothing/suit/armor/laserproof/IsReflect(def_zone)
@@ -141,7 +145,7 @@
desc = "An armored vest with a detective's badge on it."
icon_state = "detective-armor"
allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/weapon/melee/classic_baton/telescopic)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
dog_fashion = null
@@ -155,7 +159,7 @@
icon_state = "reactiveoff"
item_state = "reactiveoff"
blood_overlay_type = "armor"
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
actions_types = list(/datum/action/item_action/toggle)
resistance_flags = FIRE_PROOF | ACID_PROOF
hit_reaction_chance = 50
@@ -341,7 +345,7 @@
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 95, acid = 95)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 90, acid = 90)
/obj/item/clothing/suit/armor/heavy
name = "heavy armor"
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 9a7c584f968..28ebe2f9f39 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -7,7 +7,7 @@
flags = THICKMATERIAL
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20, fire = 30, acid = 100)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE
- resistance_flags = FIRE_PROOF | ACID_PROOF
+ resistance_flags = ACID_PROOF
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
/obj/item/clothing/suit/bio_suit
@@ -26,7 +26,7 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
strip_delay = 70
put_on_delay = 70
- resistance_flags = FIRE_PROOF | ACID_PROOF
+ resistance_flags = ACID_PROOF
//Standard biosuit, orange stripe
/obj/item/clothing/head/bio_hood/general
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index a25d4044482..77fd5976d4a 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -66,7 +66,7 @@
icon_state = "dragon"
desc = "A suit of armour fashioned from the remains of an ash drake. "
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear)
- armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50, fire = 50, acid = 100)
+ armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50, fire = 100, acid = 100)
hooded = 1
hoodtype = /obj/item/clothing/head/cloakhood/drake
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -78,7 +78,7 @@
name = "drake helm"
icon_state = "dragon"
desc = "The skull of a dragon."
- armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50, fire = 50, acid = 100)
+ armor = list(melee = 70, bullet = 30, laser = 50, energy = 40, bomb = 70, bio = 60, rad = 50, fire = 100, acid = 100)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index ad821773ac7..ec4b145f18b 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -100,7 +100,7 @@
item_state = "hazard"
blood_overlay_type = "armor"
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner,/obj/item/device/radio)
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
//Lawyer
/obj/item/clothing/suit/toggle/lawyer
name = "blue suit jacket"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index f19764bed15..61d1f7d4ebe 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -16,7 +16,7 @@
blood_overlay_type = "armor"
body_parts_covered = CHEST
allowed = list (/obj/item/weapon/gun/energy/laser/bluetag)
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/suit/redtag
name = "red laser tag armor"
@@ -26,7 +26,7 @@
blood_overlay_type = "armor"
body_parts_covered = CHEST
allowed = list (/obj/item/weapon/gun/energy/laser/redtag)
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/*
* Costume
@@ -89,7 +89,7 @@
w_class = 3
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/suit/hastur
name = "\improper Hastur's robe"
@@ -342,7 +342,7 @@
desc = "Pompadour not included."
icon_state = "leatherjacket"
item_state = "hostrench"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/gun/projectile/revolver,/obj/item/weapon/gun/projectile/revolver/detective,/obj/item/device/radio)
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index bbca34cbf4f..f9cde71de41 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -57,7 +57,7 @@
desc = "Use in case of bomb."
icon_state = "bombsuit"
flags = THICKMATERIAL
- armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0, fire = 25, acid = 50)
+ armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0, fire = 80, acid = 50)
flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
@@ -66,7 +66,7 @@
strip_delay = 70
put_on_delay = 70
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/suit/bomb_suit
@@ -80,7 +80,7 @@
flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
slowdown = 2
- armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0, fire = 25, acid = 50)
+ armor = list(melee = 20, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0, fire = 80, acid = 50)
flags_inv = HIDEJUMPSUIT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
@@ -88,7 +88,7 @@
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
strip_delay = 70
put_on_delay = 70
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/head/bomb_hood/security
@@ -114,7 +114,7 @@
strip_delay = 60
put_on_delay = 60
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/suit/radiation
name = "radiation suit"
@@ -132,4 +132,4 @@
strip_delay = 60
put_on_delay = 60
flags_inv = HIDEJUMPSUIT
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 0d43b4705d6..702e367634c 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -35,7 +35,7 @@
gas_transfer_coefficient = 1
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
dog_fashion = /datum/dog_fashion/head/blue_wizard
/obj/item/clothing/head/wizard/marisa
@@ -124,7 +124,7 @@
gas_transfer_coefficient = 1
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/head/wizard/marisa/fake
name = "witch hat"
@@ -133,7 +133,7 @@
gas_transfer_coefficient = 1
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/suit/wizrobe/marisa/fake
name = "witch robe"
@@ -143,7 +143,7 @@
gas_transfer_coefficient = 1
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/clothing/suit/wizrobe/paper
name = "papier-mâché robe"
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 7ac3b606184..68b1fc784f2 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -14,7 +14,7 @@
icon_state = "black"
item_state = "bl_suit"
item_color = "black"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/under/color/grey
name = "grey jumpsuit"
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index 3ac2b59656d..8a2e1a2ed2f 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -5,8 +5,8 @@
icon_state = "chiefengineer"
item_state = "gy_suit"
item_color = "chief"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10, fire = 40, acid = 40)
- resistance_flags = FIRE_PROOF
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10, fire = 80, acid = 40)
+ resistance_flags = 0
/obj/item/clothing/under/rank/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians."
@@ -14,7 +14,7 @@
icon_state = "atmos"
item_state = "atmos_suit"
item_color = "atmos"
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/under/rank/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding."
@@ -22,11 +22,13 @@
icon_state = "engine"
item_state = "engi_suit"
item_color = "engine"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10, fire = 30, acid = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10, fire = 60, acid = 20)
+ resistance_flags = 0
/obj/item/clothing/under/rank/roboticist
desc = "It's a slimming black with reinforced seams; great for industrial work."
name = "roboticist's jumpsuit"
icon_state = "robotics"
item_state = "robotics"
- item_color = "robotics"
\ No newline at end of file
+ item_color = "robotics"
+ resistance_flags = 0
\ No newline at end of file
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index f88d34d1ba7..736e3ce3da8 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -37,7 +37,7 @@
item_state = "armor"
can_adjust = 0
strip_delay = 100
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/under/waiter
name = "waiter's outfit"
@@ -125,7 +125,7 @@
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = 0
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/under/acj
name = "administrative cybernetic jumpsuit"
@@ -378,7 +378,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = NO_FEMALE_UNIFORM
can_adjust = 0
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/clothing/under/sundress
name = "sundress"
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 4ae10c98d94..ec506accf51 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -37,4 +37,4 @@
item_color = "trackpants"
can_adjust = 0
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
- resistance_flags = FIRE_PROOF
\ No newline at end of file
+ resistance_flags = 0
\ No newline at end of file
diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm
index 9b108de8e31..6f7a73355fa 100644
--- a/code/modules/countdown/countdown.dm
+++ b/code/modules/countdown/countdown.dm
@@ -115,7 +115,7 @@
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = attached_to
if(!istype(G))
return
- else if(G.health && !G.purpose_fulfilled)
+ else if(G.obj_integrity && !G.purpose_fulfilled)
return "[G.get_arrival_text(FALSE)]
"
/obj/effect/countdown/transformer
diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm
index 276e88d82a9..7f0f711da25 100644
--- a/code/modules/events/holiday/vday.dm
+++ b/code/modules/events/holiday/vday.dm
@@ -28,7 +28,7 @@
icon = 'icons/obj/toy.dmi'
icon_state = "sc_Ace of Hearts_syndicate" // shut up
var/message = "A generic message of love or whatever."
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
w_class = 1
/obj/item/weapon/valentine/New()
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index de3632195d5..8a151a116e6 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -19,7 +19,7 @@
if(turfs.len) //Pick a turf to spawn at if we can
var/turf/T = pick(turfs)
- new/obj/structure/spacevine_controller(T) //spawn a controller at turf
+ new/obj/effect/spacevine_controller(T) //spawn a controller at turf
/datum/spacevine_mutation
@@ -328,8 +328,8 @@
/datum/spacevine_mutation/woodening/on_grow(obj/structure/spacevine/holder)
if(holder.energy)
holder.density = 1
- holder.maxhealth = 100
- holder.health = holder.maxhealth
+ holder.max_integrity = 100
+ holder.obj_integrity = holder.max_integrity
/datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
if(I.is_sharp())
@@ -362,10 +362,10 @@
layer = SPACEVINE_LAYER
mouse_opacity = 2 //Clicking anywhere on the turf is good enough
pass_flags = PASSTABLE | PASSGRILLE
- var/health = 50
- var/maxhealth = 50
+ obj_integrity = 50
+ max_integrity = 50
var/energy = 0
- var/obj/structure/spacevine_controller/master = null
+ var/obj/effect/spacevine_controller/master = null
var/list/mutations = list()
/obj/structure/spacevine/examine(mob/user)
@@ -415,39 +415,36 @@
qdel(src)
/obj/structure/spacevine/attackby(obj/item/weapon/W, mob/user, params)
- if (!W || !user || !W.type)
- return
- user.changeNext_move(CLICK_CD_MELEE)
- var/force = W.force
if(istype(W, /obj/item/weapon/scythe))
- force = force * 4
+ user.changeNext_move(CLICK_CD_MELEE)
for(var/obj/structure/spacevine/B in orange(1,src))
- B.health = health - force
- if(B.health < 1)
- qdel(B)
-
- health = health - force
-
- if(health < 1)
- qdel(src)
-
+ B.take_damage(W.force * 4, BRUTE, "melee", 1)
return
+ else
+ return ..()
- if(W.is_sharp())
- force = force * 4
- if(W && W.damtype == "fire")
- force = force * 4
+/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user)
+ var/damage_dealt = I.force
+ if(I.is_sharp())
+ damage_dealt *= 4
+ if(I.damtype == BURN)
+ damage_dealt *= 4
for(var/datum/spacevine_mutation/SM in mutations)
- force = SM.on_hit(src, user, W, force) //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, force) //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 = health - force
- if(health < 1)
- qdel(src)
-
- ..()
+/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(src.loc, 'sound/items/Welder.ogg', 100, 1)
/obj/structure/spacevine/Crossed(mob/crosser)
if(isliving(crosser))
@@ -469,7 +466,7 @@
/obj/structure/spacevine/attack_alien(mob/living/user)
eat(user)
-/obj/structure/spacevine_controller
+/obj/effect/spacevine_controller
invisibility = INVISIBILITY_ABSTRACT
var/list/obj/structure/spacevine/vines = list()
var/list/growth_queue = list()
@@ -478,7 +475,7 @@
var/list/mutations_list = list()
var/mutativness = 1
-/obj/structure/spacevine_controller/New(loc, list/muts, mttv, spreading)
+/obj/effect/spacevine_controller/New(loc, list/muts, mttv, spreading)
spawn_spacevine_piece(loc, , muts)
START_PROCESSING(SSobj, src)
init_subtypes(/datum/spacevine_mutation/, mutations_list)
@@ -488,20 +485,20 @@
spread_cap *= spreading / 50
spread_multiplier /= spreading / 50
-/obj/structure/spacevine_controller/ex_act() //only killing all vines will end this suffering
+/obj/effect/spacevine_controller/ex_act() //only killing all vines will end this suffering
return
-/obj/structure/spacevine_controller/singularity_act()
+/obj/effect/spacevine_controller/singularity_act()
return
-/obj/structure/spacevine_controller/singularity_pull()
+/obj/effect/spacevine_controller/singularity_pull()
return
-/obj/structure/spacevine_controller/Destroy()
+/obj/effect/spacevine_controller/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
-/obj/structure/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts)
+/obj/effect/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts)
var/obj/structure/spacevine/SV = new(location)
growth_queue += SV
vines += SV
@@ -520,7 +517,7 @@
for(var/datum/spacevine_mutation/SM in SV.mutations)
SM.on_birth(SV)
-/obj/structure/spacevine_controller/process()
+/obj/effect/spacevine_controller/process()
if(!vines)
qdel(src) //space vines exterminated. Remove the controller
return
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index f323f55cb50..dcbdba4db9c 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -10,7 +10,7 @@
var/interval = 2
var/list/vents = list()
var/list/gunk = list("water","carbon","flour","radium","toxin","cleaner","nutriment","condensedcapsaicin","mushroomhallucinogen","lube",
- "plantbgone","banana","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","facid")
+ "plantbgone","banana","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","sacid")
/datum/round_event/vent_clog/announce()
priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm
index 961671763ec..cacf2ba4fce 100644
--- a/code/modules/events/wizard/rpgloot.dm
+++ b/code/modules/events/wizard/rpgloot.dm
@@ -51,6 +51,7 @@
user << "[target] catches fire!"
if(target.resistance_flags & (LAVA_PROOF|FIRE_PROOF))
target.resistance_flags &= ~(LAVA_PROOF|FIRE_PROOF)
+ target.resistance_flags |= FLAMMABLE
target.fire_act()
qdel(src)
return
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 2c69abfe524..c1cd8ab0e6b 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -363,7 +363,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/collapse
var/image/down
- var/health = 100
+ obj_integrity = 100
/obj/effect/fake_attacker/attackby(obj/item/weapon/P, mob/living/user, params)
step_away(src,my_target,2)
@@ -373,7 +373,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
my_target.visible_message("[my_target] flails around wildly.", \
"[my_target] has attacked [src]!")
- src.health -= P.force
+ obj_integrity -= P.force
/obj/effect/fake_attacker/Crossed(mob/M, somenumber)
if(M == my_target)
@@ -410,7 +410,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/fake_attacker/proc/attack_loop()
while(1)
sleep(rand(5,10))
- if(src.health < 0)
+ if(obj_integrity < 0)
collapse()
continue
if(get_dist(src,my_target) > 1)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index cc98c437146..2ef1faca034 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -10,7 +10,7 @@
var/gulp_size = 5 //This is now officially broken ... need to think of a nice way to fix it.
possible_transfer_amounts = list(5,10,15,20,25,30,50)
volume = 50
- resistance_flags = FIRE_PROOF
+ resistance_flags = 0
/obj/item/weapon/reagent_containers/food/drinks/New()
..()
@@ -105,6 +105,7 @@
volume = 5
flags = CONDUCT | OPENCONTAINER
spillable = 1
+ resistance_flags = FIRE_PROOF
/obj/item/weapon/reagent_containers/food/drinks/trophy/gold_cup
name = "gold cup"
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index 41473bcfc9f..3bf95470b8b 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -7,21 +7,10 @@
amount_per_transfer_from_this = 10
volume = 50
materials = list(MAT_GLASS=500)
- resistance_flags = 0
- burntime = 5
+ obj_integrity = 20
+ max_integrity = 20
spillable = 1
-
-/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fire_act()
- if(!reagents.total_volume)
- return
- ..()
-
-/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/burn()
- reagents.total_volume = 0 //Burns away all the alcohol :(
- reagents.reagent_list.Cut()
- on_reagent_change()
- extinguish()
- return
+ resistance_flags = ACID_PROOF
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change()
cut_overlays()
diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm
index 9905d061150..4a05510ff07 100644
--- a/code/modules/food_and_drinks/food.dm
+++ b/code/modules/food_and_drinks/food.dm
@@ -4,7 +4,7 @@
/obj/item/weapon/reagent_containers/food
possible_transfer_amounts = list()
volume = 50 //Sets the default container amount for all food items.
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/reagent_containers/food/New()
..()
diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
index f16532a9bf9..406b998d7ed 100644
--- a/code/modules/food_and_drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -176,12 +176,6 @@
list_reagents = list("nutriment" = 3, "toxin" = 5)
icon_state = "goliathmeat"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/goliath/burn()
- visible_message("\The [src] finishes cooking!")
- new/obj/item/weapon/reagent_containers/food/snacks/meat/steak/goliath/(src.loc)
- SSobj.burning -= src
- qdel(src)
-
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatwheat
name = "meatwheat clump"
desc = "This doesn't look like meat, but your standards aren't that high to begin with."
diff --git a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
index 6ce7a8b1790..54acb1aa49f 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
@@ -25,6 +25,12 @@
mixer = new /obj/item/weapon/reagent_containers(src, MIXER_CAPACITY)
mixer.name = "Mixer"
+/obj/machinery/food_cart/Destroy()
+ if(mixer)
+ qdel(mixer)
+ mixer = null
+ return ..()
+
/obj/machinery/food_cart/attack_hand(mob/user)
user.set_machine(src)
interact(user)
@@ -150,6 +156,11 @@
usr << browse(null,"window=foodcart")
return
+/obj/machinery/food_cart/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 4)
+ qdel(src)
+
#undef STORAGE_CAPACITY
#undef LIQUID_CAPACIY
#undef MIXER_CAPACITY
diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
index ea2fa786b16..56b4ec3f757 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
@@ -18,6 +18,8 @@
var/dispense_flavour = ICECREAM_VANILLA
var/flavour_name = "vanilla"
flags = OPENCONTAINER
+ obj_integrity = 300
+ max_integrity = 300
/obj/machinery/icecream_vat/proc/get_ingredient_list(type)
switch(type)
@@ -206,6 +208,12 @@
reagents.add_reagent("singulo", 2)
ice_creamed = 1
+/obj/machinery/icecream_vat/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 4)
+ qdel(src)
+
+
#undef ICECREAM_VANILLA
#undef ICECREAM_CHOCOLATE
#undef ICECREAM_STRAWBERRY
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 33e5d058f9c..f61e370eff0 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -49,14 +49,6 @@
else
return ..()
-/obj/machinery/smartfridge/on_construction()
- for(var/datum/A in contents)
- qdel(A)
-
-/obj/machinery/smartfridge/on_deconstruction()
- for(var/atom/movable/A in contents)
- A.loc = loc
-
/obj/machinery/smartfridge/RefreshParts()
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
max_n_of_items = 1500 * B.rating
@@ -95,44 +87,44 @@
updateUsrDialog()
return
- if(stat)
- return 0
+ if(!stat)
- if(contents.len >= max_n_of_items)
- user << "\The [src] is full!"
- return 0
-
- if(accept_check(O))
- load(O)
- user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].")
- updateUsrDialog()
- return 1
-
- if(istype(O, /obj/item/weapon/storage/bag))
- var/obj/item/weapon/storage/P = O
- var/loaded = 0
- for(var/obj/G in P.contents)
- if(contents.len >= max_n_of_items)
- break
- if(accept_check(G))
- load(G)
- loaded++
- updateUsrDialog()
-
- if(loaded)
- if(contents.len >= max_n_of_items)
- user.visible_message("[user] loads \the [src] with \the [O].", \
- "You fill \the [src] with \the [O].")
- else
- user.visible_message("[user] loads \the [src] with \the [O].", \
- "You load \the [src] with \the [O].")
- if(O.contents.len > 0)
- user << "Some items are refused."
- else
- user << "There is nothing in [O] to put in [src]!"
+ if(contents.len >= max_n_of_items)
+ user << "\The [src] is full!"
return 0
- else if(user.a_intent != "harm")
+ if(accept_check(O))
+ load(O)
+ user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].")
+ updateUsrDialog()
+ return 1
+
+ if(istype(O, /obj/item/weapon/storage/bag))
+ var/obj/item/weapon/storage/P = O
+ var/loaded = 0
+ for(var/obj/G in P.contents)
+ if(contents.len >= max_n_of_items)
+ break
+ if(accept_check(G))
+ load(G)
+ loaded++
+ updateUsrDialog()
+
+ if(loaded)
+ if(contents.len >= max_n_of_items)
+ user.visible_message("[user] loads \the [src] with \the [O].", \
+ "You fill \the [src] with \the [O].")
+ else
+ user.visible_message("[user] loads \the [src] with \the [O].", \
+ "You load \the [src] with \the [O].")
+ if(O.contents.len > 0)
+ user << "Some items are refused."
+ return 1
+ else
+ user << "There is nothing in [O] to put in [src]!"
+ return 0
+
+ if(user.a_intent != "harm")
user << "\The [src] smartly refuses [O]."
updateUsrDialog()
return 0
@@ -294,6 +286,10 @@
return 1
return 0
+/obj/machinery/smartfridge/drying_rack/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/mineral/wood (loc, 10)
+ qdel(src)
+
/obj/machinery/smartfridge/drying_rack/proc/toggle_drying(forceoff = 0)
if(drying || forceoff)
drying = 0
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index e00dc38691b..bb8d4e144eb 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -125,7 +125,7 @@
var/blank = 0
var/list/cards = list()
var/datum/html_interface/hi
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/hand/New(loc)
. = ..()
diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm
index 67e55144f48..d2e4a1d05b2 100644
--- a/code/modules/holodeck/area_copy.dm
+++ b/code/modules/holodeck/area_copy.dm
@@ -21,7 +21,7 @@
O.vars[V] = original.vars[V]
if(istype(O))
- O.resistance_flags |= LAVA_PROOF | FIRE_PROOF | UNACIDABLE // holoitems do not burn
+ O.resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF // holoitems do not burn
if(nerf && istype(O,/obj/item))
var/obj/item/I = O
I.damtype = STAMINA // thou shalt not
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 77f04b08ccc..d486dec83ab 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -14,7 +14,7 @@
dried_type = -1
// Saves us from having to define each stupid grown's dried_type as itself.
// If you don't want a plant to be driable (watermelons) set this to null in the time definition.
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
origin_tech = "biotech=1"
/obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc, var/obj/item/seeds/new_seed = null)
diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm
index c431644831c..2e05b8bb35b 100644
--- a/code/modules/hydroponics/grown/kudzu.dm
+++ b/code/modules/hydroponics/grown/kudzu.dm
@@ -32,7 +32,7 @@
var/turf/T = get_turf(src)
message_admins("Kudzu planted by [key_name_admin(user)](?) (FLW) at ([T.x],[T.y],[T.z] - (JMP))",0,1)
investigate_log("was planted by [key_name(user)] at ([T.x],[T.y],[T.z])","kudzu")
- new /obj/structure/spacevine_controller(user.loc, mutations, potency, production)
+ new /obj/effect/spacevine_controller(user.loc, mutations, potency, production)
qdel(src)
/obj/item/seeds/kudzu/attack_self(mob/user)
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index 4504d1740ba..508880f5c6e 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -115,6 +115,8 @@
seed = /obj/item/seeds/cherry/bomb
bitesize_mod = 2
volume = 125 //Gives enough room for the black powder at max potency
+ obj_integrity = 40
+ max_integrity = 40
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user)
var/area/A = get_area(user)
@@ -123,12 +125,14 @@
log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).")
prime()
-/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/burn()
- prime()
- ..()
+/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/deconstruct(disassembled = TRUE)
+ if(!disassembled)
+ prime()
+ if(!qdeleted(src))
+ qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/ex_act(severity)
- qdel(src) //Ensuring that it's deleted by its own explosion
+ qdel(src) //Ensuring that it's deleted by its own explosion. Also prevents mass chain reaction with piles of cherry bombs
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime()
icon_state = "cherry_bomb_lit"
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index c974d1b9da3..0125c35fcbd 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -245,7 +245,8 @@
return
var/obj/structure/glowshroom/planted = new effect_path(user.loc)
planted.delay = planted.delay - seed.production * 100 //So the delay goes DOWN with better stats instead of up. :I
- planted.endurance = seed.endurance
+ planted.obj_integrity = seed.endurance
+ planted.max_integrity = seed.endurance
planted.yield = seed.yield
planted.potency = seed.potency
user << "You plant [src]."
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index 04ac147e52d..fa8f9fc1de7 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -56,7 +56,7 @@
var/hit_zone = (C.held_index_to_dir(C.active_hand_index) == "l" ? "l_":"r_") + "arm"
var/obj/item/bodypart/affecting = C.get_bodypart(hit_zone)
if(affecting)
- if(affecting.take_damage(0, force))
+ if(affecting.receive_damage(0, force))
C.update_damage_overlays()
C << "The nettle burns your bare hand!"
return 1
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index a1c9b2fc2d6..8fa0c463c3b 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -150,7 +150,7 @@
Burn()
START_PROCESSING(SSobj, src)
-/obj/structure/bonfire/fire_act()
+/obj/structure/bonfire/fire_act(exposed_temperature, exposed_volume)
StartBurning()
/obj/structure/bonfire/Crossed(atom/movable/AM)
@@ -165,9 +165,7 @@
continue
if(isobj(A))
var/obj/O = A
- if(O.resistance_flags & FIRE_PROOF)
- continue
- O.fire_act()
+ O.fire_act(1000, 500)
else if(isliving(A))
var/mob/living/L = A
L.adjust_fire_stacks(fire_stack_strength)
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index 4fe9efe83c6..2c23081c95d 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -5,7 +5,7 @@
/obj/item/weapon/grown // Grown weapons
name = "grown_weapon"
icon = 'icons/obj/hydroponics/harvest.dmi'
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item.
/obj/item/weapon/grown/New(newloc, var/obj/item/seeds/new_seed = null)
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 7b38596b2e3..82134306813 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -16,7 +16,7 @@
var/toxic = 0 //Toxicity in the tray?
var/age = 0 //Current age
var/dead = 0 //Is it dead?
- var/health = 0 //Its health.
+ var/plant_health //Its health
var/lastproduce = 0 //Last time it was harvested
var/lastcycle = 0 //Used for timing of cycles.
var/cycledelay = 200 //About 10 seconds / cycle
@@ -197,8 +197,8 @@
//Health & Age///////////////////////////////////////////////////////////
- // Plant dies if health <= 0
- if(health <= 0)
+ // Plant dies if plant_health <= 0
+ if(plant_health <= 0)
plantdies()
adjustWeeds(1 / rating) // Weeds flourish
@@ -305,7 +305,7 @@
add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowwater3"))
if(nutrilevel <= 2)
add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lownutri3"))
- if(health <= (myseed.endurance / 2))
+ if(plant_health <= (myseed.endurance / 2))
add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowhealth3"))
if(weedlevel >= 5 || pestlevel >= 5 || toxic >= 40)
add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_alert3"))
@@ -321,7 +321,7 @@
user << "It's dead!"
else if (harvest)
user << "It's ready to harvest."
- else if (health <= (myseed.endurance / 2))
+ else if (plant_health <= (myseed.endurance / 2))
user << "It looks unhealthy."
else
user << "[src] is empty."
@@ -366,7 +366,7 @@
else
myseed = new /obj/item/seeds/weeds(src)
age = 0
- health = myseed.endurance
+ plant_health = myseed.endurance
lastcycle = world.time
harvest = 0
weedlevel = 0 // Reset
@@ -399,7 +399,7 @@
hardmutate()
age = 0
- health = myseed.endurance
+ plant_health = myseed.endurance
lastcycle = world.time
harvest = 0
weedlevel = 0 // Reset
@@ -419,7 +419,7 @@
dead = 0
hardmutate()
age = 0
- health = myseed.endurance
+ plant_health = myseed.endurance
lastcycle = world.time
harvest = 0
weedlevel = 0 // Reset
@@ -432,7 +432,7 @@
/obj/machinery/hydroponics/proc/plantdies() // OH NOES!!!!! I put this all in one function to make things easier
- health = 0
+ plant_health = 0
harvest = 0
pestlevel = 0 // Pests die
if(!dead)
@@ -773,9 +773,9 @@
dead = 0
myseed = O
age = 1
- health = myseed.endurance
+ plant_health = myseed.endurance
lastcycle = world.time
- O.loc = src
+ O.forceMove(src)
update_icon()
else
user << "[src] already has seeds in it!"
@@ -858,7 +858,7 @@
playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1)
if(myseed) //Could be that they're just using it as a de-weeder
age = 0
- health = 0
+ plant_health = 0
if(harvest)
harvest = FALSE //To make sure they can't just put in another seed and insta-harvest it
qdel(myseed)
@@ -910,7 +910,7 @@
/obj/machinery/hydroponics/proc/adjustHealth(adjustamt)
if(myseed && !dead)
- health = Clamp(health + adjustamt, 0, myseed.endurance)
+ plant_health = Clamp(plant_health + adjustamt, 0, myseed.endurance)
/obj/machinery/hydroponics/proc/adjustToxic(adjustamt)
toxic = Clamp(toxic + adjustamt, 0, 100)
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 3812bc18124..7431980ac1f 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -276,7 +276,7 @@
if(isliving(target))
var/teleport_radius = max(round(G.seed.potency / 10), 1)
var/turf/T = get_turf(target)
- new /obj/effect/decal/cleanable/molten_item(T) //Leave a pile of goo behind for dramatic effect...
+ new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect...
do_teleport(target, T, teleport_radius)
/datum/plant_gene/trait/teleport/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/C)
@@ -287,7 +287,7 @@
if(prob(50))
do_teleport(G, T, teleport_radius)
else
- new /obj/effect/decal/cleanable/molten_item(T) //Leave a pile of goo behind for dramatic effect...
+ new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect...
qdel(G)
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 51bdb5b7fb8..b395b8e277d 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -6,7 +6,7 @@
icon = 'icons/obj/hydroponics/seeds.dmi'
icon_state = "seed" // Unknown plant seed - these shouldn't exist in-game.
w_class = 1
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/plantname = "Plants" // Name of plant when planted.
var/product // A type path. The thing that is created when the plant is harvested.
var/species = "" // Used to update icons. Should match the name in the sprites unless all icon_* are overriden.
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index abdd72df540..c707fb544bb 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -17,8 +17,10 @@
anchored = 0
density = 1
opacity = 0
- resistance_flags = 0
- burntime = 30
+ resistance_flags = FLAMMABLE
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0)
var/state = 0
var/list/allowed_books = list(/obj/item/weapon/book, /obj/item/weapon/spellbook, /obj/item/weapon/storage/book) //Things allowed in the bookcase
@@ -46,8 +48,7 @@
playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
if(do_after(user, 20/I.toolspeed, target = src))
user << "You pry the frame apart."
- new /obj/item/stack/sheet/mineral/wood(loc, 4)
- qdel(src)
+ deconstruct(TRUE)
if(1)
if(istype(I, /obj/item/stack/sheet/mineral/wood))
@@ -109,13 +110,12 @@
update_icon()
-/obj/structure/bookcase/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- for(var/obj/item/weapon/book/b in contents)
- b.loc = (get_turf(src))
- if(prob(50))
- qdel(src)
+/obj/structure/bookcase/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/mineral/wood(loc, 4)
+ for(var/obj/item/weapon/book/B in contents)
+ B.forceMove(get_turf(src))
+ qdel(src)
+
/obj/structure/bookcase/update_icon()
if(contents.len < 5)
@@ -167,7 +167,7 @@
throw_range = 5
w_class = 3 //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
attack_verb = list("bashed", "whacked", "educated")
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
var/dat //Actual page content
var/due_date = 0 //Game time in 1/10th seconds
var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index 9109ddefc76..c31226730ea 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -179,9 +179,6 @@
else
return ..()
-/obj/structure/closet/crate/secure/loot/attack_animal(mob/user)
- boom(user)
-
/obj/structure/closet/crate/secure/loot/AltClick(mob/living/user)
if(!user.canUseTopic(src))
return
@@ -224,8 +221,7 @@
else
..()
-/obj/structure/closet/crate/secure/loot/burn()
- SSobj.burning -= src
+/obj/structure/closet/crate/secure/loot/deconstruct(disassembled = TRUE)
boom()
/obj/structure/closet/crate/secure/loot/proc/boom(mob/user)
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index ae054817156..4a6c74c82b8 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -152,8 +152,9 @@
icon = 'icons/obj/lavaland/ash_flora.dmi'
icon_state = "mushroom_shavings"
w_class = 1
- resistance_flags = 0
- burntime = 30
+ resistance_flags = FLAMMABLE
+ obj_integrity = 100
+ max_integrity = 100
var/prepared = FALSE
var/prepared_type = /obj/item/ash_flora/shavings
var/standard_prep = TRUE
@@ -240,8 +241,9 @@
icon = 'icons/obj/lavaland/ash_flora.dmi'
icon_state = "mushroom_bowl"
w_class = 2
- resistance_flags = 0
- burntime = 40
+ resistance_flags = FLAMMABLE
+ obj_integrity = 200
+ max_integrity = 200
//what you can craft with these things
/datum/crafting_recipe/mushroom_bowl
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 46f25ab3c4b..6a244812746 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -252,7 +252,6 @@
/obj/effect/immortality_talisman
icon_state = "blank"
icon = 'icons/effects/effects.dmi'
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/can_destroy = FALSE
/obj/effect/immortality_talisman/attackby()
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 4474a48fc0c..e3c54e6290c 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -451,9 +451,10 @@
var/buildstackamount = 5
/obj/structure/fans/deconstruct()
- if(buildstacktype)
- new buildstacktype(loc,buildstackamount)
- ..()
+ if(!(flags & NODECONSTRUCT))
+ if(buildstacktype)
+ new buildstacktype(loc,buildstackamount)
+ qdel(src)
/obj/structure/fans/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench) && !(flags&NODECONSTRUCT))
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 88c0e85baf4..0f0f4d776c0 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -36,6 +36,10 @@
if(istype(T, /turf/closed/mineral/random))
Spread(T)
+
+/turf/closed/mineral/acid_melt()
+ ChangeTurf(baseturf)
+
/turf/closed/mineral/volcanic
environment_type = "basalt"
turf_type = /turf/open/floor/plating/asteroid/basalt
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index bb92d145e93..234f3adfcaa 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -24,6 +24,7 @@
maxHealth = 125
melee_damage_lower = 15
melee_damage_upper = 15
+ obj_damage = 0
environment_smash = 0
check_friendly_fire = 1
stop_automated_movement_when_pulled = 1
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index d98a98b714c..f68565e29ce 100644
--- a/code/modules/mining/money_bag.dm
+++ b/code/modules/mining/money_bag.dm
@@ -5,8 +5,9 @@
icon_state = "moneybag"
force = 10
throwforce = 0
- resistance_flags = 0
- burntime = 20
+ resistance_flags = FLAMMABLE
+ obj_integrity = 100
+ max_integrity = 100
w_class = 4
max_w_class = 3
storage_slots = 80
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 542616a278e..89f1a5a7529 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -315,6 +315,7 @@
return items
+
/obj/item/proc/equip_to_best_slot(var/mob/M)
if(src != M.get_active_held_item())
M << "You are not holding anything to equip!"
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index 8fb5aa0cced..a1ada1800a3 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -6,7 +6,7 @@
density = 0
anchored = 1
invisibility = 60
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/dummy/slaughter/relaymove(mob/user, direction)
forceMove(get_step(src,direction))
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index 32179d23f61..9d8ea058792 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -90,23 +90,27 @@
user << "You toggle the MMI's radio system [radio.on==1 ? "on" : "off"]."
else
user << "You unlock and upend the MMI, spilling the brain onto the floor."
-
- brainmob.container = null //Reset brainmob mmi var.
- brainmob.loc = brain //Throw mob into brain.
- brainmob.stat = DEAD
- brainmob.emp_damage = 0
- brainmob.reset_perspective() //so the brainmob follows the brain organ instead of the mmi. And to update our vision
- living_mob_list -= brainmob //Get outta here
- dead_mob_list += brainmob
- brain.brainmob = brainmob //Set the brain to use the brainmob
- brainmob = null //Set mmi brainmob var to null
-
- user.put_in_hands(brain) //puts brain in the user's hand or otherwise drops it on the user's turf
- brain = null //No more brain in here
-
+ eject_brain(user)
update_icon()
name = "Man-Machine Interface"
+/obj/item/device/mmi/proc/eject_brain(mob/user)
+ brainmob.container = null //Reset brainmob mmi var.
+ brainmob.loc = brain //Throw mob into brain.
+ brainmob.stat = DEAD
+ brainmob.emp_damage = 0
+ brainmob.reset_perspective() //so the brainmob follows the brain organ instead of the mmi. And to update our vision
+ living_mob_list -= brainmob //Get outta here
+ dead_mob_list += brainmob
+ brain.brainmob = brainmob //Set the brain to use the brainmob
+ brainmob = null //Set mmi brainmob var to null
+ if(user)
+ user.put_in_hands(brain) //puts brain in the user's hand or otherwise drops it on the user's turf
+ else
+ brain.forceMove(get_turf(src))
+ brain = null //No more brain in here
+
+
/obj/item/device/mmi/proc/transfer_identity(mob/living/L) //Same deal as the regular brain proc. Used for human-->robot people.
if(!brainmob)
brainmob = new(src)
@@ -170,8 +174,21 @@
if(brainmob)
qdel(brainmob)
brainmob = null
+ if(brain)
+ qdel(brain)
+ brain = null
+ if(mecha)
+ mecha = null
+ if(radio)
+ qdel(radio)
+ radio = null
return ..()
+/obj/item/device/mmi/deconstruct(disassembled = TRUE)
+ if(brain)
+ eject_brain()
+ qdel(src)
+
/obj/item/device/mmi/examine(mob/user)
..()
if(brainmob)
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 0d934446366..c78e574b2e9 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -109,6 +109,7 @@ In all, this is a lot like the monkey code. /N
switch (severity)
if (1)
gib()
+ return
if (2)
take_overall_damage(60, 60)
@@ -121,4 +122,7 @@ In all, this is a lot like the monkey code. /N
adjustEarDamage(15,60)
/mob/living/carbon/alien/soundbang_act(intensity = 1, stun_pwr = 1, damage_pwr = 5, deafen_pwr = 15)
- return 0
\ No newline at end of file
+ return 0
+
+/mob/living/carbon/alien/acid_act(acidpwr, acid_volume)
+ return 0//aliens are immune to acid.
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index 8d155f8ceca..630c6d629c6 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -140,30 +140,16 @@ Doesn't work on other aliens/AI.*/
/obj/effect/proc_holder/alien/acid/on_lose(mob/living/carbon/user)
user.verbs.Remove(/mob/living/carbon/proc/corrosive_acid)
-/obj/effect/proc_holder/alien/acid/proc/corrode(target,mob/living/carbon/user = usr)
+/obj/effect/proc_holder/alien/acid/proc/corrode(atom/target,mob/living/carbon/user = usr)
if(target in oview(1,user))
- // OBJ CHECK
- if(isobj(target))
- var/obj/I = target
- if(I.resistance_flags & UNACIDABLE)//So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid.
- user << "You cannot dissolve this object."
- return 0
- // TURF CHECK
- else if(istype(target, /turf))
- var/turf/T = target
- // R WALL
- if(istype(T, /turf/closed/wall/r_wall))
- user << "You cannot dissolve this object."
- return 0
- // R FLOOR
- if(istype(T, /turf/open/floor/engine))
- user << "You cannot dissolve this object."
- return 0
- else// Not a type we can acid.
+ if(target.acid_act(200, 100))
+ user.visible_message("[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!")
+ return 1
+ else
+ user << "You cannot dissolve this object."
+
+
return 0
- new /obj/effect/acid(get_turf(target), target)
- user.visible_message("[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!")
- return 1
else
src << "Target is too far away."
return 0
@@ -171,8 +157,10 @@ Doesn't work on other aliens/AI.*/
/obj/effect/proc_holder/alien/acid/fire(mob/living/carbon/alien/user)
var/O = input("Select what to dissolve:","Dissolve",null) as obj|turf in oview(1,user)
- if(!O) return 0
- return corrode(O,user)
+ if(!O || user.incapacitated())
+ return 0
+ else
+ return corrode(O,user)
/mob/living/carbon/proc/corrosive_acid(O as obj|turf in oview(1)) // right click menu verb ugh
set name = "Corrossive Acid"
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
index 4f08997c40f..a9b5fae735f 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
@@ -5,7 +5,7 @@
else
..()
-/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user)
+/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(user.a_intent == "harm")
..(user, 1)
adjustBruteLoss(15)
diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
index 77bab6cdf04..82bb19b1475 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
@@ -18,7 +18,7 @@
visible_message("[M] has attempted to kick [src]!", \
"[M] has attempted to kick [src]!")
-/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user)
+/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(user.a_intent == "harm")
..(user, 1)
adjustBruteLoss(5 + rand(1,9))
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 1c26411d02f..5bc761c0faa 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -30,7 +30,7 @@
if(I && I.force)
var/d = rand(round(I.force / 4), I.force)
var/obj/item/bodypart/BP = get_bodypart("chest")
- if(BP.take_damage(d, 0))
+ if(BP.receive_damage(d, 0))
update_damage_overlays()
visible_message("[user] attacks [src]'s stomach wall with the [I.name]!", \
"[user] attacks your stomach wall with the [I.name]!")
@@ -501,8 +501,6 @@
update_stat()
if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD )
become_husk()
- if(on_fire)
- shred_clothing()
med_hud_set_health()
/mob/living/carbon/update_sight()
@@ -707,6 +705,13 @@
..()
+/mob/living/carbon/ExtinguishMob()
+ for(var/X in get_equipped_items())
+ var/obj/item/I = X
+ I.acid_level = 0 //washes off the acid on our clothes
+ I.extinguish() //extinguishes our clothes
+ ..()
+
/mob/living/carbon/fakefire(var/fire_icon = "Generic_mob_burning")
overlays_standing[FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"= fire_icon, "layer"=-FIRE_LAYER)
apply_overlay(FIRE_LAYER)
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index ea2195d1727..74898463ff9 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -286,3 +286,15 @@ mob/living/carbon/bullet_act(obj/item/projectile/P, def_zone)
src << "Your ears start to ring!"
src << sound('sound/weapons/flash_ring.ogg',0,1,0,250)
return effect_amount //how soundbanged we are
+
+
+/mob/living/carbon/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone)
+ var/bodypart_bit = 0
+ if(def_zone)
+ bodypart_bit = body_zone2body_parts_covered(def_zone)
+ for(var/X in get_equipped_items())
+ var/obj/item/I = X
+ if(I.body_parts_covered & bodypart_bit)
+ I.take_damage(0.5*damage_amount, damage_type, damage_flag, 0)
+ //0.5 multiplier for balance reason, we don't want clothes to be too easily destroyed
+
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 6da20373f62..226a4f4666a 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -18,13 +18,13 @@
switch(damagetype)
if(BRUTE)
if(BP)
- if(BP.take_damage(damage * hit_percent, 0))
+ if(BP.receive_damage(damage * hit_percent, 0))
update_damage_overlays()
else //no bodypart, we deal damage with a more general method.
adjustBruteLoss(damage * hit_percent)
if(BURN)
if(BP)
- if(BP.take_damage(0, damage * hit_percent))
+ if(BP.receive_damage(0, damage * hit_percent))
update_damage_overlays()
else
adjustFireLoss(damage * hit_percent)
@@ -120,7 +120,7 @@
if(!parts.len)
return
var/obj/item/bodypart/picked = pick(parts)
- if(picked.take_damage(brute,burn))
+ if(picked.receive_damage(brute,burn))
update_damage_overlays()
@@ -162,7 +162,7 @@
var/burn_was = picked.burn_dam
- update |= picked.take_damage(brute_per_part,burn_per_part, 0)
+ update |= picked.receive_damage(brute_per_part,burn_per_part, 0)
brute -= (picked.brute_dam - brute_was)
burn -= (picked.burn_dam - burn_was)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index dc076f45497..b9285c64abc 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -306,10 +306,10 @@
msg += "Detected cybernetic modifications:
"
msg += implant_detect
if(R)
- var/health = R.fields["p_stat"]
- msg += "\[[health]\]"
- health = R.fields["m_stat"]
- msg += "\[[health]\]
"
+ var/health_r = R.fields["p_stat"]
+ msg += "\[[health_r]\]"
+ health_r = R.fields["m_stat"]
+ msg += "\[[health_r]\]
"
R = find_record("name", perpname, data_core.medical)
if(R)
msg += "\[Medical evaluation\]
"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index e04bbd5b023..bcc9bdfe3cb 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -219,8 +219,8 @@
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
return
L.embedded_objects -= I
- L.take_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
- I.loc = get_turf(src)
+ L.receive_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
+ I.forceMove(get_turf(src))
usr.put_in_hands(I)
usr.emote("scream")
usr.visible_message("[usr] successfully rips [I] out of their [L.name]!","You successfully remove [I] from your [L.name].")
@@ -294,24 +294,24 @@
if(href_list["hud"] == "m")
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
if(href_list["p_stat"])
- var/health = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel")
+ var/health_status = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel")
if(R)
if(!H.canUseHUD())
return
else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health))
return
- if(health && health != "Cancel")
- R.fields["p_stat"] = health
+ if(health_status && health_status != "Cancel")
+ R.fields["p_stat"] = health_status
return
if(href_list["m_stat"])
- var/health = input(usr, "Specify a new mental status for this person.", "Medical HUD", R.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel")
+ var/health_status = input(usr, "Specify a new mental status for this person.", "Medical HUD", R.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel")
if(R)
if(!H.canUseHUD())
return
else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health))
return
- if(health && health != "Cancel")
- R.fields["m_stat"] = health
+ if(health_status && health_status != "Cancel")
+ R.fields["m_stat"] = health_status
return
if(href_list["evaluation"])
if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20)
@@ -884,7 +884,6 @@
override = dna.species.override_float
..()
-
/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = 0, stun = 1, distance = 0, message = 1, toxic = 0)
if(blood && (NOBLOOD in dna.species.specflags))
if(message)
@@ -893,4 +892,4 @@
if(stun)
Weaken(10)
return 1
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 766a37aad4a..cf7908ce2ef 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -18,8 +18,8 @@
return (armorval/max(organnum, 1))
-/mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/def_zone, type)
- if(!type)
+/mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/def_zone, d_type)
+ if(!d_type)
return 0
var/protection = 0
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor)
@@ -29,7 +29,7 @@
if(bp && istype(bp ,/obj/item/clothing))
var/obj/item/clothing/C = bp
if(C.body_parts_covered & def_zone.body_part)
- protection += C.armor[type]
+ protection += C.armor[d_type]
return protection
///checkeyeprot()
@@ -139,7 +139,7 @@
L.embedded_objects |= I
I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
I.loc = src
- L.take_damage(I.w_class*I.embedded_impact_pain_multiplier)
+ L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier)
visible_message("\the [I.name] embeds itself in [src]'s [L.name]!","\the [I.name] embeds itself in your [L.name]!")
hitpush = 0
skipcatch = 1 //can't catch the now embedded item
@@ -171,7 +171,7 @@
return dna.species.spec_attacked_by(I, user, affecting, a_intent, src)
-/mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user)
+/mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(user.a_intent == "harm")
..(user, 1)
playsound(loc, user.dna.species.attack_sound, 25, 1, -1)
@@ -179,6 +179,7 @@
visible_message("[user] has [hulk_verb]ed [src]!", \
"[user] has [hulk_verb]ed [src]!")
adjustBruteLoss(15)
+ damage_clothes(15, BRUTE, "melee")
return 1
/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M)
@@ -190,7 +191,8 @@
/mob/living/carbon/human/attack_paw(mob/living/carbon/monkey/M)
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
-
+ if(!affecting)
+ affecting = get_bodypart("chest")
if(M.a_intent == "help")
..() //shaking
return 0
@@ -203,6 +205,7 @@
var/damage = rand(1, 3)
if(stat != DEAD)
apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee"))
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
return 1
/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M)
@@ -221,6 +224,8 @@
"[M] has lunged at [src]!")
return 0
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
+ if(!affecting)
+ affecting = get_bodypart("chest")
var/armor_block = run_armor_check(affecting, "melee","","",10)
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
@@ -230,6 +235,7 @@
if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful
return 1
apply_damage(damage, BRUTE, affecting, armor_block)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
if(M.a_intent == "disarm") //Always drop item in hand, if no item, get stunned instead.
if(get_active_held_item() && drop_item())
@@ -253,8 +259,11 @@
if(stat != DEAD)
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected))
+ if(!affecting)
+ affecting = get_bodypart("chest")
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M)
@@ -266,9 +275,11 @@
if(!dam_zone) //Dismemberment successful
return 1
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
+ if(!affecting)
+ affecting = get_bodypart("chest")
var/armor = run_armor_check(affecting, "melee", armour_penetration = M.armour_penetration)
apply_damage(damage, M.melee_damage_type, affecting, armor)
-
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M)
@@ -285,8 +296,11 @@
return 1
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
+ if(!affecting)
+ affecting = get_bodypart("chest")
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
@@ -297,15 +311,18 @@
var/obj/item/bodypart/temp = get_bodypart(pick("chest", "chest", "chest", "head"))
if(temp)
var/update = 0
+ var/dmg = rand(M.force/2, M.force)
switch(M.damtype)
if("brute")
if(M.force > 20)
Paralyse(1)
- update |= temp.take_damage(rand(M.force/2, M.force), 0)
+ update |= temp.receive_damage(dmg, 0)
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
+ damage_clothes(dmg, BRUTE, "melee", temp.body_zone)
if("fire")
- update |= temp.take_damage(0, rand(M.force/2, M.force))
+ update |= temp.receive_damage(0, dmg)
playsound(src, 'sound/items/Welder.ogg', 50, 1)
+ damage_clothes(dmg, BURN, "melee", temp.body_zone)
if("tox")
M.mech_toxin_damage(src)
else
@@ -323,17 +340,17 @@
/mob/living/carbon/human/ex_act(severity, ex_target)
- var/b_loss = null
- var/f_loss = null
- var/bomb_armor = getarmor(null, "bomb")
+
if(istype(ex_target, /datum/spacevine_mutation) && isvineimmune(src))
return
+ var/b_loss = 0
+ var/f_loss = 0
+ var/bomb_armor = getarmor(null, "bomb")
switch (severity)
if (1)
- b_loss += 500
- if (prob(bomb_armor))
- shred_clothing(1,150)
+ if(prob(bomb_armor))
+ b_loss = 500
var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src)))
throw_at(target, 200, 4)
else
@@ -341,15 +358,11 @@
return
if (2)
- b_loss += 60
-
- f_loss += 60
- if (prob(bomb_armor))
- b_loss = b_loss/1.5
- f_loss = f_loss/1.5
- shred_clothing(1,25)
- else
- shred_clothing(1,50)
+ b_loss = 60
+ f_loss = 60
+ if(bomb_armor)
+ b_loss = 30*(2 - round(bomb_armor*0.01, 0.05))
+ f_loss = b_loss
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
adjustEarDamage(30, 120)
@@ -357,15 +370,20 @@
Paralyse(10)
if(3)
- b_loss += 30
- if (prob(bomb_armor))
- b_loss = b_loss/2
+ b_loss = 30
+ if(bomb_armor)
+ b_loss = 15*(2 - round(bomb_armor*0.01, 0.05))
+
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
adjustEarDamage(15,60)
if (prob(50))
Paralyse(8)
take_overall_damage(b_loss,f_loss)
+ if(bomb_armor == 100) //full bomb armor set, we don't call contents_explosion
+ flash_act()
+ return
+
//attempt to dismember bodyparts
if(severity <= 2 || !bomb_armor)
var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3.
@@ -426,131 +444,129 @@
informed = 1
switch(severity)
if(1)
- L.take_damage(0,10)
+ L.receive_damage(0,10)
src.Stun(10)
if(2)
- L.take_damage(0,5)
+ L.receive_damage(0,5)
src.Stun(5)
..()
-/mob/living/carbon/human/acid_act(acidpwr, toxpwr, acid_volume)
+/mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit)
var/list/damaged = list()
var/list/inventory_items_to_kill = list()
- var/acidity = min(acidpwr*acid_volume/200, toxpwr)
- var/acid_volume_left = acid_volume
- var/acid_decay = 100/acidpwr // how much volume we lose per item we try to melt. 5 for fluoro, 10 for sulphuric
-
+ var/acidity = acidpwr * min(acid_volume*0.005, 0.1)
//HEAD//
- var/obj/item/clothing/head_clothes = null
- if(glasses)
- head_clothes = glasses
- if(wear_mask)
- head_clothes = wear_mask
- if(head)
- head_clothes = head
- if(head_clothes)
- if(!(head_clothes.resistance_flags & UNACIDABLE))
- head_clothes.acid_act(acidpwr, acid_volume_left)
- acid_volume_left = max(acid_volume_left - acid_decay, 0) //We remove some of the acid volume.
- update_inv_glasses()
- update_inv_wear_mask()
- update_inv_head()
+ if(!bodyzone_hit || bodyzone_hit == "head") //only if we didn't specify a zone or if that zone is the head.
+ var/obj/item/clothing/head_clothes = null
+ if(glasses)
+ head_clothes = glasses
+ if(wear_mask)
+ head_clothes = wear_mask
+ if(head)
+ head_clothes = head
+ if(head_clothes)
+ if(!(head_clothes.resistance_flags & UNACIDABLE))
+ head_clothes.acid_act(acidpwr, acid_volume)
+ update_inv_glasses()
+ update_inv_wear_mask()
+ update_inv_head()
+ else
+ src << "Your [head_clothes.name] protects your head and face from the acid!"
else
- src << "Your [head_clothes.name] protects your head and face from the acid!"
- else
- . = get_bodypart("head")
- if(.)
- damaged += .
- if(ears)
- inventory_items_to_kill += ears
+ . = get_bodypart("head")
+ if(.)
+ damaged += .
+ if(ears)
+ inventory_items_to_kill += ears
//CHEST//
- var/obj/item/clothing/chest_clothes = null
- if(w_uniform)
- chest_clothes = w_uniform
- if(wear_suit)
- chest_clothes = wear_suit
- if(chest_clothes)
- if(!(chest_clothes.resistance_flags & UNACIDABLE))
- chest_clothes.acid_act(acidpwr, acid_volume_left)
- acid_volume_left = max(acid_volume_left - acid_decay, 0)
- update_inv_w_uniform()
- update_inv_wear_suit()
+ if(!bodyzone_hit || bodyzone_hit == "chest")
+ var/obj/item/clothing/chest_clothes = null
+ if(w_uniform)
+ chest_clothes = w_uniform
+ if(wear_suit)
+ chest_clothes = wear_suit
+ if(chest_clothes)
+ if(!(chest_clothes.resistance_flags & UNACIDABLE))
+ chest_clothes.acid_act(acidpwr, acid_volume)
+ update_inv_w_uniform()
+ update_inv_wear_suit()
+ else
+ src << "Your [chest_clothes.name] protects your body from the acid!"
else
- src << "Your [chest_clothes.name] protects your body from the acid!"
- else
- . = get_bodypart("chest")
- if(.)
- damaged += .
- if(wear_id)
- inventory_items_to_kill += wear_id
- if(r_store)
- inventory_items_to_kill += r_store
- if(l_store)
- inventory_items_to_kill += l_store
- if(s_store)
- inventory_items_to_kill += s_store
+ . = get_bodypart("chest")
+ if(.)
+ damaged += .
+ if(wear_id)
+ inventory_items_to_kill += wear_id
+ if(r_store)
+ inventory_items_to_kill += r_store
+ if(l_store)
+ inventory_items_to_kill += l_store
+ if(s_store)
+ inventory_items_to_kill += s_store
//ARMS & HANDS//
- var/obj/item/clothing/arm_clothes = null
- if(gloves)
- arm_clothes = gloves
- if(w_uniform && (w_uniform.body_parts_covered & HANDS) || w_uniform && (w_uniform.body_parts_covered & ARMS))
- arm_clothes = w_uniform
- if(wear_suit && (wear_suit.body_parts_covered & HANDS) || wear_suit && (wear_suit.body_parts_covered & ARMS))
- arm_clothes = wear_suit
- if(arm_clothes)
- if(!(arm_clothes.resistance_flags & UNACIDABLE))
- arm_clothes.acid_act(acidpwr, acid_volume_left)
- acid_volume_left = max(acid_volume_left - acid_decay, 0)
- update_inv_gloves()
- update_inv_w_uniform()
- update_inv_wear_suit()
+ if(!bodyzone_hit || bodyzone_hit == "l_arm" || bodyzone_hit == "r_arm")
+ var/obj/item/clothing/arm_clothes = null
+ if(gloves)
+ arm_clothes = gloves
+ if(w_uniform && ((w_uniform.body_parts_covered & HANDS) || (w_uniform.body_parts_covered & ARMS)))
+ arm_clothes = w_uniform
+ if(wear_suit && ((wear_suit.body_parts_covered & HANDS) || (wear_suit.body_parts_covered & ARMS)))
+ arm_clothes = wear_suit
+
+ if(arm_clothes)
+ if(!(arm_clothes.resistance_flags & UNACIDABLE))
+ arm_clothes.acid_act(acidpwr, acid_volume)
+ update_inv_gloves()
+ update_inv_w_uniform()
+ update_inv_wear_suit()
+ else
+ src << "Your [arm_clothes.name] protects your arms and hands from the acid!"
else
- src << "Your [arm_clothes.name] protects your arms and hands from the acid!"
- else
- . = get_bodypart("r_arm")
- if(.)
- damaged += .
- . = get_bodypart("l_arm")
- if(.)
- damaged += .
+ . = get_bodypart("r_arm")
+ if(.)
+ damaged += .
+ . = get_bodypart("l_arm")
+ if(.)
+ damaged += .
//LEGS & FEET//
- var/obj/item/clothing/leg_clothes = null
- if(shoes)
- leg_clothes = shoes
- if(w_uniform && (w_uniform.body_parts_covered & FEET) || w_uniform && (w_uniform.body_parts_covered & LEGS))
- leg_clothes = w_uniform
- if(wear_suit && (wear_suit.body_parts_covered & FEET) || wear_suit && (wear_suit.body_parts_covered & LEGS))
- leg_clothes = wear_suit
- if(leg_clothes)
- if(!(leg_clothes.resistance_flags & UNACIDABLE))
- leg_clothes.acid_act(acidpwr, acid_volume_left)
- acid_volume_left = max(acid_volume_left - acid_decay, 0)
- update_inv_shoes()
- update_inv_w_uniform()
- update_inv_wear_suit()
+ if(!bodyzone_hit || bodyzone_hit == "l_leg" || bodyzone_hit == "r_leg" || bodyzone_hit == "feet")
+ var/obj/item/clothing/leg_clothes = null
+ if(shoes)
+ leg_clothes = shoes
+ if(w_uniform && ((w_uniform.body_parts_covered & FEET) || (bodyzone_hit != "feet" && (w_uniform.body_parts_covered & LEGS))))
+ leg_clothes = w_uniform
+ if(wear_suit && ((wear_suit.body_parts_covered & FEET) || (bodyzone_hit != "feet" && (wear_suit.body_parts_covered & LEGS))))
+ leg_clothes = wear_suit
+ if(leg_clothes)
+ if(!(leg_clothes.resistance_flags & UNACIDABLE))
+ leg_clothes.acid_act(acidpwr, acid_volume)
+ update_inv_shoes()
+ update_inv_w_uniform()
+ update_inv_wear_suit()
+ else
+ src << "Your [leg_clothes.name] protects your legs and feet from the acid!"
else
- src << "Your [leg_clothes.name] protects your legs and feet from the acid!"
- else
- . = get_bodypart("r_leg")
- if(.)
- damaged += .
- . = get_bodypart("l_leg")
- if(.)
- damaged += .
+ . = get_bodypart("r_leg")
+ if(.)
+ damaged += .
+ . = get_bodypart("l_leg")
+ if(.)
+ damaged += .
//DAMAGE//
for(var/obj/item/bodypart/affecting in damaged)
- affecting.take_damage(acidity, 2*acidity)
+ affecting.receive_damage(acidity, 2*acidity)
if(affecting.name == "head")
if(prob(min(acidpwr*acid_volume/10, 90))) //Applies disfigurement
- affecting.take_damage(acidity, 2*acidity)
+ affecting.receive_damage(acidity, 2*acidity)
emote("scream")
facial_hair_style = "Shaved"
hair_style = "Bald"
@@ -561,17 +577,17 @@
//MELTING INVENTORY ITEMS//
//these items are all outside of armour visually, so melt regardless.
- if(back)
- inventory_items_to_kill += back
- if(belt)
- inventory_items_to_kill += belt
+ if(!bodyzone_hit)
+ if(back)
+ inventory_items_to_kill += back
+ if(belt)
+ inventory_items_to_kill += belt
- inventory_items_to_kill += held_items
+ inventory_items_to_kill += held_items
for(var/obj/item/I in inventory_items_to_kill)
- I.acid_act(acidpwr, acid_volume_left)
- acid_volume_left = max(acid_volume_left - acid_decay, 0)
-
+ I.acid_act(acidpwr, acid_volume)
+ return 1
/mob/living/carbon/human/singularity_act()
var/gain = 20
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 4d82003dadf..e175fec7d3e 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -200,100 +200,6 @@
sec_hud_set_security_status()
..()
-
-
-
-//Cycles through all clothing slots and tests them for destruction
-/mob/living/carbon/proc/shred_clothing(bomb,shock)
- if(back)
- back.shred(bomb,shock-20,src)
- if(head)
- head.shred(bomb,shock,src)
- if(wear_mask)
- wear_mask.shred(bomb,shock,src)
-
-
-/mob/living/carbon/human/shred_clothing(bomb,shock)
- var/covered_parts = 0 //The body parts that are protected by exterior clothing/armor
- var/head_absorbed = 0 //How much of the shock the headgear absorbs when it is shredded. -1=it survives
- var/suit_absorbed = 0 //How much of the shock the exosuit absorbs when it is shredded. -1=it survives
-
- //Backpacks can never be protected but are annoying as fuck to lose, so they get a lower chance to be shredded
- if(back)
- back.shred(bomb,shock-20,src)
-
- if(head)
- covered_parts |= head.flags_inv
- head_absorbed = head.shred(bomb,shock,src)
- if(wear_mask)
- var/absorbed = ((covered_parts & HIDEMASK) ? head_absorbed : 0) //Check if clothing covering this part absorbed any of the shock
- if(absorbed >= 0)
- //Masks can be used to shield other parts, but are simplified to simply add their absorbsion to the head armor if it covers the face
- var/mask_absorbed = wear_mask.shred(bomb,shock-absorbed,src)
- if(wear_mask.flags_inv & HIDEFACE)
- covered_parts |= wear_mask.flags_inv
- if(mask_absorbed < 0) //If the mask didn't get shredded, everything else on the head is protected
- head_absorbed = -1
- else
- head_absorbed += mask_absorbed
- if(ears)
- var/absorbed = ((covered_parts & HIDEEARS) ? head_absorbed : 0)
- if(absorbed >= 0)
- ears.shred(bomb,shock-absorbed,src)
- if(glasses)
- var/absorbed = ((covered_parts & HIDEEYES) ? head_absorbed : 0)
- if(absorbed >= 0)
- glasses.shred(bomb,shock-absorbed,src)
-
- if(wear_suit)
- covered_parts |= wear_suit.flags_inv
- suit_absorbed = wear_suit.shred(bomb,shock,src)
- if(gloves)
- var/absorbed = ((covered_parts & HIDEGLOVES) ? suit_absorbed : 0)
- if(absorbed >= 0)
- gloves.shred(bomb,shock-absorbed,src)
- if(shoes)
- var/absorbed = ((covered_parts & HIDESHOES) ? suit_absorbed : 0)
- if(absorbed >= 0)
- shoes.shred(bomb,shock-absorbed,src)
- if(w_uniform)
- var/absorbed = ((covered_parts & HIDEJUMPSUIT) ? suit_absorbed : 0)
- if(absorbed >= 0)
- w_uniform.shred(bomb,shock-20-absorbed,src) //Uniforms are also annoying to get shredded
-
-/obj/item/proc/shred(bomb,shock,mob/living/carbon/human/Human)
- if(flags & ABSTRACT)
- return -1
-
- var/shredded
-
- if(!bomb)
- if(!(resistance_flags & FIRE_PROOF))
- shredded = 1 //No heat protection, it burns
- else
- shredded = -1 //Heat protection = Fireproof
-
- else if(shock > 0)
- if(prob(max(shock-armor["bomb"],0)))
- shredded = armor["bomb"] + 10 //It gets shredded, but it also absorbs the shock the clothes underneath would recieve by this amount
- else
- shredded = -1 //It survives explosion
-
- if(shredded > 0)
- if(Human) //Unequip if equipped
- Human.unEquip(src)
-
- if(bomb)
- empty_object_contents()
- spawn(1) //so the shreds aren't instantly deleted by the explosion
- var/obj/effect/decal/cleanable/shreds/Shreds = new(loc)
- Shreds.desc = "The sad remains of what used to be [src.name]."
- qdel(src)
- else
- burn()
-
- return shredded
-
/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE)
var/datum/outfit/O = null
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 5d7003106aa..4a67cb15236 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -103,6 +103,72 @@
if(!dna || !dna.species.handle_fire(src))
..()
if(on_fire)
+
+ //the fire tries to damage the exposed clothes and items
+ var/list/burning_items = list()
+ //HEAD//
+ var/obj/item/clothing/head_clothes = null
+ if(glasses)
+ head_clothes = glasses
+ if(wear_mask)
+ head_clothes = wear_mask
+ if(head)
+ head_clothes = head
+ if(head_clothes)
+ burning_items += head_clothes
+ else if(ears)
+ burning_items += ears
+
+ //CHEST//
+ var/obj/item/clothing/chest_clothes = null
+ if(w_uniform)
+ chest_clothes = w_uniform
+ if(wear_suit)
+ chest_clothes = wear_suit
+ else
+ if(wear_id)
+ burning_items += wear_id
+ if(r_store)
+ burning_items += r_store
+ if(l_store)
+ burning_items += l_store
+ if(s_store)
+ burning_items += s_store
+ if(chest_clothes)
+ burning_items += chest_clothes
+
+ //ARMS & HANDS//
+ var/obj/item/clothing/arm_clothes = null
+ if(gloves)
+ arm_clothes = gloves
+ if(w_uniform && ((w_uniform.body_parts_covered & HANDS) || (w_uniform.body_parts_covered & ARMS)))
+ arm_clothes = w_uniform
+ if(wear_suit && ((wear_suit.body_parts_covered & HANDS) || (wear_suit.body_parts_covered & ARMS)))
+ arm_clothes = wear_suit
+ if(arm_clothes)
+ burning_items += arm_clothes
+
+ //LEGS & FEET//
+ var/obj/item/clothing/leg_clothes = null
+ if(shoes)
+ leg_clothes = shoes
+ if(w_uniform && ((w_uniform.body_parts_covered & FEET) || (w_uniform.body_parts_covered & LEGS)))
+ leg_clothes = w_uniform
+ if(wear_suit && ((wear_suit.body_parts_covered & FEET) || (wear_suit.body_parts_covered & LEGS)))
+ leg_clothes = wear_suit
+ if(leg_clothes)
+ burning_items += leg_clothes
+
+ if(back)
+ burning_items += back
+ if(belt)
+ burning_items += belt
+
+ for(var/X in burning_items)
+ var/obj/item/I = X
+ if(!(I.resistance_flags & FIRE_PROOF))
+ I.take_damage(fire_stacks, BURN, "fire", 0)
+
var/thermal_protection = get_thermal_protection()
if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
@@ -293,11 +359,11 @@
var/obj/item/bodypart/BP = X
for(var/obj/item/I in BP.embedded_objects)
if(prob(I.embedded_pain_chance))
- BP.take_damage(I.w_class*I.embedded_pain_multiplier)
+ BP.receive_damage(I.w_class*I.embedded_pain_multiplier)
src << "\the [I] embedded in your [BP.name] hurts!"
if(prob(I.embedded_fall_chance))
- BP.take_damage(I.w_class*I.embedded_fall_pain_multiplier)
+ BP.receive_damage(I.w_class*I.embedded_fall_pain_multiplier)
BP.embedded_objects -= I
I.loc = get_turf(src)
visible_message("\the [I] falls out of [name]'s [BP.name]!","\the [I] falls out of your [BP.name]!")
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index be40ad01a7b..0a26478c0c0 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1086,6 +1086,7 @@
var/weakness = H.check_weakness(I, user)
apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H)
+ H.damage_clothes(I.force, BRUTE, "melee", affecting.body_zone)
H.send_item_attack_message(I, user, hit_area)
@@ -1172,14 +1173,14 @@
if(BRUTE)
H.damageoverlaytemp = 20
if(BP)
- if(BP.take_damage(damage * hit_percent * brutemod, 0))
+ if(BP.receive_damage(damage * hit_percent * brutemod, 0))
H.update_damage_overlays()
else//no bodypart, we deal damage with a more general method.
H.adjustBruteLoss(damage * hit_percent * brutemod)
if(BURN)
H.damageoverlaytemp = 20
if(BP)
- if(BP.take_damage(0, damage * hit_percent * burnmod))
+ if(BP.receive_damage(0, damage * hit_percent * burnmod))
H.update_damage_overlays()
else
H.adjustFireLoss(damage * hit_percent* burnmod)
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index 3e87fa5c1ab..d879cdb128b 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -142,7 +142,27 @@
return 1
/mob/living/carbon/monkey/handle_fire()
- if(..())
- return
- bodytemperature += BODYTEMP_HEATING_MAX
- return
+ . = ..()
+ if(on_fire)
+
+ //the fire tries to damage the exposed clothes and items
+ var/list/burning_items = list()
+ //HEAD//
+ var/obj/item/clothing/head_clothes = null
+ if(wear_mask)
+ head_clothes = wear_mask
+ if(head)
+ head_clothes = head
+ if(head_clothes)
+ burning_items += head_clothes
+
+ if(back)
+ burning_items += back
+
+ for(var/X in burning_items)
+ var/obj/item/I = X
+ if(!(I.resistance_flags & FIRE_PROOF))
+ I.take_damage(fire_stacks, BURN, "fire", 0)
+
+ bodytemperature += BODYTEMP_HEATING_MAX
+
diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm
index 112999aff67..39b2637cc1c 100644
--- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm
@@ -17,10 +17,14 @@
if(..()) //successful monkey bite.
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
+ if(!affecting)
+ affecting = get_bodypart("chest")
if(M.limb_destroyer)
dismembering_strike(M, affecting.body_zone)
if(stat != DEAD)
- apply_damage(rand(1, 5), BRUTE, affecting)
+ var/dmg = rand(1, 5)
+ apply_damage(dmg, BRUTE, affecting)
+ damage_clothes(dmg, BRUTE, "melee", affecting.body_zone)
@@ -30,7 +34,10 @@
if(stat != DEAD)
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected))
+ if(!affecting)
+ affecting = get_bodypart("chest")
apply_damage(damage, BRUTE, affecting)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M)
if(..()) //To allow surgery to return properly.
@@ -56,7 +63,10 @@
visible_message("[M] has knocked out [name]!", \
"[M] has knocked out [name]!")
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
+ if(!affecting)
+ affecting = get_bodypart("chest")
apply_damage(damage, BRUTE, affecting)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
add_logs(M, src, "attacked")
else
@@ -96,9 +106,12 @@
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
add_logs(M, src, "attacked")
- if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful
+ if(!affecting)
+ affecting = get_bodypart("chest")
+ if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful
return 1
apply_damage(damage, BRUTE, affecting)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
@@ -126,7 +139,10 @@
if(!dam_zone) //Dismemberment successful
return 1
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
+ if(!affecting)
+ affecting = get_bodypart("chest")
apply_damage(damage, M.melee_damage_type, affecting)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
@@ -139,19 +155,28 @@
if(!dam_zone) //Dismemberment successful
return 1
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
+ if(!affecting)
+ affecting = get_bodypart("chest")
apply_damage(damage, BRUTE, affecting)
+ damage_clothes(damage, BRUTE, "melee", affecting.body_zone)
-/mob/living/carbon/monkey/acid_act(acidpwr, toxpwr, acid_volume)
- if(wear_mask)
- if(!(wear_mask.resistance_flags & UNACIDABLE))
- wear_mask.acid_act(acidpwr)
- update_inv_wear_mask()
- else
- src << "Your mask protects you from the acid."
- return
-
- take_bodypart_damage(min(6*toxpwr, acid_volume * acidpwr/10))
+/mob/living/carbon/monkey/acid_act(acidpwr, acid_volume, bodyzone_hit)
+ . = 1
+ if(!bodyzone_hit || bodyzone_hit == "head")
+ if(wear_mask)
+ if(!(wear_mask.resistance_flags & UNACIDABLE))
+ wear_mask.acid_act(acidpwr)
+ else
+ src << "Your mask protects you from the acid."
+ return
+ if(head)
+ if(!(head.resistance_flags & UNACIDABLE))
+ head.acid_act(acidpwr)
+ else
+ src << "Your hat protects you from the acid."
+ return
+ take_bodypart_damage(acidpwr * min(0.6, acid_volume*0.1))
/mob/living/carbon/monkey/ex_act(severity, target)
@@ -160,10 +185,10 @@
switch (severity)
if (1)
gib()
+ return
if (2)
take_overall_damage(60, 60)
- shred_clothing(1,50)
adjustEarDamage(30, 120)
if(prob(70))
Paralyse(10)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index ee4bd6ce206..57ed2439227 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -81,7 +81,7 @@
visible_message("[src] has been hit by [I].", \
"[src] has been hit by [I].")
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration)
- apply_damage(I.throwforce, dtype, zone, armor, I)
+ apply_damage(I.throwforce, dtype, zone, armor)
if(I.thrownby)
add_logs(I.thrownby, src, "hit", I)
else
@@ -276,8 +276,9 @@
//Looking for irradiate()? It's been moved to radiation.dm under the rad_act() for mobs.
-/mob/living/acid_act(acidpwr, toxpwr, acid_volume)
- take_bodypart_damage(min(10*toxpwr, acid_volume * toxpwr))
+/mob/living/acid_act(acidpwr, acid_volume)
+ take_bodypart_damage(acidpwr * min(1, acid_volume * 0.1))
+ return 1
/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0)
@@ -336,3 +337,7 @@
//called when the mob receives a loud bang
/mob/living/proc/soundbang_act()
return 0
+
+//to damage the clothes worn by a mob
+/mob/living/proc/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone)
+ return
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 0dafbfe1137..d33be72052d 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -71,5 +71,5 @@
var/blood_volume = 0 //how much blood the mob has
var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override
-
+
var/slipping = FALSE
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm
index b3a74621c22..120e1fac7d6 100644
--- a/code/modules/mob/living/silicon/robot/robot_defense.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defense.dm
@@ -166,17 +166,16 @@
gib()
return
if(2)
- if (stat != 2)
+ if (stat != DEAD)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3)
- if (stat != 2)
+ if (stat != DEAD)
adjustBruteLoss(30)
- return
-
/mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj)
..(Proj)
updatehealth()
- if(prob(75) && Proj.damage > 0) spark_system.start()
+ if(prob(75) && Proj.damage > 0)
+ spark_system.start()
return 2
diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm
index b216c04e1ab..34b0e954c8a 100644
--- a/code/modules/mob/living/silicon/silicon_defense.dm
+++ b/code/modules/mob/living/silicon/silicon_defense.dm
@@ -48,7 +48,7 @@
if(L.a_intent == "help")
visible_message("[L.name] rubs its head against [src].")
-/mob/living/silicon/attack_hulk(mob/living/carbon/human/user)
+/mob/living/silicon/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(user.a_intent == "harm")
..(user, 1)
adjustBruteLoss(rand(10, 15))
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index 0b36b950653..9478bdd60e0 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -21,6 +21,15 @@
updatehealth()
return 1
+/mob/living/simple_animal/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
+ if(user.a_intent == "harm")
+ ..(user, 1)
+ playsound(loc, "punch", 25, 1, -1)
+ visible_message("[user] has punched [src]!", \
+ "[user] has punched [src]!")
+ adjustBruteLoss(15)
+ return 1
+
/mob/living/simple_animal/attack_paw(mob/living/carbon/monkey/M)
if(..()) //successful monkey bite.
if(stat != DEAD)
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index 3b213031234..5757267f06f 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -170,7 +170,7 @@
/obj/effect/decal/cleanable/vomit,
/obj/effect/decal/cleanable/robot_debris,
/obj/effect/decal/cleanable/crayon,
- /obj/effect/decal/cleanable/molten_item,
+ /obj/effect/decal/cleanable/molten_object,
/obj/effect/decal/cleanable/tomato_smudge,
/obj/effect/decal/cleanable/egg_smudge,
/obj/effect/decal/cleanable/pie_smudge,
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 9b08a1f308b..5cceafbcfaa 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -8,7 +8,7 @@
health = 100
maxHealth = 100
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
-
+ obj_damage = 60
environment_smash = 2 //Walls can't stop THE LAW
mob_size = MOB_SIZE_LARGE
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 4893c83ed86..98a177d334b 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -91,6 +91,7 @@
health = 250
response_harm = "harmlessly punches"
harm_intent_damage = 0
+ obj_damage = 90
melee_damage_lower = 30
melee_damage_upper = 30
attacktext = "smashes their armored gauntlet into"
@@ -169,6 +170,7 @@
health = 50
response_harm = "viciously beats"
harm_intent_damage = 5
+ obj_damage = 60
melee_damage_lower = 5
melee_damage_upper = 5
retreat_distance = 10
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index e36c96c79f5..e2a2c7ffc89 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -50,8 +50,8 @@
src.visible_message("[src] calms down.")
if(stat == CONSCIOUS)
udder.generateMilk()
- if(locate(/obj/structure/spacevine) in loc)
- var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
+ var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
+ if(SV)
SV.eat(src)
if(!pulledby)
for(var/direction in shuffle(list(1,2,4,8,5,6,9,10)))
@@ -67,8 +67,8 @@
/mob/living/simple_animal/hostile/retaliate/goat/Move()
..()
if(!stat)
- if(locate(/obj/structure/spacevine) in loc)
- var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
+ var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
+ if(SV)
SV.eat(src)
/mob/living/simple_animal/hostile/retaliate/goat/attackby(obj/item/O, mob/user, params)
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index 4fdcf0610a1..98cc9b3d535 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -20,6 +20,7 @@
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
gold_core_spawnable = 2
+ obj_damage = 0
environment_smash = 0
var/list/edibles = list(/mob/living/simple_animal/butterfly,/mob/living/simple_animal/cockroach) //list of atoms, however turfs won't affect AI, but will affect consumption.
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 1a52e018bae..79281886fd6 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -69,10 +69,10 @@
if(C.avail())
visible_message("[src] chews through the [C]. It's toast!")
playsound(src, 'sound/effects/sparks2.ogg', 100, 1)
- C.Deconstruct()
+ C.deconstruct()
death(toast=1)
else
- C.Deconstruct()
+ C.deconstruct()
visible_message("[src] chews through the [C].")
/*
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 407076bbd4c..d77708e0b2a 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -32,6 +32,7 @@ var/global/list/parasites = list() //all currently existing/living guardians
healable = FALSE //don't brusepack the guardian
damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) //how much damage from each damage type we transfer to the owner
environment_smash = 1
+ obj_damage = 40
melee_damage_lower = 15
melee_damage_upper = 15
butcher_results = list(/obj/item/weapon/ectoplasm = 1)
diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
index d54d5013690..ff2e1c5a6aa 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
@@ -51,6 +51,7 @@
melee_damage_lower = initial(melee_damage_lower)
melee_damage_upper = initial(melee_damage_upper)
armour_penetration = initial(armour_penetration)
+ obj_damage = initial(obj_damage)
environment_smash = initial(environment_smash)
alpha = initial(alpha)
if(!forced)
@@ -68,6 +69,7 @@
melee_damage_lower = 50
melee_damage_upper = 50
armour_penetration = 100
+ obj_damage = 0
environment_smash = 0
PoolOrNew(/obj/effect/overlay/temp/guardian/phase/out, get_turf(src))
alpha = 15
diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
index 3d4b665fa81..842bc5e7200 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
@@ -33,6 +33,7 @@
ranged = initial(ranged)
melee_damage_lower = initial(melee_damage_lower)
melee_damage_upper = initial(melee_damage_upper)
+ obj_damage = initial(obj_damage)
environment_smash = initial(environment_smash)
alpha = 255
range = initial(range)
@@ -43,6 +44,7 @@
ranged = 0
melee_damage_lower = 0
melee_damage_upper = 0
+ obj_damage = 0
environment_smash = 0
alpha = 45
range = 255
diff --git a/code/modules/mob/living/simple_animal/guardian/types/standard.dm b/code/modules/mob/living/simple_animal/guardian/types/standard.dm
index 4cff9a0604b..45624bbaaa2 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/standard.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/standard.dm
@@ -2,6 +2,7 @@
/mob/living/simple_animal/hostile/guardian/punch
melee_damage_lower = 20
melee_damage_upper = 20
+ obj_damage = 80
next_move_modifier = 0.8 //attacks 20% faster
environment_smash = 2
playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 6ed4d60229e..32c330d2cd5 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -16,6 +16,7 @@
maxHealth = 125
health = 125
harm_intent_damage = 5
+ obj_damage = 60
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "slashes"
@@ -156,6 +157,7 @@
melee_damage_upper = 0
a_intent = "help"
friendly = "caresses"
+ obj_damage = 0
environment_smash = 0
gold_core_spawnable = 1
icon_state = "maid"
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index ce7c655206d..d41863222bc 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -22,6 +22,7 @@
health = 60
var/armored = FALSE
+ obj_damage = 60
melee_damage_lower = 20
melee_damage_upper = 30
attacktext = "claws"
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 0ec1db86273..2f09653734f 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -30,6 +30,7 @@
health = 10
faction = list("hostile")
move_to_delay = 0
+ obj_damage = 0
environment_smash = 0
mouse_opacity = 2
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
index 356d4bafbef..e6b80ad893b 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
@@ -10,6 +10,7 @@
environment_smash = 0
minimum_distance = 3
retreat_distance = 3
+ obj_damage = 0
melee_damage_lower = 10
melee_damage_upper = 20
health = 1000
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index c5d197084e6..bf99d02e8a4 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -18,6 +18,7 @@
health = 25
harm_intent_damage = 8
+ obj_damage = 50
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "bites"
@@ -63,6 +64,7 @@
pixel_x = -16
mob_size = MOB_SIZE_LARGE
+ obj_damage = 80
melee_damage_lower = 20
melee_damage_upper = 20
diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm
index 32d5b7c73dc..566f1266adf 100644
--- a/code/modules/mob/living/simple_animal/hostile/creature.dm
+++ b/code/modules/mob/living/simple_animal/hostile/creature.dm
@@ -7,6 +7,7 @@
icon_dead = "otherthing-dead"
health = 80
maxHealth = 80
+ obj_damage = 100
melee_damage_lower = 25
melee_damage_upper = 50
attacktext = "chomps"
diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm
index 9781dcd05a4..07aeea0a523 100644
--- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm
@@ -17,6 +17,7 @@
speak_emote = list("telepathically cries")
harm_intent_damage = 15
+ obj_damage = 60
melee_damage_lower = 20
melee_damage_upper = 25
attacktext = "blinks at"
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 6dba4c84856..b9f7b834f98 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -19,6 +19,7 @@
robust_searching = 1
harm_intent_damage = 10
+ obj_damage = 50
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "grips"
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index fa6d21456c9..bf85dfce9ce 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -35,6 +35,7 @@
response_harm = "hits"
maxHealth = 200
health = 200
+ obj_damage = 60
melee_damage_lower = 15
melee_damage_upper = 20
faction = list("spiders")
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index f1bf3e339dc..cf528306b21 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -16,6 +16,7 @@
faction = list("creature")
robust_searching = 1
stat_attack = 2
+ obj_damage = 0
environment_smash = 0
speak_emote = list("squeaks")
ventcrawler = 2
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 4bee096b9f4..d4b62f616ce 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile
faction = list("hostile")
stop_automated_movement_when_pulled = 0
+ obj_damage = 40
environment_smash = 1 //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
var/atom/target
var/ranged = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm
index 9b9b0ee4aa1..fdde147b9ef 100644
--- a/code/modules/mob/living/simple_animal/hostile/illusion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm
@@ -66,6 +66,7 @@
melee_damage_lower = 0
melee_damage_upper = 0
speed = -1
+ obj_damage = 0
environment_smash = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
index 63d3bd82565..46c3a62aca8 100644
--- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
@@ -122,7 +122,7 @@
return 0
if(!M.has_charge(required_mecha_charge))
return 0
- if(M.health < (initial(M.health)*0.5))
+ if(M.obj_integrity < M.max_integrity*0.5)
return 0
return 1
@@ -216,7 +216,7 @@
return
//Too Much Damage - Eject
- if(mecha.health < initial(mecha.health)*0.1)
+ if(mecha.obj_integrity < mecha.max_integrity*0.1)
exit_mecha(mecha)
return
@@ -226,7 +226,7 @@
mecha.smoke_action.Activate()
//Heavy damage - Defence Power or Retreat
- if(mecha.health < initial(mecha.health)*0.25)
+ if(mecha.obj_integrity < mecha.max_integrity*0.25)
if(prob(defence_mode_chance))
if(mecha.defense_action && mecha.defense_action.owner && !mecha.defence_mode)
mecha.leg_overload_mode = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 85d6e6a72e4..24a2ef5c935 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -625,6 +625,7 @@ Difficulty: Very Hard
flying = 1
minbodytemp = 0
maxbodytemp = 1500
+ obj_damage = 0
environment_smash = 0
AIStatus = AI_OFF
stop_automated_movement = 1
@@ -699,7 +700,7 @@ Difficulty: Very Hard
icon_state = null //This shouldn't even be visible, so if it DOES show up, at least nobody will notice
density = 1
anchored = 1
- health = 999
+ obj_integrity = 999
var/mob/living/simple_animal/holder_animal
/obj/structure/closet/stasis/process()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
index cfeb0a19e9d..2d40aae0cd2 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -262,6 +262,7 @@ Difficulty: Medium
maxHealth = 300
health = 300
faction = list("neutral")
+ obj_damage = 80
melee_damage_upper = 30
melee_damage_lower = 30
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 7cbcaa090bf..9d5c97f4831 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -535,7 +535,7 @@ Difficulty: Hard
continue
M.occupant << "Your [M.name] is struck by a [name]!"
playsound(M,'sound/weapons/sear.ogg', 50, 1, -4)
- M.take_damage(damage, "fire", 0)
+ M.take_damage(damage, BURN, 0, 0)
/obj/effect/hierophant
name = "hierophant rune"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index 8ef9ee4a1ee..f05445085d6 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -9,7 +9,7 @@
a_intent = "harm"
sentience_type = SENTIENCE_BOSS
environment_smash = 3
- obj_damage = 75
+ obj_damage = 400
luminosity = 3
faction = list("mining", "boss")
weather_immunities = list("lava","ash")
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index bb7c223fa9c..e2d3afd545a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -216,6 +216,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/ranged/CopyObject(obj/O, mob/living/creator, destroy_original = 0)
if(..())
emote_see = list("aims menacingly")
+ obj_damage = 0
environment_smash = 0 //needed? seems weird for them to do so
ranged = 1
retreat_distance = 1 //just enough to shoot
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 3478fff7ad0..205f0dd3b31 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -3,6 +3,7 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
faction = list("mining")
weather_immunities = list("lava","ash")
+ obj_damage = 30
environment_smash = 2
minbodytemp = 0
maxbodytemp = INFINITY
@@ -69,6 +70,7 @@
maxHealth = 200
health = 200
harm_intent_damage = 5
+ obj_damage = 60
melee_damage_lower = 12
melee_damage_upper = 12
attacktext = "bites into"
@@ -210,6 +212,7 @@
throw_message = "falls right through the strange body of the"
ranged_cooldown = 0
ranged_cooldown_time = 20
+ obj_damage = 0
environment_smash = 0
retreat_distance = 3
minimum_distance = 3
@@ -327,6 +330,7 @@
speak_emote = list("telepathically cries")
attack_sound = 'sound/weapons/pierce.ogg'
throw_message = "falls right through the strange body of the"
+ obj_damage = 0
environment_smash = 0
pass_flags = PASSTABLE
del_on_death = 1
@@ -420,6 +424,7 @@
maxHealth = 300
health = 300
harm_intent_damage = 0
+ obj_damage = 100
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "pulverizes"
@@ -537,13 +542,11 @@
return
if(istype(target, /obj/mecha/working/ripley))
var/obj/mecha/working/ripley/D = target
- var/list/damage_absorption = D.damage_absorption
if(D.hides < 3)
D.hides++
- damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3)
- damage_absorption["bullet"] = damage_absorption["bullet"] - 0.05
- damage_absorption["fire"] = damage_absorption["fire"] - 0.05
- damage_absorption["laser"] = damage_absorption["laser"] - 0.025
+ D.armor["melee"] = max(D.armor["melee"] - 0.1, 0.3)
+ D.armor["bullet"] = D.armor["bullet"] - 0.05
+ D.armor["laser"] = D.armor["laser"] - 0.025
user << "You strengthen [target], improving its resistance against melee attacks."
D.update_icon()
if(D.hides == 3)
@@ -581,6 +584,7 @@
maxHealth = 50
health = 50
harm_intent_damage = 5
+ obj_damage = 0
melee_damage_lower = 0
melee_damage_upper = 0
attacktext = "chomps"
@@ -625,6 +629,7 @@
return
wumbo = 1
icon_state = "Fugu_big"
+ obj_damage = 60
melee_damage_lower = 15
melee_damage_upper = 20
harm_intent_damage = 0
@@ -643,6 +648,7 @@
walk(src, 0)
wumbo = 0
icon_state = "Fugu"
+ obj_damage = 0
melee_damage_lower = 0
melee_damage_upper = 0
harm_intent_damage = 5
@@ -743,6 +749,7 @@
icon_aggro = "legion"
icon_dead = "legion"
icon_gib = "syndicate_gib"
+ obj_damage = 60
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "lashes out at"
@@ -861,6 +868,7 @@
density = 0
speak_chance = 1
turns_per_move = 8
+ obj_damage = 0
environment_smash = 0
move_to_delay = 15
response_help = "pets"
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index b0d71991d30..023774cf439 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -13,6 +13,7 @@
response_disarm = "gently pushes aside"
response_harm = "whacks"
harm_intent_damage = 5
+ obj_damage = 0
melee_damage_lower = 1
melee_damage_upper = 1
attack_same = 2
diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm
index 9f12d423d15..b87ace1afad 100644
--- a/code/modules/mob/living/simple_animal/hostile/pirate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm
@@ -14,6 +14,7 @@
health = 100
harm_intent_damage = 5
+ obj_damage = 60
melee_damage_lower = 30
melee_damage_upper = 30
attacktext = "slashes"
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
index b4de57da65e..c28250e3fcc 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
@@ -21,6 +21,7 @@
pass_flags = PASSTABLE
faction = list("hostile")
attack_sound = 'sound/weapons/bite.ogg'
+ obj_damage = 0
environment_smash = 0
ventcrawler = 2
mob_size = MOB_SIZE_TINY
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index ae38b62698a..1830ff0cd61 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -22,6 +22,7 @@
melee_damage_upper = 10
attacktext = "attacks"
attack_sound = 'sound/items/bikehorn.ogg'
+ obj_damage = 0
environment_smash = 0
del_on_death = 1
loot = list(/obj/effect/mob_spawn/human/corpse/clown)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
index e1892140a2c..a1257d71e34 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
@@ -19,6 +19,7 @@
melee_damage_upper = 10
attacktext = "hits"
attack_sound = 'sound/weapons/punch1.ogg'
+ obj_damage = 0
environment_smash = 0
del_on_death = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
index 4664a41082c..f318f7ae15c 100644
--- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
@@ -22,7 +22,6 @@
attack_sound = 'sound/hallucinations/growl1.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 10
- environment_smash = 1
robust_searching = 1
stat_attack = 1
gold_core_spawnable = 1
@@ -64,6 +63,7 @@
speak_chance = 1
speak = list("THE GODS WILL IT!","DEUS VULT!","REMOVE KABAB!")
force_threshold = 10 //trying to simulate actually having armor
+ obj_damage = 50
melee_damage_lower = 25
melee_damage_upper = 30
deathmessage = "collapses into a pile of bones, its gear clanging as it hits the ground!"
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 998cbebc3d5..30dbb43e153 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -18,7 +18,8 @@
health = 50000
healable = 0
- harm_intent_damage = 70
+ harm_intent_damage = 10
+ obj_damage = 100
melee_damage_lower = 68
melee_damage_upper = 83
attacktext = "claws"
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
index 904f3abcdcf..2f17fa57523 100644
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm
@@ -18,6 +18,7 @@
maxHealth = 100
health = 100
harm_intent_damage = 5
+ obj_damage = 0
melee_damage_lower = 10
melee_damage_upper = 10
attacktext = "punches"
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 9663b70e2f5..b6f99faf0cb 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -136,6 +136,7 @@
/mob/living/simple_animal/hostile/syndicate/civilian
minimum_distance = 10
retreat_distance = 10
+ obj_damage = 0
environment_smash = 0
/mob/living/simple_animal/hostile/syndicate/civilian/Aggro()
@@ -154,6 +155,8 @@
maxHealth = 25
melee_damage_lower = 15
melee_damage_upper = 15
+ obj_damage = 0
+ environment_smash = 0
attacktext = "cuts"
attack_sound = 'sound/weapons/bladeslice.ogg'
faction = list("syndicate")
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index 14aeb265158..6bc9aa07972 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -55,6 +55,7 @@
maxHealth = 50
ranged = 1
harm_intent_damage = 5
+ obj_damage = 60
melee_damage_lower = 25
melee_damage_upper = 25
a_intent = "harm"
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 975438b0a70..ace41147727 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -259,10 +259,11 @@ var/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange",
if(..()) //successful larva bite.
attacked += 10
-/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user)
+/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(user.a_intent == "harm")
- adjustBruteLoss(15)
discipline_slime(user)
+ return ..()
+
/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/M)
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index e8e09b4943a..69ed544ded5 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -30,12 +30,10 @@
var/max_hardware_size = 0 // Maximal hardware w_class. Tablets/PDAs have 1, laptops 2, consoles 4.
var/steel_sheet_cost = 5 // Amount of steel sheets refunded when disassembling an empty frame of this computer.
- // Damage of the chassis. If the chassis takes too much damage it will break apart.
- var/damage = 0 // Current damage level
- var/broken_damage = 50 // Damage level at which the computer ceases to operate
- var/max_damage = 100 // Damage level at which the computer breaks apart.
-
+ obj_integrity = 100
+ max_integrity = 100
armor = list(melee = 0, bullet = 20, laser = 20, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 0, acid = 0)
+
// Important hardware (must be installed for computer to work)
// Optional hardware (improves functionality, but is not critical for computer to work)
@@ -164,9 +162,9 @@
/obj/item/device/modular_computer/examine(mob/user)
..()
- if(damage > broken_damage)
+ if(obj_integrity <= integrity_failure)
user << "It is heavily damaged!"
- else if(damage)
+ else if(obj_integrity < max_integrity)
user << "It is damaged."
/obj/item/device/modular_computer/update_icon()
@@ -180,7 +178,7 @@
else
add_overlay(icon_state_menu)
- if(damage > broken_damage)
+ if(obj_integrity <= integrity_failure)
add_overlay("bsod")
add_overlay("broken")
@@ -194,7 +192,7 @@
/obj/item/device/modular_computer/proc/turn_on(mob/user)
var/issynth = issilicon(user) // Robots and AIs get different activation messages.
- if(damage > broken_damage)
+ if(obj_integrity <= integrity_failure)
if(issynth)
user << "You send an activation signal to \the [src], but it responds with an error code. It must be damaged."
else
@@ -226,7 +224,7 @@
last_power_usage = 0
return 0
- if(damage > broken_damage)
+ if(obj_integrity <= integrity_failure)
shutdown_computer()
return 0
@@ -377,13 +375,14 @@
user << "\The [W] is off."
return
- if(!damage)
+ if(obj_integrity == max_integrity)
user << "\The [src] does not require repairs."
return
user << "You begin repairing damage to \the [src]..."
- if(WT.remove_fuel(round(damage/75)) && do_after(usr, damage/10))
- damage = 0
+ var/dmg = round(max_integrity - obj_integrity)
+ if(WT.remove_fuel(round(dmg/75)) && do_after(usr, dmg/10))
+ obj_integrity = max_integrity
user << "You repair \the [src]."
return
diff --git a/code/modules/modular_computers/computers/item/computer_damage.dm b/code/modules/modular_computers/computers/item/computer_damage.dm
index d27ec0a750f..5e521a04e17 100644
--- a/code/modules/modular_computers/computers/item/computer_damage.dm
+++ b/code/modules/modular_computers/computers/item/computer_damage.dm
@@ -1,49 +1,31 @@
-/obj/item/device/modular_computer/proc/take_damage(amount, component_probability, damage_casing = 1, randomize = 1)
- if(randomize)
- // 75%-125%, rand() works with integers, apparently.
- amount *= (rand(75, 125) / 100.0)
- amount = round(amount)
- if(damage_casing)
- damage += amount
- damage = max(0,min(max_damage,damage))
-
+/obj/item/device/modular_computer/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
+ . = ..()
+ var/component_probability = min(50, max(damage_amount*0.1, 1 - obj_integrity/max_integrity))
+ switch(damage_flag)
+ if("bullet")
+ component_probability = damage_amount * 0.5
+ if("laser")
+ component_probability = damage_amount * 0.66
if(component_probability)
for(var/I in all_components)
var/obj/item/weapon/computer_hardware/H = all_components[I]
if(prob(component_probability))
- H.take_damage(round(amount / 2))
+ H.take_damage(round(damage_amount*0.5), damage_type, damage_flag, 0)
- if(damage >= max_damage)
- break_apart()
-// Stronger explosions cause serious damage to internal components
-// Minor explosions are mostly mitigitated by casing.
-/obj/item/device/modular_computer/ex_act(severity)
- take_damage(rand(100,200)/severity, component_probability = 30/severity)
-
-// EMPs are similar to explosions, but don't cause physical damage to the casing. Instead they screw up the components
-/obj/item/device/modular_computer/emp_act(severity)
- take_damage(rand(100,200)/severity, component_probability = 50/severity, damage_casing = 0)
-
-// "Stun" weapons can cause minor damage to components (short-circuits?)
-// "Burn" damage is equally strong against internal components and exterior casing
-// "Brute" damage mostly damages the casing.
-/obj/item/device/modular_computer/bullet_act(obj/item/projectile/Proj)
- switch(Proj.damage_type)
- if(BRUTE)
- take_damage(Proj.damage, component_probability = Proj.damage/2)
- if(BURN)
- take_damage(Proj.damage, component_probability = Proj.damage/1.5)
+/obj/item/device/modular_computer/deconstruct(disassembled = TRUE)
+ break_apart()
/obj/item/device/modular_computer/proc/break_apart()
- physical.visible_message("\The [src] breaks apart!")
- var/turf/newloc = get_turf(src)
- new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2))
- for(var/C in all_components)
- var/obj/item/weapon/computer_hardware/H = all_components[C]
- uninstall_component(H)
- H.forceMove(newloc)
- if(prob(25))
- H.take_damage(rand(10,30))
+ if(!(flags & NODECONSTRUCT))
+ physical.visible_message("\The [src] breaks apart!")
+ var/turf/newloc = get_turf(src)
+ new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2))
+ for(var/C in all_components)
+ var/obj/item/weapon/computer_hardware/H = all_components[C]
+ uninstall_component(H)
+ H.forceMove(newloc)
+ if(prob(25))
+ H.take_damage(rand(10,30), BRUTE, 0, 0)
relay_qdel()
- qdel()
+ qdel(src)
diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm
index d50b9f9fd30..e9b7f8d52ff 100644
--- a/code/modules/modular_computers/computers/item/processor.dm
+++ b/code/modules/modular_computers/computers/item/processor.dm
@@ -30,8 +30,8 @@
hardware_flag = machinery_computer.hardware_flag
max_hardware_size = machinery_computer.max_hardware_size
steel_sheet_cost = machinery_computer.steel_sheet_cost
- max_damage = machinery_computer._max_damage
- broken_damage = machinery_computer._break_damage
+ max_integrity = machinery_computer.max_integrity
+ integrity_failure = machinery_computer.integrity_failure
base_active_power_usage = machinery_computer.base_active_power_usage
base_idle_power_usage = machinery_computer.base_idle_power_usage
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
index e04bc0cee73..12efea42f9b 100644
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -28,9 +28,6 @@ var/list/global_modular_computers = list()
var/base_active_power_usage = 100 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
var/base_idle_power_usage = 10 // Power usage when the computer is idle and screen is off (currently only applies to laptops)
- var/_max_damage = 100
- var/_break_damage = 50
-
var/obj/item/device/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things.
/obj/machinery/modular_computer/New()
@@ -69,7 +66,7 @@ var/list/global_modular_computers = list()
else
overlays.Add(screen_icon_state_menu)
- if(cpu && cpu.damage > cpu.broken_damage)
+ if(cpu && cpu.obj_integrity <= cpu.integrity_failure)
add_overlay("bsod")
add_overlay("broken")
diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm
index cebb1f4d715..60315198ca6 100644
--- a/code/modules/modular_computers/computers/machinery/modular_console.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_console.dm
@@ -16,8 +16,9 @@
max_hardware_size = 4
steel_sheet_cost = 10
light_strength = 2
- _max_damage = 300
- _break_damage = 150
+ obj_integrity = 300
+ max_integrity = 300
+ integrity_failure = 150
/obj/machinery/modular_computer/console/buildable/New()
..()
diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
index 89040ca7ae7..4278159d1a9 100644
--- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
+++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
@@ -23,7 +23,7 @@
var/obj/item/weapon/computer_hardware/battery/battery_module = computer.all_components[MC_CELL]
var/obj/item/weapon/computer_hardware/recharger/recharger = computer.all_components[MC_CHARGE]
qdel(hard_drive)
- computer.take_damage(25, 10, 1, 1)
+ computer.take_damage(25, BRUTE, 0, 0)
if(battery_module && prob(25))
qdel(battery_module)
computer.visible_message("\The [computer]'s battery explodes in rain of sparks.")
diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm
index 81f61671555..d1d51ead8e7 100644
--- a/code/modules/modular_computers/hardware/_hardware.dm
+++ b/code/modules/modular_computers/hardware/_hardware.dm
@@ -42,12 +42,12 @@
// Cable coil. Works as repair method, but will probably require multiple applications and more cable.
if(istype(I, /obj/item/stack/cable_coil))
var/obj/item/stack/S = I
- if(!damage)
+ if(obj_integrity == max_integrity)
user << "\The [src] doesn't seem to require repairs."
return 1
if(S.use(1))
user << "You patch up \the [src] with a bit of \the [I]."
- take_damage(-10)
+ obj_integrity = min(obj_integrity + 10, max_integrity)
return 1
if(try_insert(I, user))
@@ -82,12 +82,6 @@
else if(damage)
user << "It seems to be slightly damaged."
-// Damages the component. Contains necessary checks. Negative damage "heals" the component.
-/obj/item/weapon/computer_hardware/proc/take_damage(var/amount)
- damage += round(amount) // We want nice rounded numbers here.
- damage = max(0, min(damage, max_damage)) // Clamp the value.
-
-
// Component-side compatibility check.
/obj/item/weapon/computer_hardware/proc/can_install(obj/item/device/modular_computer/M, mob/living/user = null)
return can_install
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index 010b69edf54..a29a42f89a7 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -14,25 +14,19 @@ It is possible to destroy the net by the occupant or someone else.
mouse_opacity = 1//So you can hit it with stuff.
anchored = 1//Can't drag/grab the trapped mob.
layer = ABOVE_ALL_MOB_LAYER
- var/health = 25//How much health it has.
+ obj_integrity = 25//How much health it has.
+ max_integrity = 25
var/mob/living/affecting = null//Who it is currently affecting, if anyone.
var/mob/living/master = null//Who shot web. Will let this person know if the net was successful or failed.
-/obj/structure/energy_net/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/structure/energy_net/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
+ playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
- else
- return
- health -= damage
- if(health <=0)
- qdel(src)
+ playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
/obj/structure/energy_net/Destroy()
if(affecting)
@@ -67,7 +61,7 @@ It is possible to destroy the net by the occupant or someone else.
density = 0//Make the net pass-through.
invisibility = INVISIBILITY_ABSTRACT//Make the net invisible so all the animations can play out.
- health = INFINITY//Make the net invincible so that an explosion/something else won't kill it while, spawn() is running.
+ resistance_flags |= INDESTRUCTIBLE //Make the net invincible so that an explosion/something else won't kill it while, spawn() is running.
for(var/obj/item/W in M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -102,61 +96,7 @@ It is possible to destroy the net by the occupant or someone else.
-/obj/structure/energy_net/bullet_act(obj/item/projectile/Proj)
- . = ..()
- take_damage(Proj.damage, Proj.damage_type)
-
-
-
-/obj/structure/energy_net/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- qdel(src)
- if(3)
- take_damage(rand(10,25), BRUTE, 0)
-
-/obj/structure/energy_net/blob_act(obj/structure/blob/B)
- qdel(src)
-
-/obj/structure/energy_net/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)
-
-
-/obj/structure/energy_net/attack_hulk(mob/living/carbon/human/user)
- ..(user, 1)
- user.visible_message("[user] rips the energy net apart!", \
- "You easily destroy the energy net.")
- qdel(src)
-
-
-
/obj/structure/energy_net/attack_paw(mob/user)
return attack_hand()
-
-/obj/structure/energy_net/attack_alien(mob/living/user)
- user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
- playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
- user.visible_message("[user] slices the energy net apart!", \
- "\green You slice the energy net to pieces.")
- qdel(src)
-
-
-
-/obj/structure/energy_net/attacked_by(obj/item/weapon/W, mob/user)
- ..()
- take_damage(W.force, W.damtype)
-
-
-
diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm
index fa8013941ad..ac8326b13fb 100644
--- a/code/modules/ninja/suit/shoes.dm
+++ b/code/modules/ninja/suit/shoes.dm
@@ -7,7 +7,7 @@
permeability_coefficient = 0.01
flags = NOSLIP
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 100, acid = 100)
strip_delay = 120
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 70c3a964374..bdf6f2b3eb4 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -18,8 +18,8 @@ Contents:
item_state = "s-ninja_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/stock_parts/cell)
slowdown = 0
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ resistance_flags = LAVA_PROOF | ACID_PROOF
+ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 100, acid = 100)
strip_delay = 12
//Important parts of the suit.
diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm
index b1ef1644340..418ab389ab0 100644
--- a/code/modules/paperwork/clipboard.dm
+++ b/code/modules/paperwork/clipboard.dm
@@ -10,7 +10,7 @@
var/obj/item/weapon/pen/haspen //The stored pen.
var/obj/item/weapon/paper/toppaper //The topmost piece of paper.
slot_flags = SLOT_BELT
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/clipboard/New()
update_icon()
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 2a35bfff8ff..6d5a27fe467 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -36,11 +36,12 @@
if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/folder) || istype(I, /obj/item/weapon/photo))
I.loc = src
-/obj/structure/filingcabinet/ex_act(severity, target)
- for(var/obj/item/I in src)
- I.loc = src.loc
+/obj/structure/filingcabinet/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, 2)
+ for(var/obj/item/I in src)
+ I.forceMove(loc)
qdel(src)
- ..()
/obj/structure/filingcabinet/attackby(obj/item/P, mob/user, params)
if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/documents))
@@ -53,9 +54,11 @@
icon_state = initial(icon_state)
updateUsrDialog()
else if(istype(P, /obj/item/weapon/wrench))
+ user << "You begin to [anchored ? "wrench" : "unwrench"] [src]."
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- anchored = !anchored
- user << "You [anchored ? "wrench" : "unwrench"] [src]."
+ if(do_after(user, 20, target = src))
+ user << "You successfully [anchored ? "wrench" : "unwrench"] [src]."
+ anchored = !anchored
else if(user.a_intent != "harm")
user << "You can't put [P] in [src]!"
else
@@ -131,6 +134,7 @@
P.name = "paper - '[G.fields["name"]]'"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
//before the records have been generated, so we do this inside the loop.
+
/obj/structure/filingcabinet/security/attack_hand()
populate()
..()
@@ -212,16 +216,3 @@ var/list/employmentCabinets = list()
cooldown = 0
else
user << "The [src] is jammed, give it a few seconds."
-
-
-
-
-/obj/structure/filingcabinet/employment/attackby(obj/item/P, mob/user, params)
- if(istype(P, /obj/item/weapon/wrench))
- user << "You begin to [anchored ? "wrench" : "unwrench"] [src]."
- if (do_after(user,300,user))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- anchored = !anchored
- user << "You successfully [anchored ? "wrench" : "unwrench"] [src]."
- else
- return ..()
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index cec63a72253..ace6a835e78 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -5,7 +5,7 @@
icon_state = "folder"
w_class = 2
pressure_resistance = 2
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/obj/item/weapon/folder/blue
desc = "A blue folder."
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 64d0ad1ca6d..3ddb31a8343 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -17,8 +17,9 @@
pressure_resistance = 0
slot_flags = SLOT_HEAD
body_parts_covered = HEAD
- resistance_flags = 0
- burntime = 5
+ resistance_flags = FLAMMABLE
+ obj_integrity = 50
+ max_integrity = 50
dog_fashion = /datum/dog_fashion/head
var/info //What's actually written on the paper.
@@ -338,8 +339,8 @@
add_fingerprint(user)
-/obj/item/weapon/paper/fire_act()
- ..(0)
+/obj/item/weapon/paper/fire_act(exposed_temperature, exposed_volume)
+ ..()
icon_state = "paper_onfire"
info = "[stars(info)]"
diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm
index 487a7457a4c..e66f9992800 100644
--- a/code/modules/paperwork/paper_cutter.dm
+++ b/code/modules/paperwork/paper_cutter.dm
@@ -106,8 +106,9 @@
desc = "A little slip of paper left over after a larger piece was cut. Whoa."
icon_state = "paperslip"
icon = 'icons/obj/bureaucracy.dmi'
- resistance_flags = 0
- burntime = 3
+ resistance_flags = FLAMMABLE
+ obj_integrity = 50
+ max_integrity = 50
/obj/item/weapon/paperslip/New()
..()
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 4c9da27c069..e6703e9718d 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -9,11 +9,10 @@
throw_speed = 3
throw_range = 7
pressure_resistance = 8
- resistance_flags = 0
var/amount = 30 //How much paper is in the bin.
var/list/papers = list() //List of papers put in the bin for reference.
-/obj/item/weapon/paper_bin/fire_act()
+/obj/item/weapon/paper_bin/fire_act(exposed_temperature, exposed_volume)
if(!amount)
return
..()
@@ -25,10 +24,11 @@
papers = null
. = ..()
-/obj/item/weapon/paper_bin/burn()
- amount = 0
- extinguish()
- update_icon()
+/obj/item/weapon/paper_bin/fire_act(exposed_temperature, exposed_volume)
+ if(amount)
+ amount = 0
+ update_icon()
+ ..()
/obj/item/weapon/paper_bin/MouseDrop(atom/over_object)
var/mob/living/M = usr
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index a5a72604e93..f3827856ded 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -7,8 +7,9 @@
throw_speed = 1
throwforce = 0
w_class = 1
- resistance_flags = 0
- burntime = 4
+ resistance_flags = FLAMMABLE
+ obj_integrity = 50
+ max_integrity = 50
var/obj/item/weapon/paper/internalPaper
var/list/stamped = list()
@@ -79,7 +80,6 @@
if(!(in_range(user, src))) //to prevent issues as a result of telepathically lighting a paper
return
- internalPaper.burntime = 1 //its already pretty burnt out
user.unEquip(src)
user.visible_message("[user] lights [src] ablaze with [P]!", "You light [src] on fire!")
fire_act()
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 526fc3818ef..2462a5bcdc8 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -18,6 +18,9 @@
idle_power_usage = 30
active_power_usage = 200
power_channel = EQUIP
+ obj_integrity = 300
+ max_integrity = 300
+ integrity_failure = 100
var/obj/item/weapon/paper/copy = null //what's in the copier!
var/obj/item/weapon/photo/photocopy = null
var/obj/item/documents/doccopy = null
@@ -251,8 +254,9 @@
if(istype(O, /obj/item/weapon/paper))
if(copier_empty())
if(istype(O,/obj/item/weapon/paper/contract/infernal))
- user << "The [src] smokes, smelling of brimstone!"
- resistance_flags |= ON_FIRE
+ user << "[src] smokes, smelling of brimstone!"
+ resistance_flags |= FLAMMABLE
+ fire_act()
else
if(!user.drop_item())
return
@@ -304,28 +308,8 @@
else
return ..()
-/obj/machinery/photocopier/ex_act(severity, target)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(50))
- qdel(src)
- else
- if(toner > 0)
- new /obj/effect/decal/cleanable/oil(get_turf(src))
- toner = 0
- else
- if(prob(50))
- if(toner > 0)
- new /obj/effect/decal/cleanable/oil(get_turf(src))
- toner = 0
-
-
-/obj/machinery/photocopier/blob_act(obj/structure/blob/B)
- if(prob(50))
- qdel(src)
- else
+/obj/machinery/photocopier/obj_break(damage_flag)
+ if(!(flags & NODECONSTRUCT))
if(toner > 0)
new /obj/effect/decal/cleanable/oil(get_turf(src))
toner = 0
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index a5b37664c7e..2a54c05d053 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -17,7 +17,7 @@
icon_state = "film"
item_state = "electropack"
w_class = 1
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/*
* Photo
@@ -28,8 +28,9 @@
icon_state = "photo"
item_state = "paper"
w_class = 1
- resistance_flags = 0
- burntime = 5
+ resistance_flags = FLAMMABLE
+ obj_integrity = 50
+ max_integrity = 50
var/icon/img //Big photo image
var/scribble //Scribble on the back.
var/blueprints = 0 //Does it include the blueprints?
@@ -94,7 +95,7 @@
icon_state = "album"
item_state = "briefcase"
can_hold = list(/obj/item/weapon/photo)
- resistance_flags = 0
+ resistance_flags = FLAMMABLE
/*
* Camera
diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm
index 4540a53a972..dcc443b2938 100644
--- a/code/modules/power/antimatter/control.dm
+++ b/code/modules/power/antimatter/control.dm
@@ -181,6 +181,7 @@
else
return ..()
+
/obj/machinery/power/am_control_unit/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
switch(damage_type)
if(BRUTE)
diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm
index 7524010b166..860a80a3912 100644
--- a/code/modules/power/antimatter/shielding.dm
+++ b/code/modules/power/antimatter/shielding.dm
@@ -119,11 +119,11 @@
shutdown_core()
-/obj/machinery/am_shielding/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/am_shielding/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
switch(damage_type)
if(BRUTE)
if(sound_effect)
- if(damage)
+ if(damage_amount)
playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
else
playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
@@ -132,8 +132,8 @@
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
else
return
- if(damage >= 10)
- stability -= damage/2
+ if(damage_amount >= 10)
+ stability -= damage_amount/2
check_stability()
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 5a9875accda..d43314eb8f5 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -48,6 +48,10 @@
anchored = 1
use_power = 0
req_access = list(access_engine_equip)
+ obj_integrity = 200
+ max_integrity = 200
+ integrity_failure = 50
+ armor = list(melee = 20, bullet = 20, laser = 10, energy = 100, bomb = 30, bio = 100, rad = 100, fire = 90, acid = 50)
var/area/area
var/areastring = null
var/obj/item/weapon/stock_parts/cell/cell
@@ -93,7 +97,7 @@
var/global/list/status_overlays_equipment
var/global/list/status_overlays_lighting
var/global/list/status_overlays_environ
- var/health = 50
+
/obj/machinery/power/apc/connect_to_network()
//Override because the APC does not directly connect to the network; it goes through a terminal.
@@ -183,7 +187,6 @@
/obj/machinery/power/apc/examine(mob/user)
..()
if(stat & BROKEN)
- user << "Looks broken."
return
if(opened)
if(has_electronics && terminal)
@@ -411,7 +414,7 @@
return
if(!user.drop_item())
return
- W.loc = src
+ W.forceMove(src)
cell = W
user.visible_message(\
"[user.name] has inserted the power cell to [src.name]!",\
@@ -555,13 +558,21 @@
else
return ..()
-/obj/machinery/power/apc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- ..()
- if((malfhack || (stat & BROKEN)) && !opened)
- if(damage < 10)
- return
- health -= damage
- if(health <= 0)
+/obj/machinery/power/apc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 15 && (!(stat & BROKEN) || malfai))
+ return 0
+ . = ..()
+
+
+/obj/machinery/power/apc/obj_break(damage_flag)
+ if(!(flags & NODECONSTRUCT))
+ set_broken()
+
+/obj/machinery/power/apc/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(!(stat & BROKEN))
+ set_broken()
+ if(opened != 2)
opened = 2
visible_message("The APC cover is knocked down!")
update_icon()
@@ -602,28 +613,9 @@
..()
/obj/machinery/power/apc/attack_alien(mob/living/carbon/alien/humanoid/user)
- ..()
- if(malfhack || (stat & BROKEN))
+ if(malfhack)
return
- if(opened == 0)
- if(!panel_open)
- panel_open = 1
- update_icon()
- visible_message("The [src.name]'s cover flies open, exposing the wires!")
-
- else if(panel_open && !wires.is_all_cut())
- wires.cut_all()
- update_icon()
- visible_message("The [src.name]'s wires are shredded!")
- else if(opened == 1)
- if(cell)
- cell.loc = user.loc
- cell.updateicon()
- cell = null
- visible_message("The [src.name]'s power cell flies off!")
- charging = 0
- update_icon()
-
+ ..()
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = default_state)
@@ -1084,17 +1076,6 @@
addtimer(src, "reset", 600, FALSE, APC_RESET_EMP)
..()
-/obj/machinery/power/apc/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- switch(severity)
- if(2)
- if(prob(50))
- set_broken()
- if(3)
- if(prob(25))
- set_broken()
-
/obj/machinery/power/apc/blob_act(obj/structure/blob/B)
set_broken()
@@ -1124,7 +1105,7 @@
for(var/area/A in area.related)
for(var/obj/machinery/light/L in A)
L.on = 1
- L.broken()
+ L.break_light_tube()
stoplag()
/obj/machinery/power/apc/proc/shock(mob/user, prb)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 4ce5dfb3f9a..941c423c43c 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -97,9 +97,16 @@ By design, d1 is the smallest direction and d2 is the highest
if(invisibility != INVISIBILITY_MAXIMUM)
qdel(src)
-/obj/structure/cable/Deconstruct()
- var/turf/T = loc
- stored.loc = T
+/obj/structure/cable/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ var/turf/T = loc
+ stored.forceMove(T)
+ qdel(src)
+
+/obj/structure/cable/fire_act(exposed_temperature, exposed_volume)
+ var/turf/T = src.loc
+ if(T && T.intact) //protected from fire when hidden behind a floor.
+ return
..()
///////////////////////////////////
@@ -138,7 +145,7 @@ By design, d1 is the smallest direction and d2 is the highest
user.visible_message("[user] cuts the cable.", "You cut the cable.")
stored.add_fingerprint(user)
investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires")
- Deconstruct()
+ deconstruct()
return
else if(istype(W, /obj/item/stack/cable_coil))
@@ -169,21 +176,9 @@ By design, d1 is the smallest direction and d2 is the highest
else
return 0
-//explosion handling
-/obj/structure/cable/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- switch(severity)
- if(2)
- if(prob(50))
- Deconstruct()
- if(3)
- if(prob(25))
- Deconstruct()
-
/obj/structure/cable/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
- Deconstruct()
+ deconstruct()
/obj/structure/cable/proc/cableColor(colorC = "red")
cable_color = colorC
@@ -619,7 +614,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \
if (C.shock(user, 50))
if (prob(50)) //fail
- C.Deconstruct()
+ C.deconstruct()
// called when cable_coil is click on an installed obj/cable
// or click on a turf that already contains a "node" cable
@@ -684,7 +679,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \
if (NC.shock(user, 50))
if (prob(50)) //fail
- NC.Deconstruct()
+ NC.deconstruct()
return
@@ -734,7 +729,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \
if (C.shock(user, 50))
if (prob(50)) //fail
- C.Deconstruct()
+ C.deconstruct()
return
C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets.
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 395eebbb65b..ccae16644f3 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -25,7 +25,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
anchored = 1
density = 1
use_power = 0
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/sprite_number = 0
/obj/machinery/gravity_generator/ex_act(severity, target)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 3647c9173e8..6ad8d8eba08 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -16,34 +16,38 @@
desc = "Used for building lights."
icon = 'icons/obj/lighting.dmi'
icon_state = "tube-construct-item"
- result_path = /obj/machinery/light_construct
+ result_path = /obj/structure/light_construct
inverse = 1
/obj/item/wallframe/light_fixture/small
name = "small light fixture frame"
icon_state = "bulb-construct-item"
- result_path = /obj/machinery/light_construct/small
+ result_path = /obj/structure/light_construct/small
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT)
-/obj/machinery/light_construct
+/obj/structure/light_construct
name = "light fixture frame"
desc = "A light fixture under construction."
icon = 'icons/obj/lighting.dmi'
icon_state = "tube-construct-stage1"
anchored = 1
layer = WALL_OBJ_LAYER
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 50, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 50)
+
var/stage = 1
var/fixture_type = "tube"
var/sheets_refunded = 2
var/obj/machinery/light/newlight = null
-/obj/machinery/light_construct/New(loc, ndir, building)
+/obj/structure/light_construct/New(loc, ndir, building)
..()
if(building)
setDir(ndir)
-/obj/machinery/light_construct/examine(mob/user)
+/obj/structure/light_construct/examine(mob/user)
..()
switch(src.stage)
if(1)
@@ -53,7 +57,7 @@
if(3)
user << "The casing is closed."
-/obj/machinery/light_construct/attackby(obj/item/weapon/W, mob/user, params)
+/obj/structure/light_construct/attackby(obj/item/weapon/W, mob/user, params)
add_fingerprint(user)
switch(stage)
if(1)
@@ -116,17 +120,24 @@
return
return ..()
-/obj/machinery/light_construct/blob_act(obj/structure/blob/B)
+/obj/structure/light_construct/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
qdel(src)
-/obj/machinery/light_construct/small
+/obj/structure/light_construct/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal(loc, sheets_refunded)
+ qdel(src)
+
+/obj/structure/light_construct/small
name = "small light fixture frame"
icon_state = "bulb-construct-stage1"
fixture_type = "bulb"
sheets_refunded = 1
+
+
// the standard tube light fixture
/obj/machinery/light
name = "light fixture"
@@ -136,6 +147,8 @@
desc = "A lighting fixture."
anchored = 1
layer = WALL_OBJ_LAYER
+ obj_integrity = 100
+ max_integrity = 100
use_power = 2
idle_power_usage = 2
active_power_usage = 20
@@ -152,7 +165,6 @@
// this is used to calc the probability the light burns out
var/rigged = 0 // true if rigged to explode
- var/health = 20
// the smaller bulb light fixture
@@ -163,12 +175,12 @@
brightness = 4
desc = "A small lighting fixture."
light_type = /obj/item/weapon/light/bulb
- health = 15
+
/obj/machinery/light/Move()
if(status != LIGHT_BROKEN)
- broken(1)
+ break_light_tube(1)
return ..()
/obj/machinery/light/built/New()
@@ -190,11 +202,11 @@
if("tube")
brightness = 8
if(prob(2))
- broken(1)
+ break_light_tube(1)
if("bulb")
brightness = 4
if(prob(5))
- broken(1)
+ break_light_tube(1)
spawn(1)
update(0)
@@ -319,19 +331,7 @@
playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1)
user.visible_message("[user.name] opens [src]'s casing.", \
"You open [src]'s casing.", "You hear a noise.")
- var/obj/machinery/light_construct/newlight = null
- switch(fitting)
- if("tube")
- newlight = new /obj/machinery/light_construct(src.loc)
- newlight.icon_state = "tube-construct-stage2"
-
- if("bulb")
- newlight = new /obj/machinery/light_construct/small(src.loc)
- newlight.icon_state = "bulb-construct-stage2"
- newlight.setDir(src.dir)
- newlight.stage = 2
- transfer_fingerprints_to(newlight)
- qdel(src)
+ deconstruct()
else
user << "You stick \the [W] into the light socket!"
if(has_power() && (W.flags & CONDUCT))
@@ -343,6 +343,32 @@
else
return ..()
+/obj/machinery/light/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ var/obj/structure/light_construct/newlight = null
+ var/cur_stage = 2
+ if(!disassembled)
+ cur_stage = 1
+ switch(fitting)
+ if("tube")
+ newlight = new /obj/structure/light_construct(src.loc)
+ newlight.icon_state = "tube-construct-stage[cur_stage]"
+
+ if("bulb")
+ newlight = new /obj/structure/light_construct/small(src.loc)
+ newlight.icon_state = "bulb-construct-stage[cur_stage]"
+ newlight.setDir(src.dir)
+ newlight.stage = cur_stage
+ if(!disassembled)
+ newlight.obj_integrity = newlight.max_integrity * 0.5
+ if(status != LIGHT_BROKEN)
+ break_light_tube()
+ if(status != LIGHT_EMPTY)
+ drop_light_tube()
+ new /obj/item/stack/cable_coil(loc, 1, "red")
+ transfer_fingerprints_to(newlight)
+ qdel(src)
+
/obj/machinery/light/attacked_by(obj/item/I, mob/living/user)
..()
if(status == LIGHT_BROKEN || status == LIGHT_EMPTY)
@@ -350,25 +376,27 @@
if(prob(12))
electrocute_mob(user, get_area(src), src, 0.3)
-/obj/machinery/light/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/light/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
+ . = ..()
+ if(. && !qdeleted(src))
+ if(prob(damage_amount * 5))
+ break_light_tube()
+
+
+
+
+/obj/machinery/light/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- switch(status)
- if(LIGHT_EMPTY)
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
- if(LIGHT_BROKEN)
- playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 90, 1)
- else
- playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
+ switch(status)
+ if(LIGHT_EMPTY)
+ playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
+ if(LIGHT_BROKEN)
+ playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 90, 1)
+ else
+ playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- health -= damage
- if(health <= 0)
- broken()
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
// returns whether this light has power
@@ -397,20 +425,6 @@
src.flicker(1)
return
-/obj/machinery/light/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type, 0)
-
-/obj/machinery/light/hitby(AM as mob|obj)
- ..()
- var/tforce = 0
- if(ismob(AM))
- tforce = 40
- else if(isobj(AM))
- var/obj/item/I = AM
- tforce = I.throwforce
- take_damage(tforce)
-
// attack with hand - remove tube/bulb
// if hands aren't protected and the light is on, burn the player
@@ -444,12 +458,15 @@
user << "You try to remove the light [fitting], but you burn your hand on it!"
var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
- if(affecting && affecting.take_damage( 0, 5 )) // 5 burn damage
+ if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
H.update_damage_overlays()
return // if burned, don't remove the light
else
user << "You remove the light [fitting]."
// create a light tube/bulb item and put it in the user's hand
+ drop_light_tube(user)
+
+/obj/machinery/light/proc/drop_light_tube(mob/user)
var/obj/item/weapon/light/L = new light_type()
L.status = status
L.rigged = rigged
@@ -460,10 +477,11 @@
switchcount = 0
L.update()
- L.add_fingerprint(user)
- L.loc = loc
+ L.forceMove(loc)
- user.put_in_active_hand(L) //puts it in our active hand
+ if(user) //puts it in our active hand
+ L.add_fingerprint(user)
+ user.put_in_active_hand(L)
status = LIGHT_EMPTY
update()
@@ -475,26 +493,13 @@
user << "You telekinetically remove the light [fitting]."
// create a light tube/bulb item and put it in the user's hand
- var/obj/item/weapon/light/L = new light_type()
- L.status = status
- L.rigged = rigged
- L.brightness = brightness
+ drop_light_tube()
- // light item inherits the switchcount, then zero it
- L.switchcount = switchcount
- switchcount = 0
-
- L.update()
- L.add_fingerprint(user)
- L.loc = loc
-
- status = LIGHT_EMPTY
- update()
// break the light and make sparks if was on
-/obj/machinery/light/proc/broken(skip_sound_and_sparks = 0)
- if(status == LIGHT_EMPTY)
+/obj/machinery/light/proc/break_light_tube(skip_sound_and_sparks = 0)
+ if(status == LIGHT_EMPTY || status == LIGHT_BROKEN)
return
if(!skip_sound_and_sparks)
@@ -515,29 +520,6 @@
on = 1
update()
-// explosion effect
-// destroy the whole light fixture or just shatter it
-
-/obj/machinery/light/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- switch(severity)
- if(2)
- if(prob(50))
- broken()
- if(3)
- if(prob(25))
- broken()
-
-/obj/machinery/light/blob_act(obj/structure/blob/B)
- if(B && B.loc == loc)
- broken()
- qdel(src)
- else if(prob(50))
- broken()
- else
- flicker()
-
/obj/machinery/light/tesla_act(power, explosive = FALSE)
if(explosive)
explosion(src.loc,0,0,0,flame_range = 5, adminlog = 0)
@@ -553,14 +535,14 @@
/obj/machinery/light/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(prob(max(0, exposed_temperature - 673))) //0% at <400C, 100% at >500C
- broken()
+ break_light_tube()
// explode the light
/obj/machinery/light/proc/explode()
set waitfor = 0
var/turf/T = get_turf(src.loc)
- broken() // break it first to give a warning
+ break_light_tube() // break it first to give a warning
sleep(2)
explosion(T, 0, 0, 2, 2)
sleep(1)
diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm
index 058084e1cec..915f909e231 100644
--- a/code/modules/power/rtg.dm
+++ b/code/modules/power/rtg.dm
@@ -142,7 +142,7 @@
else
overload()
-/obj/machinery/power/rtg/abductor/fire_act()
+/obj/machinery/power/rtg/abductor/fire_act(exposed_temperature, exposed_volume)
overload()
/obj/machinery/power/rtg/abductor/tesla_act()
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index ec4da0d1b2e..74fd320c11d 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -10,6 +10,9 @@ var/global/list/rad_collectors = list()
density = 1
req_access = list(access_engine_equip)
// use_power = 0
+ obj_integrity = 350
+ max_integrity = 350
+ integrity_failure = 80
var/obj/item/weapon/tank/internals/plasma/loaded_tank = null
var/last_power = 0
var/active = 0
@@ -105,12 +108,10 @@ var/global/list/rad_collectors = list()
return ..()
-/obj/machinery/power/rad_collector/ex_act(severity, target)
- switch(severity)
- if(2, 3)
- eject()
- return ..()
-
+/obj/machinery/power/rad_collector/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
+ eject()
+ stat |= BROKEN
/obj/machinery/power/rad_collector/proc/eject()
locked = 0
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 6b3f4deb296..90a8beff273 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -7,7 +7,7 @@
icon_state = "Contain_F"
anchored = 1
density = 0
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
use_power = 0
luminosity = 4
layer = ABOVE_OBJ_LAYER
@@ -26,11 +26,20 @@
shock(user)
return 1
+/obj/machinery/field/containment/attackby(obj/item/W, mob/user, params)
+ shock(user)
+ return 1
+
+/obj/machinery/field/containment/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BURN)
+ playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1)
+ if(BRUTE)
+ playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1)
/obj/machinery/field/containment/blob_act(obj/structure/blob/B)
return 0
-
/obj/machinery/field/containment/ex_act(severity, target)
return 0
@@ -69,6 +78,8 @@
/obj/machinery/field/containment/Move()
qdel(src)
+
+
// Abstract Field Class
// Used for overriding certain procs
@@ -106,7 +117,6 @@
user.updatehealth()
bump_field(user)
- return
/obj/machinery/field/proc/clear_shock()
hasShocked = 0
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 366bab4bad9..69b592d5fdf 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -30,6 +30,10 @@ field_generator power level display
anchored = 0
density = 1
use_power = 0
+ obj_integrity = 500
+ max_integrity = 500
+ //100% immune to lasers and energy projectiles since it absorbs their energy.
+ armor = list(melee = 25, bullet = 10, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
var/const/num_power_levels = 6 // Total number of power level icon has
var/power_level = 0
var/active = FG_OFFLINE
@@ -157,7 +161,7 @@ field_generator power level display
if(Proj.flag != "bullet")
power = min(power + Proj.damage, field_generator_max_power)
check_power_level()
- return 0
+ ..()
/obj/machinery/field/generator/Destroy()
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index b8140b80a10..64538f978c1 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -26,6 +26,10 @@
icon_state = "none"
anchored = 0
density = 1
+ obj_integrity = 500
+ max_integrity = 500
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 80)
+
var/obj/machinery/particle_accelerator/control_box/master = null
var/construction_state = PA_CONSTRUCTION_UNSECURED
var/reference = null
@@ -143,16 +147,17 @@
return ..()
+/obj/structure/particle_accelerator/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ new /obj/item/stack/sheet/metal (loc, 5)
+ qdel(src)
+
/obj/structure/particle_accelerator/Move()
..()
if(master && master.active)
master.toggle_power()
investigate_log("was moved whilst active; it powered down.","singulo")
-/obj/structure/particle_accelerator/blob_act(obj/structure/blob/B)
- if(prob(50))
- qdel(src)
-
/obj/structure/particle_accelerator/update_icon()
switch(construction_state)
@@ -165,7 +170,6 @@
icon_state="[reference]p[strength]"
else
icon_state="[reference]c"
- return
/obj/structure/particle_accelerator/proc/update_state()
if(master)
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 96ee044fb77..fb9af570189 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -26,7 +26,7 @@
var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
var/last_warning
var/consumedSupermatter = 0 //If the singularity has eaten a supermatter shard and can go to stage six
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0)
//CARN: admin-alert for chuckle-fuckery.
@@ -60,6 +60,19 @@
consume(user)
return 1
+/obj/singularity/attack_paw(mob/user)
+ consume(user)
+
+/obj/singularity/attack_alien(mob/user)
+ consume(user)
+
+/obj/singularity/attack_animal(mob/user)
+ consume(user)
+
+/obj/singularity/attackby(obj/item/weapon/W, mob/user, params)
+ consume(user)
+ return 1
+
/obj/singularity/Process_Spacemove() //The singularity stops drifting for no man!
return 0
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index d38b2a9c426..6b19344e683 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -12,7 +12,9 @@
idle_power_usage = 0
active_power_usage = 0
var/id = 0
- var/health = 20
+ obj_integrity = 150
+ max_integrity = 150
+ integrity_failure = 50
var/obscured = 0
var/sunfrac = 0
var/adir = SOUTH // actual dir
@@ -50,7 +52,8 @@
S.anchored = 1
S.loc = src
if(S.glass_type == /obj/item/stack/sheet/rglass) //if the panel is in reinforced glass
- health *= 2 //this need to be placed here, because panels already on the map don't have an assembly linked to
+ max_integrity *= 2 //this need to be placed here, because panels already on the map don't have an assembly linked to
+ obj_integrity = max_integrity
update_icon()
/obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user, params)
@@ -58,54 +61,43 @@
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] begins to take the glass off the solar panel.", "You begin to take the glass off the solar panel...")
if(do_after(user, 50/W.toolspeed, target = src))
- var/obj/item/solar_assembly/S = locate() in src
- if(S)
- S.loc = src.loc
- S.give_glass(stat & BROKEN)
-
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel.")
- qdel(src)
+ deconstruct(TRUE)
else
return ..()
-/obj/machinery/power/solar/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type)
-
-/obj/machinery/power/solar/hitby(AM as mob|obj)
- ..()
- var/tforce = 0
- if(ismob(AM))
- tforce = 20
- else if(isobj(AM))
- var/obj/item/I = AM
- tforce = I.throwforce
- take_damage(tforce)
-
-/obj/machinery/power/solar/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/power/solar/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- if(stat & BROKEN)
- playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 60, 1)
- else
- playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
+ if(stat & BROKEN)
+ playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 60, 1)
+ else
+ playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
if(BURN)
- if(sound_effect)
- playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+ playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+
+
+/obj/machinery/power/solar/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
+ playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
+ stat |= BROKEN
+ unset_control()
+ update_icon()
+
+/obj/machinery/power/solar/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(disassembled)
+ var/obj/item/solar_assembly/S = locate() in src
+ if(S)
+ S.forceMove(loc)
+ S.give_glass(stat & BROKEN)
else
- return
- health -= damage
- if(health <= 0)
- playsound(src, "shatter", 70, 1)
- new /obj/item/weapon/shard(src.loc)
- new /obj/item/weapon/shard(src.loc)
- qdel(src)
- else if(health <= 10)
- if(!(stat & BROKEN))
- playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
- set_broken()
+ playsound(src, "shatter", 70, 1)
+ new /obj/item/weapon/shard(src.loc)
+ new /obj/item/weapon/shard(src.loc)
+ qdel(src)
+
/obj/machinery/power/solar/update_icon()
..()
@@ -115,7 +107,6 @@
else
add_overlay(image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER))
src.setDir(angle2dir(adir))
- return
//calculates the fraction of the sunlight that the panel recieves
/obj/machinery/power/solar/proc/update_solar_exposure()
@@ -149,21 +140,6 @@
else //if we're no longer on the same powernet, remove from control computer
unset_control()
-/obj/machinery/power/solar/proc/set_broken()
- . = (!(stat & BROKEN))
- stat |= BROKEN
- unset_control()
- update_icon()
-
-
-/obj/machinery/power/solar/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- switch(severity)
- if(2)
- take_damage(rand(10,20), BRUTE, 0)
- if(3)
- take_damage(rand(5,15), BRUTE, 0)
/obj/machinery/power/solar/fake/New(var/turf/loc, var/obj/item/solar_assembly/S)
..(loc, S, 0)
@@ -289,7 +265,9 @@
density = 1
use_power = 1
idle_power_usage = 250
- var/health = 25
+ obj_integrity = 200
+ max_integrity = 200
+ integrity_failure = 100
var/icon_screen = "solar"
var/icon_keyboard = "power_key"
var/id = 0
@@ -468,25 +446,18 @@
else
return ..()
-/obj/machinery/power/solar_control/bullet_act(obj/item/projectile/P)
- . = ..()
- take_damage(P.damage, P.damage_type)
-
-/obj/machinery/power/solar_control/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+/obj/machinery/power/solar_control/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
- if(sound_effect)
- if(stat & BROKEN)
- playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
- else
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ if(stat & BROKEN)
+ playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
+ else
+ playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
if(BURN)
- if(sound_effect)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- else
- return
- health -= damage
- if(health <= 0 && !(stat & BROKEN))
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+
+/obj/machinery/power/solar_control/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
stat |= BROKEN
update_icon()
@@ -523,24 +494,6 @@
update_icon()
-/obj/machinery/power/solar_control/proc/set_broken()
- stat |= BROKEN
- update_icon()
-
-
-/obj/machinery/power/solar_control/ex_act(severity, target)
- ..()
- if(!qdeleted(src))
- switch(severity)
- if(2)
- take_damage(rand(20,30), BRUTE, 0)
- if(3)
- take_damage(rand(10,20), BRUTE, 0)
-
-/obj/machinery/power/solar_control/blob_act(obj/structure/blob/B)
- if (prob(75))
- set_broken()
- src.density = 0
//
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index cb765e76f40..8f5c739346a 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -76,7 +76,9 @@
/obj/machinery/power/supermatter_shard/Destroy()
investigate_log("has been destroyed.", "supermatter")
- qdel(radio)
+ if(radio)
+ qdel(radio)
+ radio = null
poi_list -= src
. = ..()
@@ -245,11 +247,11 @@
/obj/machinery/power/supermatter_shard/blob_act(obj/structure/blob/B)
if(B && !isspaceturf(loc)) //does nothing in space
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
- damage += B.health * 0.5 //take damage equal to 50% of remaining blob health before it tried to eat us
- if(B.health > 100)
+ damage += B.obj_integrity * 0.5 //take damage equal to 50% of remaining blob health before it tried to eat us
+ if(B.obj_integrity > 100)
B.visible_message("\The [B] strikes at \the [src] and flinches away!",\
"You hear a loud crack as you are washed with a wave of heat.")
- B.take_damage(100, BURN, src)
+ B.take_damage(100, BURN)
else
B.visible_message("\The [B] strikes at \the [src] and rapidly flashes to ash.",\
"You hear a loud crack as you are washed with a wave of heat.")
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 928e98563f3..0f37617704b 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -11,6 +11,9 @@
anchored = 1
density = 1
use_power = 0
+ obj_integrity = 250
+ max_integrity = 250
+ integrity_failure = 50
var/id = 0
var/sun_angle = 0 // sun angle as set by sun datum
@@ -64,16 +67,31 @@
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] begins to take the glass off the solar tracker.", "You begin to take the glass off the solar tracker...")
if(do_after(user, 50/W.toolspeed, target = src))
- var/obj/item/solar_assembly/S = locate() in src
- if(S)
- S.loc = src.loc
- S.give_glass(stat & BROKEN)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("[user] takes the glass off the tracker.", "You take the glass off the tracker.")
- qdel(src)
+ deconstruct(TRUE)
else
return ..()
+/obj/machinery/power/tracker/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
+ playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
+ stat |= BROKEN
+ unset_control()
+
+/obj/machinery/power/solar/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(disassembled)
+ var/obj/item/solar_assembly/S = locate() in src
+ if(S)
+ S.forceMove(loc)
+ S.give_glass(stat & BROKEN)
+ else
+ playsound(src, "shatter", 70, 1)
+ new /obj/item/weapon/shard(src.loc)
+ new /obj/item/weapon/shard(src.loc)
+ qdel(src)
+
// Tracker Electronic
/obj/item/weapon/electronics/tracker
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index b43b7b0f4ef..b64323c9ec6 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -29,6 +29,7 @@
icon_state = "compressor"
anchored = 1
density = 1
+ resistance_flags = FIRE_PROOF
var/obj/machinery/power/turbine/turbine
var/datum/gas_mixture/gas_contained
var/turf/inturf
@@ -47,6 +48,7 @@
icon_state = "turbine"
anchored = 1
density = 1
+ resistance_flags = FIRE_PROOF
var/opened = 0
var/obj/machinery/power/compressor/compressor
var/turf/outturf
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index ede8268be7d..db04bb92816 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -484,8 +484,3 @@ obj/item/weapon/gun/proc/newshot()
azoom = new()
azoom.gun = src
-
-/obj/item/weapon/gun/burn()
- if(pin)
- qdel(pin)
- .=..()
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index f9c488f9628..185d5ff2654 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -47,6 +47,9 @@
fire_delay = shot.delay
/obj/item/weapon/gun/energy/Destroy()
+ if(power_supply)
+ qdel(power_supply)
+ power_supply = null
STOP_PROCESSING(SSobj, src)
return ..()
@@ -170,7 +173,3 @@
STOP_PROCESSING(SSobj, src)
..()
-/obj/item/weapon/gun/energy/burn()
- if(power_supply)
- qdel(power_supply)
- .=..()
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 313e2814ccc..da8e2c83ec7 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -10,7 +10,7 @@
hitsound = 'sound/weapons/pierce.ogg'
var/hitsound_wall = ""
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/def_zone = "" //Aiming at
var/mob/firer = null//Who shot it
var/obj/item/ammo_casing/ammo_casing = null
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 7279ec41475..79072028c9a 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -8,6 +8,7 @@
use_power = 1
idle_power_usage = 40
interact_offline = 1
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/energy = 100
var/max_energy = 100
var/amount = 30
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index aa4955e7ef1..a4af808cbb2 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -6,6 +6,7 @@
icon_state = "mixer0b"
use_power = 1
idle_power_usage = 40
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/weapon/reagent_containers/beaker = null
var/target_temperature = 300
var/heater_coefficient = 0.10
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 07042c5e1ad..52dccdedcd8 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -7,6 +7,7 @@
icon_state = "mixer0"
use_power = 1
idle_power_usage = 20
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/weapon/reagent_containers/beaker = null
var/obj/item/weapon/storage/pill_bottle/bottle = null
var/mode = 1
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 9fd265af203..448de75f0b6 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -8,6 +8,7 @@
circuit = /obj/item/weapon/circuitboard/computer/pandemic
use_power = 1
idle_power_usage = 20
+ resistance_flags = ACID_PROOF
var/temp_html = ""
var/wait = null
var/obj/item/weapon/reagent_containers/beaker = null
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 479a2ea140b..cc6a21adf5a 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -9,6 +9,7 @@
idle_power_usage = 5
active_power_usage = 100
pass_flags = PASSTABLE
+ resistance_flags = ACID_PROOF
var/operating = 0
var/obj/item/weapon/reagent_containers/beaker = null
var/limit = 10
diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
index 3c0e289f6da..42621f1a7fc 100644
--- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
@@ -25,10 +25,10 @@
return 0 //the dead, and blob mobs, don't cause reactions
return round(reac_volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume.
-/datum/reagent/blob/proc/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause) //when the blob takes damage, do this
+/datum/reagent/blob/proc/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) //when the blob takes damage, do this
return damage
-/datum/reagent/blob/proc/death_reaction(obj/structure/blob/B, cause) //when a blob dies, do this
+/datum/reagent/blob/proc/death_reaction(obj/structure/blob/B, damage_flag) //when a blob dies, do this
return
/datum/reagent/blob/proc/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T) //when the blob expands, do this
@@ -59,15 +59,14 @@
reac_volume = ..()
M.apply_damage(0.7*reac_volume, BRUTE)
-/datum/reagent/blob/replicating_foam/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
+/datum/reagent/blob/replicating_foam/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
var/effectivedamage = damage
if(damage_type == BRUTE)
effectivedamage = damage * 2
- if(damage_type == BURN && effectivedamage > 0 && original_health - effectivedamage > 0 && prob(60))
+ if(damage_type == BURN && effectivedamage > 0 && B.obj_integrity - effectivedamage > 0 && prob(60))
var/obj/structure/blob/newB = B.expand(null, null, 0)
if(newB)
- newB.health = original_health - effectivedamage
- newB.check_health(cause)
+ newB.obj_integrity = B.obj_integrity - effectivedamage
newB.update_icon()
return effectivedamage
@@ -95,8 +94,8 @@
newB.forceMove(get_turf(B))
B.forceMove(T)
-/datum/reagent/blob/shifting_fragments/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(cause && damage > 0 && original_health - damage > 0 && prob(60-damage))
+/datum/reagent/blob/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage))
var/list/blobstopick = list()
for(var/obj/structure/blob/OB in orange(1, B))
if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id)
@@ -134,8 +133,8 @@
/datum/reagent/blob/blazing_oil/extinguish_reaction(obj/structure/blob/B)
B.take_damage(rand(1, 3), BURN)
-/datum/reagent/blob/blazing_oil/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(cause && damage_type == BURN)
+/datum/reagent/blob/blazing_oil/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if(damage_type == BURN && (damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser"))
for(var/turf/open/T in range(1, B))
var/obj/structure/blob/C = locate() in T
if(!(C && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) && prob(80))
@@ -200,8 +199,8 @@
O.add_points(points)
O << "Gained [points] resources from the zombification of [M]."
-/datum/reagent/blob/zombifying_pods/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(!isnull(cause) && damage <= 20 && original_health - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
+/datum/reagent/blob/zombifying_pods/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
B.visible_message("A spore floats free of the blob!")
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc)
BS.overmind = B.overmind
@@ -236,8 +235,8 @@
if(M)
M.apply_damage(0.6*reac_volume, OXY)
-/datum/reagent/blob/energized_jelly/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(!isnull(cause) && original_health - damage <= 0 && prob(10))
+/datum/reagent/blob/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10))
spark_system.set_up(rand(2, 4), 0, B)
spark_system.start()
return ..()
@@ -247,7 +246,7 @@
/datum/reagent/blob/energized_jelly/emp_reaction(obj/structure/blob/B, severity)
var/damage = rand(30, 50) - severity * rand(10, 15)
- B.take_damage(damage, BURN)
+ B.take_damage(damage, BURN, "energy")
//does aoe brute damage when hitting targets, is immune to explosions
/datum/reagent/blob/explosive_lattice
@@ -278,12 +277,11 @@
else
M.apply_damage(0.6*reac_volume, BRUTE)
-/datum/reagent/blob/explosive_lattice/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(isnull(cause))
- if(damage_type == BRUTE)
- return 0 //no-sell the explosion we do not take damage
- if(damage_type == BURN)
- return damage * 1.5 //take more from fire, tesla, and flashbangs
+/datum/reagent/blob/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if(damage_flag == "bomb")
+ return 0
+ else if(damage_flag != "melee" || damage_flag != "bullet" || damage_flag != "laser")
+ return damage * 1.5
return ..()
//does brute, burn, and toxin damage, and cools targets down
@@ -334,7 +332,7 @@
if(M)
M.apply_damage(reac_volume, BURN)
-/datum/reagent/blob/electromagnetic_web/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
+/datum/reagent/blob/electromagnetic_web/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_type == BRUTE) //take full brute
switch(B.brute_resist)
if(0.5)
@@ -345,8 +343,8 @@
return damage * 10
return damage * 1.25 //a laser will do 25 damage, which will kill any normal blob
-/datum/reagent/blob/electromagnetic_web/death_reaction(obj/structure/blob/B, cause)
- if(cause)
+/datum/reagent/blob/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag)
+ if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
empulse(B.loc, 1, 3) //less than screen range, so you can stand out of range to avoid it
//does brute damage, bonus damage for each nearby blob, and spreads damage out
@@ -371,15 +369,15 @@
B.blob_attack_animation(M) //show them they're getting a bad time
M.apply_damage(0.3*reac_volume, BRUTE)
-/datum/reagent/blob/synchronous_mesh/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(!isnull(cause)) //the cause isn't fire or bombs, so split the damage
+/datum/reagent/blob/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage
var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs
for(var/obj/structure/blob/C in orange(1, B))
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) //if it doesn't have the same chemical or is a core or node, don't split damage to it
damagesplit += 1
for(var/obj/structure/blob/C in orange(1, B))
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) //only hurt blobs that have the same overmind chemical and aren't cores or nodes
- C.take_damage(damage/damagesplit, CLONE, B, 0)
+ C.take_damage(damage/damagesplit, CLONE, 0, 0)
return damage / damagesplit
else
return damage * 1.25
@@ -402,9 +400,9 @@
return 0 //the dead, and blob mobs, don't cause reactions
M.adjustBruteLoss(0.8*reac_volume)
-/datum/reagent/blob/reactive_spines/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(damage && damage_type == BRUTE && original_health - damage > 0) //is there any damage, is it brute, and will we be alive
- if(isliving(cause))
+/datum/reagent/blob/reactive_spines/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if(damage && damage_type == BRUTE && B.obj_integrity - damage > 0) //is there any damage, is it brute, and will we be alive
+ if(damage_flag == "melee")
B.visible_message("The blob retaliates, lashing out!")
for(var/atom/A in range(1, B))
A.blob_act(B)
@@ -437,13 +435,13 @@
if(M)
M.adjustStaminaLoss(0.2*reac_volume)
-/datum/reagent/blob/pressurized_slime/damage_reaction(obj/structure/blob/B, original_health, damage, damage_type, cause)
- if(cause || damage_type != BURN)
+/datum/reagent/blob/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
+ if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN)
extinguisharea(B, damage)
return ..()
-/datum/reagent/blob/pressurized_slime/death_reaction(obj/structure/blob/B, cause)
- if(!isnull(cause))
+/datum/reagent/blob/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag)
+ if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
B.visible_message("The blob ruptures, spraying the area with liquid!")
extinguisharea(B, 50)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 57197c22691..4c8ce615323 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -125,15 +125,17 @@
G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0)
G.react()
qdel(hotspot)
+ var/obj/effect/acid/A = (locate(/obj/effect/acid) in T)
+ if(A)
+ A.acid_level = max(A.acid_level - reac_volume*50, 0)
/*
* Water reaction to an object
*/
/datum/reagent/water/reaction_obj(obj/O, reac_volume)
- if(istype(O))
- O.extinguish()
-
+ O.extinguish()
+ O.acid_level = 0
// Monkey cube
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 4ece92a9410..36a6eb68a49 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -679,7 +679,7 @@
if(method == INJECT)
C.adjustBruteLoss(1.5 * min(6*toxpwr, reac_volume * toxpwr))
return
- C.acid_act(acidpwr, toxpwr, reac_volume)
+ C.acid_act(acidpwr, reac_volume)
/datum/reagent/toxin/acid/reaction_obj(obj/O, reac_volume)
if(istype(O.loc, /mob)) //handled in human acid_act()
@@ -691,8 +691,7 @@
if (!istype(T))
return
reac_volume = round(reac_volume,0.1)
- for(var/obj/O in T)
- O.acid_act(acidpwr, reac_volume)
+ T.acid_act(acidpwr, reac_volume)
/datum/reagent/toxin/acid/fluacid
name = "Fluorosulfuric acid"
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 9831f73bc60..2a2b0e9f244 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -289,10 +289,10 @@
feedback_add_details("slime_cores_used","[type]")
var/turf/TU = get_turf(holder.my_atom)
TU.visible_message("The slime extract begins to vibrate adorably!")
- addtimer(src, "burn", 50, FALSE, holder)
+ addtimer(src, "slime_burn", 50, FALSE, holder)
-/datum/chemical_reaction/slimefire/proc/burn(datum/reagents/holder)
+/datum/chemical_reaction/slimefire/proc/slime_burn(datum/reagents/holder)
if(holder && holder.my_atom)
var/turf/open/T = get_turf(holder.my_atom)
if(istype(T))
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 1c54b6f22ce..ff3c280c431 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -73,7 +73,7 @@
R.on_ex_act()
..()
-/obj/item/weapon/reagent_containers/fire_act()
+/obj/item/weapon/reagent_containers/fire_act(exposed_temperature, exposed_volume)
reagents.chem_temp += 30
reagents.handle_reactions()
..()
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 8bd874837df..61bd6b78ff6 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -19,7 +19,7 @@
update_icon()
/obj/item/weapon/reagent_containers/glass/bottle/update_icon()
- overlays.Cut()
+ cut_overlays()
if(reagents.total_volume)
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]-10")
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 469be2bbbb2..b6edef2315d 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -5,6 +5,7 @@
volume = 50
flags = OPENCONTAINER
spillable = 1
+ resistance_flags = ACID_PROOF
/obj/item/weapon/reagent_containers/glass/attack(mob/M, mob/user, obj/target)
@@ -212,7 +213,7 @@
/obj/item/weapon/reagent_containers/glass/beaker/large/epinephrine
name = "epinephrine reserve tank"
list_reagents = list("epinephrine" = 50)
-
+
/obj/item/weapon/reagent_containers/glass/beaker/synthflesh
list_reagents = list("synthflesh" = 50)
@@ -230,7 +231,8 @@
flags = OPENCONTAINER
flags_inv = HIDEHAIR
slot_flags = SLOT_HEAD
- armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) //Weak melee protection, because you can wear it on your head
+ resistance_flags = 0
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 75, acid = 50) //Weak melee protection, because you can wear it on your head
slot_equipment_priority = list( \
slot_back, slot_wear_id,\
slot_w_uniform, slot_wear_suit,\
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 962649807d4..7cc303bc814 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -6,28 +6,16 @@
density = 1
anchored = 0
pressure_resistance = 2*ONE_ATMOSPHERE
+ obj_integrity = 300
+ max_integrity = 300
var/tank_volume = 1000 //In units, how much the dispenser can hold
var/reagent_id = "water" //The ID of the reagent that the dispenser uses
-/obj/structure/reagent_dispensers/ex_act(severity, target)
- switch(severity)
- if(1)
+/obj/structure/reagent_dispensers/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
+ . = ..()
+ if(. && obj_integrity > 0)
+ if(tank_volume && (damage_flag == "bullet" || damage_flag == "laser"))
boom()
- return
- if(2)
- if (prob(50))
- boom()
- return
- if(3)
- if (prob(5))
- boom()
- return
- else
- return
-
-/obj/structure/reagent_dispensers/blob_act(obj/structure/blob/B)
- if(prob(50))
- boom()
/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers))
@@ -53,21 +41,18 @@
chem_splash(loc, 5, list(reagents))
qdel(src)
+/obj/structure/reagent_dispensers/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(!disassembled)
+ boom()
+ else
+ qdel(src)
+
/obj/structure/reagent_dispensers/watertank
name = "water tank"
desc = "A water tank."
icon_state = "water"
-/obj/structure/reagent_dispensers/bullet_act(obj/item/projectile/Proj)
- ..()
- if(tank_volume && istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)))
- boom()
-
-/obj/structure/reagent_dispensers/watertank/blob_act(obj/structure/blob/B)
- if(prob(50))
- PoolOrNew(/obj/effect/particle_effect/water, loc)
- qdel(src)
-
/obj/structure/reagent_dispensers/watertank/high
name = "high-capacity water tank"
desc = "A highly-pressurized water tank made to hold gargantuan amounts of water.."
@@ -80,15 +65,6 @@
icon_state = "fuel"
reagent_id = "welding_fuel"
-/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/Proj)
- ..()
- if(istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)))
- var/boom_message = "[key_name_admin(Proj.firer)] triggered a fueltank explosion via projectile."
- bombers += boom_message
- message_admins(boom_message)
- log_game("[key_name(Proj.firer)] triggered a fueltank explosion via projectile.")
- boom()
-
/obj/structure/reagent_dispensers/fueltank/boom()
explosion(get_turf(src), 0, 1, 5, flame_range = 5)
qdel(src)
@@ -99,13 +75,23 @@
/obj/structure/reagent_dispensers/fueltank/ex_act()
boom()
-/obj/structure/reagent_dispensers/fueltank/fire_act()
+/obj/structure/reagent_dispensers/fueltank/fire_act(exposed_temperature, exposed_volume)
boom()
/obj/structure/reagent_dispensers/fueltank/tesla_act()
..() //extend the zap
boom()
+/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/P)
+ ..()
+ if(!qdeleted(src)) //wasn't deleted by the projectile's effects.
+ if(!P.nodamage && ((P.damage_type == BURN) || (P.damage_type == BRUTE)))
+ var/boom_message = "[key_name_admin(P.firer)] triggered a fueltank explosion via projectile."
+ bombers += boom_message
+ message_admins(boom_message)
+ log_game("[key_name(P.firer)] triggered a fueltank explosion via projectile.")
+ boom()
+
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/weldingtool))
if(!reagents.has_reagent("welding_fuel"))
@@ -176,6 +162,8 @@
/obj/structure/reagent_dispensers/beerkeg/blob_act(obj/structure/blob/B)
explosion(src.loc,0,3,5,7,10)
+ if(!qdeleted(src))
+ qdel(src)
/obj/structure/reagent_dispensers/virusfood
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index 6c75044074b..8982370ff3a 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -11,6 +11,8 @@
density = 0
pressure_resistance = 5*ONE_ATMOSPHERE
level = 2
+ obj_integrity = 200
+ max_integrity = 200
var/ptype = 0
var/dpdir = 0 // directions as disposalpipe
diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm
index 528b8dce387..0389b87fd99 100644
--- a/code/modules/recycling/disposal-structures.dm
+++ b/code/modules/recycling/disposal-structures.dm
@@ -6,6 +6,7 @@
/obj/structure/disposalholder
invisibility = INVISIBILITY_MAXIMUM
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/datum/gas_mixture/gas = null // gas used to flush, will appear at exit point
var/active = 0 // true if the holder is moving, otherwise inactive
dir = 0
@@ -123,6 +124,8 @@
/obj/structure/disposalholder/allow_drop()
return 1
+
+
// Disposal pipes
/obj/structure/disposalpipe
@@ -135,7 +138,9 @@
level = 1 // underfloor only
var/dpdir = 0 // bitmask of pipe directions
dir = 0// dir will contain dominant direction for junction pipes
- var/health = 10 // health points 0-10
+ obj_integrity = 200
+ max_integrity = 200
+ armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 90, acid = 30)
layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes
var/base_icon_state // initial icon state on map
var/obj/structure/disposalconstruct/stored
@@ -178,22 +183,9 @@
/obj/structure/disposalpipe/Destroy()
var/obj/structure/disposalholder/H = locate() in src
if(H)
- // holder was present
H.active = 0
var/turf/T = src.loc
- if(T.density)
- // deleting pipe is inside a dense turf (wall)
- // this is unlikely, but just dump out everything into the turf in case
-
- for(var/atom/movable/AM in H)
- AM.forceMove(src.loc)
- AM.pipe_eject(0)
- qdel(H)
- return ..()
-
- // otherwise, do normal expel from turf
- else
- expel(H, T, 0)
+ expel(H, T, 0)
return ..()
// returns the direction of the next pipe object, given the entrance dir
@@ -255,12 +247,14 @@
/obj/structure/disposalpipe/proc/expel(obj/structure/disposalholder/H, turf/T, direction)
var/turf/target
+ var/eject_range = 5
+ var/turf/open/floor/floorturf
if(isfloorturf(T)) //intact floor, pop the tile
- var/turf/open/floor/myturf = T
- if(myturf.floor_tile)
- PoolOrNew(myturf.floor_tile, T)
- myturf.make_plating()
+ floorturf = T
+ if(floorturf.floor_tile)
+ PoolOrNew(floorturf.floor_tile, T)
+ floorturf.make_plating()
if(direction) // direction is specified
if(isspaceturf(T)) // if ended in space, then range is unlimited
@@ -268,59 +262,19 @@
else // otherwise limit to 10 tiles
target = get_ranged_target_turf(T, direction, 10)
- playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
- if(H)
- for(var/atom/movable/AM in H)
- AM.forceMove(src.loc)
- AM.pipe_eject(direction)
- AM.throw_at_fast(target, 10, 1)
+ eject_range = 10
- else // no specified direction, so throw in random direction
+ else if(floorturf)
+ target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5))
- playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
- if(H)
- for(var/atom/movable/AM in H)
- target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5))
- AM.forceMove(src.loc)
- AM.pipe_eject(0)
- AM.throw_at_fast(target, 5, 1)
+ playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
+ for(var/atom/movable/AM in H)
+ AM.forceMove(src.loc)
+ AM.pipe_eject(direction)
+ if(target)
+ AM.throw_at_fast(target, eject_range, 1)
H.vent_gas(T)
qdel(H)
- return
-
-// call to break the pipe
-// will expel any holder inside at the time
-// then delete the pipe
-// remains : set to leave broken pipe pieces in place
-/obj/structure/disposalpipe/proc/broken(remains = 0)
- if(remains)
- for(var/D in cardinal)
- if(D & dpdir)
- var/obj/structure/disposalpipe/broken/P = new(src.loc)
- P.setDir(D)
-
- src.invisibility = INVISIBILITY_MAXIMUM // make invisible (since we won't delete the pipe immediately)
- var/obj/structure/disposalholder/H = locate() in src
- if(H)
- // holder was present
- H.active = 0
- var/turf/T = src.loc
- if(T.density)
- // broken pipe is inside a dense turf (wall)
- // this is unlikely, but just dump out everything into the turf in case
-
- for(var/atom/movable/AM in H)
- AM.forceMove(src.loc)
- AM.pipe_eject(0)
- qdel(H)
- return
-
- // otherwise, do normal expel from turf
- if(H)
- expel(H, T, 0)
-
- spawn(2) // delete pipe after 2 ticks to ensure expel proc finished
- qdel(src)
// pipe affected by explosion
@@ -330,28 +284,20 @@
var/obj/structure/disposalholder/H = locate() in src
if(H)
H.contents_explosion(severity, target)
-
- switch(severity)
- if(1)
- broken(0)
- return
- if(2)
- health -= rand(5,15)
- healthcheck()
- return
- if(3)
- health -= rand(0,15)
- healthcheck()
- return
+ ..()
-// test health for brokenness
-/obj/structure/disposalpipe/proc/healthcheck()
- if(health < -2)
- broken(0)
- else if(health<1)
- broken(1)
- return
+/obj/structure/disposalpipe/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 10)
+ return 0
+ . = ..()
+
+/obj/structure/disposalpipe/fire_act(exposed_temperature, exposed_volume)
+ var/turf/T = src.loc
+ if(T && T.intact) //protected from fire when hidden behind a floor.
+ return
+ ..()
+
//attack by item
//weldingtool: unfasten and convert to obj/disposalconstruct
@@ -370,7 +316,7 @@
// check if anything changed over 2 seconds
if(do_after(user,30, target = src))
if(!src || !W.isOn()) return
- Deconstruct()
+ deconstruct()
user << "You slice the disposal pipe."
else
return ..()
@@ -380,20 +326,28 @@
. = 1
// called when pipe is cut with welder
-/obj/structure/disposalpipe/Deconstruct()
- if(stored)
- var/turf/T = loc
- stored.loc = T
- transfer_fingerprints_to(stored)
- stored.setDir(dir)
- stored.density = 0
- stored.anchored = 1
- stored.update_icon()
- ..()
+/obj/structure/disposalpipe/deconstruct(disassembled = TRUE)
+ if(!(flags & NODECONSTRUCT))
+ if(disassembled)
+ if(stored)
+ var/turf/T = loc
+ stored.loc = T
+ transfer_fingerprints_to(stored)
+ stored.setDir(dir)
+ stored.density = 0
+ stored.anchored = 1
+ stored.update_icon()
+ else
+ for(var/D in cardinal)
+ if(D & dpdir)
+ var/obj/structure/disposalpipe/broken/P = new(src.loc)
+ P.setDir(D)
+ qdel(src)
+
/obj/structure/disposalpipe/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
- Deconstruct()
+ deconstruct()
// *** TEST verb
//client/verb/dispstop()
@@ -679,11 +633,10 @@
/obj/structure/disposalpipe/broken/New()
..()
update()
- return
// the disposal outlet machine
-/obj/structure/disposalpipe/broken/Deconstruct()
+/obj/structure/disposalpipe/broken/deconstruct()
qdel(src)
/obj/structure/disposaloutlet
diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm
index d185fa41adc..f2952257970 100644
--- a/code/modules/recycling/disposal-unit.dm
+++ b/code/modules/recycling/disposal-unit.dm
@@ -8,6 +8,9 @@
anchored = 1
density = 1
on_blueprints = TRUE
+ armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 90, acid = 30)
+ obj_integrity = 200
+ max_integrity = 200
var/datum/gas_mixture/air_contents // internal reservoir
var/mode = 1 // mode -1=screws removed 0=off 1=charging 2=charged
var/flush = 0 // true if flush handle is pulled
@@ -54,7 +57,7 @@
/obj/machinery/disposal/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
- Deconstruct()
+ deconstruct()
/obj/machinery/disposal/initialize()
// this will get a copy of the air turf and take a SEND PRESSURE amount of air from it
@@ -91,7 +94,7 @@
if(!W.isOn())
return
user << "You slice the floorweld off \the [src]."
- Deconstruct()
+ deconstruct()
return
if(user.a_intent != "harm")
@@ -195,14 +198,6 @@
*/
interact(user, 0)
-// hostile mob escape from disposals
-/obj/machinery/disposal/attack_animal(mob/living/simple_animal/M)
- if(M.environment_smash)
- M.do_attack_animation(src)
- visible_message("[M.name] smashes \the [src] apart!")
- qdel(src)
- return
-
// eject the contents of the disposal unit
/obj/machinery/disposal/proc/eject()
var/turf/T = get_turf(src)
@@ -265,14 +260,15 @@
H.vent_gas(loc)
qdel(H)
-/obj/machinery/disposal/Deconstruct()
- if(stored)
- var/turf/T = loc
- stored.loc = T
- src.transfer_fingerprints_to(stored)
- stored.anchored = 0
- stored.density = 1
- stored.update_icon()
+/obj/machinery/disposal/deconstruct()
+ if(!(flags & NODECONSTRUCT))
+ if(stored)
+ var/turf/T = loc
+ stored.loc = T
+ src.transfer_fingerprints_to(stored)
+ stored.anchored = 0
+ stored.density = 1
+ stored.update_icon()
..()
//How disposal handles getting a storage dump from a storage object
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 339d468a7df..156de6e3c46 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -107,5 +107,5 @@
//we eject the loaded item when deconstructing the machine
/obj/machinery/r_n_d/on_deconstruction()
if(loaded_item)
- loaded_item.loc = loc
+ loaded_item.forceMove(loc)
..()
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 7545803b9e0..cfc64d6ab01 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -3,7 +3,7 @@
icon = 'icons/obj/machines/research.dmi'
icon_state = "server"
var/datum/research/files
- var/health = 100
+ var/heat_health = 100
var/list/id_with_upload = list() //List of R&D consoles with upload to server access.
var/list/id_with_download = list() //List of R&D consoles with download from server access.
var/id_with_upload_string = "" //String versions for easy editing in map editor.
@@ -56,12 +56,12 @@
var/datum/gas_mixture/environment = loc.return_air()
switch(environment.temperature)
if(0 to T0C)
- health = min(100, health + 1)
+ heat_health = min(100, heat_health + 1)
if(T0C to (T20C + 20))
- health = Clamp(health, 0, 100)
+ heat_health = Clamp(heat_health, 0, 100)
if((T20C + 20) to (T0C + 70))
- health = max(0, health - 1)
- if(health <= 0)
+ heat_health = max(0, heat_health - 1)
+ if(heat_health <= 0)
/*griefProtection() This seems to get called twice before running any code that deletes/damages the server or it's files anwyay.
refreshParts and the hasReq procs that get called by this are laggy and do not need to be called by every server on the map every tick */
var/updateRD = 0
@@ -84,18 +84,10 @@
griefProtection()
..()
-
/obj/machinery/r_n_d/server/ex_act(severity, target)
griefProtection()
..()
-
-/obj/machinery/r_n_d/server/blob_act(obj/structure/blob/B)
- griefProtection()
- ..()
-
-
-
//Backup files to centcom to help admins recover data after greifer attacks
/obj/machinery/r_n_d/server/proc/griefProtection()
for(var/obj/machinery/r_n_d/server/centcom/C in machines)
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 89e662e3c05..078f20f0afc 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -418,7 +418,7 @@
item_state = "golem"
item_color = "golem"
flags = ABSTRACT | NODROP
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
has_sensor = 0
/obj/item/clothing/suit/golem
@@ -431,7 +431,7 @@
permeability_coefficient = 0.50
body_parts_covered = FULL_BODY
flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags = ABSTRACT | NODROP
/obj/item/clothing/shoes/golem
@@ -439,7 +439,7 @@
desc = "sturdy adamantine feet"
icon_state = "golem"
item_state = null
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags = NOSLIP | ABSTRACT | NODROP
@@ -449,7 +449,7 @@
icon_state = "golem"
item_state = "golem"
siemens_coefficient = 0
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags = ABSTRACT | NODROP
@@ -460,7 +460,7 @@
item_state = null
siemens_coefficient = 0
flags = ABSTRACT | NODROP
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/item/clothing/head/space/golem
@@ -469,7 +469,7 @@
item_color = "dermal"
name = "golem's head"
desc = "a golem's head"
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags = ABSTRACT | NODROP
/obj/effect/golemrune
@@ -478,7 +478,7 @@
name = "rune"
icon = 'icons/obj/rune.dmi'
icon_state = "golem"
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
layer = TURF_LAYER
/obj/effect/golemrune/New()
diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
index 71ee2153806..96dc4c28bea 100644
--- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
+++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
@@ -10,7 +10,7 @@
bound_width = 96
bound_height = 96
pixel_x = -32
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
luminosity = 1
var/boss = FALSE
var/is_anyone_home = FALSE
diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm
index 34be79ef84d..9a90b43541e 100644
--- a/code/modules/security_levels/keycard_authentication.dm
+++ b/code/modules/security_levels/keycard_authentication.dm
@@ -11,6 +11,7 @@ var/datum/events/keycard_events = new()
active_power_usage = 6
power_channel = ENVIRON
req_access = list(access_keycard_auth)
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/datum/event/ev
var/event = ""
var/obj/machinery/keycard_auth/event_source
diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm
index eb64c406645..0ebc8ef0436 100644
--- a/code/modules/shuttle/ferry.dm
+++ b/code/modules/shuttle/ferry.dm
@@ -12,6 +12,7 @@
var/cooldown = 600
possible_destinations = "ferry_home"
admin_controlled = 1
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list)
..()
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 208672cc81e..770a1673ac2 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -8,7 +8,7 @@
//icon = 'icons/dirsquare.dmi'
icon_state = "pinonfar"
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
anchored = 1
var/id
@@ -29,12 +29,16 @@
else
return QDEL_HINT_LETMELIVE
+/obj/docking_port/take_damage()
+ return
+
/obj/docking_port/singularity_pull()
return
/obj/docking_port/singularity_act()
return 0
/obj/docking_port/shuttleRotate()
return //we don't rotate with shuttles via this code.
+
//returns a list(x0,y0, x1,y1) where points 0 and 1 are bounding corners of the projected rectangle
/obj/docking_port/proc/return_coords(_x, _y, _dir)
if(_dir == null)
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index f018168952c..37e44407dd0 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -57,7 +57,8 @@
name = "wabbajack altar"
desc = "Whether you're sleeping or waking, it's going to be \
quite chaotic."
- health = 1000
+ obj_integrity = 1000
+ max_integrity = 1000
verb_say = "chants"
var/obj/machinery/power/emitter/energycannon/magical/our_statue
var/list/mob/living/sleepers = list()
@@ -187,7 +188,8 @@
/obj/structure/table/wood/bar
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flags = NODECONSTRUCT
- health = 1000
+ obj_integrity = 1000
+ max_integrity = 1000
var/boot_dir = 1
/obj/structure/table/wood/bar/Crossed(atom/movable/AM)
diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm
index 8d993a45c49..c835013866a 100644
--- a/code/modules/shuttle/syndicate.dm
+++ b/code/modules/shuttle/syndicate.dm
@@ -8,6 +8,7 @@
req_access = list(access_syndicate)
shuttleId = "syndicate"
possible_destinations = "syndicate_away;syndicate_z5;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s"
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/machinery/computer/shuttle/syndicate/recall
name = "syndicate shuttle recall terminal"
diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm
index 5aba7f5b5c3..bd91b8ff347 100644
--- a/code/modules/spells/spell_types/ethereal_jaunt.dm
+++ b/code/modules/spells/spell_types/ethereal_jaunt.dm
@@ -78,7 +78,7 @@
density = 0
anchored = 1
invisibility = 60
- resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/dummy/spell_jaunt/Destroy()
// Eject contents if deleted somehow
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index eb490cffc5a..a2acadb0f93 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -104,7 +104,7 @@
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
//Damage will not exceed max_damage using this proc
//Cannot apply negative damage
-/obj/item/bodypart/proc/take_damage(brute, burn, updating_health = 1)
+/obj/item/bodypart/proc/receive_damage(brute, burn, updating_health = 1)
if(owner && (owner.status_flags & GODMODE))
return 0 //godmode
brute = max(brute * config.damage_multiplier,0)
@@ -345,6 +345,11 @@
return standing
+
+/obj/item/bodypart/deconstruct(disassembled = TRUE)
+ drop_organs()
+ qdel(src)
+
/obj/item/bodypart/chest
name = "chest"
desc = "It's impolite to stare at a person's chest."
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 7c153342226..fa648d9bd26 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -16,7 +16,7 @@
return 0
var/obj/item/bodypart/affecting = C.get_bodypart("chest")
- affecting.take_damage(Clamp(brute_dam/2, 15, 50), Clamp(burn_dam/2, 0, 50)) //Damage the chest based on limb's existing damage
+ affecting.receive_damage(Clamp(brute_dam/2, 15, 50), Clamp(burn_dam/2, 0, 50)) //Damage the chest based on limb's existing damage
C.visible_message("[C]'s [src.name] has been violently dismembered!")
C.emote("scream")
drop_limb()
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index c3d86b5d4a2..067788acfcf 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -174,10 +174,6 @@
return standing
-/obj/item/bodypart/head/burn()
- drop_organs()
- ..()
-
/obj/item/bodypart/head/monkey
icon = 'icons/mob/animal_parts.dmi'
icon_state = "default_monkey_head"
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index c07e5208bef..2bbcb36fcc6 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -73,7 +73,7 @@
F.SetLuminosity(0)
owner.unEquip(holder, 1)
- holder.loc = src
+ holder.forceMove(src)
holder = null
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
@@ -84,7 +84,7 @@
holder = item
holder.flags |= NODROP
- holder.resistance_flags |= LAVA_PROOF | UNACIDABLE
+ holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
holder.slot_flags = null
holder.w_class = 5
holder.materials = null
@@ -158,7 +158,8 @@
origin_tech = "materials=4;combat=4;biotech=4;powerstorage=4;syndicate=3"
holder = /obj/item/weapon/gun/energy/laser/mounted
-/obj/item/organ/cyberimp/arm/gun/laser/l/zone = "l_arm"
+/obj/item/organ/cyberimp/arm/gun/laser/l
+ zone = "l_arm"
/obj/item/organ/cyberimp/arm/gun/taser
@@ -168,7 +169,8 @@
origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4"
holder = /obj/item/weapon/gun/energy/gun/advtaser/mounted
-/obj/item/organ/cyberimp/arm/gun/taser/l/zone = "l_arm"
+/obj/item/organ/cyberimp/arm/gun/taser/l
+ zone = "l_arm"
/obj/item/organ/cyberimp/arm/toolset
@@ -178,7 +180,8 @@
contents = newlist(/obj/item/weapon/screwdriver/cyborg, /obj/item/weapon/wrench/cyborg, /obj/item/weapon/weldingtool/largetank/cyborg,
/obj/item/weapon/crowbar/cyborg, /obj/item/weapon/wirecutters/cyborg, /obj/item/device/multitool/cyborg)
-/obj/item/organ/cyberimp/arm/toolset/l/zone = "l_arm"
+/obj/item/organ/cyberimp/arm/toolset/l
+ zone = "l_arm"
/obj/item/organ/cyberimp/arm/toolset/emag_act()
if(!(locate(/obj/item/weapon/kitchen/knife/combat/cyborg) in items_list))
diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm
index 4e001cb1680..4058a763519 100644
--- a/code/modules/vehicles/pimpin_ride.dm
+++ b/code/modules/vehicles/pimpin_ride.dm
@@ -7,6 +7,11 @@
var/obj/item/weapon/storage/bag/trash/mybag = null
var/floorbuffer = 0
+/obj/vehicle/janicart/Destroy()
+ if(mybag)
+ qdel(mybag)
+ mybag = null
+ return ..()
/obj/vehicle/janicart/handle_vehicle_offsets()
..()
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index f21275b6fce..be42e5ef8d9 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -8,6 +8,9 @@
anchored = 0
can_buckle = 1
buckle_lying = 0
+ obj_integrity = 300
+ max_integrity = 300
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 0, bomb = 30, bio = 0, rad = 0, fire = 60, acid = 60)
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
@@ -144,3 +147,28 @@
/obj/vehicle/space/Process_Spacemove(direction)
return 1
+
+/obj/vehicle/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 20)
+ return 0
+ . = ..()
+
+/obj/vehicle/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/metal (loc, 5)
+ qdel(src)
+
+/obj/vehicle/examine(mob/user)
+ ..()
+ if(!(resistance_flags & INDESTRUCTIBLE))
+ if(resistance_flags & ON_FIRE)
+ user << "It's on fire!"
+ var/healthpercent = (obj_integrity/max_integrity) * 100
+ switch(healthpercent)
+ if(100 to INFINITY)
+ user << "It seems pristine and undamaged."
+ if(50 to 100)
+ user << "It looks slightly damaged."
+ if(25 to 50)
+ user << "It appears heavily damaged."
+ if(0 to 25)
+ user << "It's falling apart!"
\ No newline at end of file
diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi
index 5e71e45d4bf..c29eb7d616f 100644
Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index adef4345cc9..84611b698b9 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/effects/item_damage.dmi b/icons/effects/item_damage.dmi
new file mode 100644
index 00000000000..cc23d9fca4a
Binary files /dev/null and b/icons/effects/item_damage.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 97f450831fa..626b4a8d6cd 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 3498b295a39..9c761d2c1c2 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -136,11 +136,13 @@
#include "code\controllers\failsafe.dm"
#include "code\controllers\master.dm"
#include "code\controllers\subsystem.dm"
+#include "code\controllers\subsystem\acid.dm"
#include "code\controllers\subsystem\air.dm"
#include "code\controllers\subsystem\assets.dm"
#include "code\controllers\subsystem\augury.dm"
#include "code\controllers\subsystem\diseases.dm"
#include "code\controllers\subsystem\events.dm"
+#include "code\controllers\subsystem\fire_burning.dm"
#include "code\controllers\subsystem\garbage.dm"
#include "code\controllers\subsystem\icon_smooth.dm"
#include "code\controllers\subsystem\ipintel.dm"
@@ -549,6 +551,7 @@
#include "code\game\objects\empulse.dm"
#include "code\game\objects\explosion.dm"
#include "code\game\objects\items.dm"
+#include "code\game\objects\obj_defense.dm"
#include "code\game\objects\objs.dm"
#include "code\game\objects\radiation.dm"
#include "code\game\objects\structures.dm"
@@ -764,6 +767,7 @@
#include "code\game\objects\structures\grille.dm"
#include "code\game\objects\structures\guncase.dm"
#include "code\game\objects\structures\hivebot.dm"
+#include "code\game\objects\structures\holosign.dm"
#include "code\game\objects\structures\janicart.dm"
#include "code\game\objects\structures\kitchen_spike.dm"
#include "code\game\objects\structures\ladders.dm"