mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-22 04:24:20 +01:00
Deconflict
This commit is contained in:
@@ -22514,7 +22514,7 @@
|
||||
},
|
||||
/area/crew_quarters/bar/atrium)
|
||||
"aRy" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/crew_quarters/bar/atrium)
|
||||
"aRz" = (
|
||||
@@ -23422,7 +23422,7 @@
|
||||
d2 = 8;
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
@@ -24305,7 +24305,7 @@
|
||||
},
|
||||
/area/crew_quarters/bar/atrium)
|
||||
"aUH" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
@@ -89006,7 +89006,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/wood{
|
||||
broken = 1;
|
||||
icon_state = "wood-broken"
|
||||
@@ -89016,12 +89016,12 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/maintenance/gambling_den)
|
||||
"dcT" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "wood"
|
||||
},
|
||||
@@ -90537,7 +90537,7 @@
|
||||
/area/maintenance/gambling_den)
|
||||
"dfP" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/wood{
|
||||
@@ -91371,7 +91371,7 @@
|
||||
},
|
||||
/area/maintenance/gambling_den)
|
||||
"dhw" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -91380,7 +91380,7 @@
|
||||
/area/maintenance/gambling_den)
|
||||
"dhx" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
@@ -92327,7 +92327,7 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/maintenance/starboard)
|
||||
"diY" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/wood{
|
||||
@@ -92346,7 +92346,7 @@
|
||||
/area/maintenance/gambling_den)
|
||||
"dja" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -93121,7 +93121,7 @@
|
||||
},
|
||||
/area/maintenance/gambling_den)
|
||||
"dkr" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
@@ -94305,7 +94305,7 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/hallway/secondary/construction)
|
||||
"dmM" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/maintenance/gambling_den)
|
||||
"dmN" = (
|
||||
@@ -96153,7 +96153,7 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/crew_quarters/hor)
|
||||
"dpR" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
@@ -96848,7 +96848,7 @@
|
||||
},
|
||||
/area/maintenance/gambling_den)
|
||||
"dra" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
@@ -101412,7 +101412,7 @@
|
||||
},
|
||||
/area/crew_quarters/theatre)
|
||||
"dzq" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -102176,7 +102176,7 @@
|
||||
dir = 4;
|
||||
level = 1
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -102619,7 +102619,7 @@
|
||||
},
|
||||
/area/crew_quarters/theatre)
|
||||
"dBq" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -108948,21 +108948,21 @@
|
||||
},
|
||||
/area/chapel/office)
|
||||
"dMT" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "chapel"
|
||||
},
|
||||
/area/chapel/main)
|
||||
"dMU" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "chapel"
|
||||
},
|
||||
/area/chapel/main)
|
||||
"dMV" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "chapel"
|
||||
@@ -108970,14 +108970,14 @@
|
||||
/area/chapel/main)
|
||||
"dMW" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "chapel"
|
||||
},
|
||||
/area/chapel/main)
|
||||
"dMX" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
pixel_x = 28
|
||||
@@ -109317,14 +109317,14 @@
|
||||
},
|
||||
/area/chapel/office)
|
||||
"dNJ" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "chapel"
|
||||
},
|
||||
/area/chapel/main)
|
||||
"dNK" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 4;
|
||||
icon_state = "chapel"
|
||||
@@ -109332,7 +109332,7 @@
|
||||
/area/chapel/main)
|
||||
"dNL" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "chapel"
|
||||
@@ -109340,7 +109340,7 @@
|
||||
/area/chapel/main)
|
||||
"dNM" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "chapel"
|
||||
@@ -109692,7 +109692,7 @@
|
||||
},
|
||||
/area/chapel/office)
|
||||
"dOq" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/obj/machinery/light{
|
||||
icon_state = "tube1";
|
||||
dir = 8
|
||||
@@ -109715,7 +109715,7 @@
|
||||
},
|
||||
/area/chapel/main)
|
||||
"dOt" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/obj/machinery/light{
|
||||
icon_state = "tube1";
|
||||
dir = 4
|
||||
@@ -111770,7 +111770,7 @@
|
||||
/area/chapel/office)
|
||||
"dSf" = (
|
||||
/obj/machinery/light/small,
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/newscaster{
|
||||
@@ -111783,7 +111783,7 @@
|
||||
/area/chapel/main)
|
||||
"dSg" = (
|
||||
/obj/machinery/light/small,
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/newscaster{
|
||||
|
||||
@@ -13578,7 +13578,7 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/maintenance/fore)
|
||||
"aya" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/wood,
|
||||
/area/crew_quarters/mrchangs)
|
||||
"ayb" = (
|
||||
@@ -14935,7 +14935,7 @@
|
||||
name = "Port Maintenance"
|
||||
})
|
||||
"aAB" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
@@ -14952,7 +14952,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
@@ -15652,7 +15652,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/crew_quarters/sleep)
|
||||
"aBS" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
@@ -21926,7 +21926,7 @@
|
||||
name = "\improper Warehouse"
|
||||
})
|
||||
"aMA" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
/obj/item/shard{
|
||||
icon_state = "medium"
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
@@ -128,7 +128,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/ruin/unpowered)
|
||||
"av" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
@@ -201,7 +201,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/ruin/unpowered)
|
||||
"aH" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
|
||||
@@ -1134,7 +1134,7 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/awaymission/academy/classrooms)
|
||||
"ds" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
@@ -2204,7 +2204,7 @@
|
||||
},
|
||||
/area/awaymission/academy/classrooms)
|
||||
"gb" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/academy/classrooms)
|
||||
"gc" = (
|
||||
|
||||
@@ -605,7 +605,7 @@
|
||||
},
|
||||
/area/awaymission/example)
|
||||
"bB" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "bar"
|
||||
},
|
||||
@@ -670,7 +670,7 @@
|
||||
},
|
||||
/area/awaymission/example)
|
||||
"bJ" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (EAST)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 4
|
||||
@@ -680,7 +680,7 @@
|
||||
},
|
||||
/area/awaymission/example)
|
||||
"bK" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (WEST)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 8
|
||||
@@ -706,7 +706,7 @@
|
||||
},
|
||||
/area/awaymission/example)
|
||||
"bN" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (NORTH)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 1
|
||||
|
||||
@@ -2195,7 +2195,7 @@
|
||||
name = "Syndicate Outpost"
|
||||
})
|
||||
"dh" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/obj/machinery/alarm/monitor{
|
||||
dir = 4;
|
||||
frequency = 1439;
|
||||
@@ -7981,7 +7981,7 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/obj/machinery/alarm/monitor{
|
||||
dir = 8;
|
||||
frequency = 1439;
|
||||
@@ -8717,7 +8717,7 @@
|
||||
name = "MO19 Arrivals"
|
||||
})
|
||||
"mB" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
|
||||
@@ -224,7 +224,7 @@
|
||||
},
|
||||
/area/awaymission/UO71/plaza)
|
||||
"aH" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (NORTH)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 1
|
||||
@@ -873,7 +873,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 10
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (EAST)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 4
|
||||
@@ -921,7 +921,7 @@
|
||||
on = 1;
|
||||
pressure_checks = 1
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (NORTH)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 1
|
||||
@@ -2216,7 +2216,7 @@
|
||||
on = 1;
|
||||
pressure_checks = 1
|
||||
},
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/awaymission/UO71/plaza)
|
||||
"eW" = (
|
||||
@@ -6161,7 +6161,7 @@
|
||||
pixel_y = 23;
|
||||
req_access = null
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/paper/terrorspiders4,
|
||||
@@ -6479,7 +6479,7 @@
|
||||
req_access_txt = "0";
|
||||
specialfunctions = 4
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (NORTH)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 1
|
||||
@@ -8632,7 +8632,7 @@
|
||||
},
|
||||
/area/awaymission/UO71/centralhall)
|
||||
"qL" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/awaymission/UO71/centralhall)
|
||||
"qM" = (
|
||||
@@ -9040,7 +9040,7 @@
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/awaymission/UO71/centralhall)
|
||||
"ru" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
@@ -12195,7 +12195,7 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
@@ -12540,7 +12540,7 @@
|
||||
},
|
||||
/area/awaymission/UO71/eng)
|
||||
"xF" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/awaymission/UO71/mining)
|
||||
"xG" = (
|
||||
@@ -13396,7 +13396,7 @@
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/awaymission/UO71/loot)
|
||||
"zt" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/obj/item/clothing/shoes/chameleon/noslip,
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/awaymission/UO71/loot)
|
||||
@@ -13506,12 +13506,12 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/UO71/queen)
|
||||
"zW" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/UO71/queen)
|
||||
"zX" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (EAST)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 4
|
||||
@@ -13523,7 +13523,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/UO71/queen)
|
||||
"zZ" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (EAST)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 4
|
||||
@@ -13531,7 +13531,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/UO71/queen)
|
||||
"Aa" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
@@ -13544,7 +13544,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/UO71/queen)
|
||||
"Ac" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (NORTH)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 1
|
||||
@@ -13568,7 +13568,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/UO71/queen)
|
||||
"Ag" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/light,
|
||||
|
||||
@@ -1423,7 +1423,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 10
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (EAST)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 4
|
||||
@@ -1491,7 +1491,7 @@
|
||||
on = 1;
|
||||
pressure_checks = 1
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (NORTH)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 1
|
||||
@@ -3362,7 +3362,7 @@
|
||||
on = 1;
|
||||
pressure_checks = 1
|
||||
},
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/awaycontent/a1{
|
||||
has_gravity = 1;
|
||||
@@ -8156,7 +8156,7 @@
|
||||
pixel_y = 23;
|
||||
req_access = null
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
@@ -8519,7 +8519,7 @@
|
||||
req_access_txt = "0";
|
||||
specialfunctions = 4
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
tag = "icon-wooden_chair (NORTH)";
|
||||
icon_state = "wooden_chair";
|
||||
dir = 1
|
||||
@@ -11135,7 +11135,7 @@
|
||||
name = "UO45 Crew Quarters"
|
||||
})
|
||||
"qt" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/awaycontent/a2{
|
||||
has_gravity = 1;
|
||||
@@ -11629,7 +11629,7 @@
|
||||
name = "UO45 Crew Quarters"
|
||||
})
|
||||
"ra" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
@@ -15331,7 +15331,7 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
@@ -15833,7 +15833,7 @@
|
||||
name = "UO45 Engineering"
|
||||
})
|
||||
"wN" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/awaycontent/a4{
|
||||
has_gravity = 1;
|
||||
|
||||
@@ -682,7 +682,7 @@
|
||||
},
|
||||
/area/awaymission/wwmines)
|
||||
"cc" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -704,7 +704,7 @@
|
||||
},
|
||||
/area/awaymission/wwmines)
|
||||
"ce" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -861,7 +861,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/wwgov)
|
||||
"cA" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
@@ -995,13 +995,13 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/wwmines)
|
||||
"cV" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/wwmines)
|
||||
"cW" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
@@ -2303,7 +2303,7 @@
|
||||
/turf/simulated/wall/mineral/sandstone,
|
||||
/area/awaymission/wwmines)
|
||||
"gm" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -2312,7 +2312,7 @@
|
||||
},
|
||||
/area/awaymission/wwmines)
|
||||
"gn" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -2428,7 +2428,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/wwmines)
|
||||
"gD" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "barber"
|
||||
@@ -2479,7 +2479,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/awaymission/wwmines)
|
||||
"gL" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -2528,7 +2528,7 @@
|
||||
tag = "icon-gibup1";
|
||||
icon_state = "gibup1"
|
||||
},
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 8;
|
||||
icon_state = "barber"
|
||||
|
||||
@@ -18897,7 +18897,7 @@
|
||||
/obj/structure/sign/poster/contraband/random{
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/maintenance/fpmaint)
|
||||
"aGk" = (
|
||||
@@ -33468,7 +33468,7 @@
|
||||
},
|
||||
/area/hallway/primary/central/north)
|
||||
"biP" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
@@ -33483,7 +33483,7 @@
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/crew_quarters/mrchangs)
|
||||
"biR" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
@@ -79735,7 +79735,7 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/atmos/control)
|
||||
"cMb" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/wood{
|
||||
@@ -79748,7 +79748,7 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/maintenance/asmaint)
|
||||
"cMd" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/carpet,
|
||||
@@ -83569,7 +83569,7 @@
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/crew_quarters/mrchangs)
|
||||
"cSX" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/obj/structure/cable{
|
||||
d1 = 1;
|
||||
d2 = 2;
|
||||
@@ -84339,7 +84339,7 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/maintenance/aft)
|
||||
"cUi" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/crew_quarters/mrchangs)
|
||||
"cUj" = (
|
||||
@@ -91152,7 +91152,7 @@
|
||||
name = "station intercom (General)";
|
||||
pixel_y = -28
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/wood,
|
||||
|
||||
@@ -3384,7 +3384,7 @@
|
||||
/turf/simulated/floor/plating/airless,
|
||||
/area/space/nearstation)
|
||||
"hx" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/wood{
|
||||
tag = "icon-wood-broken7";
|
||||
icon_state = "wood-broken7"
|
||||
@@ -3946,7 +3946,7 @@
|
||||
},
|
||||
/area/derelict/crew_quarters)
|
||||
"ix" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/wood{
|
||||
@@ -4279,7 +4279,7 @@
|
||||
name = "Derelict Annex"
|
||||
})
|
||||
"je" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -4296,7 +4296,7 @@
|
||||
},
|
||||
/area/derelict/arrival)
|
||||
"jg" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/sign/poster/contraband/random{
|
||||
@@ -4370,7 +4370,7 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/derelict/crew_quarters)
|
||||
"jn" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/structure/chair/wood,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "wood"
|
||||
},
|
||||
@@ -4613,7 +4613,7 @@
|
||||
},
|
||||
/area/derelict/crew_quarters)
|
||||
"jM" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -7287,7 +7287,7 @@
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -7301,7 +7301,7 @@
|
||||
},
|
||||
/area/derelict/crew_quarters)
|
||||
"qo" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -8210,7 +8210,7 @@
|
||||
name = "Derelict Annex"
|
||||
})
|
||||
"sd" = (
|
||||
/obj/structure/chair/wood/normal{
|
||||
/obj/structure/chair/wood{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/update_icon(var/safety = 0)
|
||||
..()
|
||||
|
||||
|
||||
plane = FLOOR_PLANE
|
||||
|
||||
if(!check_icon_cache())
|
||||
@@ -152,7 +152,7 @@
|
||||
|
||||
if(pressure_delta > 0.5)
|
||||
if(air_contents.temperature > 0)
|
||||
var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) / 5
|
||||
var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
|
||||
|
||||
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
|
||||
if(pressure_delta > 0.5)
|
||||
if(environment.temperature > 0)
|
||||
var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) / 5
|
||||
var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION)
|
||||
|
||||
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
|
||||
if(isnull(removed)) //in space
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0)
|
||||
..()
|
||||
|
||||
|
||||
plane = FLOOR_PLANE
|
||||
|
||||
if(!check_icon_cache())
|
||||
@@ -227,7 +227,7 @@
|
||||
|
||||
if(scrubbing)
|
||||
if((scrub_O2 && environment.oxygen>0.001) || (scrub_N2 && environment.nitrogen>0.001) || (scrub_CO2 && environment.carbon_dioxide>0.001) || (scrub_Toxins && environment.toxins>0.001) || (environment.trace_gases.len>0))
|
||||
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() / 5
|
||||
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles()
|
||||
|
||||
//Take a gas sample
|
||||
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
|
||||
@@ -269,7 +269,7 @@
|
||||
if(air_contents.return_pressure()>=50*ONE_ATMOSPHERE)
|
||||
return
|
||||
|
||||
var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) / 5
|
||||
var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume)
|
||||
|
||||
var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
|
||||
|
||||
|
||||
@@ -298,63 +298,30 @@
|
||||
excited_group.reset_cooldowns()
|
||||
|
||||
/turf/proc/high_pressure_movements()
|
||||
for(var/atom/movable/M in src)
|
||||
M.experience_pressure_difference(pressure_difference, pressure_direction)
|
||||
var/atom/movable/M
|
||||
for(var/thing in src)
|
||||
M = thing
|
||||
if(!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired)
|
||||
M.experience_pressure_difference(pressure_difference, pressure_direction)
|
||||
|
||||
|
||||
|
||||
|
||||
/atom/movable/var/pressure_resistance = 5
|
||||
/atom/movable/var/throw_pressure_limit = 15
|
||||
/atom/movable/var/last_forced_movement = 0
|
||||
/atom/movable/var/pressure_resistance = 10
|
||||
/atom/movable/var/last_high_pressure_movement_air_cycle = 0
|
||||
|
||||
/atom/movable/proc/experience_pressure_difference(pressure_difference, direction)
|
||||
if(last_forced_movement >= SSair.times_fired)
|
||||
return 0
|
||||
if(anchored || move_resist == INFINITY)
|
||||
return 0
|
||||
else if(!pulledby)
|
||||
var/turf/target = get_turf(src)
|
||||
var/datum/gas_mixture/target_air = target.return_air()
|
||||
if(isspaceturf(target) || isunsimulatedturf(target) || pressure_resistance > target_air.return_pressure())
|
||||
return 0
|
||||
if(pressure_difference >= throw_pressure_limit)
|
||||
var/general_direction = get_edge_target_turf(src, direction)
|
||||
if(last_forced_movement + 10 < SSair.times_fired && is_valid_tochat_target(src)) //the first check prevents spamming throw to_chat
|
||||
to_chat(src, "<span class='userdanger'>The pressure sends you flying!</span>")
|
||||
spawn()
|
||||
var/max_distance = 14 // reduce by one each calculation to prevent infinate loops.
|
||||
var/min_observed_pressure = INFINITY
|
||||
var/turf/possible_target = get_turf(src)
|
||||
while(!isspaceturf(target) && !isunsimulatedturf(target) && max_distance > 0)
|
||||
max_distance--
|
||||
target_air = target.return_air()
|
||||
min_observed_pressure = target_air.return_pressure()
|
||||
possible_target = get_step_towards(target,general_direction)
|
||||
if(istype(possible_target, /turf/space))
|
||||
target = possible_target
|
||||
break
|
||||
if(!CanAtmosPass(possible_target))
|
||||
target = possible_target
|
||||
max_distance = 0
|
||||
break
|
||||
var/datum/gas_mixture/possible_target_air = possible_target.return_air()
|
||||
if(possible_target_air.return_pressure() > min_observed_pressure)
|
||||
target = possible_target
|
||||
break
|
||||
target = possible_target
|
||||
if(max_distance)
|
||||
throw_at(target, get_dist(src, target), pressure_difference / 200, null, 0, 0, null)
|
||||
else
|
||||
throw_at(target, pressure_difference / 10, pressure_difference / 200, null, 0, 0, null)
|
||||
last_forced_movement = SSair.times_fired
|
||||
return 1
|
||||
else if(pressure_difference > pressure_resistance)
|
||||
spawn()
|
||||
step(src, direction)
|
||||
last_forced_movement = SSair.times_fired
|
||||
return 1
|
||||
return 0
|
||||
/atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0)
|
||||
var/const/PROBABILITY_OFFSET = 25
|
||||
var/const/PROBABILITY_BASE_PRECENT = 75
|
||||
var/max_force = sqrt(pressure_difference) * (MOVE_FORCE_DEFAULT / 5)
|
||||
set waitfor = 0
|
||||
var/move_prob = 100
|
||||
if(pressure_resistance > 0)
|
||||
move_prob = (pressure_difference / pressure_resistance * PROBABILITY_BASE_PRECENT) - PROBABILITY_OFFSET
|
||||
move_prob += pressure_resistance_prob_delta
|
||||
if(move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO))))
|
||||
step(src, direction)
|
||||
last_high_pressure_movement_air_cycle = SSair.times_fired
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -63,4 +63,11 @@
|
||||
#define AREACOORD(src) "[src ? "[get_area_name(src, TRUE)] [COORD(src)]" : "nonexistent location" ]"
|
||||
#define ADMIN_COORDJMP(src) "[src ? "[COORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]"
|
||||
#define ADMIN_VERBOSEJMP(src) "[src ? "[AREACOORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]"
|
||||
#define ADMIN_SHOWDETAILS(mask, content) "<a href='?_src_=holder;showdetails=[html_encode(content)]'>[mask]</a>"
|
||||
#define ADMIN_SHOWDETAILS(mask, content) "<a href='?_src_=holder;showdetails=[html_encode(content)]'>[mask]</a>"
|
||||
|
||||
///Max length of a keypress command before it's considered to be a forged packet/bogus command
|
||||
#define MAX_KEYPRESS_COMMANDLENGTH 16
|
||||
///Max amount of keypress messages per second over two seconds before client is autokicked
|
||||
#define MAX_KEYPRESS_AUTOKICK 50
|
||||
///Length of held key rolling buffer
|
||||
#define HELD_KEY_BUFFER_LENGTH 15
|
||||
@@ -0,0 +1,43 @@
|
||||
GLOBAL_LIST_EMPTY(typelists)
|
||||
|
||||
#ifndef TESTING
|
||||
|
||||
/datum/proc/typelist(key, list/values = list())
|
||||
var/list/mytypelist = GLOB.typelists[type] || (GLOB.typelists[type] = list())
|
||||
return mytypelist[key] || (mytypelist[key] = values.Copy())
|
||||
|
||||
#else
|
||||
// mostly the same code as above, just more verbose, slower and has tallying for saved lists
|
||||
/datum/proc/typelist(key, list/values)
|
||||
if (!values)
|
||||
values = list()
|
||||
GLOB.typelistkeys |= key
|
||||
if (GLOB.typelists[type])
|
||||
if (GLOB.typelists[type][key])
|
||||
GLOB.typelists[type]["[key]-saved"]++
|
||||
return GLOB.typelists[type][key]
|
||||
else
|
||||
GLOB.typelists[type][key] = values.Copy()
|
||||
else
|
||||
GLOB.typelists[type] = list()
|
||||
GLOB.typelists[type][key] = values.Copy()
|
||||
return GLOB.typelists[type][key]
|
||||
|
||||
GLOBAL_LIST_EMPTY(typelistkeys)
|
||||
|
||||
/proc/tallytypelistsavings()
|
||||
var/savings = list()
|
||||
var/saveditems = list()
|
||||
for (var/key in GLOB.typelistkeys)
|
||||
savings[key] = 0
|
||||
saveditems[key] = 0
|
||||
|
||||
for (var/type in GLOB.typelists)
|
||||
for (var/saving in savings)
|
||||
if (GLOB.typelists[type]["[saving]-saved"])
|
||||
savings[saving] += GLOB.typelists[type]["[saving]-saved"]
|
||||
saveditems[saving] += (GLOB.typelists[type]["[saving]-saved"] * length(GLOB.typelists[type][saving]))
|
||||
|
||||
for (var/saving in savings)
|
||||
to_chat(world, "Savings for [saving]: [savings[saving]] lists, [saveditems[saving]] items")
|
||||
#endif
|
||||
@@ -34,8 +34,6 @@ GLOBAL_LIST_INIT(restricted_camera_networks, list(
|
||||
"Hotel"
|
||||
)) //Those networks can only be accessed by preexisting terminals. AIs and new terminals can't use them.
|
||||
|
||||
GLOBAL_LIST_INIT(mineral_turfs, list())
|
||||
|
||||
GLOBAL_LIST_INIT(ruin_landmarks, list())
|
||||
|
||||
GLOBAL_LIST_INIT(round_end_sounds, list(
|
||||
|
||||
@@ -4,7 +4,7 @@ GLOBAL_LIST_INIT(base_chemicals, list("water","oxygen","nitrogen","hydrogen","po
|
||||
"iron","aluminum","silicon","sugar","ethanol"))
|
||||
// Standard chemicals
|
||||
GLOBAL_LIST_INIT(standard_chemicals, list("slimejelly","blood","water","lube","charcoal","toxin","cyanide",
|
||||
"morphine","epinephrine","space_drugs","serotrotium","oxygen","copper",
|
||||
"morphine","epinephrine","space_drugs","oxygen","copper",
|
||||
"nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine",
|
||||
"fluorine","sodium","phosphorus","lithium","sugar","sacid","facid",
|
||||
"glycerol","radium","mutadone","thermite","mutagen","virusfood","iron",
|
||||
@@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(standard_chemicals, list("slimejelly","blood","water","lube","c
|
||||
GLOBAL_LIST_INIT(rare_chemicals, list("minttoxin","syndicate_nanites", "xenomicrobes"))
|
||||
// Standard medicines
|
||||
GLOBAL_LIST_INIT(standard_medicines, list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs",
|
||||
"serotrotium","mutadone","mutagen","teporone","lexorin","silver_sulfadiazine",
|
||||
"mutadone","mutagen","teporone","lexorin","silver_sulfadiazine",
|
||||
"salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol",
|
||||
"potass_iodide","pen_acid","mannitol","oculine","styptic_powder",
|
||||
"methamphetamine","spaceacillin","carpotoxin","lsd","ethanol","ammonia",
|
||||
|
||||
@@ -31,7 +31,7 @@ SUBSYSTEM_DEF(mapping)
|
||||
if (mining_type == "lavaland")
|
||||
// Spawn Lavaland ruins and rivers.
|
||||
seedRuins(list(level_name_to_num(MINING)), config.lavaland_budget, /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates)
|
||||
spawn_rivers()
|
||||
spawn_rivers(list(level_name_to_num(MINING)))
|
||||
else
|
||||
// Populate mining Z-level hidden rooms
|
||||
for(var/i = 0, i < max_secret_rooms, i++)
|
||||
|
||||
@@ -263,7 +263,12 @@ UI STUFF
|
||||
else
|
||||
continue
|
||||
|
||||
dat += "</table></body>"
|
||||
dat += "</table>"
|
||||
dat += "<h1>Resolve All</h1>"
|
||||
if(ticket_system_name == "Mentor Tickets")
|
||||
dat += "<a href='?src=[UID()];resolveall=1'>Resolve All Open Mentor Tickets</a></body>"
|
||||
else
|
||||
dat += "<a href='?src=[UID()];resolveall=1'>Resolve All Open Admin Tickets</a></body>"
|
||||
|
||||
return dat
|
||||
|
||||
@@ -402,6 +407,12 @@ UI STUFF
|
||||
takeTicket(indexNum)
|
||||
showDetailUI(usr, indexNum)
|
||||
|
||||
if(href_list["resolveall"])
|
||||
if(ticket_system_name == "Mentor Tickets")
|
||||
usr.client.resolveAllMentorTickets()
|
||||
else
|
||||
usr.client.resolveAllAdminTickets()
|
||||
|
||||
/datum/controller/subsystem/tickets/proc/takeTicket(var/index)
|
||||
if(assignStaffToTicket(usr.client, index))
|
||||
if(span_class == "mentorhelp")
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/datum/status_effect/freon
|
||||
id = "frozen"
|
||||
duration = 100
|
||||
status_type = STATUS_EFFECT_UNIQUE
|
||||
alert_type = /obj/screen/alert/status_effect/freon
|
||||
var/icon/cube
|
||||
var/can_melt = TRUE
|
||||
|
||||
/obj/screen/alert/status_effect/freon
|
||||
name = "Frozen Solid"
|
||||
desc = "You're frozen inside an ice cube, and cannot move! You can still do stuff, like shooting. Resist out of the cube!"
|
||||
icon_state = "frozen"
|
||||
|
||||
/datum/status_effect/freon/on_apply()
|
||||
RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/owner_resist)
|
||||
if(!owner.stat)
|
||||
to_chat(owner, "<span class='userdanger'>You become frozen in a cube!</span>")
|
||||
cube = icon('icons/effects/freeze.dmi', "ice_cube")
|
||||
owner.add_overlay(cube)
|
||||
owner.update_canmove()
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/freon/tick()
|
||||
owner.update_canmove()
|
||||
if(can_melt && owner.bodytemperature >= BODYTEMP_NORMAL)
|
||||
qdel(src)
|
||||
|
||||
/datum/status_effect/freon/proc/owner_resist()
|
||||
to_chat(owner, "You start breaking out of the ice cube!")
|
||||
if(do_mob(owner, owner, 40))
|
||||
if(!QDELETED(src))
|
||||
to_chat(owner, "You break out of the ice cube!")
|
||||
owner.remove_status_effect(/datum/status_effect/freon)
|
||||
owner.update_canmove()
|
||||
|
||||
/datum/status_effect/freon/on_remove()
|
||||
if(!owner.stat)
|
||||
to_chat(owner, "The cube melts!")
|
||||
owner.cut_overlay(cube)
|
||||
owner.adjust_bodytemperature(100)
|
||||
owner.update_canmove()
|
||||
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
|
||||
|
||||
/datum/status_effect/freon/watcher
|
||||
duration = 8
|
||||
can_melt = FALSE
|
||||
+38
-25
@@ -1108,21 +1108,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 1
|
||||
surplus = 35
|
||||
|
||||
/datum/uplink_item/stealthy_tools/syndigaloshes
|
||||
name = "No-Slip Chameleon Shoes"
|
||||
desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \
|
||||
They do not work on heavily lubricated surfaces."
|
||||
reference = "NSSS"
|
||||
item = /obj/item/clothing/shoes/chameleon/noslip
|
||||
cost = 2
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
|
||||
reference = "TNSSS"
|
||||
cost = 4 //but they aren't
|
||||
excludefrom = list()
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_tools/chamsechud
|
||||
name = "Chameleon Security HUD"
|
||||
desc = "A stolen Nanotrasen Security HUD with Syndicate chameleon technology implemented into it. Similarly to a chameleon jumpsuit, the HUD can be morphed into various other eyewear, while retaining the HUD qualities when worn."
|
||||
@@ -1168,7 +1153,29 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
Due to budget cuts, the shoes don't provide protection against slipping. The set comes with a complementary chameleon stamp."
|
||||
reference = "CHAM"
|
||||
item = /obj/item/storage/box/syndie_kit/chameleon
|
||||
cost = 4
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_tools/chameleon/nuke
|
||||
reference = "NCHAM"
|
||||
cost = 6
|
||||
excludefrom = list()
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_tools/syndigaloshes
|
||||
name = "No-Slip Chameleon Shoes"
|
||||
desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \
|
||||
They do not work on heavily lubricated surfaces."
|
||||
reference = "NSSS"
|
||||
item = /obj/item/clothing/shoes/chameleon/noslip
|
||||
cost = 2
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
|
||||
reference = "NNSSS"
|
||||
cost = 4
|
||||
excludefrom = list()
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_tools/chameleon_proj
|
||||
name = "Chameleon-Projector"
|
||||
@@ -1209,6 +1216,21 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 2
|
||||
surplus = 30
|
||||
|
||||
/datum/uplink_item/stealthy_tools/syndigaloshes
|
||||
name = "No-Slip Chameleon Shoes"
|
||||
desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. They do not work on heavily lubricated surfaces."
|
||||
reference = "NOCS"
|
||||
item = /obj/item/clothing/shoes/chameleon/noslip
|
||||
cost = 2
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
|
||||
reference = "NOCSN"
|
||||
item = /obj/item/clothing/shoes/chameleon/noslip
|
||||
cost = 4
|
||||
excludefrom = list()
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_tools/cutouts
|
||||
name = "Adaptive Cardboard Cutouts"
|
||||
desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. This pack contains three as well as a \
|
||||
@@ -1373,16 +1395,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
These reverse-engineered knockoffs of Nanotrasen's 'Advanced Magboots' slow you down in simulated-gravity environments much like the standard issue variety."
|
||||
reference = "BRMB"
|
||||
item = /obj/item/clothing/shoes/magboots/syndie
|
||||
cost = 3
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/device_tools/magboots/advance
|
||||
name = "Advanced Blood-Red Magboots"
|
||||
desc = "Reverse-engineered magboots that appear to be based on an advanced model, as they have a lighter magnetic pull. Property of Gorlex Marauders."
|
||||
reference = "ABRMB"
|
||||
item = /obj/item/clothing/shoes/magboots/syndie/advance
|
||||
cost = 3
|
||||
excludefrom = list()
|
||||
cost = 2
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/device_tools/powersink
|
||||
|
||||
@@ -45,13 +45,7 @@
|
||||
loc.handle_atom_del(src)
|
||||
for(var/atom/movable/AM in contents)
|
||||
qdel(AM)
|
||||
var/turf/un_opaque
|
||||
if(opacity && isturf(loc))
|
||||
un_opaque = loc
|
||||
|
||||
loc = null
|
||||
if(un_opaque)
|
||||
un_opaque.recalc_atom_opacity()
|
||||
if(pulledby)
|
||||
if(pulledby.pulling == src)
|
||||
pulledby.pulling = null
|
||||
@@ -120,7 +114,7 @@
|
||||
return
|
||||
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move.
|
||||
pulledby.stop_pulling()
|
||||
|
||||
|
||||
/atom/movable/proc/can_be_pulled(user, grab_state, force)
|
||||
if(src == user || !isturf(loc))
|
||||
return FALSE
|
||||
|
||||
@@ -45,8 +45,6 @@
|
||||
var/obj/structure/blob/factory/factory = null
|
||||
var/list/human_overlays = list()
|
||||
var/is_zombie = 0
|
||||
pressure_resistance = 100 //100 kPa difference required to push
|
||||
throw_pressure_limit = 120 //120 kPa difference required to throw
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
|
||||
..()
|
||||
@@ -97,8 +95,6 @@
|
||||
human_overlays = H.overlays
|
||||
update_icons()
|
||||
H.forceMove(src)
|
||||
pressure_resistance = 20 //5 kPa difference required to push lowered
|
||||
throw_pressure_limit = 30 //15 kPa difference required to throw lowered
|
||||
visible_message("<span class='warning'>The corpse of [H.name] suddenly rises!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
|
||||
@@ -176,8 +172,7 @@
|
||||
force_threshold = 10
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
|
||||
pressure_resistance = 100 //100 kPa difference required to push
|
||||
throw_pressure_limit = 120 //120 kPa difference required to throw
|
||||
pressure_resistance = 50
|
||||
see_in_dark = 8
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
|
||||
|
||||
@@ -456,7 +456,7 @@
|
||||
/datum/spellbook_entry/item/armor/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book)
|
||||
. = ..()
|
||||
if(.)
|
||||
new /obj/item/clothing/shoes/magboots/wizard(get_turf(user))
|
||||
new /obj/item/clothing/shoes/sandal(get_turf(user)) //In case they've lost them.
|
||||
new /obj/item/clothing/gloves/color/purple(get_turf(user)) // To complete the outfit
|
||||
|
||||
/datum/spellbook_entry/item/mjolnir
|
||||
|
||||
@@ -119,8 +119,6 @@
|
||||
|
||||
var/report_danger_level = TRUE
|
||||
|
||||
var/automatic_emergency = TRUE //Does the alarm automaticly respond to an emergency condition
|
||||
|
||||
/obj/machinery/alarm/monitor
|
||||
report_danger_level = FALSE
|
||||
|
||||
@@ -315,12 +313,6 @@
|
||||
|
||||
if(old_danger_level!=danger_level)
|
||||
apply_danger_level()
|
||||
if(automatic_emergency && mode == AALARM_MODE_SCRUBBING && danger_level == ATMOS_ALARM_DANGER)
|
||||
if(pressure_dangerlevel == ATMOS_ALARM_DANGER)
|
||||
mode = AALARM_MODE_OFF
|
||||
if(temperature_dangerlevel == ATMOS_ALARM_DANGER && cur_tlv.max2 <= environment.temperature)
|
||||
mode = AALARM_MODE_PANIC
|
||||
apply_mode()
|
||||
|
||||
if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05)
|
||||
mode = AALARM_MODE_SCRUBBING
|
||||
|
||||
@@ -71,7 +71,7 @@ var/datum/canister_icons/canister_icon_container = new()
|
||||
|
||||
var/can_label = 1
|
||||
var/filled = 0.5
|
||||
pressure_resistance = 7*ONE_ATMOSPHERE
|
||||
pressure_resistance = 7 * ONE_ATMOSPHERE
|
||||
var/temperature_resistance = 1000 + T0C
|
||||
volume = 1000
|
||||
use_power = NO_POWER_USE
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
volume = 750
|
||||
|
||||
var/minrate = 0//probably useless, but whatever
|
||||
var/maxrate = 10 * ONE_ATMOSPHERE / 4
|
||||
var/maxrate = 10 * ONE_ATMOSPHERE
|
||||
|
||||
/obj/machinery/portable_atmospherics/scrubber/emp_act(severity)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
|
||||
@@ -492,7 +492,7 @@
|
||||
playsound(src.loc, 'sound/weapons/genhit.ogg', 100, 1)
|
||||
var/turf/space/T
|
||||
for(T in orange(1, src))
|
||||
T.ChangeTurf(/turf/simulated/floor/plating/)
|
||||
T.ChangeTurf(/turf/simulated/floor/plating)
|
||||
else
|
||||
atom_say("Something slams into the floor around [src] - luckily, it didn't get through!")
|
||||
playsound(src.loc, 'sound/effects/bang.ogg', 20, 1)
|
||||
|
||||
@@ -96,7 +96,7 @@ Class Procs:
|
||||
/obj/machinery
|
||||
name = "machinery"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
pressure_resistance = 10
|
||||
pressure_resistance = 15
|
||||
layer = BELOW_OBJ_LAYER
|
||||
var/stat = 0
|
||||
var/emagged = 0
|
||||
|
||||
@@ -84,7 +84,6 @@
|
||||
name = "security suit storage unit"
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/security
|
||||
mask_type = /obj/item/clothing/mask/gas/sechailer
|
||||
magboots_type = /obj/item/clothing/shoes/magboots
|
||||
req_access = list(access_security)
|
||||
|
||||
/obj/machinery/suit_storage_unit/security/secure
|
||||
@@ -130,7 +129,6 @@
|
||||
/obj/machinery/suit_storage_unit/cmo/secure/sec_storage
|
||||
name = "medical suit storage unit"
|
||||
mask_type = /obj/item/clothing/mask/gas
|
||||
magboots_type = /obj/item/clothing/shoes/magboots
|
||||
|
||||
/obj/machinery/suit_storage_unit/clown
|
||||
name = "clown suit storage unit"
|
||||
@@ -154,7 +152,6 @@
|
||||
name = "syndicate suit storage unit"
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
mask_type = /obj/item/clothing/mask/gas/syndicate
|
||||
magboots_type = /obj/item/clothing/shoes/magboots/syndie
|
||||
storage_type = /obj/item/tank/jetpack/oxygen/harness
|
||||
req_access = list(access_syndicate)
|
||||
safeties = FALSE //in a syndicate base, everything can be used as a murder weapon at a moment's notice.
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
/turf/simulated/floor/plating/asteroid/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill)
|
||||
for(var/turf/simulated/floor/plating/asteroid/M in range(1, drill.chassis))
|
||||
if((get_dir(drill.chassis, M) & drill.chassis.dir) && !M.dug)
|
||||
M.gets_dug()
|
||||
M.getDug()
|
||||
drill.log_message("Drilled through [src]")
|
||||
drill.move_ores()
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
else
|
||||
atoms = orange(3, target)
|
||||
for(var/atom/movable/A in atoms)
|
||||
if(A.anchored) continue
|
||||
if(A.anchored || A.move_resist == INFINITY) continue
|
||||
spawn(0)
|
||||
var/iter = 5-get_dist(A,target)
|
||||
for(var/i=0 to iter)
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
/obj/effect/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
|
||||
return FALSE
|
||||
|
||||
/obj/effect/experience_pressure_difference()
|
||||
return
|
||||
|
||||
/obj/effect/decal
|
||||
plane = FLOOR_PLANE
|
||||
var/no_scoop = FALSE //if it has this, don't let it be scooped up
|
||||
|
||||
@@ -25,7 +25,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
var/w_class = WEIGHT_CLASS_NORMAL
|
||||
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
|
||||
pass_flags = PASSTABLE
|
||||
pressure_resistance = 3
|
||||
pressure_resistance = 4
|
||||
// causeerrorheresoifixthis
|
||||
var/obj/item/master = null
|
||||
|
||||
|
||||
@@ -41,160 +41,160 @@
|
||||
/obj/item/lightreplacer
|
||||
|
||||
name = "light replacer"
|
||||
desc = "A device to automatically replace lights. Refill with working lightbulbs."
|
||||
desc = "A device to automatically replace lights. Refill with broken or working light bulbs, or sheets of glass."
|
||||
|
||||
icon = 'icons/obj/janitor.dmi'
|
||||
icon_state = "lightreplacer0"
|
||||
item_state = "electronic"
|
||||
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
origin_tech = "magnets=3;engineering=4"
|
||||
force = 8
|
||||
|
||||
var/emagged = FALSE
|
||||
var/max_uses = 20
|
||||
var/uses = 0
|
||||
var/shards = 0
|
||||
var/recycle = 3
|
||||
var/emagged = 0
|
||||
var/failmsg = ""
|
||||
var/uses = 10
|
||||
// How much to increase per each glass?
|
||||
var/increment = 5
|
||||
// How much to take from the glass?
|
||||
var/decrement = 1
|
||||
var/charge = 1
|
||||
|
||||
/obj/item/lightreplacer/New()
|
||||
uses = max_uses / 2
|
||||
failmsg = "The [name]'s refill light blinks red."
|
||||
..()
|
||||
// Eating used bulbs gives us bulb shards
|
||||
var/bulb_shards = 0
|
||||
// when we get this many shards, we get a free bulb.
|
||||
var/shards_required = 4
|
||||
|
||||
|
||||
/obj/item/lightreplacer/examine(mob/user)
|
||||
if(..(user, 2))
|
||||
to_chat(user, "It has [uses] lights and [shards] shards remaining.")
|
||||
..()
|
||||
to_chat(user, status_string())
|
||||
|
||||
/obj/item/lightreplacer/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/stack/sheet/glass))
|
||||
var/obj/item/stack/sheet/glass/G = W
|
||||
if(G.amount - decrement >= 0 && uses < max_uses)
|
||||
var/remaining = max(G.amount - decrement, 0)
|
||||
if(!remaining && !(G.amount - decrement) == 0)
|
||||
to_chat(user, "There isn't enough glass.")
|
||||
return
|
||||
G.amount = remaining
|
||||
if(!G.amount)
|
||||
user.drop_item()
|
||||
qdel(G)
|
||||
AddUses(increment)
|
||||
to_chat(user, "You insert a piece of glass into the [src.name]. You have [uses] lights remaining.")
|
||||
/obj/item/lightreplacer/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/stack/sheet/glass))
|
||||
var/obj/item/stack/sheet/glass/G = I
|
||||
if(uses >= max_uses)
|
||||
to_chat(user, "<span class='warning'>[src] is full.</span>")
|
||||
return
|
||||
else if(G.use(decrement))
|
||||
AddUses(increment)
|
||||
to_chat(user, "<span class='notice'>You insert a piece of glass into [src]. You have [uses] light\s remaining.</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need one sheet of glass to replace lights!</span>")
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/light))
|
||||
var/obj/item/light/L = W
|
||||
if(istype(I, /obj/item/shard))
|
||||
if(uses >= max_uses)
|
||||
to_chat(user, "<span class='warning'>[src] is full.</span>")
|
||||
return
|
||||
if(!user.unEquip(I))
|
||||
return
|
||||
AddUses(round(increment * 0.75))
|
||||
to_chat(user, "<span class='notice'>You insert a shard of glass into [src]. You have [uses] light\s remaining.</span>")
|
||||
qdel(I)
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/light))
|
||||
var/obj/item/light/L = I
|
||||
if(L.status == 0) // LIGHT OKAY
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "[L] is stuck to your hand!")
|
||||
return
|
||||
if(uses < max_uses)
|
||||
if(!user.unEquip(L))
|
||||
return
|
||||
AddUses(1)
|
||||
to_chat(user, "You insert the [L.name] into the [src.name]. You have [uses] lights remaining.")
|
||||
user.drop_item()
|
||||
qdel(L)
|
||||
return
|
||||
else if(L.status == 2 || L.status == 3)
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "[L] is stuck to your hand!")
|
||||
return
|
||||
else
|
||||
AddShards(1)
|
||||
to_chat(user, "You insert [L] into [src]. You have [shards] shards remaining.")
|
||||
user.drop_item()
|
||||
qdel(L)
|
||||
else
|
||||
if(!user.unEquip(L))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You insert [L] into [src].</span>")
|
||||
AddShards(1, user)
|
||||
qdel(L)
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/storage))
|
||||
var/obj/item/storage/S = W
|
||||
var/found_lightbulbs = 0
|
||||
if(istype(I, /obj/item/storage))
|
||||
var/obj/item/storage/S = I
|
||||
var/found_lightbulbs = FALSE
|
||||
var/replaced_something = TRUE
|
||||
|
||||
for(var/obj/item/I in S.contents)
|
||||
if(istype(I,/obj/item/light))
|
||||
var/obj/item/light/L = I
|
||||
found_lightbulbs = 1
|
||||
for(var/obj/item/IT in S.contents)
|
||||
if(istype(IT, /obj/item/light))
|
||||
var/obj/item/light/L = IT
|
||||
found_lightbulbs = TRUE
|
||||
if(uses >= max_uses)
|
||||
to_chat(user, "<span class='warning'>[src] is full!</span>")
|
||||
break
|
||||
if(L.status == 0)
|
||||
if(L.status == LIGHT_OK)
|
||||
replaced_something = TRUE
|
||||
AddUses(1)
|
||||
qdel(L)
|
||||
else if(L.status == 2 || L.status == 3)
|
||||
AddShards(1)
|
||||
|
||||
else if(L.status == LIGHT_BROKEN || L.status == LIGHT_BURNED)
|
||||
replaced_something = TRUE
|
||||
AddShards(1, user)
|
||||
qdel(L)
|
||||
to_chat(user, "<span class='notice'>You fill [src] with lights from [S].")
|
||||
|
||||
if(!found_lightbulbs)
|
||||
to_chat(user, "<span class='warning'>[S] contains no bulbs.</span>")
|
||||
return
|
||||
|
||||
if(!replaced_something && uses == max_uses)
|
||||
to_chat(user, "<span class='warning'>[src] is full!</span>")
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You fill [src] with lights from [S]. " + status_string() + "</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/lightreplacer/emag_act(user as mob)
|
||||
if(!emagged)
|
||||
Emag()
|
||||
|
||||
/obj/item/lightreplacer/attack_self(mob/user)
|
||||
/* // This would probably be a bit OP. If you want it though, uncomment the code.
|
||||
if(isrobot(user))
|
||||
var/mob/living/silicon/robot/R = user
|
||||
if(R.emagged)
|
||||
src.Emag()
|
||||
to_chat(usr, "You shortcircuit the [src].")
|
||||
return
|
||||
*/
|
||||
to_chat(usr, "It has [uses] lights remaining.")
|
||||
for(var/obj/machinery/light/target in user.loc)
|
||||
ReplaceLight(target, user)
|
||||
to_chat(user, status_string())
|
||||
|
||||
/obj/item/lightreplacer/update_icon()
|
||||
icon_state = "lightreplacer[emagged]"
|
||||
|
||||
/obj/item/lightreplacer/proc/status_string()
|
||||
return "It has [uses] light\s remaining (plus [bulb_shards] fragment\s)."
|
||||
|
||||
/obj/item/lightreplacer/proc/Use(var/mob/user)
|
||||
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
|
||||
/obj/item/lightreplacer/proc/Use(mob/user)
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
|
||||
AddUses(-1)
|
||||
return 1
|
||||
|
||||
// Negative numbers will subtract
|
||||
/obj/item/lightreplacer/proc/AddUses(var/amount = 1)
|
||||
uses = min(max(uses + amount, 0), max_uses)
|
||||
/obj/item/lightreplacer/proc/AddUses(amount = 1)
|
||||
uses = Clamp(uses + amount, 0, max_uses)
|
||||
|
||||
/obj/item/lightreplacer/proc/AddShards(amount = 1)
|
||||
shards += amount
|
||||
var/recycled_lights = round(shards / recycle)
|
||||
if(recycled_lights > 0)
|
||||
AddUses(recycled_lights)
|
||||
shards = shards % recycle
|
||||
return recycled_lights
|
||||
/obj/item/lightreplacer/proc/AddShards(amount = 1, user)
|
||||
bulb_shards += amount
|
||||
var/new_bulbs = round(bulb_shards / shards_required)
|
||||
if(new_bulbs > 0)
|
||||
AddUses(new_bulbs)
|
||||
bulb_shards = bulb_shards % shards_required
|
||||
if(new_bulbs != 0)
|
||||
to_chat(user, "<span class='notice'>[src] has fabricated a new bulb from the broken glass it has stored. It now has [uses] uses.</span>")
|
||||
playsound(loc, 'sound/machines/ding.ogg', 50, TRUE)
|
||||
return new_bulbs
|
||||
|
||||
/obj/item/lightreplacer/proc/Charge(var/mob/user)
|
||||
charge += 1
|
||||
if(charge > 7)
|
||||
if(charge > 3)
|
||||
AddUses(1)
|
||||
charge = 1
|
||||
|
||||
/obj/item/lightreplacer/proc/ReplaceLight(var/obj/machinery/light/target, var/mob/living/U)
|
||||
|
||||
/obj/item/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U)
|
||||
if(target.status != LIGHT_OK)
|
||||
if(CanUse(U))
|
||||
if(!Use(U)) return
|
||||
to_chat(U, "<span class='notice'>You replace the [target.fitting] with the [src].</span>")
|
||||
if(!Use(U))
|
||||
return
|
||||
to_chat(U, "<span class='notice'>You replace [target.fitting] with [src].</span>")
|
||||
|
||||
if(target.status != LIGHT_EMPTY)
|
||||
|
||||
var/obj/item/light/L1 = new target.light_type(target.loc)
|
||||
L1.status = target.status
|
||||
L1.rigged = target.rigged
|
||||
L1.brightness_range = target.brightness_range
|
||||
L1.brightness_power = target.brightness_power
|
||||
L1.brightness_color = target.brightness_color
|
||||
L1.switchcount = target.switchcount
|
||||
target.switchcount = 0
|
||||
L1.update()
|
||||
|
||||
AddShards(1, U)
|
||||
target.status = LIGHT_EMPTY
|
||||
target.update()
|
||||
|
||||
@@ -215,37 +215,54 @@
|
||||
return
|
||||
|
||||
else
|
||||
to_chat(U, failmsg)
|
||||
to_chat(U, "[src]'s refill light blinks red.")
|
||||
return
|
||||
else
|
||||
to_chat(U, "There is a working [target.fitting] already inserted.")
|
||||
to_chat(U, "<span class='warning'>There is a working [target.fitting] already inserted!</span>")
|
||||
return
|
||||
|
||||
/obj/item/lightreplacer/proc/Emag()
|
||||
emagged = !emagged
|
||||
playsound(src.loc, "sparks", 100, 1)
|
||||
playsound(loc, "sparks", 100, TRUE)
|
||||
if(emagged)
|
||||
name = "Shortcircuited [initial(name)]"
|
||||
name = "shortcircuited [initial(name)]"
|
||||
else
|
||||
name = initial(name)
|
||||
update_icon()
|
||||
|
||||
//Can you use it?
|
||||
/obj/item/lightreplacer/proc/CanUse(mob/living/user)
|
||||
add_fingerprint(user)
|
||||
if(uses > 0)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/lightreplacer/afterattack(atom/T, mob/U, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(!isturf(T))
|
||||
return
|
||||
|
||||
var/used = FALSE
|
||||
for(var/atom/A in T)
|
||||
if(!CanUse(U))
|
||||
break
|
||||
used = TRUE
|
||||
if(istype(A, /obj/machinery/light))
|
||||
ReplaceLight(A, U)
|
||||
|
||||
if(!used)
|
||||
to_chat(U, "[src]'s refill light blinks red.")
|
||||
|
||||
/obj/item/lightreplacer/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J)
|
||||
J.put_in_cart(src, user)
|
||||
J.myreplacer = src
|
||||
J.update_icon()
|
||||
|
||||
/obj/item/lightreplacer/proc/CanUse(var/mob/living/user)
|
||||
src.add_fingerprint(user)
|
||||
//Not sure what else to check for. Maybe if clumsy?
|
||||
if(uses > 0)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
/obj/item/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
|
||||
return
|
||||
|
||||
#undef LIGHT_OK
|
||||
#undef LIGHT_EMPTY
|
||||
#undef LIGHT_BROKEN
|
||||
#undef LIGHT_BURNED
|
||||
#undef LIGHT_BURNED
|
||||
@@ -9,7 +9,7 @@
|
||||
throw_range = 1
|
||||
throw_speed = 1
|
||||
layer = 4
|
||||
pressure_resistance = 1
|
||||
pressure_resistance = 2
|
||||
|
||||
/obj/item/documents/nanotrasen
|
||||
desc = "\"Top Secret\" Nanotrasen documents printed on special copy-protected paper. It is filled with complex diagrams and lists of names, dates and coordinates."
|
||||
|
||||
@@ -166,7 +166,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
|
||||
new /datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1),
|
||||
new /datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20),
|
||||
new /datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 10), \
|
||||
new /datum/stack_recipe("wooden chair", /obj/structure/chair/wood/normal, 3, time = 10, one_per_turf = 1, on_floor = 1),
|
||||
new /datum/stack_recipe("wooden chair", /obj/structure/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1),
|
||||
new /datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1),
|
||||
new /datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 50, one_per_turf = 1, on_floor = 1),
|
||||
new /datum/stack_recipe("dresser", /obj/structure/dresser, 30, time = 50, one_per_turf = 1, on_floor = 1),
|
||||
|
||||
@@ -7,32 +7,35 @@
|
||||
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
|
||||
flags = CONDUCT
|
||||
force = 3.0
|
||||
throwforce = 10.0
|
||||
force = 3
|
||||
throwforce = 10
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
materials = list(MAT_METAL=500)
|
||||
origin_tech = "combat=1;plasmatech=2;engineering=2"
|
||||
var/status = 0
|
||||
var/lit = 0 //on or off
|
||||
var/operating = 0//cooldown
|
||||
var/turf/previousturf = null
|
||||
var/status = FALSE
|
||||
var/lit = FALSE //on or off
|
||||
var/operating = FALSE//cooldown
|
||||
var/obj/item/weldingtool/weldtool = null
|
||||
var/obj/item/assembly/igniter/igniter = null
|
||||
var/obj/item/tank/plasma/ptank = null
|
||||
var/warned_admins = FALSE //for the message_admins() when lit
|
||||
//variables for prebuilt flamethrowers
|
||||
var/create_full = FALSE
|
||||
var/create_with_tank = FALSE
|
||||
var/igniter_type = /obj/item/assembly/igniter
|
||||
|
||||
|
||||
/obj/item/flamethrower/Destroy()
|
||||
QDEL_NULL(weldtool)
|
||||
QDEL_NULL(igniter)
|
||||
QDEL_NULL(ptank)
|
||||
previousturf = null
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/flamethrower/process()
|
||||
if(!lit)
|
||||
if(!lit || !igniter)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return null
|
||||
var/turf/location = loc
|
||||
@@ -41,133 +44,139 @@
|
||||
if(M.l_hand == src || M.r_hand == src)
|
||||
location = M.loc
|
||||
if(isturf(location)) //start a fire if possible
|
||||
location.hotspot_expose(700, 2)
|
||||
return
|
||||
igniter.flamethrower_process(location)
|
||||
|
||||
|
||||
/obj/item/flamethrower/update_icon()
|
||||
overlays.Cut()
|
||||
cut_overlays()
|
||||
if(igniter)
|
||||
overlays += "+igniter[status]"
|
||||
add_overlay("+igniter[status]")
|
||||
if(ptank)
|
||||
overlays += "+ptank"
|
||||
add_overlay("+ptank")
|
||||
if(lit)
|
||||
overlays += "+lit"
|
||||
add_overlay("+lit")
|
||||
item_state = "flamethrower_1"
|
||||
else
|
||||
item_state = "flamethrower_0"
|
||||
return
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.update_inv_l_hand()
|
||||
M.update_inv_r_hand()
|
||||
|
||||
/obj/item/flamethrower/afterattack(atom/target, mob/user, flag)
|
||||
if(flag) return // too close
|
||||
// Make sure our user is still holding us
|
||||
if(user && user.is_in_active_hand(src))
|
||||
. = ..()
|
||||
if(flag)
|
||||
return // too close
|
||||
if(user && user.get_active_hand() == src) // Make sure our user is still holding us
|
||||
var/turf/target_turf = get_turf(target)
|
||||
if(target_turf)
|
||||
var/turflist = getline(user, target_turf)
|
||||
add_attack_logs(user, target, "Flamethrowered at [target.x],[target.y],[target.z]")
|
||||
flame_turf(turflist)
|
||||
|
||||
/obj/item/flamethrower/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(user.stat || user.restrained() || user.lying) return
|
||||
if(iswrench(W) && !status)//Taking this apart
|
||||
/obj/item/flamethrower/attackby(obj/item/I, mob/user, params)
|
||||
if(iswrench(I) && !status)//Taking this apart
|
||||
var/turf/T = get_turf(src)
|
||||
if(weldtool)
|
||||
weldtool.loc = T
|
||||
weldtool.forceMove(T)
|
||||
weldtool = null
|
||||
if(igniter)
|
||||
igniter.loc = T
|
||||
igniter.forceMove(T)
|
||||
igniter = null
|
||||
if(ptank)
|
||||
ptank.loc = T
|
||||
ptank.forceMove(T)
|
||||
ptank = null
|
||||
new /obj/item/stack/rods(T)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(isscrewdriver(W) && igniter && !lit)
|
||||
else if(isscrewdriver(I) && igniter && !lit)
|
||||
status = !status
|
||||
to_chat(user, "<span class='notice'>[igniter] is now [status ? "secured" : "unsecured"]!</span>")
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(isigniter(W))
|
||||
var/obj/item/assembly/igniter/I = W
|
||||
if(I.secured) return
|
||||
if(igniter) return
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
igniter = I
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(istype(W,/obj/item/tank/plasma))
|
||||
if(ptank)
|
||||
to_chat(user, "<span class='notice'>There appears to already be a plasma tank loaded in [src]!</span>")
|
||||
else if(isigniter(I))
|
||||
var/obj/item/assembly/igniter/IG = I
|
||||
if(IG.secured)
|
||||
return
|
||||
user.drop_item()
|
||||
ptank = W
|
||||
W.loc = src
|
||||
if(igniter)
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
IG.forceMove(src)
|
||||
igniter = IG
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/analyzer) && ptank)
|
||||
else if(istype(I, /obj/item/tank/plasma))
|
||||
if(ptank)
|
||||
if(user.drop_item())
|
||||
I.forceMove(src)
|
||||
ptank.forceMove(get_turf(src))
|
||||
ptank = I
|
||||
to_chat(user, "<span class='notice'>You swap the plasma tank in [src]!</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
I.forceMove(src)
|
||||
ptank = I
|
||||
update_icon()
|
||||
return
|
||||
|
||||
else if(istype(I, /obj/item/analyzer) && ptank)
|
||||
atmosanalyzer_scan(ptank.air_contents, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/flamethrower/attack_self(mob/user)
|
||||
toggle_igniter(user)
|
||||
|
||||
/obj/item/flamethrower/AltClick(mob/user)
|
||||
if(ptank && isliving(user) && user.Adjacent(src))
|
||||
user.put_in_hands(ptank)
|
||||
ptank = null
|
||||
to_chat(user, "<span class='notice'>You remove the plasma tank from [src]!</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/flamethrower/examine(mob/user)
|
||||
..()
|
||||
return
|
||||
if(ptank)
|
||||
to_chat(user, "<span class='notice'>[src] has \a [ptank] attached. Alt-click to remove it.</span>")
|
||||
|
||||
|
||||
/obj/item/flamethrower/attack_self(mob/user as mob)
|
||||
if(user.stat || user.restrained() || user.lying) return
|
||||
user.set_machine(src)
|
||||
/obj/item/flamethrower/proc/toggle_igniter(mob/user)
|
||||
if(!ptank)
|
||||
to_chat(user, "<span class='notice'>Attach a plasma tank first!</span>")
|
||||
return
|
||||
var/dat = text("<TT><B>Flamethrower (<A HREF='?src=[UID()];light=1'>[lit ? "<font color='red'>Lit</font>" : "Unlit"]</a>)</B><BR>\n Tank Pressure: [ptank.air_contents.return_pressure()]<BR>\n<A HREF='?src=[UID()];remove=1'>Remove plasmatank</A> - <A HREF='?src=[UID()];close=1'>Close</A></TT>")
|
||||
user << browse(dat, "window=flamethrower;size=600x300")
|
||||
onclose(user, "flamethrower")
|
||||
return
|
||||
|
||||
|
||||
/obj/item/flamethrower/Topic(href,href_list[])
|
||||
if(href_list["close"])
|
||||
usr.unset_machine()
|
||||
usr << browse(null, "window=flamethrower")
|
||||
if(!status)
|
||||
to_chat(user, "<span class='notice'>Secure the igniter first!</span>")
|
||||
return
|
||||
if(usr.stat || usr.restrained() || usr.lying) return
|
||||
usr.set_machine(src)
|
||||
if(href_list["light"])
|
||||
if(!ptank) return
|
||||
if(!status) return
|
||||
lit = !lit
|
||||
if(lit)
|
||||
START_PROCESSING(SSobj, src)
|
||||
if(href_list["remove"])
|
||||
if(!ptank) return
|
||||
usr.put_in_hands(ptank)
|
||||
ptank = null
|
||||
lit = 0
|
||||
usr.unset_machine()
|
||||
usr << browse(null, "window=flamethrower")
|
||||
for(var/mob/M in viewers(1, loc))
|
||||
if((M.client && M.machine == src))
|
||||
attack_self(M)
|
||||
to_chat(user, "<span class='notice'>You [lit ? "extinguish" : "ignite"] [src]!</span>")
|
||||
lit = !lit
|
||||
if(lit)
|
||||
START_PROCESSING(SSobj, src)
|
||||
if(!warned_admins)
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] has lit a flamethrower.")
|
||||
warned_admins = TRUE
|
||||
else
|
||||
STOP_PROCESSING(SSobj,src)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/flamethrower/CheckParts(list/parts_list)
|
||||
..()
|
||||
weldtool = locate(/obj/item/weldingtool) in contents
|
||||
igniter = locate(/obj/item/assembly/igniter) in contents
|
||||
weldtool.status = 0
|
||||
igniter.secured = 0
|
||||
status = 1
|
||||
weldtool.status = FALSE
|
||||
igniter.secured = FALSE
|
||||
status = TRUE
|
||||
update_icon()
|
||||
|
||||
//Called from turf.dm turf/dblclick
|
||||
/obj/item/flamethrower/proc/flame_turf(turflist)
|
||||
if(!lit || operating) return
|
||||
operating = 1
|
||||
if(!lit || operating)
|
||||
return
|
||||
operating = TRUE
|
||||
var/turf/previousturf = get_turf(src)
|
||||
for(var/turf/simulated/T in turflist)
|
||||
if(!T.air)
|
||||
@@ -176,48 +185,62 @@
|
||||
continue //so we don't burn the tile we be standin on
|
||||
if(!T.CanAtmosPass(previousturf))
|
||||
break
|
||||
ignite_turf(T)
|
||||
if(igniter)
|
||||
igniter.ignite_turf(src, T)
|
||||
else
|
||||
default_ignite(T)
|
||||
sleep(1)
|
||||
previousturf = T
|
||||
operating = 0
|
||||
operating = FALSE
|
||||
for(var/mob/M in viewers(1, loc))
|
||||
if((M.client && M.machine == src))
|
||||
attack_self(M)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/flamethrower/proc/ignite_turf(turf/target, release_amount = 0.05)
|
||||
/obj/item/flamethrower/proc/default_ignite(turf/target, release_amount = 0.05)
|
||||
//TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this...
|
||||
//Transfer 5% of current tank air contents to turf
|
||||
var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount)
|
||||
air_transfer.toxins = air_transfer.toxins // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE
|
||||
if(air_transfer.toxins)
|
||||
air_transfer.toxins = air_transfer.toxins * 5
|
||||
target.assume_air(air_transfer)
|
||||
//Burn it based on transfered gas
|
||||
target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500) // -- More of my "how do I shot fire?" dickery. -- TLE
|
||||
target.hotspot_expose((ptank.air_contents.temperature*2) + 380, 500)
|
||||
//location.hotspot_expose(1000,500,1)
|
||||
SSair.add_to_active(target, 0)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/flamethrower/full/New(var/loc)
|
||||
..()
|
||||
if(!weldtool)
|
||||
weldtool = new /obj/item/weldingtool(src)
|
||||
weldtool.status = 0
|
||||
if(!igniter)
|
||||
igniter = new /obj/item/assembly/igniter(src)
|
||||
igniter.secured = 0
|
||||
status = 1
|
||||
update_icon()
|
||||
/obj/item/flamethrower/Initialize(mapload)
|
||||
. = ..()
|
||||
if(create_full)
|
||||
if(!weldtool)
|
||||
weldtool = new /obj/item/weldingtool(src)
|
||||
weldtool.status = FALSE
|
||||
if(!igniter)
|
||||
igniter = new igniter_type(src)
|
||||
igniter.secured = FALSE
|
||||
status = TRUE
|
||||
if(create_with_tank)
|
||||
ptank = new /obj/item/tank/plasma/full(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/flamethrower/full/tank/New(var/loc)
|
||||
..()
|
||||
ptank = new /obj/item/tank/plasma/full(src)
|
||||
update_icon()
|
||||
/obj/item/flamethrower/full
|
||||
create_full = TRUE
|
||||
|
||||
/obj/item/flamethrower/full/tank
|
||||
create_with_tank = TRUE
|
||||
|
||||
/obj/item/flamethrower/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(ptank && damage && attack_type == PROJECTILE_ATTACK && prob(15))
|
||||
owner.visible_message("<span class='danger'>[attack_text] hits the fueltank on [owner]'s [src], rupturing it! What a shot!</span>")
|
||||
var/turf/target_turf = get_turf(owner)
|
||||
log_game("A projectile ([hitby]) detonated a flamethrower tank held by [key_name(owner)] at [COORD(target_turf)]")
|
||||
ignite_turf(target_turf, 100)
|
||||
qdel(ptank)
|
||||
igniter.ignite_turf(src,target_turf, release_amount = 100)
|
||||
QDEL_NULL(ptank)
|
||||
return 1 //It hit the flamethrower, not them
|
||||
|
||||
/obj/item/assembly/igniter/proc/flamethrower_process(turf/simulated/location)
|
||||
location.hotspot_expose(700, 2)
|
||||
|
||||
/obj/item/assembly/igniter/proc/ignite_turf(obj/item/flamethrower/F, turf/simulated/location, release_amount = 0.05)
|
||||
F.default_ignite(location, release_amount)
|
||||
@@ -1,27 +1,30 @@
|
||||
// Glass shards
|
||||
|
||||
/obj/item/shard
|
||||
name = "glass shard"
|
||||
name = "shard"
|
||||
desc = "A nasty looking shard of glass."
|
||||
icon = 'icons/obj/shards.dmi'
|
||||
icon_state = "large"
|
||||
sharp = TRUE
|
||||
desc = "Could probably be used as ... a throwing weapon?"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
force = 5
|
||||
throwforce = 10
|
||||
item_state = "shard-glass"
|
||||
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
materials = list(MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
|
||||
attack_verb = list("stabbed", "slashed", "sliced", "cut")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0)
|
||||
sharp = TRUE
|
||||
var/cooldown = 0
|
||||
var/icon_prefix
|
||||
var/obj/item/stack/sheet/welded_type = /obj/item/stack/sheet/glass
|
||||
|
||||
/obj/item/shard/suicide_act(mob/user)
|
||||
to_chat(viewers(user), pick("<span class='danger'>[user] is slitting [user.p_their()] wrists with [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>",
|
||||
"<span class='danger'>[user] is slitting [user.p_their()] throat with [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>"))
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/shard/New()
|
||||
..()
|
||||
/obj/item/shard/Initialize(mapload)
|
||||
. = ..()
|
||||
icon_state = pick("large", "medium", "small")
|
||||
switch(icon_state)
|
||||
if("small")
|
||||
@@ -33,6 +36,8 @@
|
||||
if("large")
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
if(icon_prefix)
|
||||
icon_state = "[icon_prefix][icon_state]"
|
||||
|
||||
/obj/item/shard/afterattack(atom/movable/AM, mob/user, proximity)
|
||||
if(!proximity || !(src in user))
|
||||
@@ -48,15 +53,17 @@
|
||||
if(affecting.is_robotic())
|
||||
return
|
||||
to_chat(H, "<span class='warning'>[src] cuts into your hand!</span>")
|
||||
if(affecting.receive_damage(force*0.5))
|
||||
if(affecting.receive_damage(force * 0.5))
|
||||
H.UpdateDamageIcon()
|
||||
|
||||
/obj/item/shard/attackby(obj/item/I, mob/user, params)
|
||||
if(iswelder(I))
|
||||
var/obj/item/weldingtool/WT = I
|
||||
if(WT.remove_fuel(0, user))
|
||||
var/obj/item/stack/sheet/glass/NG = new (user.loc)
|
||||
for(var/obj/item/stack/sheet/glass/G in user.loc)
|
||||
var/obj/item/stack/sheet/NG = new welded_type(user.loc)
|
||||
for(var/obj/item/stack/sheet/G in user.loc)
|
||||
if(!istype(G, welded_type))
|
||||
continue
|
||||
if(G == NG)
|
||||
continue
|
||||
if(G.amount >= G.max_amount)
|
||||
@@ -64,64 +71,48 @@
|
||||
G.attackby(NG, user)
|
||||
to_chat(user, "<span class='notice'>You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
return
|
||||
if(istype(I, /obj/item/lightreplacer))
|
||||
I.attackby(src, user)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/shard/Crossed(AM as mob|obj, oldloc)
|
||||
if(isliving(AM))
|
||||
var/mob/living/M = AM
|
||||
if(M.incorporeal_move || M.flying || M.throwing)//you are incorporal or flying or being thrown ..no shard stepping!
|
||||
/obj/item/shard/Crossed(mob/living/L, oldloc)
|
||||
if(istype(L) && has_gravity(loc))
|
||||
if(L.incorporeal_move || L.flying)
|
||||
return
|
||||
to_chat(M, "<span class='danger'>You step on \the [src]!</span>")
|
||||
playsound(loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
playsound(loc, 'sound/effects/glass_step.ogg', 50, TRUE)
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
|
||||
if(!affecting)
|
||||
return
|
||||
if(affecting.is_robotic())
|
||||
return
|
||||
var/feetCover = (H.wear_suit && H.wear_suit.body_parts_covered & FEET) || (H.w_uniform && H.w_uniform.body_parts_covered & FEET)
|
||||
if(H.shoes || feetCover || H.buckled)
|
||||
return
|
||||
if(affecting.receive_damage(force, 0))
|
||||
H.UpdateDamageIcon()
|
||||
|
||||
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
|
||||
var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
|
||||
if(!affecting)
|
||||
return
|
||||
if(affecting.is_robotic())
|
||||
return
|
||||
H.Weaken(3)
|
||||
if(affecting.receive_damage(5, 0))
|
||||
H.UpdateDamageIcon()
|
||||
..()
|
||||
if(cooldown < world.time - 10) //cooldown to avoid message spam.
|
||||
if(!H.incapacitated(ignore_restraints = TRUE))
|
||||
H.visible_message("<span class='danger'>[H] steps on [src]!</span>", \
|
||||
"<span class='userdanger'>You step on [src]!</span>")
|
||||
else
|
||||
H.visible_message("<span class='danger'>[H] slides on [src]!</span>", \
|
||||
"<span class='userdanger'>You slide on [src]!</span>")
|
||||
|
||||
cooldown = world.time
|
||||
H.Weaken(3)
|
||||
return ..()
|
||||
|
||||
/obj/item/shard/plasma
|
||||
name = "plasma shard"
|
||||
desc = "A shard of plasma glass. Considerably tougher then normal glass shards. Apparently not tough enough to be a window."
|
||||
force = 8
|
||||
throwforce = 15
|
||||
force = 6
|
||||
throwforce = 11
|
||||
icon_state = "plasmalarge"
|
||||
sharp = TRUE
|
||||
|
||||
/obj/item/shard/plasma/New()
|
||||
..()
|
||||
icon_state = pick("plasmalarge", "plasmamedium", "plasmasmall")
|
||||
switch(icon_state)
|
||||
if("plasmasmall")
|
||||
pixel_x = rand(-12, 12)
|
||||
pixel_y = rand(-12, 12)
|
||||
if("plasmamedium")
|
||||
pixel_x = rand(-8, 8)
|
||||
pixel_y = rand(-8, 8)
|
||||
if("plasmalarge")
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
|
||||
/obj/item/shard/plasma/attackby(obj/item/W, mob/user, params)
|
||||
if(iswelder(W))
|
||||
var/obj/item/weldingtool/WT = W
|
||||
if(WT.remove_fuel(0, user))
|
||||
var/obj/item/stack/sheet/plasmaglass/NG = new (user.loc)
|
||||
for(var/obj/item/stack/sheet/plasmaglass/G in user.loc)
|
||||
if(G == NG)
|
||||
continue
|
||||
if(G.amount >= G.max_amount)
|
||||
continue
|
||||
G.attackby(NG, user, params)
|
||||
to_chat(usr, "You add the newly-formed plasma glass to the stack. It now contains [NG.amount] sheets.")
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
|
||||
icon_prefix = "plasma"
|
||||
welded_type = /obj/item/stack/sheet/plasmaglass
|
||||
@@ -8,7 +8,7 @@
|
||||
slot_flags = SLOT_BACK
|
||||
hitsound = 'sound/weapons/smash.ogg'
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
pressure_resistance = ONE_ATMOSPHERE*5
|
||||
pressure_resistance = ONE_ATMOSPHERE * 5
|
||||
force = 5.0
|
||||
throwforce = 10.0
|
||||
throw_speed = 1
|
||||
|
||||
@@ -278,22 +278,22 @@
|
||||
if(Adj)
|
||||
return //Safety check so you don't blast yourself trying to refill your tank
|
||||
var/datum/reagents/R = reagents
|
||||
if(R.total_volume < 50)
|
||||
to_chat(user, "You need at least 50 units of water to use the nanofrost launcher!")
|
||||
if(R.total_volume < 100)
|
||||
to_chat(user, "You need at least 100 units of water to use the nanofrost launcher!")
|
||||
return
|
||||
if(nanofrost_cooldown)
|
||||
to_chat(user, "Nanofrost launcher is still recharging")
|
||||
return
|
||||
nanofrost_cooldown = 1
|
||||
R.remove_any(50)
|
||||
R.remove_any(100)
|
||||
var/obj/effect/nanofrost_container/A = new /obj/effect/nanofrost_container(get_turf(src))
|
||||
log_game("[key_name(user)] used Nanofrost at [get_area(user)] ([user.x], [user.y], [user.z]).")
|
||||
playsound(src,'sound/items/syringeproj.ogg',40,1)
|
||||
for(var/a=0, a<5, a++)
|
||||
step_towards(A, target)
|
||||
sleep(1)
|
||||
sleep(2)
|
||||
A.Smoke()
|
||||
spawn(50)
|
||||
spawn(100)
|
||||
if(src)
|
||||
nanofrost_cooldown = 0
|
||||
return
|
||||
|
||||
@@ -337,14 +337,23 @@
|
||||
sharp = TRUE
|
||||
no_spin_thrown = TRUE
|
||||
var/obj/item/grenade/explosive = null
|
||||
var/icon_prefix = "spearglass"
|
||||
|
||||
/obj/item/twohanded/spear/update_icon()
|
||||
if(explosive)
|
||||
icon_state = "spearbomb[wielded]"
|
||||
else
|
||||
icon_state = "spearglass[wielded]"
|
||||
icon_state = "[icon_prefix][wielded]"
|
||||
|
||||
/obj/item/twohanded/spear/CheckParts(list/parts_list)
|
||||
var/obj/item/shard/tip = locate() in parts_list
|
||||
if(istype(tip, /obj/item/shard/plasma))
|
||||
force_wielded = 19
|
||||
force_unwielded = 11
|
||||
throwforce = 21
|
||||
icon_prefix = "spearplasma"
|
||||
update_icon()
|
||||
qdel(tip)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
@@ -370,9 +379,7 @@
|
||||
force_wielded = 20 //I have no idea how to balance
|
||||
throwforce = 22
|
||||
armour_penetration = 15 //Enhanced armor piercing
|
||||
|
||||
/obj/item/twohanded/spear/bonespear/update_icon()
|
||||
icon_state = "bone_spear[wielded]"
|
||||
icon_prefix = "bone_spear"
|
||||
|
||||
//GREY TIDE
|
||||
/obj/item/twohanded/spear/grey_tide
|
||||
|
||||
@@ -105,7 +105,12 @@
|
||||
..()
|
||||
if(istype(I, /obj/item/shard))
|
||||
var/obj/item/twohanded/spear/S = new /obj/item/twohanded/spear
|
||||
|
||||
if(istype(I, /obj/item/shard/plasma))
|
||||
S.force_wielded = 19
|
||||
S.force_unwielded = 11
|
||||
S.throwforce = 21
|
||||
S.icon_prefix = "spearplasma"
|
||||
S.update_icon()
|
||||
if(!remove_item_from_storage(user))
|
||||
user.unEquip(src)
|
||||
user.unEquip(I)
|
||||
|
||||
@@ -272,7 +272,6 @@
|
||||
new /obj/item/sensor_device(src)
|
||||
new /obj/item/key/ambulance(src)
|
||||
new /obj/item/pinpointer/crew(src)
|
||||
new /obj/item/clothing/shoes/magboots(src)
|
||||
new /obj/item/handheld_defibrillator(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/reagents
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
new /obj/item/clothing/mask/gas/syndicate(src)
|
||||
new /obj/item/clothing/suit/space/hardsuit/syndi(src)
|
||||
new /obj/item/tank/jetpack/oxygen/harness(src)
|
||||
new /obj/item/clothing/shoes/magboots/syndie(src)
|
||||
|
||||
/obj/structure/closet/syndicate/nuclear
|
||||
desc = "It's a storage unit for a Syndicate boarding party."
|
||||
|
||||
@@ -133,6 +133,9 @@
|
||||
|
||||
// Chair types
|
||||
/obj/structure/chair/wood
|
||||
name = "wooden chair"
|
||||
desc = "Old is never too old to not be in fashion."
|
||||
icon_state = "wooden_chair"
|
||||
burn_state = FLAMMABLE
|
||||
burntime = 20
|
||||
buildstackamount = 3
|
||||
@@ -142,15 +145,8 @@
|
||||
/obj/structure/chair/wood/narsie_act()
|
||||
return
|
||||
|
||||
/obj/structure/chair/wood/normal
|
||||
icon_state = "wooden_chair"
|
||||
name = "wooden chair"
|
||||
desc = "Old is never too old to not be in fashion."
|
||||
|
||||
/obj/structure/chair/wood/wings
|
||||
icon_state = "wooden_chair_wings"
|
||||
name = "wooden chair"
|
||||
desc = "Old is never too old to not be in fashion."
|
||||
item_chair = /obj/item/chair/wood/wings
|
||||
|
||||
/obj/structure/chair/comfy
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
|
||||
/**********************Asteroid**************************/
|
||||
|
||||
/turf/simulated/floor/plating/asteroid
|
||||
gender = PLURAL
|
||||
name = "asteroid sand"
|
||||
baseturf = /turf/simulated/floor/plating/asteroid
|
||||
icon_state = "asteroid"
|
||||
@@ -8,17 +10,32 @@
|
||||
footstep_sounds = list()
|
||||
var/environment_type = "asteroid"
|
||||
var/turf_type = /turf/simulated/floor/plating/asteroid //Because caves do whacky shit to revert to normal
|
||||
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug
|
||||
var/sand_type = /obj/item/stack/ore/glass
|
||||
var/floor_variance = 20 //probability floor has a different icon state
|
||||
var/obj/item/stack/digResult = /obj/item/stack/ore/glass/basalt
|
||||
var/dug
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/New()
|
||||
/turf/simulated/floor/plating/asteroid/Initialize(mapload)
|
||||
var/proper_name = name
|
||||
..()
|
||||
. = ..()
|
||||
name = proper_name
|
||||
if(prob(floor_variance))
|
||||
icon_state = "[environment_type][rand(0,12)]"
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/proc/getDug()
|
||||
new digResult(src, 5)
|
||||
icon_plating = "[environment_type]_dug"
|
||||
icon_state = "[environment_type]_dug"
|
||||
dug = TRUE
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/proc/can_dig(mob/user)
|
||||
if(!dug)
|
||||
return TRUE
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>Looks like someone has dug here already.</span>")
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
|
||||
return
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/burn_tile()
|
||||
return
|
||||
|
||||
@@ -31,46 +48,50 @@
|
||||
/turf/simulated/floor/plating/asteroid/remove_plating()
|
||||
return
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/ex_act(severity, target)
|
||||
/turf/simulated/floor/plating/asteroid/ex_act(severity)
|
||||
if(!can_dig())
|
||||
return
|
||||
switch(severity)
|
||||
if(3)
|
||||
return
|
||||
if(2)
|
||||
if(prob(20))
|
||||
gets_dug()
|
||||
getDug()
|
||||
if(1)
|
||||
gets_dug()
|
||||
getDug()
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/attackby(obj/item/W, mob/user, params)
|
||||
/turf/simulated/floor/plating/asteroid/attackby(obj/item/I, mob/user, params)
|
||||
//note that this proc does not call ..()
|
||||
if(!W || !user)
|
||||
return 0
|
||||
if(!I|| !user)
|
||||
return FALSE
|
||||
|
||||
if((istype(I, /obj/item/shovel) || istype(I, /obj/item/pickaxe)))
|
||||
if(!can_dig(user))
|
||||
return TRUE
|
||||
|
||||
if((istype(W, /obj/item/shovel) || istype(W, /obj/item/pickaxe)))
|
||||
var/turf/T = get_turf(user)
|
||||
if(!istype(T))
|
||||
return
|
||||
|
||||
if(dug)
|
||||
to_chat(user, "<span class='warning'>This area has already been dug!</span>")
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You start digging...</span>")
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
if(do_after(user, 20 * W.toolspeed, target = src))
|
||||
to_chat(user, "<span class='notice'>You dig a hole.</span>")
|
||||
gets_dug()
|
||||
return
|
||||
|
||||
else if(istype(W,/obj/item/storage/bag/ore))
|
||||
var/obj/item/storage/bag/ore/S = W
|
||||
playsound(src, I.usesound, 50, TRUE)
|
||||
if(do_after(user, 40 * I.toolspeed, target = src))
|
||||
if(!can_dig(user))
|
||||
return TRUE
|
||||
to_chat(user, "<span class='notice'>You dig a hole.</span>")
|
||||
getDug()
|
||||
return TRUE
|
||||
|
||||
else if(istype(I, /obj/item/storage/bag/ore))
|
||||
var/obj/item/storage/bag/ore/S = I
|
||||
if(S.collection_mode == 1)
|
||||
for(var/obj/item/stack/ore/O in src.contents)
|
||||
O.attackby(W,user)
|
||||
for(var/obj/item/stack/ore/O in contents)
|
||||
O.attackby(I, user)
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/stack/tile))
|
||||
var/obj/item/stack/tile/Z = W
|
||||
else if(istype(I, /obj/item/stack/tile))
|
||||
var/obj/item/stack/tile/Z = I
|
||||
if(!Z.use(1))
|
||||
return
|
||||
if(istype(Z, /obj/item/stack/tile/plasteel)) // Turn asteroid floors into plating by default
|
||||
@@ -79,25 +100,14 @@
|
||||
ChangeTurf(Z.turf_type, keep_icon = FALSE)
|
||||
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/proc/gets_dug()
|
||||
if(dug)
|
||||
return
|
||||
for(var/i in 1 to 5)
|
||||
new sand_type(src)
|
||||
dug = 1
|
||||
icon_plating = "[environment_type]_dug"
|
||||
icon_state = "[environment_type]_dug"
|
||||
slowdown = 0
|
||||
return
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/basalt
|
||||
name = "volcanic floor"
|
||||
baseturf = /turf/simulated/floor/plating/asteroid/basalt
|
||||
icon_state = "basalt"
|
||||
icon_plating = "basalt"
|
||||
environment_type = "basalt"
|
||||
sand_type = /obj/item/stack/ore/glass/basalt
|
||||
floor_variance = 15
|
||||
digResult = /obj/item/stack/ore/glass/basalt
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/basalt/lava //lava underneath
|
||||
baseturf = /turf/simulated/floor/plating/lava/smooth
|
||||
@@ -107,10 +117,14 @@
|
||||
oxygen = 0
|
||||
nitrogen = 0
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/basalt/Initialize()
|
||||
/turf/simulated/floor/plating/asteroid/basalt/Initialize(mapload)
|
||||
. = ..()
|
||||
set_basalt_light(src)
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/basalt/getDug()
|
||||
set_light(0)
|
||||
return ..()
|
||||
|
||||
/proc/set_basalt_light(turf/simulated/floor/B)
|
||||
switch(B.icon_state)
|
||||
if("basalt1", "basalt2", "basalt3")
|
||||
@@ -118,11 +132,6 @@
|
||||
if("basalt5", "basalt9")
|
||||
B.set_light(1.4, 0.6, LIGHT_COLOR_LAVA) //barely anything!
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/basalt/gets_dug()
|
||||
if(!dug)
|
||||
set_light(0)
|
||||
..()
|
||||
|
||||
///////Surface. The surface is warm, but survivable without a suit. Internals are required. The floors break to chasms, which drop you into the underground.
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
|
||||
@@ -138,9 +147,10 @@
|
||||
nitrogen = 0
|
||||
turf_type = /turf/simulated/floor/plating/asteroid/airless
|
||||
|
||||
#define SPAWN_MEGAFAUNA "MEGAFAUNA"
|
||||
#define SPAWN_MEGAFAUNA "bluh bluh huge boss"
|
||||
#define SPAWN_BUBBLEGUM 6
|
||||
|
||||
GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = 6))
|
||||
GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM))
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/airless/cave
|
||||
var/length = 100
|
||||
@@ -169,22 +179,20 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/airless/cave/volcanic/has_data //subtype for producing a tunnel with given data
|
||||
has_data = TRUE
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/airless/cave/New()
|
||||
/turf/simulated/floor/plating/asteroid/airless/cave/Initialize(mapload)
|
||||
if (!mob_spawn_list)
|
||||
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 1, /mob/living/simple_animal/hostile/asteroid/goliath = 5, /mob/living/simple_animal/hostile/asteroid/basilisk = 4, /mob/living/simple_animal/hostile/asteroid/hivelord = 3)
|
||||
if (!megafauna_spawn_list)
|
||||
megafauna_spawn_list = GLOB.megafauna_spawn_list
|
||||
if (!flora_spawn_list)
|
||||
flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2)
|
||||
|
||||
. = ..()
|
||||
if(!has_data)
|
||||
produce_tunnel_from_data()
|
||||
..()
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/airless/cave/proc/get_cave_data(set_length, exclude_dir = -1)
|
||||
// If set_length (arg1) isn't defined, get a random length; otherwise assign our length to the length arg.
|
||||
@@ -234,7 +242,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
|
||||
if(istype(tunnel))
|
||||
// Small chance to have forks in our tunnel; otherwise dig our tunnel.
|
||||
if(i > 3 && prob(20))
|
||||
var/turf/simulated/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type,FALSE,TRUE)
|
||||
var/turf/simulated/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type, FALSE, TRUE)
|
||||
C.going_backwards = FALSE
|
||||
C.produce_tunnel_from_data(rand(10, 15), dir)
|
||||
else
|
||||
@@ -260,19 +268,22 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
|
||||
SpawnFlora(T)
|
||||
|
||||
SpawnMonster(T)
|
||||
T.ChangeTurf(turf_type,FALSE,FALSE,TRUE)
|
||||
T.ChangeTurf(turf_type, FALSE, FALSE, TRUE)
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T)
|
||||
if(prob(30))
|
||||
if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored))
|
||||
if(istype(loc, /area/mine/explored) || !istype(loc, /area/lavaland/surface/outdoors/unexplored))
|
||||
return
|
||||
var/randumb = pickweight(mob_spawn_list)
|
||||
while(randumb == SPAWN_MEGAFAUNA)
|
||||
var/maybe_boss = pickweight(megafauna_spawn_list)
|
||||
if(megafauna_spawn_list[maybe_boss])
|
||||
randumb = maybe_boss
|
||||
if(ispath(maybe_boss, /mob/living/simple_animal/hostile/megafauna/bubblegum)) //there can be only one bubblegum, so don't waste spawns on it
|
||||
megafauna_spawn_list.Remove(maybe_boss)
|
||||
if(istype(loc, /area/lavaland/surface/outdoors/unexplored/danger)) //this is danger. it's boss time.
|
||||
var/maybe_boss = pickweight(megafauna_spawn_list)
|
||||
if(megafauna_spawn_list[maybe_boss])
|
||||
randumb = maybe_boss
|
||||
if(ispath(maybe_boss, /mob/living/simple_animal/hostile/megafauna/bubblegum)) //there can be only one bubblegum, so don't waste spawns on it
|
||||
megafauna_spawn_list.Remove(maybe_boss)
|
||||
else //this is not danger, don't spawn a boss, spawn something else
|
||||
randumb = pickweight(mob_spawn_list)
|
||||
|
||||
for(var/mob/living/simple_animal/hostile/H in urange(12,T)) //prevents mob clumps
|
||||
if((ispath(randumb, /mob/living/simple_animal/hostile/megafauna) || ismegafauna(H)) && get_dist(src, H) <= 7)
|
||||
@@ -286,6 +297,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
|
||||
return
|
||||
|
||||
#undef SPAWN_MEGAFAUNA
|
||||
#undef SPAWN_BUBBLEGUM
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnFlora(turf/T)
|
||||
if(prob(12))
|
||||
@@ -300,6 +312,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
|
||||
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/snow
|
||||
gender = PLURAL
|
||||
name = "snow"
|
||||
desc = "Looks cold."
|
||||
icon = 'icons/turf/snow.dmi'
|
||||
@@ -309,7 +322,18 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
|
||||
temperature = 180
|
||||
slowdown = 2
|
||||
environment_type = "snow"
|
||||
sand_type = /obj/item/stack/sheet/mineral/snow
|
||||
planetary_atmos = TRUE
|
||||
burnt_states = list("snow_dug")
|
||||
digResult = /obj/item/stack/sheet/mineral/snow
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/snow/burn_tile()
|
||||
if(!burnt)
|
||||
visible_message("<span class='danger'>[src] melts away!.</span>")
|
||||
slowdown = 0
|
||||
burnt = TRUE
|
||||
icon_state = "snow_dug"
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/turf/simulated/floor/plating/asteroid/snow/airless
|
||||
temperature = TCMB
|
||||
@@ -322,4 +346,5 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
|
||||
/turf/simulated/floor/plating/asteroid/snow/atmosphere
|
||||
oxygen = 22
|
||||
nitrogen = 82
|
||||
temperature = 180
|
||||
temperature = 180
|
||||
planetary_atmos = FALSE
|
||||
@@ -48,7 +48,7 @@
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
|
||||
/turf/simulated/floor/indestructible/necropolis/Initialize()
|
||||
/turf/simulated/floor/indestructible/necropolis/Initialize(mapload)
|
||||
. = ..()
|
||||
if(prob(12))
|
||||
icon_state = "necro[rand(2,3)]"
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
icon_state = "rock"
|
||||
var/smooth_icon = 'icons/turf/smoothrocks.dmi'
|
||||
smooth = SMOOTH_MORE | SMOOTH_BORDER
|
||||
canSmoothWith
|
||||
canSmoothWith = null
|
||||
baseturf = /turf/simulated/floor/plating/asteroid/airless
|
||||
temperature = 2.7
|
||||
opacity = 1
|
||||
density = 1
|
||||
blocks_air = 1
|
||||
density = TRUE
|
||||
blocks_air = TRUE
|
||||
layer = EDGED_TURF_LAYER
|
||||
temperature = TCMB
|
||||
var/environment_type = "asteroid"
|
||||
@@ -21,21 +21,18 @@
|
||||
var/spread = 0 //will the seam spread?
|
||||
var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles
|
||||
var/last_act = 0
|
||||
var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner
|
||||
var/defer_change = FALSE
|
||||
var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner
|
||||
var/defer_change = 0
|
||||
|
||||
/turf/simulated/mineral/New()
|
||||
if (!canSmoothWith)
|
||||
/turf/simulated/mineral/Initialize(mapload)
|
||||
if(!canSmoothWith)
|
||||
canSmoothWith = list(/turf/simulated/mineral)
|
||||
var/matrix/M = new
|
||||
M.Translate(-4, -4)
|
||||
transform = M
|
||||
icon = smooth_icon
|
||||
|
||||
..()
|
||||
GLOB.mineral_turfs += src
|
||||
|
||||
if (mineralType && mineralAmt && spread && spreadChance)
|
||||
. = ..()
|
||||
if(mineralType && mineralAmt && spread && spreadChance)
|
||||
for(var/dir in cardinal)
|
||||
if(prob(spreadChance))
|
||||
var/turf/T = get_step(src, dir)
|
||||
@@ -56,37 +53,34 @@
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/turf/simulated/mineral/attackby(var/obj/item/pickaxe/P as obj, mob/user as mob, params)
|
||||
/turf/simulated/mineral/attackby(obj/item/I, mob/user, params)
|
||||
if(!user.IsAdvancedToolUser())
|
||||
to_chat(usr, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/pickaxe))
|
||||
if(istype(I, /obj/item/pickaxe))
|
||||
var/obj/item/pickaxe/P = I
|
||||
var/turf/T = user.loc
|
||||
if(!isturf(T))
|
||||
return
|
||||
|
||||
if(last_act + (40 * P.toolspeed) > world.time) // Prevents message spam
|
||||
return
|
||||
|
||||
last_act = world.time
|
||||
to_chat(user, "<span class='notice'>You start picking...</span>")
|
||||
P.playDigSound()
|
||||
|
||||
if(do_after(user, 40 * P.toolspeed, target = src))
|
||||
if(istype(src, /turf/simulated/mineral)) //sanity check against turf being deleted during digspeed delay
|
||||
if(ismineralturf(src)) //sanity check against turf being deleted during digspeed delay
|
||||
to_chat(user, "<span class='notice'>You finish cutting into the rock.</span>")
|
||||
P.update_icon()
|
||||
gets_drilled(user)
|
||||
feedback_add_details("pick_used_mining","[P.name]")
|
||||
else
|
||||
return attack_hand(user)
|
||||
|
||||
/turf/simulated/mineral/proc/gets_drilled()
|
||||
if(mineralType && (mineralAmt > 0) && (mineralAmt < 11))
|
||||
var/i
|
||||
for(i=0; i < mineralAmt; i++)
|
||||
new mineralType(src)
|
||||
if(mineralType && (mineralAmt > 0))
|
||||
new mineralType(src, mineralAmt)
|
||||
feedback_add_details("ore_mined","[mineralType]|[mineralAmt]")
|
||||
for(var/obj/effect/temp_visual/mining_overlay/M in src)
|
||||
qdel(M)
|
||||
@@ -94,26 +88,20 @@
|
||||
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
|
||||
playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction
|
||||
|
||||
if(rand(1, 750) == 1)
|
||||
visible_message("<span class='notice'>An old dusty crate was buried within!</span>")
|
||||
new /obj/structure/closet/crate/secure/loot(src)
|
||||
|
||||
return
|
||||
|
||||
/turf/simulated/mineral/attack_animal(mob/living/simple_animal/user as mob)
|
||||
if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS))
|
||||
gets_drilled()
|
||||
..()
|
||||
|
||||
/turf/simulated/mineral/attack_alien(var/mob/living/carbon/alien/M)
|
||||
/turf/simulated/mineral/attack_alien(mob/living/carbon/alien/M)
|
||||
to_chat(M, "<span class='notice'>You start digging into the rock...</span>")
|
||||
playsound(src, 'sound/effects/break_stone.ogg', 50, 1)
|
||||
playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE)
|
||||
if(do_after(M, 40, target = src))
|
||||
to_chat(M, "<span class='notice'>You tunnel into the rock.</span>")
|
||||
gets_drilled()
|
||||
gets_drilled(M)
|
||||
|
||||
/turf/simulated/mineral/Bumped(AM as mob|obj)
|
||||
. = ..()
|
||||
/turf/simulated/mineral/Bumped(atom/movable/AM)
|
||||
..()
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if((istype(H.l_hand,/obj/item/pickaxe)) && (!H.hand))
|
||||
@@ -124,15 +112,15 @@
|
||||
|
||||
else if(isrobot(AM))
|
||||
var/mob/living/silicon/robot/R = AM
|
||||
if(istype(R.module_active,/obj/item/pickaxe))
|
||||
attackby(R.module_active,R)
|
||||
if(istype(R.module_active, /obj/item/pickaxe))
|
||||
attackby(R.module_active, R)
|
||||
|
||||
else if(ismecha(AM))
|
||||
var/obj/mecha/M = AM
|
||||
if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/drill))
|
||||
if(istype(M.selected, /obj/item/mecha_parts/mecha_equipment/drill))
|
||||
M.selected.action(src)
|
||||
|
||||
/turf/simulated/mineral/ex_act(severity, target)
|
||||
/turf/simulated/mineral/ex_act(severity)
|
||||
..()
|
||||
switch(severity)
|
||||
if(3)
|
||||
@@ -145,22 +133,23 @@
|
||||
gets_drilled(null, 1)
|
||||
|
||||
/turf/simulated/mineral/random
|
||||
var/mineralSpawnChanceList
|
||||
var/mineralSpawnChanceList = list(/turf/simulated/mineral/uranium = 5, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 10,
|
||||
/turf/simulated/mineral/silver = 12, /turf/simulated/mineral/plasma = 20, /turf/simulated/mineral/iron = 40, /turf/simulated/mineral/titanium = 11,
|
||||
/turf/simulated/mineral/gibtonite = 4, /turf/simulated/floor/plating/asteroid/airless/cave = 2, /turf/simulated/mineral/bscrystal = 1)
|
||||
//Currently, Adamantine won't spawn as it has no uses. -Durandan
|
||||
var/mineralChance = 13
|
||||
var/display_icon_state = "rock"
|
||||
|
||||
/turf/simulated/mineral/random/New()
|
||||
if (!mineralSpawnChanceList)
|
||||
mineralSpawnChanceList = list(
|
||||
/turf/simulated/mineral/uranium = 5, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 10,
|
||||
/turf/simulated/mineral/silver = 12, /turf/simulated/mineral/plasma = 20, /turf/simulated/mineral/iron = 40, /turf/simulated/mineral/titanium = 11,
|
||||
/turf/simulated/mineral/gibtonite = 4, /turf/simulated/floor/plating/asteroid/airless/cave = 2, /turf/simulated/mineral/bscrystal = 1)
|
||||
if (display_icon_state)
|
||||
/turf/simulated/mineral/random/Initialize(mapload)
|
||||
|
||||
mineralSpawnChanceList = typelist("mineralSpawnChanceList", mineralSpawnChanceList)
|
||||
|
||||
if(display_icon_state)
|
||||
icon_state = display_icon_state
|
||||
..()
|
||||
. = ..()
|
||||
if (prob(mineralChance))
|
||||
var/path = pickweight(mineralSpawnChanceList)
|
||||
var/turf/T = ChangeTurf(path,FALSE,TRUE)
|
||||
var/turf/T = ChangeTurf(path, FALSE, TRUE)
|
||||
|
||||
if(T && ismineralturf(T))
|
||||
var/turf/simulated/mineral/M = T
|
||||
@@ -191,7 +180,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
mineralSpawnChanceList = list(
|
||||
/turf/simulated/mineral/uranium/volcanic = 35, /turf/simulated/mineral/diamond/volcanic = 30, /turf/simulated/mineral/gold/volcanic = 45, /turf/simulated/mineral/titanium/volcanic = 45,
|
||||
@@ -212,7 +200,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
mineralChance = 10
|
||||
@@ -223,9 +210,9 @@
|
||||
|
||||
/turf/simulated/mineral/random/labormineral
|
||||
mineralSpawnChanceList = list(
|
||||
/turf/simulated/mineral/uranium = 2, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 3, /turf/simulated/mineral/titanium = 4,
|
||||
/turf/simulated/mineral/silver = 6, /turf/simulated/mineral/plasma = 15, /turf/simulated/mineral/iron = 80,
|
||||
/turf/simulated/mineral/gibtonite = 3)
|
||||
/turf/simulated/mineral/uranium = 3, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 8, /turf/simulated/mineral/titanium = 8,
|
||||
/turf/simulated/mineral/silver = 20, /turf/simulated/mineral/plasma = 30, /turf/simulated/mineral/iron = 95,
|
||||
/turf/simulated/mineral/gibtonite = 2)
|
||||
icon_state = "rock_labor"
|
||||
|
||||
/turf/simulated/mineral/random/labormineral/volcanic
|
||||
@@ -235,12 +222,11 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
mineralSpawnChanceList = list(
|
||||
/turf/simulated/mineral/uranium/volcanic = 2, /turf/simulated/mineral/diamond/volcanic = 1, /turf/simulated/mineral/gold/volcanic = 3, /turf/simulated/mineral/titanium/volcanic = 4,
|
||||
/turf/simulated/mineral/silver/volcanic = 6, /turf/simulated/mineral/plasma/volcanic = 15, /turf/simulated/mineral/iron/volcanic = 80,
|
||||
/turf/simulated/mineral/gibtonite/volcanic = 3)
|
||||
/turf/simulated/mineral/uranium/volcanic = 3, /turf/simulated/mineral/diamond/volcanic = 1, /turf/simulated/mineral/gold/volcanic = 8, /turf/simulated/mineral/titanium/volcanic = 8,
|
||||
/turf/simulated/mineral/silver/volcanic = 20, /turf/simulated/mineral/plasma/volcanic = 30, /turf/simulated/mineral/bscrystal/volcanic = 1, /turf/simulated/mineral/gibtonite/volcanic = 2,
|
||||
/turf/simulated/mineral/iron/volcanic = 95)
|
||||
|
||||
// Actual minerals
|
||||
/turf/simulated/mineral/iron
|
||||
@@ -256,7 +242,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
/turf/simulated/mineral/uranium
|
||||
@@ -272,7 +257,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
/turf/simulated/mineral/diamond
|
||||
@@ -288,7 +272,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
/turf/simulated/mineral/gold
|
||||
@@ -304,7 +287,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
/turf/simulated/mineral/silver
|
||||
@@ -320,7 +302,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
/turf/simulated/mineral/titanium
|
||||
@@ -336,7 +317,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
/turf/simulated/mineral/plasma
|
||||
@@ -352,7 +332,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
/turf/simulated/mineral/clown
|
||||
@@ -369,7 +348,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
/turf/simulated/mineral/mime
|
||||
@@ -385,7 +363,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
/turf/simulated/mineral/bscrystal
|
||||
@@ -402,7 +379,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
/turf/simulated/mineral/volcanic
|
||||
@@ -412,7 +388,6 @@
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
|
||||
/turf/simulated/mineral/volcanic/lava_land_surface
|
||||
environment_type = "basalt"
|
||||
@@ -420,6 +395,12 @@
|
||||
baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface
|
||||
defer_change = 1
|
||||
|
||||
//gibtonite state defines
|
||||
#define GIBTONITE_UNSTRUCK 0
|
||||
#define GIBTONITE_ACTIVE 1
|
||||
#define GIBTONITE_STABLE 2
|
||||
#define GIBTONITE_DETONATE 3
|
||||
|
||||
// Gibtonite
|
||||
/turf/simulated/mineral/gibtonite
|
||||
mineralAmt = 1
|
||||
@@ -427,39 +408,29 @@
|
||||
spread = 0
|
||||
scan_state = "rock_Gibtonite"
|
||||
var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it
|
||||
var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction
|
||||
var/stage = GIBTONITE_UNSTRUCK //How far into the lifecycle of gibtonite we are
|
||||
var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes
|
||||
var/activated_name = null
|
||||
var/activated_image = null
|
||||
var/mutable_appearance/activated_overlay
|
||||
|
||||
/turf/simulated/mineral/gibtonite/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
planetary_atmos = TRUE
|
||||
defer_change = 1
|
||||
|
||||
/turf/simulated/mineral/gibtonite/New()
|
||||
/turf/simulated/mineral/gibtonite/Initialize(mapload)
|
||||
det_time = rand(8,10) //So you don't know exactly when the hot potato will explode
|
||||
..()
|
||||
. = ..()
|
||||
|
||||
/turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) && stage == 1)
|
||||
user.visible_message("<span class='notice'>You use [I] to locate where to cut off the chain reaction and attempt to stop it...</span>")
|
||||
user.visible_message("<span class='notice'>[user] holds [I] to [src]...</span>", "<span class='notice'>You use [I] to locate where to cut off the chain reaction and attempt to stop it...</span>")
|
||||
defuse()
|
||||
..()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/turf/simulated/mineral/gibtonite/proc/explosive_reaction(var/mob/user = null, triggered_by_explosion = 0)
|
||||
if(stage == 0)
|
||||
var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = ON_EDGED_TURF_LAYER)
|
||||
add_overlay(I)
|
||||
activated_image = I
|
||||
/turf/simulated/mineral/gibtonite/proc/explosive_reaction(mob/user = null, triggered_by_explosion = 0)
|
||||
if(stage == GIBTONITE_UNSTRUCK)
|
||||
activated_overlay = mutable_appearance('icons/turf/smoothrocks.dmi', "rock_Gibtonite_active", ON_EDGED_TURF_LAYER)
|
||||
add_overlay(activated_overlay)
|
||||
name = "gibtonite deposit"
|
||||
desc = "An active gibtonite reserve. Run!"
|
||||
stage = 1
|
||||
stage = GIBTONITE_ACTIVE
|
||||
visible_message("<span class='danger'>There was gibtonite inside! It's going to explode!</span>")
|
||||
var/turf/bombturf = get_turf(src)
|
||||
var/area/A = get_area(bombturf)
|
||||
@@ -481,39 +452,39 @@
|
||||
|
||||
/turf/simulated/mineral/gibtonite/proc/countdown(notify_admins = 0)
|
||||
set waitfor = 0
|
||||
while(istype(src, /turf/simulated/mineral/gibtonite) && stage == 1 && det_time > 0 && mineralAmt >= 1)
|
||||
while(istype(src, /turf/simulated/mineral/gibtonite) && stage == GIBTONITE_ACTIVE && det_time > 0 && mineralAmt >= 1)
|
||||
det_time--
|
||||
sleep(5)
|
||||
if(istype(src, /turf/simulated/mineral/gibtonite))
|
||||
if(stage == 1 && det_time <= 0 && mineralAmt >= 1)
|
||||
if(stage == GIBTONITE_ACTIVE && det_time <= 0 && mineralAmt >= 1)
|
||||
var/turf/bombturf = get_turf(src)
|
||||
mineralAmt = 0
|
||||
stage = 3
|
||||
stage = GIBTONITE_DETONATE
|
||||
explosion(bombturf,1,3,5, adminlog = notify_admins)
|
||||
|
||||
/turf/simulated/mineral/gibtonite/proc/defuse()
|
||||
if(stage == 1)
|
||||
overlays -= activated_image
|
||||
var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = ON_EDGED_TURF_LAYER)
|
||||
add_overlay(I)
|
||||
if(stage == GIBTONITE_ACTIVE)
|
||||
cut_overlay(activated_overlay)
|
||||
activated_overlay.icon_state = "rock_Gibtonite_inactive"
|
||||
add_overlay(activated_overlay)
|
||||
desc = "An inactive gibtonite reserve. The ore can be extracted."
|
||||
stage = 2
|
||||
stage = GIBTONITE_STABLE
|
||||
if(det_time < 0)
|
||||
det_time = 0
|
||||
visible_message("<span class='notice'>The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!</span>")
|
||||
visible_message("<span class='notice'>The chain reaction was stopped! The gibtonite had [det_time] reactions left till the explosion!</span>")
|
||||
|
||||
/turf/simulated/mineral/gibtonite/gets_drilled(var/mob/user, triggered_by_explosion = 0)
|
||||
if(stage == 0 && mineralAmt >= 1) //Gibtonite deposit is activated
|
||||
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg',50,1)
|
||||
if(stage == GIBTONITE_UNSTRUCK && mineralAmt >= 1) //Gibtonite deposit is activated
|
||||
playsound(src,'sound/effects/hit_on_shattered_glass.ogg', 50, TRUE)
|
||||
explosive_reaction(user, triggered_by_explosion)
|
||||
return
|
||||
if(stage == 1 && mineralAmt >= 1) //Gibtonite deposit goes kaboom
|
||||
if(stage == GIBTONITE_ACTIVE && mineralAmt >= 1) //Gibtonite deposit goes kaboom
|
||||
var/turf/bombturf = get_turf(src)
|
||||
mineralAmt = 0
|
||||
stage = 3
|
||||
explosion(bombturf, 1, 2, 5, adminlog = 0)
|
||||
if(stage == 2) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
|
||||
var/obj/item/twohanded/required/gibtonite/G = new /obj/item/twohanded/required/gibtonite/(src)
|
||||
stage = GIBTONITE_DETONATE
|
||||
explosion(bombturf,1,2,5, adminlog = 0)
|
||||
if(stage == GIBTONITE_STABLE) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
|
||||
var/obj/item/twohanded/required/gibtonite/G = new(src)
|
||||
if(det_time <= 0)
|
||||
G.quality = 3
|
||||
G.icon_state = "Gibtonite ore 3"
|
||||
@@ -523,3 +494,18 @@
|
||||
|
||||
ChangeTurf(turf_type, defer_change)
|
||||
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
|
||||
|
||||
|
||||
/turf/simulated/mineral/gibtonite/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
|
||||
oxygen = 14
|
||||
nitrogen = 23
|
||||
temperature = 300
|
||||
defer_change = 1
|
||||
|
||||
#undef GIBTONITE_UNSTRUCK
|
||||
#undef GIBTONITE_ACTIVE
|
||||
#undef GIBTONITE_STABLE
|
||||
#undef GIBTONITE_DETONATE
|
||||
@@ -4,7 +4,7 @@
|
||||
#define RANDOM_LOWER_X 50
|
||||
#define RANDOM_LOWER_Y 50
|
||||
|
||||
/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/simulated/floor/plating/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors/unexplored, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y)
|
||||
/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/simulated/floor/plating/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y)
|
||||
var/list/river_nodes = list()
|
||||
var/num_spawned = 0
|
||||
var/list/possible_locs = block(locate(min_x, min_y, target_z), locate(max_x, max_y, target_z))
|
||||
|
||||
@@ -54,7 +54,7 @@ var/global/nologevent = 0
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////Panels
|
||||
|
||||
/datum/admins/proc/show_player_panel(var/mob/M in GLOB.mob_list)
|
||||
set category = "Admin"
|
||||
set category = null
|
||||
set name = "Show Player Panel"
|
||||
set desc="Edit player (respawn, ban, heal, etc)"
|
||||
|
||||
@@ -937,9 +937,9 @@ var/global/nologevent = 0
|
||||
message_admins("[key_name_admin(usr)] checked the AI laws")
|
||||
|
||||
/client/proc/update_mob_sprite(mob/living/carbon/human/H as mob)
|
||||
set category = "Admin"
|
||||
set name = "Update Mob Sprite"
|
||||
set desc = "Should fix any mob sprite update errors."
|
||||
set category = null
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
@@ -71,13 +71,12 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/alt_check,
|
||||
/client/proc/secrets,
|
||||
/client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */
|
||||
/client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */
|
||||
/client/proc/change_human_appearance_self, /* Allows the human-based mob itself to change its basic appearance */
|
||||
/client/proc/debug_variables,
|
||||
/client/proc/reset_all_tcs, /*resets all telecomms scripts*/
|
||||
/client/proc/toggle_mentor_chat,
|
||||
/client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/
|
||||
/client/proc/list_ssds,
|
||||
/client/proc/list_afks,
|
||||
/client/proc/list_ssds_afks,
|
||||
/client/proc/cmd_admin_headset_message,
|
||||
/client/proc/spawn_floor_cluwne,
|
||||
/client/proc/show_discord_duplicates, // This needs removing at some point, ingame discord linking got removed in #11359
|
||||
@@ -803,7 +802,7 @@ var/list/admin_verbs_ticket = list(
|
||||
/client/proc/change_human_appearance_admin(mob/living/carbon/human/H in GLOB.mob_list)
|
||||
set name = "C.M.A. - Admin"
|
||||
set desc = "Allows you to change the mob appearance"
|
||||
set category = "Admin"
|
||||
set category = null
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
@@ -829,7 +828,7 @@ var/list/admin_verbs_ticket = list(
|
||||
/client/proc/change_human_appearance_self(mob/living/carbon/human/H in GLOB.mob_list)
|
||||
set name = "C.M.A. - Self"
|
||||
set desc = "Allows the mob to change its appearance"
|
||||
set category = "Admin"
|
||||
set category = null
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
@@ -12,12 +12,12 @@
|
||||
|
||||
/client/proc/resolveAllAdminTickets()
|
||||
set name = "Resolve All Open Admin Tickets"
|
||||
set category = "Admin"
|
||||
set category = null
|
||||
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes")
|
||||
if(alert("Are you sure you want to resolve ALL open admin tickets?","Resolve all open admin tickets?","Yes","No") != "Yes")
|
||||
return
|
||||
|
||||
SStickets.resolveAllOpenTickets()
|
||||
|
||||
@@ -12,12 +12,12 @@
|
||||
|
||||
/client/proc/resolveAllMentorTickets()
|
||||
set name = "Resolve All Open Mentor Tickets"
|
||||
set category = "Admin"
|
||||
set category = null
|
||||
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes")
|
||||
if(alert("Are you sure you want to resolve ALL open mentor tickets?","Resolve all open mentor tickets?","Yes","No") != "Yes")
|
||||
return
|
||||
|
||||
SSmentor_tickets.resolveAllOpenTickets()
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
return
|
||||
var/ticketID = text2num(href_list["openmentorticket"])
|
||||
SSmentor_tickets.showDetailUI(usr, ticketID)
|
||||
|
||||
|
||||
if(href_list["stickyban"])
|
||||
stickyban(href_list["stickyban"],href_list)
|
||||
|
||||
@@ -169,14 +169,6 @@
|
||||
message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom IP and computer id fields replaced with the IP and computer id from the located mob")
|
||||
|
||||
DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid )
|
||||
if(BANTYPE_PERMA)
|
||||
add_note(banckey, "Permanently Banned - [banreason]", null, usr.ckey, 0)
|
||||
else if(BANTYPE_TEMP)
|
||||
add_note(banckey, "Banned for [banduration] minutes - [banreason]", null, usr.ckey, 0)
|
||||
else if(BANTYPE_JOB_PERMA)
|
||||
add_note(banckey, "Banned from [banjob] - [banreason]", null, usr.ckey, 0)
|
||||
else
|
||||
add_note(banckey, "[banreason]", null, usr.ckey, 0)
|
||||
|
||||
|
||||
else if(href_list["editrights"])
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
/client/proc/jumptoturf(var/turf/T in world)
|
||||
set name = "Jump to Turf"
|
||||
set category = "Admin"
|
||||
set category = null
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
@@ -191,7 +191,7 @@
|
||||
else
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
|
||||
to_chat(X, "<span class='boldnotice'>[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]</span>")
|
||||
|
||||
|
||||
//Check if the mob being PM'd has any open admin tickets.
|
||||
var/tickets = list()
|
||||
if(type == "Mentorhelp")
|
||||
@@ -205,10 +205,10 @@
|
||||
if(type == "Mentorhelp")
|
||||
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
|
||||
tickets = SSmentor_tickets.checkForTicket(src)
|
||||
else // Ahelp
|
||||
else // Ahelp
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
|
||||
tickets = SStickets.checkForTicket(src)
|
||||
|
||||
|
||||
if(tickets)
|
||||
for(var/datum/ticket/i in tickets)
|
||||
i.addResponse(src, msg)
|
||||
@@ -351,7 +351,7 @@
|
||||
var/client/C = pms[title].client || update_client(title)
|
||||
if(!C)
|
||||
return "[title] (Disconnected)"
|
||||
return "[key_name(C, FALSE)] ([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_SM(C.mob,"SM")]) ([admin_jump_link(C.mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>)"
|
||||
return "[key_name(C, FALSE)] ([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_TP(C.mob,"TP")]) ([ADMIN_SM(C.mob,"SM")]) ([admin_jump_link(C.mob)])"
|
||||
|
||||
/datum/pm_tracker/proc/update_client(title)
|
||||
var/client/C = GLOB.directory[ckey(title)]
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
var/global/list/frozen_mob_list = list()
|
||||
/client/proc/freeze(var/mob/living/M as mob in GLOB.mob_list)
|
||||
set category = "Admin"
|
||||
set name = "Freeze"
|
||||
set category = null
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
@@ -87,8 +87,8 @@ var/global/list/frozen_mob_list = list()
|
||||
//////////////////////////Freeze Mech
|
||||
|
||||
/client/proc/freezemecha(var/obj/mecha/O as obj in GLOB.mechas_list)
|
||||
set category = "Admin"
|
||||
set name = "Freeze Mech"
|
||||
set category = null
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
deity = SSticker.cultdat.entity_name
|
||||
|
||||
log_say("(PRAYER) [msg]", usr)
|
||||
msg = "<span class='notice'>[bicon(cross)]<b><font color=[font_color]>[prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]:</font> [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_SC(src,"SC")]) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
|
||||
msg = "<span class='notice'>[bicon(cross)]<b><font color=[font_color]>[prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]:</font> [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_TP(src,"TP")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) ([ADMIN_SC(src,"SC")]) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
|
||||
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(check_rights(R_EVENT,0,X.mob))
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
/proc/Centcomm_announce(var/text , var/mob/Sender)
|
||||
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
|
||||
msg = "<span class='boldnotice'><font color=orange>CENTCOMM: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")])):</span> [msg]"
|
||||
msg = "<span class='boldnotice'><font color=orange>CENTCOMM: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")])):</span> [msg]"
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(R_EVENT & X.holder.rights)
|
||||
to_chat(X, msg)
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
/proc/Syndicate_announce(var/text , var/mob/Sender)
|
||||
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
|
||||
msg = "<span class='boldnotice'><font color='#DC143C'>SYNDICATE: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_SYNDICATE_REPLY(Sender,"RPLY")]):</span> [msg]"
|
||||
msg = "<span class='boldnotice'><font color='#DC143C'>SYNDICATE: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_SYNDICATE_REPLY(Sender,"RPLY")]):</span> [msg]"
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(check_rights(R_EVENT,0,X.mob))
|
||||
to_chat(X, msg)
|
||||
@@ -59,7 +59,7 @@
|
||||
|
||||
/proc/HONK_announce(var/text , var/mob/Sender)
|
||||
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
|
||||
msg = "<span class='boldnotice'><font color=pink>HONK: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;HONKReply=[Sender.UID()]'>RPLY</A>):</span> [msg]"
|
||||
msg = "<span class='boldnotice'><font color=pink>HONK: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;HONKReply=[Sender.UID()]'>RPLY</A>):</span> [msg]"
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(R_EVENT & X.holder.rights)
|
||||
to_chat(X, msg)
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
/proc/ERT_Announce(var/text , var/mob/Sender, var/repeat_warning)
|
||||
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
|
||||
msg = "<span class='adminnotice'><b><font color=orange>ERT REQUEST: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;ErtReply=[Sender.UID()]'>RESPOND</A>):</b> [msg]</span>"
|
||||
msg = "<span class='adminnotice'><b><font color=orange>ERT REQUEST: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;ErtReply=[Sender.UID()]'>RESPOND</A>):</b> [msg]</span>"
|
||||
if(repeat_warning)
|
||||
msg += "<BR><span class='adminnotice'><b>WARNING: ERT request has gone 5 minutes with no reply!</b></span>"
|
||||
for(var/client/X in GLOB.admins)
|
||||
@@ -80,7 +80,7 @@
|
||||
/proc/Nuke_request(text , mob/Sender)
|
||||
var/nuke_code = get_nuke_code()
|
||||
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
|
||||
msg = "<span class='adminnotice'><b><font color=orange>NUKE CODE REQUEST: </font>[key_name(Sender)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")]):</b> [msg]</span>"
|
||||
msg = "<span class='adminnotice'><b><font color=orange>NUKE CODE REQUEST: </font>[key_name(Sender)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")]):</b> [msg]</span>"
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(check_rights(R_EVENT,0,X.mob))
|
||||
to_chat(X, msg)
|
||||
|
||||
@@ -776,8 +776,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/cmd_admin_check_contents(mob/living/M as mob in GLOB.mob_list)
|
||||
set category = "Admin"
|
||||
set name = "Check Contents"
|
||||
set category = null
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
@@ -957,21 +957,24 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
message_admins("[key_name_admin(usr)] reset NTTC scripts.")
|
||||
feedback_add_details("admin_verb","RAT2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/list_ssds()
|
||||
/client/proc/list_ssds_afks()
|
||||
set category = "Admin"
|
||||
set name = "List SSDs"
|
||||
set desc = "Lists SSD players"
|
||||
set name = "List SSDs and AFKs"
|
||||
set desc = "Lists SSD and AFK players"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/msg = "<html><head><title>SSD Report</title></head><body>"
|
||||
/* ======== SSD Section ========= */
|
||||
var/msg = "<html><head><title>SSD & AFK Report</title></head><body>"
|
||||
msg += "SSD Players:<BR><TABLE border='1'>"
|
||||
msg += "<TR><TD><B>Key</B></TD><TD><B>Real Name</B></TD><TD><B>Job</B></TD><TD><B>Mins SSD</B></TD><TD><B>Special Role</B></TD><TD><B>Area</B></TD><TD><B>PPN</B></TD><TD><B>Cryo</B></TD></TR>"
|
||||
var/mins_ssd
|
||||
var/job_string
|
||||
var/key_string
|
||||
var/role_string
|
||||
var/obj_count = 0
|
||||
var/obj_string = ""
|
||||
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
|
||||
if(!isLivingSSD(H))
|
||||
continue
|
||||
@@ -984,8 +987,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if(job_string in command_positions)
|
||||
job_string = "<U>" + job_string + "</U>"
|
||||
role_string = "-"
|
||||
var/obj_count = 0
|
||||
var/obj_string = ""
|
||||
if(H.mind)
|
||||
if(H.mind.special_role)
|
||||
role_string = "<U>[H.mind.special_role]</U>"
|
||||
@@ -1003,24 +1004,12 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
else
|
||||
msg += "<TD><A href='?_src_=holder;cryossd=[H.UID()]'>Cryo</A></TD>"
|
||||
msg += "</TR>"
|
||||
msg += "</TABLE></BODY></HTML>"
|
||||
src << browse(msg, "window=Player_ssd_check")
|
||||
msg += "</TABLE><br></BODY></HTML>"
|
||||
|
||||
/client/proc/list_afks()
|
||||
set category = "Admin"
|
||||
set name = "List AFKs"
|
||||
set desc = "Lists AFK players"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/msg = "<html><head><title>AFK Report</title></head><body>"
|
||||
/* ======== AFK Section ========= */
|
||||
msg += "AFK Players:<BR><TABLE border='1'>"
|
||||
msg += "<TR><TD><B>Key</B></TD><TD><B>Real Name</B></TD><TD><B>Job</B></TD><TD><B>Mins AFK</B></TD><TD><B>Special Role</B></TD><TD><B>Area</B></TD><TD><B>PPN</B></TD><TD><B>Cryo</B></TD></TR>"
|
||||
var/mins_afk
|
||||
var/job_string
|
||||
var/key_string
|
||||
var/role_string
|
||||
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
|
||||
if(H.client == null || H.stat == DEAD) // No clientless or dead
|
||||
continue
|
||||
@@ -1035,8 +1024,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if(job_string in command_positions)
|
||||
job_string = "<U>" + job_string + "</U>"
|
||||
role_string = "-"
|
||||
var/obj_count = 0
|
||||
var/obj_string = ""
|
||||
obj_count = 0
|
||||
obj_string = ""
|
||||
if(H.mind)
|
||||
if(H.mind.special_role)
|
||||
role_string = "<U>[H.mind.special_role]</U>"
|
||||
@@ -1055,7 +1044,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
msg += "<TD><A href='?_src_=holder;cryossd=[H.UID()];cryoafk=1'>Cryo</A></TD>"
|
||||
msg += "</TR>"
|
||||
msg += "</TABLE></BODY></HTML>"
|
||||
src << browse(msg, "window=Player_afk_check")
|
||||
src << browse(msg, "window=Player_ssd_afk_check;size=600x300")
|
||||
|
||||
/client/proc/toggle_ert_calling()
|
||||
set category = "Event"
|
||||
|
||||
@@ -95,3 +95,8 @@
|
||||
|
||||
// Has the client been varedited by an admin? [Inherits from datum now]
|
||||
// var/var_edited = FALSE
|
||||
|
||||
var/client_keysend_amount = 0
|
||||
var/next_keysend_reset = 0
|
||||
var/next_keysend_trip_reset = 0
|
||||
var/keysend_tripped = FALSE
|
||||
@@ -3,7 +3,46 @@
|
||||
/client/verb/keyDown(_key as text)
|
||||
set instant = TRUE
|
||||
set hidden = TRUE
|
||||
|
||||
client_keysend_amount += 1
|
||||
|
||||
var/cache = client_keysend_amount
|
||||
|
||||
if(keysend_tripped && next_keysend_trip_reset <= world.time)
|
||||
keysend_tripped = FALSE
|
||||
|
||||
if(next_keysend_reset <= world.time)
|
||||
client_keysend_amount = 0
|
||||
next_keysend_reset = world.time + (1 SECONDS)
|
||||
|
||||
//The "tripped" system is to confirm that flooding is still happening after one spike
|
||||
//not entirely sure how byond commands interact in relation to lag
|
||||
//don't want to kick people if a lag spike results in a huge flood of commands being sent
|
||||
if(cache >= MAX_KEYPRESS_AUTOKICK)
|
||||
if(!keysend_tripped)
|
||||
keysend_tripped = TRUE
|
||||
next_keysend_trip_reset = world.time + (2 SECONDS)
|
||||
else
|
||||
log_admin("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.")
|
||||
message_admins("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.")
|
||||
QDEL_IN(src, 1)
|
||||
return
|
||||
|
||||
///Check if the key is short enough to even be a real key
|
||||
if(LAZYLEN(_key) > MAX_KEYPRESS_COMMANDLENGTH)
|
||||
to_chat(src, "<span class='userdanger'>Invalid KeyDown detected! You have been disconnected from the server automatically.</span>")
|
||||
log_admin("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.")
|
||||
message_admins("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.")
|
||||
QDEL_IN(src, 1)
|
||||
return
|
||||
//offset by 1 because the buffer address is 0 indexed because the math was simpler
|
||||
keys_held[current_key_address + 1] = _key
|
||||
//the time a key was pressed isn't actually used anywhere (as of 2019-9-10) but this allows easier access usage/checking
|
||||
|
||||
keys_held[_key] = world.time
|
||||
|
||||
current_key_address = ((current_key_address + 1) % HELD_KEY_BUFFER_LENGTH)
|
||||
|
||||
var/movement = SSinput.movement_keys[_key]
|
||||
if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key]
|
||||
if(!(next_move_dir_sub & movement) && !keys_held["Ctrl"])
|
||||
@@ -40,7 +79,11 @@
|
||||
/client/verb/keyUp(_key as text)
|
||||
set instant = TRUE
|
||||
set hidden = TRUE
|
||||
keys_held -= _key
|
||||
//Can't just do a remove because it would alter the length of the rolling buffer, instead search for the key then null it out if it exists
|
||||
for(var/i in 1 to HELD_KEY_BUFFER_LENGTH)
|
||||
if(keys_held[i] == _key)
|
||||
keys_held[i] = null
|
||||
break
|
||||
var/movement = SSinput.movement_keys[_key]
|
||||
if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key]
|
||||
if(!(next_move_dir_add & movement))
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
/client
|
||||
var/list/keys_held = list() // A list of any keys held currently
|
||||
// These next two vars are to apply movement for keypresses and releases made while move delayed.
|
||||
// Because discarding that input makes the game less responsive.
|
||||
var/next_move_dir_add // On next move, add this dir to the move that would otherwise be done
|
||||
var/next_move_dir_sub // On next move, subtract this dir from the move that would otherwise be done
|
||||
/// A rolling buffer of any keys held currently
|
||||
var/list/keys_held = list()
|
||||
///used to keep track of the current rolling buffer position
|
||||
var/current_key_address = 0
|
||||
/// These next two vars are to apply movement for keypresses and releases made while move delayed.
|
||||
/// Because discarding that input makes the game less responsive.
|
||||
/// On next move, add this dir to the move that would otherwise be done
|
||||
var/next_move_dir_add
|
||||
/// On next move, subtract this dir from the move that would otherwise be done
|
||||
var/next_move_dir_sub
|
||||
|
||||
// Set a client's focus to an object and override these procs on that object to let it handle keypresses
|
||||
|
||||
@@ -31,6 +36,11 @@
|
||||
/client/proc/set_macros()
|
||||
set waitfor = FALSE
|
||||
|
||||
//Reset and populate the rolling buffer
|
||||
keys_held.Cut()
|
||||
for(var/i in 1 to HELD_KEY_BUFFER_LENGTH)
|
||||
keys_held += null
|
||||
|
||||
erase_all_macros()
|
||||
|
||||
var/list/macro_sets = SSinput.macro_sets
|
||||
|
||||
@@ -213,13 +213,13 @@
|
||||
if("winter") //Snow terrain is slow to move in and cold! Get the assistants to shovel your driveway.
|
||||
NewTerrainFloors = /turf/simulated/floor/snow // Needs to be updated after turf update
|
||||
NewTerrainWalls = /turf/simulated/wall/mineral/wood
|
||||
NewTerrainChairs = /obj/structure/chair/wood/normal
|
||||
NewTerrainChairs = /obj/structure/chair/wood
|
||||
NewTerrainTables = /obj/structure/table/glass
|
||||
NewFlora = list(/obj/structure/flora/grass/green, /obj/structure/flora/grass/brown, /obj/structure/flora/grass/both)
|
||||
if("jungle") //Beneficial due to actually having breathable air. Plus, monkeys and bows and arrows.
|
||||
NewTerrainFloors = /turf/simulated/floor/grass
|
||||
NewTerrainWalls = /turf/simulated/wall/mineral/sandstone
|
||||
NewTerrainChairs = /obj/structure/chair/wood/normal
|
||||
NewTerrainChairs = /obj/structure/chair/wood
|
||||
NewTerrainTables = /obj/structure/table/wood
|
||||
NewFlora = list(/obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/fernybush, /obj/structure/flora/ausbushes/leafybush,
|
||||
/obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/sunnybush, /obj/structure/flora/tree/palm, /mob/living/carbon/human/monkey,
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
var/custom_pixel_x_offset = 0 //for admin fuckery.
|
||||
var/custom_pixel_y_offset = 0
|
||||
pass_flags = PASSTABLE
|
||||
pressure_resistance = 100 //100 kPa difference required to push
|
||||
throw_pressure_limit = 120 //120 kPa difference required to throw
|
||||
|
||||
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
||||
/mob/living/carbon/alien/humanoid/New()
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
heal_rate = 5
|
||||
large = 1
|
||||
ventcrawler = 0
|
||||
pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper.
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/New()
|
||||
create_reagents(100)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/mob/living/carbon
|
||||
gender = MALE
|
||||
pressure_resistance = 15
|
||||
var/list/stomach_contents = list()
|
||||
var/list/internal_organs = list()
|
||||
var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
|
||||
|
||||
@@ -500,11 +500,12 @@ emp_act
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/experience_pressure_difference(pressure_difference, direction)
|
||||
playsound(src, 'sound/effects/space_wind.ogg', 50, 1)
|
||||
if(shoes)
|
||||
if(istype(shoes,/obj/item/clothing/shoes/magboots) && (shoes.flags & NOSLIP)) //TODO: Make a not-shit shoe var system to negate airflow.
|
||||
return 0
|
||||
..()
|
||||
playsound(src, 'sound/effects/space_wind.ogg', 50, TRUE)
|
||||
if(shoes && istype(shoes, /obj/item/clothing))
|
||||
var/obj/item/clothing/S = shoes
|
||||
if (S.flags & NOSLIP)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/water_act(volume, temperature, source, method = TOUCH)
|
||||
. = ..()
|
||||
|
||||
@@ -2,7 +2,7 @@ var/global/default_martial_art = new/datum/martial_art
|
||||
/mob/living/carbon/human
|
||||
|
||||
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,GLAND_HUD)
|
||||
|
||||
pressure_resistance = 25
|
||||
//Marking colour and style
|
||||
var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000.
|
||||
var/list/m_styles = DEFAULT_MARKING_STYLES //All markings set to None.
|
||||
|
||||
@@ -604,6 +604,34 @@
|
||||
else
|
||||
return pick("trails_1", "trails_2")
|
||||
|
||||
/mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0)
|
||||
if(buckled)
|
||||
return
|
||||
if(client && client.move_delay >= world.time + world.tick_lag * 2)
|
||||
pressure_resistance_prob_delta -= 30
|
||||
|
||||
var/list/turfs_to_check = list()
|
||||
|
||||
if(has_limbs)
|
||||
var/turf/T = get_step(src, angle2dir(dir2angle(direction) + 90))
|
||||
if (T)
|
||||
turfs_to_check += T
|
||||
|
||||
T = get_step(src, angle2dir(dir2angle(direction) - 90))
|
||||
if(T)
|
||||
turfs_to_check += T
|
||||
|
||||
for(var/t in turfs_to_check)
|
||||
T = t
|
||||
if(T.density)
|
||||
pressure_resistance_prob_delta -= 20
|
||||
continue
|
||||
for(var/atom/movable/AM in T)
|
||||
if(AM.density && AM.anchored)
|
||||
pressure_resistance_prob_delta -= 20
|
||||
break
|
||||
|
||||
..(pressure_difference, direction, pressure_resistance_prob_delta)
|
||||
|
||||
/*//////////////////////
|
||||
START RESIST PROCS
|
||||
@@ -617,6 +645,8 @@
|
||||
return
|
||||
changeNext_move(CLICK_CD_RESIST)
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_LIVING_RESIST, src)
|
||||
|
||||
if(!restrained())
|
||||
if(resist_grab())
|
||||
return
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/mob/living
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
pressure_resistance = 10
|
||||
|
||||
//Health and life related vars
|
||||
var/maxHealth = 100 //Maximum health that should be possible.
|
||||
@@ -65,7 +66,7 @@
|
||||
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
|
||||
|
||||
var/list/status_effects //a list of all status effects the mob has
|
||||
|
||||
|
||||
var/deathgasp_on_death = FALSE
|
||||
|
||||
var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added
|
||||
|
||||
@@ -252,7 +252,7 @@
|
||||
modules += new /obj/item/soap/nanotrasen(src)
|
||||
modules += new /obj/item/storage/bag/trash/cyborg(src)
|
||||
modules += new /obj/item/mop/advanced/cyborg(src)
|
||||
modules += new /obj/item/lightreplacer(src)
|
||||
modules += new /obj/item/lightreplacer/cyborg(src)
|
||||
modules += new /obj/item/holosign_creator(src)
|
||||
emag = new /obj/item/reagent_containers/spray(src)
|
||||
|
||||
@@ -544,7 +544,7 @@
|
||||
modules += new /obj/item/crowbar/cyborg(src)
|
||||
modules += new /obj/item/wirecutters/cyborg(src)
|
||||
modules += new /obj/item/multitool/cyborg(src)
|
||||
modules += new /obj/item/lightreplacer(src)
|
||||
modules += new /obj/item/lightreplacer/cyborg(src)
|
||||
modules += new /obj/item/gripper(src)
|
||||
modules += new /obj/item/matter_decompiler(src)
|
||||
modules += new /obj/item/reagent_containers/spray/cleaner/drone(src)
|
||||
@@ -562,10 +562,6 @@
|
||||
/obj/item/robot_module/drone/respawn_consumable(mob/living/silicon/robot/R)
|
||||
var/obj/item/reagent_containers/spray/cleaner/C = locate() in modules
|
||||
C.reagents.add_reagent("cleaner", 3)
|
||||
|
||||
var/obj/item/lightreplacer/LR = locate() in modules
|
||||
LR.Charge(R)
|
||||
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
modtype = "Syndicate"
|
||||
req_access = list(access_syndicate)
|
||||
ionpulse = 1
|
||||
magpulse = 1
|
||||
lawchannel = "State"
|
||||
var/playstyle_string = "<span class='userdanger'>You are a Syndicate assault cyborg!</span><br>\
|
||||
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
@@ -80,7 +79,7 @@
|
||||
|
||||
var/datum/action/thermals = new /datum/action/innate/robot_sight/thermal()
|
||||
thermals.Grant(src)
|
||||
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/verb/modify_name()
|
||||
set name = "Modify Name"
|
||||
set desc = "Change your systems' registered name to fool Nanotrasen systems. No cost."
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
faction = list("syndicate")
|
||||
shoot_sound = 'sound/weapons/wave.ogg'
|
||||
anchored = 1
|
||||
pressure_resistance = 100 //100 kPa difference required to push
|
||||
throw_pressure_limit = 120
|
||||
window_id = "syndiebot"
|
||||
window_name = "Syndicate Bot Interface"
|
||||
var/turf/saved_turf
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
minbodytemp = 0
|
||||
faction = list("cult")
|
||||
flying = 1
|
||||
pressure_resistance = 100
|
||||
universal_speak = 1
|
||||
AIStatus = AI_OFF //normal constructs don't have AI
|
||||
var/const_type = "shade"
|
||||
|
||||
@@ -24,8 +24,6 @@
|
||||
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 = 15
|
||||
heat_damage_per_tick = 20
|
||||
pressure_resistance = 100 //100 kPa difference required to push
|
||||
throw_pressure_limit = 120 //120 kPa difference required to throw
|
||||
faction = list("alien")
|
||||
status_flags = CANPUSH
|
||||
minbodytemp = 0
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
faction = list("carp")
|
||||
flying = 1
|
||||
pressure_resistance = 200
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
|
||||
|
||||
var/carp_color = "carp" //holder for icon set
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
attack_sound = 'sound/creatures/headcrab_attack.ogg'
|
||||
speak_emote = list("hisses")
|
||||
var/is_zombie = 0
|
||||
stat_attack = UNCONSCIOUS //so they continue to attack when they are on the ground.
|
||||
stat_attack = DEAD //so they continue to attack when they are on the ground.
|
||||
var/host_species = ""
|
||||
var/list/human_overlays = list()
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
var/mob/living/L = target
|
||||
if (istype(L))
|
||||
if(istype(L))
|
||||
L.adjust_fire_stacks(0.1)
|
||||
L.IgniteMob()
|
||||
|
||||
@@ -141,5 +141,12 @@
|
||||
damage_type = BURN
|
||||
nodamage = FALSE
|
||||
|
||||
/obj/item/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/mob/living/L = target
|
||||
if(istype(L))
|
||||
L.apply_status_effect(/datum/status_effect/freon/watcher)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril
|
||||
fromtendril = TRUE
|
||||
@@ -46,7 +46,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)
|
||||
minbodytemp = 0
|
||||
|
||||
pressure_resistance = 300
|
||||
faction = list("undead") // did I mention ghost
|
||||
loot = list(/obj/item/reagent_containers/food/snacks/ectoplasm)
|
||||
del_on_death = 1
|
||||
|
||||
@@ -49,10 +49,6 @@ var/global/list/ts_spiderling_list = list()
|
||||
// '1' (default for most simple_mobs, including terror spiders) converts to 3.5, or 2.8 tiles/sec.
|
||||
// '2' converts to 4.5, or 2.2 tiles/sec.
|
||||
|
||||
// Atmos
|
||||
pressure_resistance = 50 //50 kPa difference required to push
|
||||
throw_pressure_limit = 100 //100 kPa difference required to throw
|
||||
|
||||
// Ventcrawling
|
||||
ventcrawler = 1 // allows player ventcrawling
|
||||
var/ai_ventcrawls = TRUE
|
||||
|
||||
@@ -556,6 +556,11 @@
|
||||
genemutcheck(src, block,null, MUTCHK_FORCED)
|
||||
dna.UpdateSE()
|
||||
|
||||
///////////////////////////////// FROZEN /////////////////////////////////////
|
||||
|
||||
/mob/living/proc/IsFrozen()
|
||||
return has_status_effect(/datum/status_effect/freon)
|
||||
|
||||
///////////////////////////////////// STUN ABSORPTION /////////////////////////////////////
|
||||
|
||||
/mob/living/proc/add_stun_absorption(key, duration, priority, message, self_message, examine_message)
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
else if((fall_over || resting) && !lying)
|
||||
fall(fall_over)
|
||||
|
||||
canmove = !(fall_over || resting || stunned || buckled)
|
||||
canmove = !(fall_over || resting || stunned || IsFrozen() || buckled)
|
||||
density = !lying
|
||||
if(lying)
|
||||
if(layer == initial(layer))
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
throw_range = 2
|
||||
throw_speed = 1
|
||||
layer = 4
|
||||
pressure_resistance = 1
|
||||
pressure_resistance = 2
|
||||
attack_verb = list("bapped")
|
||||
var/amount = 0 //Amount of items clipped to the paper. Note: If you have 2 paper, this should be 1
|
||||
var/page = 1
|
||||
|
||||
@@ -303,10 +303,7 @@
|
||||
//Light replacer code
|
||||
if(istype(W, /obj/item/lightreplacer))
|
||||
var/obj/item/lightreplacer/LR = W
|
||||
if(isliving(user))
|
||||
var/mob/living/U = user
|
||||
LR.ReplaceLight(src, U)
|
||||
return
|
||||
LR.ReplaceLight(src, user)
|
||||
|
||||
// attempt to insert light
|
||||
if(istype(W, /obj/item/light))
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
holds_charge = TRUE
|
||||
unique_frequency = TRUE
|
||||
|
||||
/obj/item/gun/energy/kinetic_accelerator/New()
|
||||
/obj/item/gun/energy/kinetic_accelerator/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!holds_charge)
|
||||
empty()
|
||||
@@ -98,8 +98,7 @@
|
||||
if(!QDELING(src) && !holds_charge)
|
||||
// Put it on a delay because moving item from slot to hand
|
||||
// calls dropped().
|
||||
spawn(2)
|
||||
empty_if_not_held()
|
||||
addtimer(CALLBACK(src, .proc/empty_if_not_held), 2)
|
||||
|
||||
/obj/item/gun/energy/kinetic_accelerator/proc/empty_if_not_held()
|
||||
if(!ismob(loc))
|
||||
@@ -143,17 +142,17 @@
|
||||
overheat = FALSE
|
||||
|
||||
/obj/item/gun/energy/kinetic_accelerator/update_icon()
|
||||
overlays.Cut()
|
||||
cut_overlays()
|
||||
if(empty_state && !can_shoot())
|
||||
overlays += empty_state
|
||||
add_overlay(empty_state)
|
||||
|
||||
if(gun_light && can_flashlight)
|
||||
var/iconF = "flight"
|
||||
if(gun_light.on)
|
||||
iconF = "flight_on"
|
||||
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
|
||||
add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset))
|
||||
if(bayonet && can_bayonet)
|
||||
overlays += knife_overlay
|
||||
add_overlay(knife_overlay)
|
||||
|
||||
|
||||
/obj/item/gun/energy/kinetic_accelerator/experimental
|
||||
|
||||
@@ -165,12 +165,18 @@
|
||||
|
||||
/obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user)
|
||||
if(istype(A, /obj/item/stack/sheet/mineral/plasma))
|
||||
if(power_supply.charge >= power_supply.maxcharge)
|
||||
to_chat(user,"<span class='notice'>[src] is already fully charged.")
|
||||
return
|
||||
var/obj/item/stack/sheet/S = A
|
||||
S.use(1)
|
||||
power_supply.give(1000)
|
||||
on_recharge()
|
||||
to_chat(user, "<span class='notice'>You insert [A] in [src], recharging it.</span>")
|
||||
else if(istype(A, /obj/item/stack/ore/plasma))
|
||||
if(power_supply.charge >= power_supply.maxcharge)
|
||||
to_chat(user,"<span class='notice'>[src] is already fully charged.")
|
||||
return
|
||||
var/obj/item/stack/ore/S = A
|
||||
S.use(1)
|
||||
power_supply.give(500)
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
hitsound = 'sound/weapons/pierce.ogg'
|
||||
var/hitsound_wall = ""
|
||||
pressure_resistance = INFINITY
|
||||
burn_state = LAVA_PROOF
|
||||
var/def_zone = "" //Aiming at
|
||||
var/mob/firer = null//Who shot it
|
||||
@@ -98,7 +97,7 @@
|
||||
var/turf/simulated/wall/W = target_loca
|
||||
if(impact_effect_type)
|
||||
new impact_effect_type(target_loca, hitx, hity)
|
||||
|
||||
|
||||
W.add_dent(WALL_DENT_SHOT, hitx, hity)
|
||||
return 0
|
||||
if(alwayslog)
|
||||
@@ -334,3 +333,6 @@ obj/item/projectile/Crossed(atom/movable/AM, oldloc) //A mob moving on a tile wi
|
||||
/obj/item/projectile/proc/setAngle(new_angle) //wrapper for overrides.
|
||||
Angle = new_angle
|
||||
return TRUE
|
||||
|
||||
/obj/item/projectile/experience_pressure_difference()
|
||||
return
|
||||
@@ -362,7 +362,6 @@
|
||||
drink_icon = "cubalibreglass"
|
||||
drink_name = "Cuba Libre"
|
||||
drink_desc = "A classic mix of rum and cola."
|
||||
taste_description = "fruity alcohol"
|
||||
taste_description = "liberation"
|
||||
|
||||
/datum/reagent/consumable/ethanol/whiskey_cola
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
reagent_state = SOLID
|
||||
color = "#FFFFFF"
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/spider_eggs/on_mob_life(mob/living/M)
|
||||
if(volume > 2.5)
|
||||
@@ -20,6 +21,7 @@
|
||||
description = "Microscopic construction robots."
|
||||
color = "#535E66" // rgb: 83, 94, 102
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/nanomachines/on_mob_life(mob/living/carbon/M)
|
||||
if(volume > 1.5)
|
||||
@@ -33,6 +35,7 @@
|
||||
description = "Microbes with an entirely alien cellular structure."
|
||||
color = "#535E66" // rgb: 83, 94, 102
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/xenomicrobes/on_mob_life(mob/living/carbon/M)
|
||||
if(volume > 1.5)
|
||||
@@ -45,6 +48,7 @@
|
||||
description = "Active fungal spores."
|
||||
color = "#92D17D" // rgb: 146, 209, 125
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/fungalspores/on_mob_life(mob/living/carbon/M)
|
||||
if(volume > 2.5)
|
||||
@@ -58,6 +62,7 @@
|
||||
reagent_state = SOLID
|
||||
color = "#FA0000" // rgb: 250, 0, 0
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/jagged_crystals/on_mob_life(mob/living/carbon/M)
|
||||
M.ForceContractDisease(new /datum/disease/berserker(0))
|
||||
@@ -70,6 +75,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#1E4600"
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/salmonella/on_mob_life(mob/living/carbon/M)
|
||||
M.ForceContractDisease(new /datum/disease/food_poisoning(0))
|
||||
@@ -82,6 +88,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#FF0000"
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/gibbis/on_mob_life(mob/living/carbon/M)
|
||||
if(volume > 2.5)
|
||||
@@ -95,6 +102,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#FFFFFF"
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/prions/on_mob_life(mob/living/carbon/M)
|
||||
if(volume > 4.5)
|
||||
@@ -108,6 +116,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#465046"
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/grave_dust/on_mob_life(mob/living/carbon/M)
|
||||
if(volume > 4.5)
|
||||
@@ -121,6 +130,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#F7E6B1"
|
||||
can_synth = FALSE
|
||||
taste_description = "bacon"
|
||||
|
||||
/datum/reagent/bacon_grease/on_mob_life(mob/living/carbon/M)
|
||||
if(volume > 4.5)
|
||||
@@ -134,6 +144,7 @@
|
||||
reagent_state = SOLID
|
||||
color = "#925D6C"
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/heartworms/on_mob_life(mob/living/carbon/M)
|
||||
if(volume > 4.5)
|
||||
@@ -152,6 +163,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#AB1CCF"
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/concentrated_initro/on_mob_life(mob/living/M)
|
||||
if(volume >= 5)
|
||||
@@ -170,6 +182,7 @@
|
||||
reagent_state = LIQUID
|
||||
nutriment_factor = 2 * REAGENTS_METABOLISM
|
||||
color = "#899613" // rgb: 137, 150, 19
|
||||
taste_description = "watery milk"
|
||||
|
||||
/datum/reagent/mutagen/mutagenvirusfood
|
||||
name = "mutagenic agar"
|
||||
@@ -198,4 +211,4 @@
|
||||
/datum/reagent/plasma_dust/plasmavirusfood/weak
|
||||
name = "weakened virus plasma"
|
||||
id = "weakplasmavirusfood"
|
||||
color = "#CEC3C6" // rgb: 206,195,198
|
||||
color = "#CEC3C6" // rgb: 206,195,198
|
||||
@@ -1,18 +1,3 @@
|
||||
/datum/reagent/serotrotium
|
||||
name = "Serotrotium"
|
||||
id = "serotrotium"
|
||||
description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans."
|
||||
reagent_state = LIQUID
|
||||
color = "#202040" // rgb: 20, 20, 40
|
||||
metabolization_rate = 0.25 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/serotrotium/on_mob_life(mob/living/M)
|
||||
if(ishuman(M))
|
||||
if(prob(7))
|
||||
M.emote(pick("twitch","drool","moan","gasp"))
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/reagent/lithium
|
||||
name = "Lithium"
|
||||
id = "lithium"
|
||||
@@ -170,6 +155,7 @@
|
||||
color = "#60A584" // rgb: 96, 165, 132
|
||||
overdose_threshold = 20
|
||||
addiction_chance = 50
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/crank/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -475,7 +461,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#644600"
|
||||
addiction_chance = 30
|
||||
taste_description = "puke... or worse"
|
||||
taste_description = "the inside of a toilet... or worse"
|
||||
|
||||
/datum/reagent/jenkem/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -491,6 +477,7 @@
|
||||
description = "An illegal performance enhancing drug. Side effects might include chest pain, seizures, swelling, headache, fever... ... ..."
|
||||
reagent_state = LIQUID
|
||||
color = "#60A584" // rgb: 96, 165, 132
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/aranesp/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -515,6 +502,7 @@
|
||||
description = "A mild psychoactive chemical extracted from the cannabis plant."
|
||||
reagent_state = LIQUID
|
||||
color = "#0FBE0F"
|
||||
taste_description = "man like, totally the best like, thing ever dude"
|
||||
|
||||
/datum/reagent/thc/on_mob_life(mob/living/M)
|
||||
M.stuttering += rand(0,2)
|
||||
@@ -697,7 +685,7 @@
|
||||
process_flags = SYNTHETIC
|
||||
overdose_threshold = 20
|
||||
addiction_chance = 50
|
||||
taste_description = "silicone"
|
||||
taste_description = "silicon"
|
||||
|
||||
|
||||
/datum/reagent/surge/on_mob_life(mob/living/M)
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
reagent_state = SOLID
|
||||
nutriment_factor = 15 * REAGENTS_METABOLISM
|
||||
color = "#664330" // rgb: 102, 67, 48
|
||||
var/brute_heal = 1
|
||||
var/burn_heal = 0
|
||||
|
||||
/datum/reagent/consumable/nutriment/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -33,10 +35,8 @@
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
|
||||
if(prob(50))
|
||||
update_flags |= M.adjustBruteLoss(-1, FALSE)
|
||||
if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature.
|
||||
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
H.blood_volume += 0.4
|
||||
update_flags |= M.adjustBruteLoss(-brute_heal, FALSE)
|
||||
update_flags |= M.adjustFireLoss(-burn_heal, FALSE)
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/consumable/nutriment/on_new(list/supplied_data)
|
||||
@@ -66,36 +66,26 @@
|
||||
id = "protein"
|
||||
description = "Various essential proteins and fats commonly found in animal flesh and blood."
|
||||
diet_flags = DIET_CARN | DIET_OMNI
|
||||
taste_description = "meat" //TODO: Remove
|
||||
|
||||
/datum/reagent/consumable/nutriment/plantmatter // Plant-based biomatter, digestable by herbivores and omnivores, worthless to carnivores
|
||||
name = "Plant-matter"
|
||||
id = "plantmatter"
|
||||
description = "Vitamin-rich fibers and natural sugars commonly found in fresh produce."
|
||||
diet_flags = DIET_HERB | DIET_OMNI
|
||||
taste_description = "vegetables" //TODO: Remove
|
||||
|
||||
/datum/reagent/consumable/vitamin
|
||||
/datum/reagent/consumable/nutriment/vitamin
|
||||
name = "Vitamin"
|
||||
id = "vitamin"
|
||||
description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form."
|
||||
reagent_state = SOLID
|
||||
color = "#664330" // rgb: 102, 67, 48
|
||||
taste_description = "nutrition"
|
||||
brute_heal = 1
|
||||
burn_heal = 1
|
||||
|
||||
/datum/reagent/consumable/vitamin/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
if(prob(50))
|
||||
update_flags |= M.adjustBruteLoss(-1, FALSE)
|
||||
update_flags |= M.adjustFireLoss(-1, FALSE)
|
||||
/datum/reagent/consumable/nutriment/vitamin/on_mob_life(mob/living/M)
|
||||
if(M.satiety < 600)
|
||||
M.satiety += 30
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature.
|
||||
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
H.blood_volume += 0.5
|
||||
return ..() | update_flags
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/sugar
|
||||
name = "Sugar"
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/datum/reagent/medicine
|
||||
name = "Medicine"
|
||||
id = "medicine"
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/medicine/on_mob_life(mob/living/M)
|
||||
current_cycle++
|
||||
@@ -290,11 +291,6 @@
|
||||
addiction_chance = 5
|
||||
taste_description = "health"
|
||||
|
||||
/datum/reagent/medicine/omnizine/godblood
|
||||
name = "Godblood"
|
||||
description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power."
|
||||
overdose_threshold = 150
|
||||
|
||||
/datum/reagent/medicine/omnizine/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
update_flags |= M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
@@ -728,7 +724,7 @@
|
||||
id = "mannitol"
|
||||
description = "Mannitol is a sugar alcohol that can help alleviate cranial swelling."
|
||||
color = "#D1D1F1"
|
||||
taste_description = "neurogenisis"
|
||||
taste_description = "sweetness"
|
||||
|
||||
/datum/reagent/medicine/mannitol/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -786,6 +782,7 @@
|
||||
description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun."
|
||||
color = "#C8A5DC"
|
||||
can_synth = FALSE
|
||||
taste_description = "<span class='userdanger'>an unstoppable force</span>"
|
||||
|
||||
/datum/reagent/medicine/stimulants/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -962,6 +959,12 @@
|
||||
metabolization_rate = 0.1
|
||||
taste_description = "faint hope"
|
||||
|
||||
/datum/reagent/medicine/omnizine_diluted/godblood
|
||||
name = "Godblood"
|
||||
id = "godblood"
|
||||
description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power."
|
||||
overdose_threshold = 150
|
||||
|
||||
/datum/reagent/medicine/omnizine_diluted/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
update_flags |= M.adjustToxLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
|
||||
@@ -614,6 +614,7 @@
|
||||
description = "A potent alchemic ingredient."
|
||||
reagent_state = LIQUID
|
||||
color = "#092D09"
|
||||
taste_description = "alchemy"
|
||||
|
||||
/datum/reagent/woolbat
|
||||
name = "Wool of bat"
|
||||
@@ -621,6 +622,7 @@
|
||||
description = "A potent alchemic ingredient."
|
||||
reagent_state = LIQUID
|
||||
color = "#080808"
|
||||
taste_description = "alchemy"
|
||||
|
||||
/datum/reagent/tonguedog
|
||||
name = "Tongue of dog"
|
||||
@@ -628,6 +630,7 @@
|
||||
description = "A potent alchemic ingredient."
|
||||
reagent_state = LIQUID
|
||||
color = "#2D0909"
|
||||
taste_description = "alchemy"
|
||||
|
||||
/datum/reagent/triplepiss
|
||||
name = "Triplepiss"
|
||||
@@ -635,6 +638,7 @@
|
||||
description = "Ewwwwwwwww."
|
||||
reagent_state = LIQUID
|
||||
color = "#857400"
|
||||
taste_description = "alchemy"
|
||||
|
||||
/datum/reagent/spraytan
|
||||
name = "Spray Tan"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#FFAF00"
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
taste_description = "burning"
|
||||
var/temp_fire = 4000
|
||||
var/temp_deviance = 1000
|
||||
var/size_divisor = 40
|
||||
@@ -49,6 +50,7 @@
|
||||
reagent_state = LIQUID
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
color = "#C86432"
|
||||
taste_description = "burning"
|
||||
|
||||
/datum/reagent/napalm/reaction_temperature(exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > T0C + 100)
|
||||
@@ -253,6 +255,7 @@
|
||||
description = "Sends everything flying from the detonation point."
|
||||
reagent_state = LIQUID
|
||||
color = "#FFA500"
|
||||
taste_description = "air and bitterness"
|
||||
|
||||
/datum/reagent/sorium/reaction_turf(turf/T, volume) // oh no
|
||||
if(prob(75))
|
||||
@@ -269,7 +272,7 @@
|
||||
description = "Sucks everything into the detonation point."
|
||||
reagent_state = LIQUID
|
||||
color = "#800080"
|
||||
taste_description = "the end of the world"
|
||||
taste_description = "compressed bitterness"
|
||||
|
||||
/datum/reagent/liquid_dark_matter/reaction_turf(turf/T, volume) //Oh gosh, why
|
||||
if(prob(75))
|
||||
@@ -302,6 +305,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#FFFF00"
|
||||
penetrates_skin = TRUE
|
||||
taste_description = "salt"
|
||||
|
||||
/datum/reagent/smoke_powder
|
||||
name = "Smoke Powder"
|
||||
@@ -309,6 +313,7 @@
|
||||
description = "Makes a large cloud of smoke that can carry reagents."
|
||||
reagent_state = LIQUID
|
||||
color = "#808080"
|
||||
taste_description = "smoke"
|
||||
|
||||
/datum/reagent/sonic_powder
|
||||
name = "Sonic Powder"
|
||||
@@ -317,6 +322,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#0000FF"
|
||||
penetrates_skin = TRUE
|
||||
taste_description = "loud noises"
|
||||
|
||||
/datum/reagent/cryostylane
|
||||
name = "Cryostylane"
|
||||
@@ -324,6 +330,7 @@
|
||||
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K."
|
||||
color = "#B2B2FF" // rgb: 139, 166, 233
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/cryostylane/on_mob_life(mob/living/M) //TODO: code freezing into an ice cube
|
||||
if(M.reagents.has_reagent("oxygen"))
|
||||
@@ -358,6 +365,7 @@
|
||||
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly heats all other reagents."
|
||||
color = "#B20000" // rgb: 139, 166, 233
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/pyrosium/on_mob_life(mob/living/M)
|
||||
if(M.reagents.has_reagent("oxygen"))
|
||||
@@ -380,6 +388,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#A0A090"
|
||||
var/cooling_temperature = 3 // more effective than water
|
||||
taste_description = "the inside of a fire extinguisher"
|
||||
|
||||
/datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||
// Put out fire
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#CF3600" // rgb: 207, 54, 0
|
||||
taste_mult = 1.2
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/toxin/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -17,6 +18,7 @@
|
||||
description = "A toxic venom injected by spacefaring arachnids."
|
||||
reagent_state = LIQUID
|
||||
color = "#CF3600" // rgb: 207, 54, 0
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/spider_venom/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -81,6 +83,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#13BC5E" // rgb: 19, 188, 94
|
||||
can_synth = FALSE
|
||||
taste_description = "slime"
|
||||
|
||||
/datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||
if(method != TOUCH)
|
||||
@@ -95,7 +98,6 @@
|
||||
color = "#484848" // rgb: 72, 72, 72
|
||||
metabolization_rate = 0.2
|
||||
penetrates_skin = TRUE
|
||||
taste_description = "metal"
|
||||
taste_mult = 0 // elemental mercury is tasteless
|
||||
|
||||
/datum/reagent/mercury/on_mob_life(mob/living/M)
|
||||
@@ -127,7 +129,7 @@
|
||||
color = "#6A6054"
|
||||
penetrates_skin = TRUE
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
taste_description = "spicy freshness"
|
||||
taste_description = "acid"
|
||||
|
||||
/datum/reagent/fluorine/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -142,6 +144,7 @@
|
||||
reagent_state = SOLID
|
||||
color = "#C7C7C7" // rgb: 199,199,199
|
||||
penetrates_skin = TRUE
|
||||
taste_description = "the colour blue and regret"
|
||||
|
||||
/datum/reagent/radium/on_mob_life(mob/living/M)
|
||||
if(M.radiation < 80)
|
||||
@@ -160,6 +163,7 @@
|
||||
color = "#04DF27"
|
||||
metabolization_rate = 0.3
|
||||
taste_mult = 0.9
|
||||
taste_description = "slime"
|
||||
|
||||
/datum/reagent/mutagen/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||
if(!..())
|
||||
@@ -186,6 +190,7 @@
|
||||
description = "Just the regular, boring sort of mutagenic compound. Works in a completely predictable manner."
|
||||
reagent_state = LIQUID
|
||||
color = "#7DFF00"
|
||||
taste_description = "slime"
|
||||
|
||||
/datum/reagent/stable_mutagen/on_mob_life(mob/living/M)
|
||||
if(!ishuman(M) || !M.dna)
|
||||
@@ -251,6 +256,7 @@
|
||||
reagent_state = SOLID
|
||||
color = "#B8B8C0" // rgb: 184, 184, 192
|
||||
taste_mult = 0
|
||||
taste_description = "the inside of a reactor"
|
||||
|
||||
/datum/reagent/uranium/on_mob_life(mob/living/M)
|
||||
M.apply_effect(2, IRRADIATE, negate_armor = 1)
|
||||
@@ -268,6 +274,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#52685D"
|
||||
metabolization_rate = 0.2
|
||||
taste_description = "sweetness"
|
||||
|
||||
/datum/reagent/lexorin/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -332,6 +339,7 @@
|
||||
description = "A deadly neurotoxin produced by the dreaded spess carp."
|
||||
reagent_state = LIQUID
|
||||
color = "#003333" // rgb: 0, 51, 51
|
||||
taste_description = "fish"
|
||||
|
||||
/datum/reagent/carpotoxin/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -345,6 +353,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#6E2828"
|
||||
data = 13
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/staminatoxin/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -358,6 +367,7 @@
|
||||
id = "spore"
|
||||
description = "A natural toxin produced by blob spores that inhibits vision when ingested."
|
||||
color = "#9ACD32"
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/spores/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -376,6 +386,7 @@
|
||||
drink_name = "Beer glass"
|
||||
drink_desc = "A freezing pint of beer"
|
||||
taste_description = "beer"
|
||||
taste_description = "piss water"
|
||||
|
||||
/datum/reagent/beer2/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -487,6 +498,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#DED6D0"
|
||||
penetrates_skin = TRUE
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/formaldehyde/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -504,6 +516,7 @@
|
||||
metabolization_rate = 0.2
|
||||
overdose_threshold = 40
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/venom/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -529,6 +542,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#60A584"
|
||||
metabolization_rate = 1
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/neurotoxin2/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -593,6 +607,7 @@
|
||||
color = "#B0B0B0"
|
||||
metabolization_rate = 0.3
|
||||
penetrates_skin = TRUE
|
||||
taste_description = "prickliness"
|
||||
|
||||
/datum/reagent/itching_powder/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_STAT
|
||||
@@ -806,6 +821,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#6BA688"
|
||||
metabolization_rate = 0.1
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/sulfonal/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -871,6 +887,7 @@
|
||||
color = "#C2D8CD"
|
||||
metabolization_rate = 0.05
|
||||
can_synth = FALSE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/coniine/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -886,6 +903,7 @@
|
||||
color = "#191919"
|
||||
metabolization_rate = 0.1
|
||||
penetrates_skin = TRUE
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/curare/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -919,6 +937,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#C8C8C8" //RGB: 200, 200, 200
|
||||
metabolization_rate = 0.2 * REAGENTS_METABOLISM
|
||||
taste_mult = 0
|
||||
|
||||
/datum/reagent/heparin/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -993,6 +1012,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#d3cf50"
|
||||
var/lethality = 0 //Glyphosate is non-toxic to people
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/glyphosate/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -1045,6 +1065,7 @@
|
||||
id = "pestkiller"
|
||||
description = "A harmful toxic mixture to kill pests. Do not ingest!"
|
||||
color = "#4B004B" // rgb: 75, 0, 75
|
||||
taste_description = "bitterness"
|
||||
|
||||
/datum/reagent/pestkiller/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -1125,6 +1146,7 @@
|
||||
description = "A filthy, carcinogenic sludge produced by the Slurrypod plant."
|
||||
reagent_state = LIQUID
|
||||
color = "#00C81E"
|
||||
taste_description = "slime"
|
||||
|
||||
/datum/reagent/toxic_slurry/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
@@ -1143,6 +1165,7 @@
|
||||
description = "This is probably not good for you."
|
||||
reagent_state = LIQUID
|
||||
color = "#00FD00"
|
||||
taste_description = "slime"
|
||||
|
||||
/datum/reagent/glowing_slurry/reaction_mob(mob/living/M, method=TOUCH, volume) //same as mutagen
|
||||
if(!..())
|
||||
|
||||
@@ -246,7 +246,7 @@
|
||||
description = "Filthy water scoured from a nasty toilet bowl. Absolutely disgusting."
|
||||
reagent_state = LIQUID
|
||||
color = "#757547"
|
||||
taste_description = "puke"
|
||||
taste_description = "the inside of a toilet... or worse"
|
||||
|
||||
/datum/reagent/fishwater/toiletwater/reaction_mob(mob/living/M, method=TOUCH, volume) //For shennanigans
|
||||
return
|
||||
@@ -391,7 +391,7 @@
|
||||
process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL.
|
||||
metabolization_rate = 1
|
||||
can_synth = FALSE
|
||||
taste_description = "admin abuse"
|
||||
taste_description = "burning"
|
||||
|
||||
/datum/reagent/hellwater/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
return
|
||||
last_process = world.time
|
||||
to_chat(user, "<span class='notice'>The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.</span>")
|
||||
user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood, 20)
|
||||
user.reagents.add_reagent("godblood", 20)
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src, .proc/update_icon), time_between_uses)
|
||||
|
||||
|
||||
@@ -100,7 +100,6 @@
|
||||
icon = 'icons/vehicles/CargoTrain.dmi'
|
||||
icon_state = "ambulance"
|
||||
anchored = FALSE
|
||||
throw_pressure_limit = INFINITY //Throwing an ambulance trolley can kill the process scheduler.
|
||||
|
||||
/obj/structure/bed/amb_trolley/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user