Merge remote-tracking branch 'remotes/upstream/master' into tanksprites

# Conflicts:
#	icons/mob/inhands/items_lefthand.dmi
#	icons/mob/inhands/items_righthand.dmi
This commit is contained in:
uraniummeltdown
2017-02-13 21:01:58 +04:00
228 changed files with 5111 additions and 2423 deletions
@@ -635,7 +635,7 @@
"amk" = (/turf/simulated/wall/r_wall,/area/engine/gravitygenerator)
"aml" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/stealth,/obj/item/clothing/head/helmet/space/vox/stealth,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"amm" = (/obj/machinery/conveyor{dir = 2; id = "garbage"; layer = 2.7},/obj/machinery/door/poddoor/preopen{id_tag = "Disposal Exit"; layer = 3.1; name = "disposal exit vent"},/turf/simulated/floor/plating,/area/maintenance/disposal)
"amn" = (/obj/machinery/door_control{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/machinery/driver_button{id_tag = "trash"; pixel_x = -26; pixel_y = -6},/obj/structure/stool,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal)
"amn" = (/obj/machinery/door_control{id = "trash"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/machinery/driver_button{id_tag = "trash"; pixel_x = -26; pixel_y = -6},/obj/structure/stool,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal)
"amo" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/disposal)
"amp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal)
"amq" = (/obj/effect/decal/cleanable/blood/oil,/obj/machinery/light_switch{pixel_x = 25; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
@@ -8072,6 +8072,8 @@
"cZl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-24"; layer = 4.1; tag = "icon-plant-24"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cZm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
"cZn" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"cZo" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"cZp" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; width = 25},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 14; id = "emergency_home"; name = "emergency evac bay"; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"cZq" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape)
"cZr" = (/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8113,7 +8115,6 @@
"dah" = (/turf/simulated/shuttle/wall{icon_state = "swallc2"; dir = 2},/area/shuttle/escape)
"dai" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape)
"daj" = (/obj/structure/sign/nosmoking_2,/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape)
"dak" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; width = 25},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 14; id = "emergency_home"; name = "emergency evac bay"; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dal" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/shuttle/escape)
"dam" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6; pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/device/radio,/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape)
"dao" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8662,7 +8663,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqaaacTZcXjcVMcVRcWNcWNcXkcSOcSOcSOcSOcZwcWzcXmcUXcXncUXcXmcZxcZCcSOcXpcTXcXpcTXcTXcTXcTXcTXcXpcTXcXpcTXaaaabqabqcVGcXqcXrcXscXtcVGcXucXvcVGcVGcXwdeQcXycXzcVGcYccZvcYycXZcYdcYbcYdcYdcYecXZaaaaaaabqauparBaupabqabqabqabqcVJabqabqabqabqabqabearBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcSOcSOcXEcUXcUXcUXcXFcXGcSOcZQcVacXIcXJcXJcXKcXJcXJcXLcZRcVkcXMcTXcXacTXaaaaaaaaacTXcXNcTXcXacTXaaaabqaaacNzcXOcXPcXQcXRcXRcXScXTcXUcXVcXVcXWcXXcXYcNzcYccZvcYycYGcXBcXCcZycXCcXBcZzaaaaaaabqaaaabqaaaabqaaaaaaaaacYfaaaaaaabqaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacTZcYgcYhcYicYjcYkcXKcYlcYmcSOcSOcSOcSOcUecUecUecUecUecSOcSOcVkcXpcTXcXpcTXaaaabqaaacTXcXpcTXcZUcZTabqabqaaacNzdeBcYpcYqcYrcYrcYscYtcYucYucYucYucYvcYwcNzcYccZvcYycOmcOmcOmcYIcfwaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcTZcSOcSOcTZcTZcTZcSOcYCcSOaaaaaacYDcYFcYFcYFcYFdahdaXcYFdaidcbcYFdcbdajcYFcYFcYFdaidakcYFdcbdalcYEcYJaaacVGcYKcYLcYMcYNcYOcYPcYQcYRdgXdgWcYUcYVcYWcVGcYcciccWkdawcOmcZfcZhcOmaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcZacZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcTZcSOcSOcTZcTZcTZcSOcYCcSOaaaaaacYDcYFcYFcYFcYFdahdaXcYFdaicZocYFcZodajcYFcYFcYFdaicZpcYFdcbdalcYEcYJaaacVGcYKcYLcYMcYNcYOcYPcYQcYRdgXdgWcYUcYVcYWcVGcYcciccWkdawcOmcZfcZhcOmaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcZacZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaaaaaaaaaaabqabqdazdbadaAdcTdcPdaBcZedcncZBdaCcZBdaDcZBdaCdaCdaDdaCdaEcZBdaCcZBcZBdaKdaJaaacVGcZrcZrcZrcZrcTkcZscZtcZucTkcZrcZrcZrcZrcVGdaLciccWkdaMdaOcZicZncfwaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBaaacZAcZAcZAcZAcZAabqarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqdaVdaZcZedbkcZBddadbqdbhcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZgcYFaaacVGcZGcZHcZHcVbcZJcZKcZLcZMcZNcVlcZPcZPcZPcVGcYcdbudbFdbvcfwcfwcOmcfwaaaaaaaaaaaaabqaaaabqaaaabqabqabqaaacYBaaaabqaaaabqaaaabqaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbNdbOcZedbPddccZBcZBdaJcZBcZBdbQdbYdbQdbQdbQcZBdbQdbQdbQdbYdbQcZBcZBdccdaiabqcVGcZPcZPcZPcZXcZYcZZdaadabdacdadcZPcZPcZPcVGcOmcfwcOmcOmcfwaaaaaaaaaaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+1 -1
View File
@@ -437,7 +437,7 @@
"iu" = (/obj/machinery/door/airlock/centcom{name = "Centcom Security"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
"iv" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/evac)
"iw" = (/obj/item/weapon/soap/syndie,/obj/structure/mopbucket,/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"ix" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"ix" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard/syndicate,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"iy" = (/obj/structure/table/woodentable,/obj/item/toy/nuke,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"iz" = (/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"iA" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark{name = "Response Team"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -505,7 +505,7 @@
"jK" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"jL" = (/obj/docking_port/stationary/transit{dwidth = 3; height = 7; id = "steel_rain_transit"; name = "steel_rain in transit"; width = 7},/turf/space/transit/horizontal,/area/space)
"jM" = (/obj/item/weapon/soap/syndie,/obj/structure/mopbucket,/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"jN" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"jN" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard/syndicate,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"jO" = (/obj/structure/table/woodentable,/obj/item/toy/nuke,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"jP" = (/turf/unsimulated/wall/abductor{icon_state = "alien21"},/area/abductor_ship)
"jQ" = (/turf/unsimulated/wall/abductor{icon_state = "alien20"},/area/abductor_ship)
+8 -7
View File
@@ -1152,7 +1152,7 @@
"wh" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wi" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/mine/eva)
"wj" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
"wk" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/belt/utility,/obj/machinery/light/small{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/mine/eva)
"wk" = (/obj/structure/rack,/obj/machinery/light/small{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
"wl" = (/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/dangerous/explored)
"wm" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
"wn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
@@ -1174,7 +1174,7 @@
"wD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wE" = (/turf/simulated/wall,/area/mine/lobby)
"wF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Mining Station Pod Bay"; req_access_txt = "54"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/lobby)
"wG" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/camera{c_tag = "Mining Outpost EVA"; dir = 4; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/mine/eva)
"wG" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/camera{c_tag = "Mining Outpost EVA"; dir = 4; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
"wH" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/eva)
"wI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/mine/eva)
"wJ" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel,/area/mine/eva)
@@ -1195,7 +1195,7 @@
"wY" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plating,/area/mine/eva)
"wZ" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/item/device/gps/mining{gpstag = "MINE2"},/obj/item/device/gps/mining{gpstag = "MINE1"},/obj/item/device/gps/mining,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -3},/turf/simulated/floor/plasteel,/area/mine/eva)
"xa" = (/turf/simulated/floor/plasteel,/area/mine/eva)
"xb" = (/obj/structure/dispenser/oxygen,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/eva)
"xb" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel,/area/mine/eva)
"xc" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/eva)
"xd" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/eva)
"xe" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/eva)
@@ -1258,7 +1258,7 @@
"yj" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/mine/eva)
"yk" = (/obj/machinery/power/apc{dir = 2; name = "Mining EVA APC"; pixel_x = 1; pixel_y = -23},/obj/structure/cable,/turf/simulated/floor/plasteel,/area/mine/eva)
"yl" = (/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor/plasteel,/area/mine/eva)
"ym" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/mine/eva)
"ym" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/mine/eva)
"yn" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/mine/eva)
"yo" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_east_pump"; tag_exterior_door = "mining_east_outer"; frequency = 1379; id_tag = "mining_east_airlock"; tag_interior_door = "mining_east_inner"; pixel_x = 0; pixel_y = -25; req_access_txt = null; tag_chamber_sensor = "mining_east_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel,/area/mine/eva)
"yp" = (/obj/machinery/camera{c_tag = "Mining Outpost Starboard External Airlock"; dir = 1; network = list("Mining Outpost")},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_east_sensor"; pixel_x = 0; pixel_y = -25},/obj/structure/ore_box,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/eva)
@@ -1373,6 +1373,7 @@
"Au" = (/turf/simulated/wall,/area/mine/living_quarters{name = "Mining Station Break Room"})
"Av" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/mine/living_quarters{name = "Mining Station Break Room"})
"Aw" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/lobby)
"Ax" = (/obj/machinery/light/small,/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel,/area/mine/eva)
"AB" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/mine/lobby)
"AC" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/mine/lobby)
"AD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Mining Shuttle Airlock"; dir = 8; network = list("Mining Outpost")},/turf/simulated/floor/plasteel,/area/mine/lobby)
@@ -1619,10 +1620,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaccsacacacacaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacbjbjacaaaaaaaaaeaevkvkvkvkvkvkvlvlvlvkvmvkvkvkaeaeaeafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacafafaeaeaeaeaeafafafafafacacacacacacacbjbjbjbjuEuEuEuEvnvovpuEuIvquEvruEuEuEuVuVuVuEaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafafaeaeaeaeoapSpUpTpApVphaeaeaeaeaeaeaeaeafafafafafoBoBoBoBoBoBoBoBoBoBafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacacacaaaaafaeaeaevkvvvwvxvyvzvAvBvCvDvEvFvGvyrkaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacafafaeaeaeaeaeaeaeaeaeaeafafafafafacacacacbjbjbjuEvHvIvJvKvIvIuEuMuNvLuKuEvMvNvOvOvOuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafaeaeaeaeqdqcqsqqwXvPvRvRvQvQaeaeaeaeaeaeafafafafoBoBoBoBoBoBoBoBoBoBafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaacacacaaaaacafaeaeaevkvSvTvUvyvTvVvTvTvWvXvYvGvZviaeaeaeaeaeafafafacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjacacafafnfaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafacacacacacacuEwbvIwcwdwewfuEuEuEuEuKuEvMwgwgwgwhuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeqdxwzgxFwXwiwjwjwkvQaevjaeaeaenXnfafafafoBoBoBoBoBoBoBoBoBoBafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaevkwmvTvTwnvTvVwovTvTvywpwqvyrKaeaeaeaeaeaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjacacafafaevbaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacuEwrwswtvIwuwvwwwhwxwywzuEoTwgwBwCwDuVaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaezRzRwTwFwXwGwHwIwJvQvQvQvQaeaeaeaeafafafafoBoBoBoBoBoBoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaevkwKvTwLvEwMwNwOvTvkvkvkvkvkvmrjrkaeaeaeaeaeaeaeaeafafafacacacacacbjbjbjbjbjbjbjacacacafaeaeaeaeaeaeaeaeaeaeaerjrkaeaeaeaeaeaeaeaeaeafafacacwPuEuEuEwQuEuEwRwSwUwRwSuEuEuEuEuExruEuEuVuVaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaexuxuwVAMABwYwZxaxaxbxcxdxexcrkaeaeaenlafafafoBoBoBoBoBoBoBafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaevkwmvTvTwnvTvVwovTvTvywpwqvyrKaeaeaeaeaeaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjacacafafaevbaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacuEwrwswtvIwuwvwwwhwxwywzuEoTwgwBwCwDuVaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaezRzRwTwFwXwGwHwIxbvQvQvQvQaeaeaeaeafafafafoBoBoBoBoBoBoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaevkwKvTwLvEwMwNwOvTvkvkvkvkvkvmrjrkaeaeaeaeaeaeaeaeafafafacacacacacbjbjbjbjbjbjbjacacacafaeaeaeaeaeaeaeaeaeaeaerjrkaeaeaeaeaeaeaeaeaeafafacacwPuEuEuEwQuEuEwRwSwUwRwSuEuEuEuEuExruEuEuVuVaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaexuxuwVAMABwYwZymxawJxcxdxexcrkaeaeaenlafafafoBoBoBoBoBoBoBafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkxfxgxhvyxixjxkxlxmxnxoxpxqxHtStTqJqJqJqJqJqFaeaeaeaeafafafacacacacacbjbjbjacacacacafafaeaetRqJqJqJqJqJqJqJqJtStTqJqJqJqJqFaeaeaeaeaeafacacacacacwQxsxtxRwgwDxvwhwDwwzJxxxywhwDwgxzxAuVuVuVxBxCxCxCxCxCxCxCxDxDxDxDxDxDxDxuxuxuxEwWBQxGybxIxaxaxJxKxLxMxNvsaeaeaenlafafafoBoBoBoBoBoBafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkvkvkvkvkxPxQyevkvkxSvkvkvkvkrCrKaeaeaeaeaepuaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaepuaeaeaeaeaeaeaeaerCrKaeaeaeaepuaeaeaeaeaeafafnfafafacuEuEuEuEwgwDxTxUxVwyxWxXxXxYxYxZxXyayExXyEycycycycycycycycydydydydydydydyIyfyIygyfyhyiyjykylymynxcyoypxcrKaeaeaeaeafafafafoBoBoBoBoBafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkvkvkvkvkxPxQyevkvkxSvkvkvkvkrCrKaeaeaeaeaepuaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaepuaeaeaeaeaeaeaeaerCrKaeaeaeaepuaeaeaeaeaeafafnfafafacuEuEuEuEwgwDxTxUxVwyxWxXxXxYxYxZxXyayExXyEycycycycycycycycydydydydydydydyIyfyIygyfyhyiyjykylAxynxcyoypxcrKaeaeaeaeafafafafoBoBoBoBoBafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaevkyqyrysytvknovtofaeaeaeaeaeqvaeaeaeqEqJqJqFaeaeaeaeafacacacacacacacacacacafaeaetRqJtQaeaeaeaeafaeaeqvaeaeaeaeaeaepuaeaeaeaeaeaeaevbaeafafafafafuEwgywyxyyyyyxyzyAyByyyyyCyxyDyVyVyVyFyFyFyFyFyFyFyFyGyGyGyGyGyGyHyXyXyXyJyKyLyMyNyOyPyOyOyOyOyOyOvuaeaeaeaenlafafafoBoBoBoBafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaevkyRySyTyUvkaeaeaeaeaeaeafafnfafaeaeaeaeaepuaeaeaeaeaeafacacacacacafafafafafaetRtQaeaeaeafafafafafafnfaeaeaeaeaeaepuaeaeaeaeaeaeaeaeaeaeaeafafuEuEwRAnwRuEuEyWAoyYuEuEuEyZwRuEuVaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxuxuwWzazbzczdzezfBRzhziyOuvwaaeaeaeaeaeafafafoBoBoBoBafafafoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaevkvkvkvkvkvkaeaeafafafafafacacafafaeaeaeaepuaeaeaeaeaeaeafafafafafafaeaeaeaeaepuaeaeafafafacacacacacafaeaeaeaeaeaepuaeaeaerjrkaeaeaeaeaeaeaeafuEzkwAzmzluEzozpzqzrzsuEztzuzvuEaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagwEzwzxzyzzzAzAzBzCzCzDzEwluLaeaeaeaeaeafafafoBoBoBafafoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+4 -2
View File
@@ -6,7 +6,7 @@
"af" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape)
"ag" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"ah" = (/obj/structure/sign/nosmoking_2,/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape)
"ai" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; name = "Meta emergency shuttle"; timid = 1; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"ai" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"aj" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/shuttle/escape)
"ak" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/escape)
"al" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/escape)
@@ -110,9 +110,10 @@
"cf" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/escape)
"cg" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/shuttle/escape)
"ch" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/escape)
"ci" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; name = "Meta emergency shuttle"; timid = 1; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
(1,1,1) = {"
aaaaabacacacacadaeacafagacagahacacacafaiacagajakal
aaaaabacacacacadaeacafaiacaiahacacacafciacagajakal
aaamanaoapaqarasatauavauawauavavawavaxauavauauayaz
aAaBasaCauaDaEaFauauauauauauauauauauauauauauauaGac
aHaIasaJaKauauazauauaLaMaLaLaLauaLaLaLaMaLauauaNaf
@@ -127,3 +128,4 @@ aOaBasbIbpbpbJaFbKbrbrbLasbMauauaublbNbpbpbpbpbAac
aabOanbPbpbpbJasbQbRbSbTasbUbVbWbXbYbZcacbcccdceaV
aaaacfacbqbqaccgakacacajcgaeacacajcgakaeacacajakch
"}
@@ -61,6 +61,7 @@
/obj/machinery/atmospherics/unary/vent_pump/New()
..()
all_vent_pumps += src
icon = null
initial_loc = get_area(loc)
area_uid = initial_loc.uid
@@ -426,6 +427,7 @@
return ..()
/obj/machinery/atmospherics/unary/vent_pump/Destroy()
all_vent_pumps -= src
if(initial_loc)
initial_loc.air_vent_info -= id_tag
initial_loc.air_vent_names -= id_tag
+1
View File
@@ -24,6 +24,7 @@
#define FIRELOSS 2
#define TOXLOSS 4
#define OXYLOSS 8
#define SHAME 16
//Bitflags defining which status effects could be or are inflicted on a mob
#define CANSTUN 1
+5 -3
View File
@@ -12,6 +12,7 @@
#define DISABILITY_FLAG_DEAF 8
#define DISABILITY_FLAG_BLIND 16
#define DISABILITY_FLAG_MUTE 32
#define DISABILITY_FLAG_COLOURBLIND 64
///////////////////////////////////////
// MUTATIONS
@@ -84,8 +85,9 @@
#define TOURETTES 8
#define NERVOUS 16
#define BLIND 32
#define MUTE 64
#define DEAF 128
#define COLOURBLIND 64
#define MUTE 128
#define DEAF 256
//Nutrition levels for humans. No idea where else to put it
#define NUTRITION_LEVEL_FAT 600
@@ -113,4 +115,4 @@
#define GENETIC_DAMAGE_STAGE_3 35
#define CLONER_FRESH_CLONE "fresh"
#define CLONER_MATURE_CLONE "mature"
#define CLONER_MATURE_CLONE "mature"
+7
View File
@@ -0,0 +1,7 @@
//ITEM INVENTORY WEIGHT, FOR w_class
#define WEIGHT_CLASS_TINY 1 //Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money
#define WEIGHT_CLASS_SMALL 2 //Pockets can hold small and tiny items, ex: Flashlight, Multitool, Grenades, GPS Device
#define WEIGHT_CLASS_NORMAL 3 //Standard backpacks can carry tiny, small & normal items, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets
#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in an inventory, ex: Defibrillator, Backpack, Space Suits
#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons
#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe
+63
View File
@@ -0,0 +1,63 @@
//Defines for atom layers and planes
//KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE
#define CLICKCATCHER_PLANE -99
#define PLANE_SPACE -95
#define PLANE_SPACE_PARALLAX -90
#define GAME_PLANE 0
//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define
#define MID_TURF_LAYER 2.02
#define HIGH_TURF_LAYER 2.03
#define ABOVE_OPEN_TURF_LAYER 2.04
#define CLOSED_TURF_LAYER 2.05
#define ABOVE_NORMAL_TURF_LAYER 2.08
#define LATTICE_LAYER 2.2
#define DISPOSAL_PIPE_LAYER 2.3
#define GAS_PIPE_LAYER 2.35
#define WIRE_LAYER 2.4
#define WIRE_TERMINAL_LAYER 2.45
#define LOW_OBJ_LAYER 2.5
#define BELOW_OPEN_DOOR_LAYER 2.6
#define OPEN_DOOR_LAYER 2.7
#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible
#define TABLE_LAYER 2.8
#define BELOW_OBJ_LAYER 2.9
#define LOW_ITEM_LAYER 2.95
//#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define
#define CLOSED_DOOR_LAYER 3.1
#define CLOSED_FIREDOOR_LAYER 3.11
#define ABOVE_OBJ_LAYER 3.2
#define ABOVE_WINDOW_LAYER 3.3
#define SIGN_LAYER 3.4
#define NOT_HIGH_OBJ_LAYER 3.5
#define HIGH_OBJ_LAYER 3.6
#define BELOW_MOB_LAYER 3.7
#define LYING_MOB_LAYER 3.8
//#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define
#define ABOVE_MOB_LAYER 4.1
#define WALL_OBJ_LAYER 4.25
#define EDGED_TURF_LAYER 4.3
#define ON_EDGED_TURF_LAYER 4.35
#define LARGE_MOB_LAYER 4.4
#define ABOVE_ALL_MOB_LAYER 4.5
#define SPACEVINE_LAYER 4.8
#define SPACEVINE_MOB_LAYER 4.9
//#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define
#define RIPPLE_LAYER 5.1
#define GHOST_LAYER 6
#define AREA_LAYER 10
#define MASSIVE_OBJ_LAYER 11
#define POINT_LAYER 12
#define LIGHTING_PLANE 15
#define LIGHTING_LAYER 15
//HUD layer defines
#define HUD_LAYER 19
#define HUD_PLANE 90
+36 -3
View File
@@ -1,10 +1,43 @@
#define LIGHTING_INTERVAL 5 // frequency, in 1/10ths of a second, of the lighting process
#define LIGHTING_FALLOFF 1 // type of falloff to use for lighting; 1 for circular, 2 for square
#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources
#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone
#define LIGHTING_LAYER 10 // drawing layer for lighting overlays
#define LIGHTING_ICON 'icons/effects/lighting_overlay.dmi' // icon used for lighting shading effects
#define LIGHTING_ICON 'icons/effects/lighting_overlay.png' // icon used for lighting shading effects
#define LIGHTING_ROUND_VALUE (1 / 128) //Value used to round lumcounts, values smaller than 1/255 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY.
#define LIGHTING_SOFT_THRESHOLD 0.05 // If the max of the lighting lumcounts of each spectrum drops below this, disable luminosity on the lighting overlays.
// If I were you I'd leave this alone.
#define LIGHTING_BASE_MATRIX \
list \
( \
LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
0, 0, 0, 1 \
) \
// Helpers so we can (more easily) control the colour matrices.
#define CL_MATRIX_RR 1
#define CL_MATRIX_RG 2
#define CL_MATRIX_RB 3
#define CL_MATRIX_RA 4
#define CL_MATRIX_GR 5
#define CL_MATRIX_GG 6
#define CL_MATRIX_GB 7
#define CL_MATRIX_GA 8
#define CL_MATRIX_BR 9
#define CL_MATRIX_BG 10
#define CL_MATRIX_BB 11
#define CL_MATRIX_BA 12
#define CL_MATRIX_AR 13
#define CL_MATRIX_AG 14
#define CL_MATRIX_AB 15
#define CL_MATRIX_AA 16
#define CL_MATRIX_CR 17
#define CL_MATRIX_CG 18
#define CL_MATRIX_CB 19
#define CL_MATRIX_CA 20
+12 -9
View File
@@ -253,16 +253,19 @@
#define MAP_MAXZ 6
//Matricies
#define MATRIX_DEFAULT list(1, 0, 0, 0,\
0, 1, 0, 0,\
0, 0, 1, 0,\
0, 0, 0, 1)
#define MATRIX_GREYSCALE list(0.33, 0.33, 0.33,\
0.33, 0.33, 0.33,\
0.33, 0.33, 0.33)
#define MATRIX_VULP_CBLIND list(0.5,0.4,0.1,\
0.5,0.4,0.1,\
0.0,0.2,0.8)
#define MATRIX_TAJ_CBLIND list(0.4,0.2,0.4,\
0.4,0.6,0.0,\
0.2,0.2,0.6)
#define MATRIX_GREYSCALE list(0.33, 0.33, 0.33, 0,\
0.33, 0.33, 0.33, 0,\
0.33, 0.33, 0.33, 0,\
0.00, 0.00, 0.00, 1,\
0.00, 0.00, 0.00, 0)
//Gun trigger guards
#define TRIGGER_GUARD_ALLOW_ALL -1
#define TRIGGER_GUARD_NONE 0
+3
View File
@@ -0,0 +1,3 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
+1 -1
View File
@@ -7,7 +7,7 @@
/proc/animate_fade_grayscale(var/atom/A, var/time = 5)
if(!istype(A) && !istype(A, /client))
return
A.color = MATRIX_DEFAULT
A.color = null
animate(A, color = MATRIX_GREYSCALE, time = time, easing = SINE_EASING)
/proc/animate_melt_pixel(var/atom/A)
+17
View File
@@ -412,6 +412,23 @@
return 0
return 1
/proc/GetRedPart(const/hexa)
return hex2num(copytext(hexa, 2, 4))
/proc/GetGreenPart(const/hexa)
return hex2num(copytext(hexa, 4, 6))
/proc/GetBluePart(const/hexa)
return hex2num(copytext(hexa, 6, 8))
/proc/GetHexColors(const/hexa)
return list(
GetRedPart(hexa),
GetGreenPart(hexa),
GetBluePart(hexa),
)
/proc/MinutesToTicks(var/minutes as num)
return minutes * 60 * 10
+6
View File
@@ -884,3 +884,9 @@ proc/sort_atoms_by_layer(var/list/atoms)
icon = J
return J
return 0
//Hook, override to run code on- wait this is images
//Images have dir without being an atom, so they get their own definition.
//Lame.
/image/proc/setDir(newdir)
dir = newdir
+1 -1
View File
@@ -250,7 +250,7 @@ Proc for attack log creation, because really why not
*/
proc/add_logs(mob/user, mob/target, what_done, var/object=null, var/addition=null, var/admin=1, var/print_attack_log = 1)//print_attack_log notifies admins with attack logs on
var/list/ignore=list("shaked", "CPRed", "grabbed", "punched", "disarmed")
var/list/ignore=list("shaked", "CPRed", "grabbed", "disarmed")
if(!user)
return
if(ismob(user))
+5 -2
View File
@@ -1563,7 +1563,7 @@ var/mob/dview/dview_mob = new
//pre_rotation: Chooses to rotate src 90 degress towards the orbit dir (clockwise/anticlockwise), useful for things to go "head first" like ghosts
//lockinorbit: Forces src to always be on A's turf, otherwise the orbit cancels when src gets too far away (eg: ghosts)
/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE)
/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE, forceMove = FALSE)
if(!istype(A))
return
@@ -1595,7 +1595,10 @@ var/mob/dview/dview_mob = new
var/targetloc = get_turf(A)
if(!lockinorbit && loc != lastloc && loc != targetloc)
break
loc = targetloc
if(forceMove)
forceMove(targetloc)
else
loc = targetloc
lastloc = loc
sleep(0.6)
+1
View File
@@ -1,5 +1,6 @@
///////////
var/BLINDBLOCK = 0
var/COLOURBLINDBLOCK = 0
var/DEAFBLOCK = 0
var/HULKBLOCK = 0
var/TELEBLOCK = 0
+1
View File
@@ -23,6 +23,7 @@ var/global/list/rcd_list = list() //list of Rapid Construction Devices.
var/global/list/apcs = list()
var/global/list/air_alarms = list()
var/global/list/power_monitors = list()
var/global/list/all_vent_pumps = list()
var/global/list/navbeacons = list() //list of all bot nagivation beacons, used for patrolling.
var/global/list/deliverybeacons = list() //list of all MULEbot delivery beacons.
-3
View File
@@ -1,3 +0,0 @@
#define CLICKCATCHER_PLANE -99
#define HUD_PLANE 90
+93 -8
View File
@@ -1,18 +1,103 @@
var/global/datum/controller/process/lighting/lighting_controller
// Solves problems with lighting updates lagging shit
// Max constraints on number of updates per doWork():
#define MAX_LIGHT_UPDATES_PER_WORK 100
#define MAX_CORNER_UPDATES_PER_WORK 1000
#define MAX_OVERLAY_UPDATES_PER_WORK 2000
/var/lighting_overlays_initialised = FALSE
/var/list/lighting_update_lights = list() // List of lighting sources queued for update.
/var/list/lighting_update_corners = list() // List of lighting corners queued for update.
/var/list/lighting_update_overlays = list() // List of lighting overlays queued for update.
/var/list/lighting_update_lights_old = list() // List of lighting sources currently being updated.
/var/list/lighting_update_corners_old = list() // List of lighting corners currently being updated.
/var/list/lighting_update_overlays_old = list() // List of lighting overlays currently being updated.
/datum/controller/process/lighting
/datum/controller/process/lighting/setup()
name = "lighting"
schedule_interval = LIGHTING_INTERVAL
start_delay = 1
lighting_controller = src
create_lighting_overlays()
schedule_interval = world.tick_lag // run as fast as you possibly can
create_all_lighting_overlays()
lighting_overlays_initialised = TRUE
// Pre-process lighting once before the round starts. Wait 30 seconds so the away mission has time to load.
spawn(300)
doWork()
doWork(1)
/datum/controller/process/lighting/doWork(roundstart)
// Counters
var/light_updates = 0
var/corner_updates = 0
var/overlay_updates = 0
lighting_update_lights_old = lighting_update_lights //We use a different list so any additions to the update lists during a delay from scheck() don't cause things to be cut from the list without being updated.
lighting_update_lights = list()
for(var/datum/light_source/L in lighting_update_lights_old)
if(light_updates >= MAX_LIGHT_UPDATES_PER_WORK && !roundstart)
lighting_update_lights += L
continue // DON'T break, we're adding stuff back into the update queue.
if(L.check() || L.destroyed || L.force_update)
L.remove_lum()
if(!L.destroyed)
L.apply_lum()
else if(L.vis_update) //We smartly update only tiles that became (in) visible to use.
L.smart_vis_update()
L.vis_update = FALSE
L.force_update = FALSE
L.needs_update = FALSE
light_updates++
SCHECK
lighting_update_corners_old = lighting_update_corners //Same as above.
lighting_update_corners = list()
for(var/A in lighting_update_corners_old)
if(corner_updates >= MAX_CORNER_UPDATES_PER_WORK && !roundstart)
lighting_update_corners += A
continue // DON'T break, we're adding stuff back into the update queue.
var/datum/lighting_corner/C = A
C.update_overlays()
C.needs_update = FALSE
corner_updates++
SCHECK
lighting_update_overlays_old = lighting_update_overlays //Same as above.
lighting_update_overlays = list()
for(var/atom/movable/lighting_overlay/O in lighting_update_overlays_old)
if(overlay_updates >= MAX_OVERLAY_UPDATES_PER_WORK && !roundstart)
lighting_update_overlays += O
continue // DON'T break, we're adding stuff back into the update queue.
O.update_overlay()
O.needs_update = 0
overlay_updates++
SCHECK
/datum/controller/process/lighting/statProcess()
..()
stat(null, "[last_light_count] lights, [last_overlay_count] overlays")
stat(null, "[all_lighting_sources.len] light sources exist")
stat(null, "[all_lighting_corners.len] light corners exist")
stat(null, "[global.all_lighting_overlays.len] light overlays exist")
stat(null, "[lighting_update_lights.len] lighting sources queued")
stat(null, "[lighting_update_corners.len] lighting corners queued")
stat(null, "[lighting_update_overlays.len] lighting overlays queued")
// Lighting process code located in modules\lighting\lighting_process.dm
#undef MAX_LIGHT_UPDATES_PER_WORK
#undef MAX_CORNER_UPDATES_PER_WORK
#undef MAX_OVERLAY_UPDATES_PER_WORK
+3 -3
View File
@@ -38,7 +38,7 @@
var/continuous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
var/allow_Metadata = 0 // Metadata is supported.
var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1.
var/Ticklag = 0.9
var/Ticklag = 0.5
var/Tickcomp = 0
var/socket_talk = 0 // use socket_talk to communicate with other processes
var/list/resource_urls = null
@@ -575,10 +575,10 @@
if("round_abandon_penalty_period")
config.round_abandon_penalty_period = MinutesToTicks(text2num(value))
if("medal_hub_address")
global.medal_hub = value
if("medal_hub_password")
global.medal_pass = value
+1 -4
View File
@@ -17,7 +17,7 @@
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
return
/client/proc/debug_controller(controller in list("Master","failsafe","Ticker","Air","Lighting","Jobs","Sun","Radio","Configuration","pAI", "Cameras","Garbage", "Transfer Controller","Event","Alarm","Scheduler","Nano","Vote","Diseases","Fires","Mob","NPC AI","Shuttle","Timer","Weather","Space","Mob Hunt Server"))
/client/proc/debug_controller(controller in list("Master","failsafe","Ticker","Air","Jobs","Sun","Radio","Configuration","pAI", "Cameras","Garbage", "Transfer Controller","Event","Alarm","Scheduler","Nano","Vote","Diseases","Fires","Mob","NPC AI","Shuttle","Timer","Weather","Space","Mob Hunt Server"))
set category = "Debug"
set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -36,9 +36,6 @@
if("Air")
debug_variables(air_master)
feedback_add_details("admin_verb","DAir")
if("Lighting")
debug_variables(lighting_controller)
feedback_add_details("admin_verb","DLighting")
if("Jobs")
debug_variables(job_master)
feedback_add_details("admin_verb","DJobs")
+1
View File
@@ -54,6 +54,7 @@
var/has_been_rev = 0//Tracks if this mind has been a rev or not
var/miming = 0 // Mime's vow of silence
var/speech_span // What span any body this mind has talks in.
var/datum/faction/faction //associated faction
var/datum/changeling/changeling //changeling holder
var/linglink
+5
View File
@@ -26,6 +26,10 @@
for(var/obj/item in hand_items)
if(istype(item, /obj/item/organ/internal/brain)) //Yeah, sadly this doesn't work due to the organ system.
break
if(ABSTRACT in item.flags)
continue
if(NODROP in item.flags)
message += "This feels very redundant, but you go through with it anyway.<br>"
marked_item = item
message += "You mark [item] for recall.</span>"
name = "Recall [item]"
@@ -36,6 +40,7 @@
message = "<span class='caution'>You aren't holding anything that can be marked for recall.</span>"
else
message = "<span class='notice'>You must hold the desired item in your hands to mark it for recall.</span>"
else if(marked_item && marked_item in hand_items) //unlinking item to the spell
message = "<span class='notice'>You remove the mark on [marked_item] to use elsewhere.</span>"
name = "Instant Summons"
+14 -14
View File
@@ -106,14 +106,14 @@ var/list/ghostteleportlocs = list()
name = "\improper Admin Room"
icon_state = "start"
requires_power = 0
lighting_use_dynamic = 0
dynamic_lighting = 0
/area/adminconstruction
name = "\improper Admin Testing Area"
icon_state = "start"
requires_power = 0
lighting_use_dynamic = 0
dynamic_lighting = 0
/area/space
icon_state = "space"
@@ -466,7 +466,7 @@ var/list/ghostteleportlocs = list()
icon_state = "start"
requires_power = 0
luminosity = 1
lighting_use_dynamic = 0
dynamic_lighting = 0
has_gravity = 1
// === end remove
@@ -482,7 +482,7 @@ var/list/ghostteleportlocs = list()
name = "\improper Centcom"
icon_state = "centcom"
requires_power = 0
lighting_use_dynamic = 0
dynamic_lighting = 0
/area/centcom/control
name = "\improper Centcom Control"
@@ -563,7 +563,7 @@ var/list/ghostteleportlocs = list()
name = "\improper Thunderdome"
icon_state = "thunder"
requires_power = 0
lighting_use_dynamic = 0
dynamic_lighting = 0
/area/tdome/arena_source
@@ -648,7 +648,7 @@ var/list/ghostteleportlocs = list()
icon_state = "yellow"
requires_power = 0
has_gravity = 1
lighting_use_dynamic = 0
dynamic_lighting = 0
/area/wizard_station
name = "\improper Wizard's Den"
@@ -671,7 +671,7 @@ var/list/ghostteleportlocs = list()
name = "\improper Vox Base"
icon_state = "yellow"
requires_power = 0
lighting_use_dynamic = 0
dynamic_lighting = 0
no_teleportlocs = 1
/area/vox_station/transit
@@ -1228,7 +1228,7 @@ var/list/ghostteleportlocs = list()
/area/holodeck
name = "\improper Holodeck"
icon_state = "Holodeck"
lighting_use_dynamic = 0
dynamic_lighting = 0
/area/holodeck/alphadeck
name = "\improper Holodeck Alpha"
@@ -1365,7 +1365,7 @@ var/list/ghostteleportlocs = list()
/area/solar
requires_power = 0
lighting_use_dynamic = 0
dynamic_lighting = 0
auxport
name = "\improper Fore Port Solar Array"
@@ -2280,25 +2280,25 @@ area/security/podbay
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = 0
dynamic_lighting = 0
/area/turret_protected/AIsatextFS
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = 0
dynamic_lighting = 0
/area/turret_protected/AIsatextAS
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = 0
dynamic_lighting = 0
/area/turret_protected/AIsatextAP
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = 0
dynamic_lighting = 0
/area/turret_protected/NewAIMain
name = "\improper AI Main New"
@@ -2475,7 +2475,7 @@ area/security/podbay
name = "Beach"
icon_state = "beach"
luminosity = 1
lighting_use_dynamic = 0
dynamic_lighting = 0
requires_power = 0
ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg')
+1 -1
View File
@@ -29,7 +29,7 @@
if(type == /area) // override defaults for space. TODO: make space areas of type /area/space rather than /area
requires_power = 1
always_unpowered = 1
lighting_use_dynamic = 1
dynamic_lighting = 1
power_light = 0
power_equip = 0
power_environ = 0
+1 -1
View File
@@ -88,7 +88,7 @@ var/global/max_secret_rooms = 6
theme = "cavein"
walltypes = list(/turf/simulated/mineral/random/high_chance=1)
floortypes = list(/turf/simulated/floor/plating/airless/asteroid, /turf/simulated/floor/beach/sand)
treasureitems = list(/obj/mecha/working/ripley/mining=1, /obj/item/weapon/pickaxe/drill/diamonddrill=2,/obj/item/weapon/gun/energy/kinetic_accelerator/hyper=1,
treasureitems = list(/obj/mecha/working/ripley/mining=1, /obj/item/weapon/pickaxe/drill/diamonddrill=2,
/obj/item/weapon/resonator/upgraded=1, /obj/item/weapon/pickaxe/drill/jackhammer=5)
fluffitems = list(/obj/effect/decal/cleanable/blood=3,/obj/effect/decal/remains/human=1,/obj/item/clothing/under/overalls=1,
/obj/item/weapon/reagent_containers/food/snacks/grown/chili=1,/obj/item/weapon/tank/oxygen/red=2)
+4 -5
View File
@@ -81,6 +81,10 @@
reagents = null
invisibility = 101
return ..()
//Hook for running code when a dir change occurs
/atom/proc/setDir(newdir)
dir = newdir
/atom/proc/CheckParts(list/parts_list)
for(var/A in parts_list)
@@ -222,11 +226,6 @@
/atom/proc/relaymove()
return
//called to set the atom's dir and used to add behaviour to dir-changes - Not fully used (yet)
/atom/proc/set_dir(new_dir)
. = new_dir != dir
dir = new_dir
/atom/proc/ex_act()
return
+6
View File
@@ -32,7 +32,13 @@
/atom/movable/Destroy()
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
+19 -2
View File
@@ -115,6 +115,24 @@
/datum/dna/gene/disability/blindness/New()
block=BLINDBLOCK
/datum/dna/gene/disability/colourblindness
name = "Colourblindness"
activation_message = "You feel a peculiar prickling in your eyes while your perception of colour changes."
deactivation_message ="Your eyes tingle unsettlingly, though everything seems to become alot more colourful."
instability = -GENE_INSTABILITY_MODERATE
disability = COLOURBLIND
/datum/dna/gene/disability/colourblindness/New()
block=COLOURBLINDBLOCK
/datum/dna/gene/disability/colourblindness/activate(var/mob/M, var/connected, var/flags)
..()
M.update_client_colour() //Handle the activation of the colourblindness on the mob.
/datum/dna/gene/disability/colourblindness/deactivate(var/mob/M, var/connected, var/flags)
..()
M.update_client_colour() //Handle the deactivation of the colourblindness on the mob.
/datum/dna/gene/disability/deaf
name="Deafness"
activation_message="It's kinda quiet."
@@ -126,7 +144,7 @@
block=DEAFBLOCK
/datum/dna/gene/disability/deaf/activate(var/mob/M, var/connected, var/flags)
..(M,connected,flags)
..()
M.EarDeaf(1)
/datum/dna/gene/disability/nearsighted
@@ -139,7 +157,6 @@
/datum/dna/gene/disability/nearsighted/New()
block=GLASSESBLOCK
/datum/dna/gene/disability/lisp
name = "Lisp"
desc = "I wonder wath thith doeth."
+5 -5
View File
@@ -135,13 +135,13 @@
message = replacetextEx(message,"w","v")
message = replacetextEx(message,"J","Y")
message = replacetextEx(message,"j","y")
message = replacetextEx(message,"A",pick("Å","Ä","Æ","A"))
message = replacetextEx(message,"a",pick("å","ä","æ","a"))
message = replacetextEx(message,"A",pick("Å","Ä","Æ","A"))
message = replacetextEx(message,"a",pick("å","ä","æ","a"))
message = replacetextEx(message,"BO","BJO")
message = replacetextEx(message,"Bo","Bjo")
message = replacetextEx(message,"bo","bjo")
message = replacetextEx(message,"O",pick("Ö","Ø","O"))
message = replacetextEx(message,"o",pick("ö","ø","o"))
message = replacetextEx(message,"O",pick("Ö","Ø","O"))
message = replacetextEx(message,"o",pick("ö","ø","o"))
if(prob(30))
message += " Bork[pick("",", bork",", bork, bork")]!"
return message
@@ -259,7 +259,7 @@
action_icon_state = "genetic_incendiary"
/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets,mob/living/user = usr)
/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets, mob/living/user = usr)
var/mob/living/carbon/L = user
L.adjust_fire_stacks(0.5)
L.visible_message("<span class='danger'>[L.name]</b> suddenly bursts into flames!</span>")
+81 -94
View File
@@ -57,12 +57,7 @@
var/turf/simulated/T = get_turf(M)
if(!istype(T))
return
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
var/light_available
if(L)
light_available = L.get_clamped_lum()*10
else
light_available = 5
var/light_available = T.get_lumcount() * 10
if(light_available <= 2)
M.alpha = round(M.alpha * 0.8)
else
@@ -148,15 +143,15 @@
action_icon_state = "genetic_cryo"
/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets)
/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets, mob/user = usr)
if(!targets.len)
to_chat(usr, "<span class='notice'>No target found in range.</span>")
to_chat(user, "<span class='notice'>No target found in range.</span>")
return
var/mob/living/carbon/C = targets[1]
if(!iscarbon(C))
to_chat(usr, "<span class='warning'>This will only work on normal organic beings.</span>")
to_chat(user, "<span class='warning'>This will only work on normal organic beings.</span>")
return
if(RESIST_COLD in C.mutations)
@@ -169,15 +164,15 @@
if(istype(H.wear_suit, /obj/item/clothing/suit/space))
handle_suit = 1
if(H.internal)
H.visible_message("<span class='warning'>[usr] sprays a cloud of fine ice crystals, engulfing [H]!</span>",
"<span class='notice'>[usr] sprays a cloud of fine ice crystals over your [H.head]'s visor.</span>")
log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] while wearing internals and a suit")
msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
H.visible_message("<span class='warning'>[user] sprays a cloud of fine ice crystals, engulfing [H]!</span>",
"<span class='notice'>[user] sprays a cloud of fine ice crystals over your [H.head]'s visor.</span>")
log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] while wearing internals and a suit")
msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
else
H.visible_message("<span class='warning'>[usr] sprays a cloud of fine ice crystals engulfing, [H]!</span>",
"<span class='warning'>[usr] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.</span>")
log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)]")
msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
H.visible_message("<span class='warning'>[user] sprays a cloud of fine ice crystals engulfing, [H]!</span>",
"<span class='warning'>[user] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.</span>")
log_admin("[key_name(user)] has used cryokinesis on [key_name(C)]")
msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
H.bodytemperature = max(0, H.bodytemperature - 50)
H.adjustFireLoss(5)
if(!handle_suit)
@@ -185,11 +180,11 @@
C.adjustFireLoss(10)
C.ExtinguishMob()
C.visible_message("\red [usr] sprays a cloud of fine ice crystals, engulfing [C]!")
log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] without internals or a suit")
msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
C.visible_message("\red [user] sprays a cloud of fine ice crystals, engulfing [C]!")
log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] without internals or a suit")
msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
//playsound(usr.loc, 'bamf.ogg', 50, 0)
//playsound(user.loc, 'bamf.ogg', 50, 0)
new/obj/effect/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis"))
@@ -299,10 +294,9 @@
revert_cast(user)
return
perform(targets)
perform(targets, user = user)
/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets)
var/mob/user = usr
/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets, mob/user = usr)
if(!targets.len)
to_chat(user, "<span class='notice'>No target found in range.</span>")
return
@@ -388,60 +382,60 @@
action_icon_state = "genetic_jump"
/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets)
/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets, mob/user = usr)
var/failure = 0
if(istype(usr.loc,/mob/) || usr.lying || usr.stunned || usr.buckled || usr.stat)
to_chat(usr, "<span class='warning'>You can't jump right now!</span>")
if(istype(user.loc,/mob/) || user.lying || user.stunned || user.buckled || user.stat)
to_chat(user, "<span class='warning'>You can't jump right now!</span>")
return
if(istype(usr.loc,/turf/))
if(usr.restrained())//Why being pulled while cuffed prevents you from moving
for(var/mob/M in range(usr, 1))
if(M.pulling == usr)
if(!M.restrained() && M.stat == 0 && M.canmove && usr.Adjacent(M))
if(istype(user.loc,/turf/))
if(user.restrained())//Why being pulled while cuffed prevents you from moving
for(var/mob/M in range(user, 1))
if(M.pulling == user)
if(!M.restrained() && M.stat == 0 && M.canmove && user.Adjacent(M))
failure = 1
else
M.stop_pulling()
if(usr.pinned.len)
if(user.pinned.len)
failure = 1
usr.visible_message("<span class='danger'>[usr.name]</b> takes a huge leap!</span>")
playsound(usr.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
user.visible_message("<span class='danger'>[user.name]</b> takes a huge leap!</span>")
playsound(user.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
if(failure)
usr.Weaken(5)
usr.Stun(5)
usr.visible_message("<span class='warning'>[usr] attempts to leap away but is slammed back down to the ground!</span>",
user.Weaken(5)
user.Stun(5)
user.visible_message("<span class='warning'>[user] attempts to leap away but is slammed back down to the ground!</span>",
"<span class='warning'>You attempt to leap away but are suddenly slammed back down to the ground!</span>",
"<span class='notice'>You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor.</span>")
return 0
var/prevLayer = usr.layer
var/prevFlying = usr.flying
usr.layer = 9
var/prevLayer = user.layer
var/prevFlying = user.flying
user.layer = 9
usr.flying = 1
user.flying = 1
for(var/i=0, i<10, i++)
step(usr, usr.dir)
if(i < 5) usr.pixel_y += 8
else usr.pixel_y -= 8
step(user, user.dir)
if(i < 5) user.pixel_y += 8
else user.pixel_y -= 8
sleep(1)
usr.flying = prevFlying
user.flying = prevFlying
if(FAT in usr.mutations && prob(66))
usr.visible_message("<span class='danger'>[usr.name]</b> crashes due to their heavy weight!</span>")
//playsound(usr.loc, 'zhit.wav', 50, 1)
usr.AdjustWeakened(10)
usr.AdjustStunned(5)
if(FAT in user.mutations && prob(66))
user.visible_message("<span class='danger'>[user.name]</b> crashes due to their heavy weight!</span>")
//playsound(user.loc, 'zhit.wav', 50, 1)
user.AdjustWeakened(10)
user.AdjustStunned(5)
usr.layer = prevLayer
user.layer = prevLayer
if(istype(usr.loc,/obj/))
var/obj/container = usr.loc
to_chat(usr, "<span class='warning'>You leap and slam your head against the inside of [container]! Ouch!</span>")
usr.AdjustParalysis(3)
usr.AdjustWeakened(5)
container.visible_message("<span class='danger'>[usr.loc]</b> emits a loud thump and rattles a bit.</span>")
playsound(usr.loc, 'sound/effects/bang.ogg', 50, 1)
if(istype(user.loc,/obj/))
var/obj/container = user.loc
to_chat(user, "<span class='warning'>You leap and slam your head against the inside of [container]! Ouch!</span>")
user.AdjustParalysis(3)
user.AdjustWeakened(5)
container.visible_message("<span class='danger'>[user.loc]</b> emits a loud thump and rattles a bit.</span>")
playsound(user.loc, 'sound/effects/bang.ogg', 50, 1)
var/wiggle = 6
while(wiggle > 0)
wiggle--
@@ -451,9 +445,6 @@
container.pixel_x = 0
container.pixel_y = 0
return
////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/polymorphism
@@ -480,6 +471,7 @@
charge_max = 1800
clothes_req = 0
human_req = 1
stat_allowed = 0
invocation_type = "none"
range = 1
@@ -487,21 +479,18 @@
action_icon_state = "genetic_poly"
/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets)
var/mob/living/M=targets[1]
/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets, mob/user = usr)
var/mob/living/M = targets[1]
if(!ishuman(M))
to_chat(usr, "<span class='warning'>You can only change your appearance to that of another human.</span>")
return
if(!ishuman(usr))
return
usr.visible_message("<span class='warning'>[usr]'s body shifts and contorts.</span>")
user.visible_message("<span class='warning'>[user]'s body shifts and contorts.</span>")
spawn(10)
if(M && usr)
playsound(usr.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
var/mob/living/carbon/human/H = usr
if(M && user)
playsound(user.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
var/mob/living/carbon/human/H = user
var/mob/living/carbon/human/target = M
H.UpdateAppearance(target.dna.UI)
H.real_name = target.real_name
@@ -529,6 +518,7 @@
desc = "Read the minds of others for information."
charge_max = 180
clothes_req = 0
human_req = 1
stat_allowed = 0
invocation_type = "none"
range = -2
@@ -544,29 +534,26 @@
revert_cast(user)
return
perform(targets)
/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets)
if(!ishuman(usr)) return
perform(targets, user = user)
/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/M in targets)
if(!iscarbon(M))
to_chat(usr, "<span class='warning'>You may only use this on other organic beings.</span>")
to_chat(user, "<span class='warning'>You may only use this on other organic beings.</span>")
return
if(PSY_RESIST in M.mutations)
to_chat(usr, "<span class='warning'>You can't see into [M.name]'s mind at all!</span>")
to_chat(user, "<span class='warning'>You can't see into [M.name]'s mind at all!</span>")
return
if(M.stat == 2)
to_chat(usr, "<span class='warning'>[M.name] is dead and cannot have their mind read.</span>")
to_chat(user, "<span class='warning'>[M.name] is dead and cannot have their mind read.</span>")
return
if(M.health < 0)
to_chat(usr, "<span class='warning'>[M.name] is dying, and their thoughts are too scrambled to read.</span>")
to_chat(user, "<span class='warning'>[M.name] is dying, and their thoughts are too scrambled to read.</span>")
return
to_chat(usr, "<span class='notice'>Mind Reading of <b>[M.name]:</b></span>")
to_chat(user, "<span class='notice'>Mind Reading of <b>[M.name]:</b></span>")
var/pain_condition = M.health
// lower health means more pain
var/list/randomthoughts = list("what to have for lunch","the future","the past","money",
@@ -583,33 +570,33 @@
switch(pain_condition)
if(81 to INFINITY)
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] feels good.</span>")
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] feels good.</span>")
if(61 to 80)
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering mild pain.</span>")
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering mild pain.</span>")
if(41 to 60)
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering significant pain.</span>")
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering significant pain.</span>")
if(21 to 40)
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering severe pain.</span>")
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering severe pain.</span>")
else
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering excruciating pain.</span>")
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering excruciating pain.</span>")
thoughts = "haunted by their own mortality"
switch(M.a_intent)
if(I_HELP)
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense benevolent thoughts from [M.name].</span>")
to_chat(user, "<span class='notice'><b>Mood</b>: You sense benevolent thoughts from [M.name].</span>")
if(I_DISARM)
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense cautious thoughts from [M.name].</span>")
to_chat(user, "<span class='notice'><b>Mood</b>: You sense cautious thoughts from [M.name].</span>")
if(I_GRAB)
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense hostile thoughts from [M.name].</span>")
to_chat(user, "<span class='notice'><b>Mood</b>: You sense hostile thoughts from [M.name].</span>")
if(I_HARM)
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense cruel thoughts from [M.name].</span>")
to_chat(user, "<span class='notice'><b>Mood</b>: You sense cruel thoughts from [M.name].</span>")
for(var/mob/living/L in view(7,M))
if(L == M)
continue
thoughts = "thinking about punching [L.name]"
break
else
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense strange thoughts from [M.name].</span>")
to_chat(user, "<span class='notice'><b>Mood</b>: You sense strange thoughts from [M.name].</span>")
if(istype(M,/mob/living/carbon/human))
var/numbers[0]
@@ -618,11 +605,11 @@
numbers += H.mind.initial_account.account_number
numbers += H.mind.initial_account.remote_access_pin
if(numbers.len>0)
to_chat(usr, "<span class='notice'><b>Numbers</b>: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].</span>")
to_chat(usr, "<span class='notice'><b>Thoughts</b>: [M.name] is currently [thoughts].</span>")
to_chat(user, "<span class='notice'><b>Numbers</b>: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].</span>")
to_chat(user, "<span class='notice'><b>Thoughts</b>: [M.name] is currently [thoughts].</span>")
if(EMPATH in M.mutations)
to_chat(M, "<span class='warning'>You sense [usr.name] reading your mind.</span>")
to_chat(M, "<span class='warning'>You sense [user.name] reading your mind.</span>")
else if(prob(5) || M.mind.assigned_role=="Chaplain")
to_chat(M, "<span class='warning'>You sense someone intruding upon your thoughts...</span>")
return
@@ -24,15 +24,18 @@
if(!user)
return 0
to_chat(user, "<span class='notice'>We transform our appearance.</span>")
user.dna.SetSEState(MONKEYBLOCK,0)
domutcheck(user, null) // Do a pre-mutcheck to cleanly switch from monkey form.
user.dna = chosen_dna
user.dna.SetSEState(MONKEYBLOCK,0,1)
genemutcheck(user,MONKEYBLOCK,null,MUTCHK_FORCED)
user.dna = chosen_dna.Clone()
user.real_name = chosen_dna.real_name
if(istype(user))
user.set_species(chosen_dna.species)
domutcheck(user,null,MUTCHK_FORCED)
user.flavor_text = ""
if(ishuman(user))
user.set_species()
user.dna.UpdateSE()
user.dna.UpdateUI()
user.sync_organ_dna(1)
user.UpdateAppearance()
domutcheck(user, null)
changeling.purchasedpowers -= src
//O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/lesserform(null)
@@ -21,6 +21,7 @@
to_chat(H, "<span class='warning'>We cannot perform this ability in this form!</span>")
return
user.dna = user.dna.Clone()
H.visible_message("<span class='warning'>[H] transforms!</span>")
changeling.geneticdamage = 30
to_chat(H, "<span class='warning'>Our genes cry out!</span>")
@@ -16,12 +16,15 @@
return
user.dna = chosen_dna.Clone()
user.real_name = chosen_dna.real_name
user.flavor_text = ""
if(ishuman(user))
user.set_species()
user.set_species(chosen_dna.species)
domutcheck(user, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
user.flavor_text = ""
user.dna.UpdateSE()
user.dna.UpdateUI()
user.sync_organ_dna(1)
user.UpdateAppearance()
domutcheck(user, null)
user.changeling_update_languages(changeling.absorbed_languages)
feedback_add_details("changeling_powers","TR")
@@ -193,10 +193,9 @@
return ..()
/datum/action/innate/demon/whisper/proc/choose_targets(mob/user = usr)//yes i am copying from telepathy..hush...
var/list/targets = new /list()
var/list/validtargets = new /list()
for(var/mob/M in view(user.client.view, user))
if(M && M.mind)
var/list/validtargets = list()
for(var/mob/living/M in view(user.client.view, get_turf(user)))
if(M && M.mind && M.stat != DEAD)
if(M == user)
continue
@@ -206,15 +205,12 @@
to_chat(usr, "<span class='warning'>There are no valid targets!</span>")
return
targets += input("Choose the target to talk to.", "Targeting") as null|mob in validtargets
if(!targets.len || !targets[1])
return
var/mob/living/target = input("Choose the target to talk to.", "Targeting") as null|mob in validtargets
return target
/datum/action/innate/demon/whisper/Activate()
var/list/choice = choose_targets()
if(!choice.len)
var/mob/living/choice = choose_targets()
if(!choice)
return
var/msg = stripped_input(usr, "What do you wish to tell [choice]?", null, "")
@@ -1,5 +1,5 @@
#define CHALLENGE_TIME_LIMIT 6000
#define MIN_CHALLENGE_PLAYERS 50
#define CHALLENGE_MIN_PLAYERS 50
#define CHALLENGE_SHUTTLE_DELAY 15000 //25 minutes, so the ops have at least 5 minutes before the shuttle is callable.
/obj/item/device/nuclear_challenge
@@ -9,33 +9,42 @@
desc = "Use to send a declaration of hostilities to the target, delaying your shuttle departure for 20 minutes while they prepare for your assault. \
Such a brazen move will attract the attention of powerful benefactors within the Syndicate, who will supply your team with a massive amount of bonus telecrystals. \
Must be used within five minutes, or your benefactors will lose interest."
var/declaring_war = 0
var/declaring_war = FALSE
/obj/item/device/nuclear_challenge/attack_self(mob/living/user)
if(declaring_war)
return
if(player_list.len < MIN_CHALLENGE_PLAYERS)
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
return
if(!is_admin_level(user.z))
to_chat(user, "You have to be at your base to use this.")
if(!check_allowed(user))
return
if(world.time > CHALLENGE_TIME_LIMIT)
to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")
declaring_war = TRUE
var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew? You have [-round((world.time-round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No")
declaring_war = FALSE
if(!check_allowed(user))
return
declaring_war = 1
var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew?", "Declare war?", "Yes", "No")
if(are_you_sure == "No")
to_chat(user, "On second thought, the element of surprise isn't so bad after all.")
declaring_war = 0
return
var/war_declaration = "[user.real_name] has declared his intent to utterly destroy [station_name()] with a nuclear device, and dares the crew to try and stop them."
declaring_war = TRUE
var/custom_threat = alert(user, "Do you want to customize your declaration?", "Customize?", "Yes", "No")
declaring_war = FALSE
if(!check_allowed(user))
return
if(custom_threat == "Yes")
declaring_war = TRUE
war_declaration = stripped_input(user, "Insert your custom declaration", "Declaration")
declaring_war = FALSE
if(!check_allowed(user) || !war_declaration)
return
event_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg')
to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.")
for(var/obj/machinery/computer/shuttle/syndicate/S in machines)
@@ -47,7 +56,25 @@
config.shuttle_refuel_delay = CHALLENGE_SHUTTLE_DELAY
qdel(src)
/obj/item/device/nuclear_challenge/proc/check_allowed(mob/living/user)
if(declaring_war)
to_chat(user, "You are already in the process of declaring war! Make your mind up.")
return FALSE
if(player_list.len < CHALLENGE_MIN_PLAYERS)
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
return FALSE
if(!is_admin_level(user.z))
to_chat(user, "You have to be at your base to use this.")
return FALSE
if(world.time > CHALLENGE_TIME_LIMIT)
to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")
return FALSE
for(var/obj/machinery/computer/shuttle/syndicate/S in machines)
if(S.moved)
to_chat(user, "The shuttle has already been moved! You have forfeit the right to declare war.")
return FALSE
return TRUE
#undef CHALLENGE_TIME_LIMIT
#undef MIN_CHALLENGE_PLAYERS
#undef CHALLENGE_MIN_PLAYERS
#undef CHALLENGE_SHUTTLE_DELAY
+1
View File
@@ -35,6 +35,7 @@
// Standard muts
BLINDBLOCK = getAssignedBlock("BLIND", numsToAssign)
COLOURBLINDBLOCK = getAssignedBlock("COLOURBLIND", numsToAssign)
DEAFBLOCK = getAssignedBlock("DEAF", numsToAssign)
HULKBLOCK = getAssignedBlock("HULK", numsToAssign, DNA_HARD_BOUNDS, good=1)
TELEBLOCK = getAssignedBlock("TELE", numsToAssign, DNA_HARD_BOUNDS, good=1)
@@ -84,8 +84,8 @@
P.visible_message("<span class='danger'>[P]'s light fades and turns off.</span>")
else if(istype(I, /obj/item/weapon/gun))
var/obj/item/weapon/gun/G = I
if(G.F)
var/obj/item/device/flashlight/F = G.F
if(G.gun_light)
var/obj/item/device/flashlight/F = G.gun_light
if(F.on)
G.toggle_gunlight()
G.visible_message("<span class='danger'>[G]'s light fades and turns off.</span>")
+2 -6
View File
@@ -416,12 +416,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
owner.alpha = 255
return
var/turf/simulated/T = get_turf(owner)
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
var/light_available
if(L)
light_available = L.get_clamped_lum(0.5) * 10
else
light_available = 10
var/light_available = T.get_lumcount(0.5) * 10
if(!istype(T))
return 0
@@ -429,6 +424,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
if(!iscloaking)
owner.alpha = 255
return 0
if(light_available <= 2)
owner.alpha = round((255 * 0.15))
return 1
@@ -479,8 +479,7 @@
if(T.y > world.maxy-outer_tele_radius || T.y < outer_tele_radius)
continue
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
var/lightingcount = L.get_clamped_lum(0.5) * 10
var/lightingcount = T.get_lumcount(0.5) * 10
// LIGHTING CHECK
if(lightingcount > max_lum)
+7 -1
View File
@@ -786,6 +786,7 @@ var/global/list/multiverse = list()
GiveHint(target)
cooldown = world.time +cooldown_time
return
if(!link)
if(I.loc == user && istype(I) && I.w_class <= 2)
user.drop_item()
@@ -794,13 +795,17 @@ var/global/list/multiverse = list()
to_chat(user, "You attach [I] to the doll.")
update_targets()
..()
/obj/item/voodoo/check_eye(mob/user as mob)
return src.loc == user
if(loc != user)
user.reset_perspective(null)
user.unset_machine()
/obj/item/voodoo/attack_self(mob/user as mob)
if(!target && possible.len)
target = input(user, "Select your victim!", "Voodoo") as null|anything in possible
return
if(user.zone_sel.selecting == "chest")
if(link)
target = null
@@ -809,6 +814,7 @@ var/global/list/multiverse = list()
link = null
update_targets()
return
if(target && cooldown < world.time)
switch(user.zone_sel.selecting)
if("mouth")
+5
View File
@@ -32,6 +32,11 @@
attached_spell.attached_hand = null
qdel(src)
/obj/item/weapon/melee/touch_attack/dropped()
if(attached_spell)
attached_spell.attached_hand = null
qdel(src)
/obj/item/weapon/melee/touch_attack/disintegrate
name = "disintegrating touch"
desc = "This hand of mine glows with an awesome power!"
+3 -3
View File
@@ -1,7 +1,7 @@
/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam")
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam")
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic")
@@ -76,8 +76,8 @@
new /obj/item/weapon/gun/energy/decloner(get_turf(H))
if("mindflayer")
new /obj/item/weapon/gun/energy/mindflayer(get_turf(H))
if("hyperkinetic")
new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(get_turf(H))
if("kinetic")
new /obj/item/weapon/gun/energy/kinetic_accelerator(get_turf(H))
if("advplasmacutter")
new /obj/item/weapon/gun/energy/plasmacutter/adv(get_turf(H))
if("wormhole")
+116 -69
View File
@@ -8,84 +8,118 @@
slot_flags = SLOT_BELT
origin_tech = "bluespace=4;materials=4"
var/imprinted = "empty"
var/usability = TRUE // Can this soul stone be used by anyone, or only cultists/wizards?
var/reusable = TRUE // Can this soul stone be used more than once?
var/spent = FALSE // If the soul stone can only be used once, has it been used?
/obj/item/device/soulstone/proc/can_use(mob/living/user)
if(iscultist(user) || iswizard(user) || usability)
return TRUE
//////////////////////////////Capturing////////////////////////////////////////////////////////
return FALSE
/obj/item/device/soulstone/proc/was_used()
if(!reusable)
spent = TRUE
name = "dull [name]"
desc = "A fragment of the legendary treasure known simply as \
the 'Soul Stone'. The shard lies still, dull and lifeless; \
whatever spark it once held long extinguished."
/obj/item/device/soulstone/anybody
usability = TRUE
attack(mob/living/carbon/human/M as mob, mob/user as mob)
if(!istype(M, /mob/living/carbon/human))//If target is not a human.
return ..()
if(istype(M, /mob/living/carbon/human/dummy))
return ..()
if(M.has_brain_worms()) //Borer stuff - RR
to_chat(user, "<span class='warning'>This being is corrupted by an alien intelligence and cannot be soul trapped.</span>")
return ..()
if(jobban_isbanned(M, "cultist") || jobban_isbanned(M, "Syndicate"))
to_chat(user, "<span class='warning'>A mysterious force prevents you from trapping this being's soul.</span>")
return ..()
M.create_attack_log("<font color='orange'>Has had their soul captured with [src.name] by [key_name(user)]</font>")
user.create_attack_log("<font color='red'>Used the [src.name] to capture the soul of [key_name(M)]</font>")
log_attack("<font color='red'>[key_name(user)] used the [src.name] to capture the soul of [key_name(M)]</font>")
transfer_soul("VICTIM", M, user)
/obj/item/device/soulstone/anybody/chaplain
name = "mysterious old shard"
reusable = FALSE
/obj/item/device/soulstone/pickup(mob/living/user)
..()
if(!can_use(user))
to_chat(user, "<span class='danger'>An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly.</span>")
user.Dizzy(120)
//////////////////////////////Capturing////////////////////////////////////////////////////////
/obj/item/device/soulstone/attack(mob/living/carbon/human/M as mob, mob/user as mob)
if(!can_use(user))
user.Paralyse(5)
to_chat(user, "<span class='userdanger'>Your body is wracked with debilitating pain!</span>")
return
/*attack(mob/living/simple_animal/shade/M as mob, mob/user as mob)//APPARENTLY THEY NEED THEIR OWN SPECIAL SNOWFLAKE CODE IN THE LIVING ANIMAL DEFINES
if(!istype(M, /mob/living/simple_animal/shade))//If target is not a shade
return ..()
user.create_attack_log("<font color='red'>Used the [src.name] to capture the soul of [M.name] ([M.ckey])</font>")
transfer_soul("SHADE", M, user)
return*/
///////////////////Options for using captured souls///////////////////////////////////////
attack_self(mob/user)
if(!in_range(src, user))
return
user.set_machine(src)
var/dat = "<TT><B>Soul Stone</B><BR>"
for(var/mob/living/simple_animal/shade/A in src)
dat += "Captured Soul: [A.name]<br>"
dat += {"<A href='byond://?src=[UID()];choice=Summon'>Summon Shade</A>"}
dat += "<br>"
dat += {"<a href='byond://?src=[UID()];choice=Close'> Close</a>"}
user << browse(dat, "window=aicard")
onclose(user, "aicard")
if(spent)
to_chat(user, "<span class='warning'>There is no power left in the shard.</span>")
return
if(!ishuman(M) || istype(M, /mob/living/carbon/human/dummy)) //If target is not a human or a dummy
return ..()
if(M.has_brain_worms()) //Borer stuff - RR
to_chat(user, "<span class='warning'>This being is corrupted by an alien intelligence and cannot be soul trapped.</span>")
return ..()
if(jobban_isbanned(M, "cultist") || jobban_isbanned(M, "Syndicate"))
to_chat(user, "<span class='warning'>A mysterious force prevents you from trapping this being's soul.</span>")
return ..()
M.create_attack_log("<font color='orange'>Has had their soul captured with [src.name] by [key_name(user)]</font>")
user.create_attack_log("<font color='red'>Used the [src.name] to capture the soul of [key_name(M)]</font>")
log_attack("<font color='red'>[key_name(user)] used the [src.name] to capture the soul of [key_name(M)]</font>")
Topic(href, href_list)
var/mob/U = usr
if(!in_range(src, U)||U.machine!=src)
transfer_soul("VICTIM", M, user)
return
///////////////////Options for using captured souls///////////////////////////////////////
/obj/item/device/soulstone/attack_self(mob/user)
if(!in_range(src, user))
return
if(!can_use(user))
user.Paralyse(5)
to_chat(user, "<span class='userdanger'>Your body is wracked with debilitating pain!</span>")
return
user.set_machine(src)
var/dat = "<TT><B>Soul Stone</B><BR>"
for(var/mob/living/simple_animal/shade/A in src)
dat += "Captured Soul: [A.name]<br>"
dat += {"<A href='byond://?src=[UID()];choice=Summon'>Summon Shade</A>"}
dat += "<br>"
dat += {"<a href='byond://?src=[UID()];choice=Close'> Close</a>"}
user << browse(dat, "window=aicard")
onclose(user, "aicard")
return
/obj/item/device/soulstone/Topic(href, href_list)
var/mob/U = usr
if(!in_range(src, U) || U.machine != src || !can_use(usr))
U << browse(null, "window=aicard")
U.unset_machine()
return
add_fingerprint(U)
U.set_machine(src)
switch(href_list["choice"])//Now we switch based on choice.
if("Close")
U << browse(null, "window=aicard")
U.unset_machine()
return
add_fingerprint(U)
U.set_machine(src)
switch(href_list["choice"])//Now we switch based on choice.
if("Close")
U << browse(null, "window=aicard")
U.unset_machine()
return
if("Summon")
for(var/mob/living/simple_animal/shade/A in src)
A.status_flags &= ~GODMODE
A.canmove = 1
to_chat(A, "<b>You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs.</b>")
A.loc = U.loc
A.cancel_camera()
src.icon_state = "soulstone"
attack_self(U)
if("Summon")
for(var/mob/living/simple_animal/shade/A in src)
A.status_flags &= ~GODMODE
A.canmove = 1
A.forceMove(get_turf(usr))
A.cancel_camera()
icon_state = "soulstone"
name = initial(name)
if(iswizard(usr) || usability)
to_chat(A, "<b>You have been released from your prison, but you are still bound to [usr.real_name]'s will. Help them succeed in their goals at all costs.</b>")
else if(iscultist(usr))
to_chat(A, "<b>You have been released from your prison, but you are still bound to the cult's will. Help them succeed in their goals at all costs.</b>")
was_used()
attack_self(U)
///////////////////////////Transferring to constructs/////////////////////////////////////////////////////
/obj/structure/constructshell
@@ -93,15 +127,30 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "construct"
desc = "A wicked machine used by those skilled in magical arts. It is inactive"
/obj/structure/constructshell/examine(mob/user)
if(..(user, 0))
if(iscultist(user) || iswizard(user) || user.stat == DEAD)
to_chat(user, "<span class='cult'>A construct shell, used to house bound souls from a soulstone.</span>")
to_chat(user, "<span class='cult'>Placing a soulstone with a soul into this shell allows you to produce your choice of the following:</span>")
to_chat(user, "<span class='cult'>An <b>Artificer</b>, which can produce <b>more shells and soulstones</b>, as well as fortifications.</span>")
to_chat(user, "<span class='cult'>A <b>Wraith</b>, which does high damage and can jaunt through walls, though it is quite fragile.</span>")
to_chat(user, "<span class='cult'>A <b>Juggernaut</b>, which is very hard to kill and can produce temporary walls, but is slow.</span>")
/obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/device/soulstone))
O.transfer_soul("CONSTRUCT",src,user)
var/obj/item/device/soulstone/SS = O
if(!SS.can_use(user))
to_chat(user, "<span class='danger'>An overwhelming feeling of dread comes over you as you attempt to place the soulstone into the shell. It would be wise to be rid of this quickly.</span>")
user.Dizzy(120)
return
SS.transfer_soul("CONSTRUCT",src,user)
SS.was_used()
else
return ..()
////////////////////////////Proc for moving soul in and out off stone//////////////////////////////////////
/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob).
switch(choice)
if("FORCE")
@@ -238,7 +287,6 @@
to_chat(newstruct, "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>")
newstruct.cancel_camera()
/obj/item/device/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/U, vic = 0)
new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
T.invisibility = 101
@@ -268,7 +316,6 @@
if(vic && U)
to_chat(U, "<span class='info'><b>Capture successful!</b>:</span> [T.real_name]'s soul has been ripped from their body and stored within the soul stone.")
/obj/item/device/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/U)
var/mob/dead/observer/chosen_ghost
-1
View File
@@ -848,7 +848,6 @@
to_chat(user, "<span class='warning'>[src] suddenly vanishes!</span>")
qdel(src)
/obj/item/weapon/spellbook/oneuse/fake_gib
spell = /obj/effect/proc_holder/spell/targeted/touch/fake_disintegrate
spellname = "disintegrate"
+1 -1
View File
@@ -8,7 +8,7 @@
supervisors = "your laws"
req_admin_notify = 1
minimal_player_age = 30
exp_requirements = 600
exp_requirements = 1200
exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
+3 -1
View File
@@ -13,7 +13,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
access = list() //See get_access()
minimal_access = list() //See get_access()
minimal_player_age = 30
exp_requirements = 600
exp_requirements = 1200
exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -237,6 +237,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
alt_titles = list("Lawyer","Public Defender")
minimal_player_age = 30
exp_requirements = 300
exp_type = EXP_TYPE_CREW
idtype = /obj/item/weapon/card/id/security
equip(var/mob/living/carbon/human/H)
+3
View File
@@ -453,6 +453,7 @@
occupantData["intOrgan"] = intOrganData
occupantData["blind"] = (H.disabilities & BLIND)
occupantData["colourblind"] = (H.disabilities & COLOURBLIND)
occupantData["nearsighted"] = (H.disabilities & NEARSIGHTED)
data["occupant"] = occupantData
@@ -639,6 +640,8 @@
dat += "</table>"
if(occupant.disabilities & BLIND)
dat += "<font color='red'>Cataracts detected.</font><BR>"
if(occupant.disabilities & COLOURBLIND)
dat += "<font color='red'>Photoreceptor abnormalities detected.</font><BR>"
if(occupant.disabilities & NEARSIGHTED)
dat += "<font color='red'>Retinal misalignment detected.</font><BR>"
else
+4 -4
View File
@@ -445,12 +445,12 @@ update_flag
else
logmsg = "Valve was <b>opened</b> by [usr] ([usr.ckey]), starting the transfer into the <font color='red'><b>air</b></font><br>"
if(air_contents.toxins > 0)
message_admins("[key_name_admin(usr)] opened a canister that contains plasma! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]")
message_admins("[key_name_admin(usr)] opened a canister that contains plasma in [get_area(src)]! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] opened a canister that contains plasma at [get_area(src)]: [x], [y], [z]")
var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air_contents.trace_gases
if(sleeping_agent && (sleeping_agent.moles > 1))
message_admins("[key_name_admin(usr)] opened a canister that contains N2O! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] opened a canister that contains N2O at [x], [y], [z]")
message_admins("[key_name_admin(usr)] opened a canister that contains N2O in [get_area(src)]! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] opened a canister that contains N2O at [get_area(src)]: [x], [y], [z]")
investigate_log(logmsg, "atmos")
release_log += logmsg
valve_open = !valve_open
@@ -757,6 +757,17 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/stack/cable_coil = 1,
/obj/item/weapon/stock_parts/console_screen = 1)
/obj/item/weapon/circuitboard/quantumpad
name = "circuit board (Quantum Pad)"
build_path = /obj/machinery/quantumpad
board_type = "machine"
origin_tech = "programming=3;engineering=3;plasmatech=3;bluespace=4"
frame_desc = "Requires 1 Bluespace Crystal, 1 Capacitor, 1 piece of cable and 1 Manipulator."
req_components = list(
/obj/item/weapon/ore/bluespace_crystal = 1,
/obj/item/weapon/stock_parts/capacitor = 1,
/obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/stack/cable_coil = 1)
/obj/item/weapon/circuitboard/sleeper
name = "circuit board (Sleeper)"
+148
View File
@@ -0,0 +1,148 @@
/obj/machinery/quantumpad
name = "quantum pad"
desc = "A bluespace quantum-linked telepad used for teleporting objects to other quantum pads."
icon = 'icons/obj/telescience.dmi'
icon_state = "qpad-idle"
anchored = 1
use_power = 1
idle_power_usage = 200
active_power_usage = 5000
var/teleport_cooldown = 400 //30 seconds base due to base parts
var/teleport_speed = 50
var/last_teleport //to handle the cooldown
var/teleporting = 0 //if it's in the process of teleporting
var/power_efficiency = 1
var/obj/machinery/quantumpad/linked_pad = null
/obj/machinery/quantumpad/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/quantumpad(null)
component_parts += new /obj/item/weapon/ore/bluespace_crystal/artificial(null)
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/stack/cable_coil(null, 1)
RefreshParts()
/obj/machinery/quantumpad/Destroy()
linked_pad = null
return ..()
/obj/machinery/quantumpad/RefreshParts()
var/E = 0
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
E += C.rating
power_efficiency = E
E = 0
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
E += M.rating
teleport_speed = initial(teleport_speed)
teleport_speed -= (E*10)
teleport_cooldown = initial(teleport_cooldown)
teleport_cooldown -= (E * 100)
/obj/machinery/quantumpad/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, "pad-idle-o", "qpad-idle", I))
return
if(panel_open)
if(ismultitool(I))
var/obj/item/device/multitool/M = I
M.buffer = src
to_chat(user, "<span class='notice'>You save the data in the [I.name]'s buffer.</span>")
return 1
else if(ismultitool(I))
var/obj/item/device/multitool/M = I
if(istype(M.buffer, /obj/machinery/quantumpad))
linked_pad = M.buffer
to_chat(user, "<span class='notice'>You link the [src] to the one in the [I.name]'s buffer.</span>")
return 1
if(exchange_parts(user, I))
return
if(default_deconstruction_crowbar(I))
return
return ..()
/obj/machinery/quantumpad/attack_hand(mob/user)
if(panel_open)
to_chat(user, "<span class='warning'>The panel must be closed before operating this machine!</span>")
return
if(!linked_pad || qdeleted(linked_pad))
to_chat(user, "<span class='warning'>There is no linked pad!</span>")
return
if(world.time < last_teleport + teleport_cooldown)
to_chat(user, "<span class='warning'>[src] is recharging power. Please wait [round((last_teleport + teleport_cooldown - world.time) / 10)] seconds.</span>")
return
if(teleporting)
to_chat(user, "<span class='warning'>[src] is charging up. Please wait.</span>")
return
if(linked_pad.teleporting)
to_chat(user, "<span class='warning'>Linked pad is busy. Please wait.</span>")
return
if(linked_pad.stat & NOPOWER)
to_chat(user, "<span class='warning'>Linked pad is not responding to ping.</span>")
return
add_fingerprint(user)
doteleport(user)
/obj/machinery/quantumpad/proc/sparks()
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, get_turf(src))
s.start()
/obj/machinery/quantumpad/attack_ghost(mob/dead/observer/ghost)
if(linked_pad)
ghost.forceMove(get_turf(linked_pad))
/obj/machinery/quantumpad/proc/doteleport(mob/user)
if(linked_pad)
playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1)
teleporting = 1
spawn(teleport_speed)
if(!src || qdeleted(src))
teleporting = 0
return
if(stat & NOPOWER)
to_chat(user, "<span class='warning'>[src] is unpowered!</span>")
teleporting = 0
return
if(!linked_pad || qdeleted(linked_pad) || linked_pad.stat & NOPOWER)
to_chat(user, "<span class='warning'>Linked pad is not responding to ping. Teleport aborted.</span>")
teleporting = 0
return
teleporting = 0
last_teleport = world.time
// use a lot of power
use_power(10000 / power_efficiency)
sparks()
linked_pad.sparks()
flick("qpad-beam", src)
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
flick("qpad-beam", linked_pad)
playsound(get_turf(linked_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
for(var/atom/movable/ROI in get_turf(src))
// if is anchored, don't let through
if(ROI.anchored)
if(isliving(ROI))
var/mob/living/L = ROI
if(L.buckled)
// TP people on office chairs
if(L.buckled.anchored)
continue
else
continue
else if(!isobserver(ROI))
continue
do_teleport(ROI, get_turf(linked_pad))
+3 -7
View File
@@ -46,17 +46,13 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
ME.attach(src)
/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/stock_parts/cell/C=null)
if(C)
C.forceMove(src)
cell = C
return
cell = new(src)
/obj/mecha/combat/gygax/dark/add_cell()
cell = new /obj/item/weapon/stock_parts/cell/bluespace(src)
cell.charge = 30000
cell.maxcharge = 30000
+6 -1
View File
@@ -50,6 +50,11 @@
force = 55
max_equip = 5
/obj/mecha/combat/marauder/seraph/add_cell()
cell = new /obj/item/weapon/stock_parts/cell/bluespace(src)
cell.charge = 40000
cell.maxcharge = 40000
/obj/mecha/combat/marauder/seraph/loaded/New()
..()//Let it equip whatever is needed.
var/obj/item/mecha_parts/mecha_equipment/ME
@@ -61,7 +66,7 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src)
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
+10 -2
View File
@@ -9,17 +9,25 @@
icon_state = "mecha_teleport"
origin_tech = "bluespace=10"
equip_cooldown = 150
energy_drain = 1000
energy_drain = 8000
range = RANGED
var/tele_precision = 4
/obj/item/mecha_parts/mecha_equipment/teleporter/action(atom/target)
if(!action_checks(target) || !is_teleport_allowed(loc.z))
return
var/turf/T = get_turf(target)
if(T)
do_teleport(chassis, T, 4)
chassis.use_power(energy_drain)
do_teleport(chassis, T, tele_precision)
return 1
/obj/item/mecha_parts/mecha_equipment/teleporter/precise
name = "upgraded teleporter"
desc = "An exosuit module that allows exosuits to teleport to any position in view. This is the high-precision, energy-efficient version."
origin_tech = "bluespace=13"
energy_drain = 1000
tele_precision = 1
////////////////////////////////////////////// WORMHOLE GENERATOR //////////////////////////////////////////
@@ -117,9 +117,9 @@ var/global/list/image/splatter_cache=list()
user.hand_blood_color = basecolor
user.update_inv_gloves(1)
user.verbs += /mob/living/carbon/human/proc/bloody_doodle
/obj/effect/decal/cleanable/blood/can_bloodcrawl_in()
return amount
return TRUE
/obj/effect/decal/cleanable/blood/splatter
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
+3 -3
View File
@@ -750,7 +750,7 @@ steam.start() -- spawns the effect
var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition)
I.dir = src.holder.dir
flick("ion_fade", I)
I.icon_state = "blank"
I.icon_state = ""
spawn( 20 )
if(I)
I.delete()
@@ -812,8 +812,8 @@ steam.start() -- spawns the effect
II.dir = src.holder.dir
flick("ion_fade", I)
flick("ion_fade", II)
I.icon_state = "blank"
II.icon_state = "blank"
I.icon_state = ""
II.icon_state = ""
spawn( 20 )
if(I) I.delete()
if(II) II.delete()
+12
View File
@@ -113,6 +113,18 @@
layer = 4.1
duration = 4
/obj/effect/overlay/temp/explosion
name = "explosion"
icon = 'icons/effects/96x96.dmi'
icon_state = "explosion"
pixel_x = -32
pixel_y = -32
duration = 8
/obj/effect/overlay/temp/explosion/fast
icon_state = "explosionfast"
duration = 4
/obj/effect/overlay/temp/decoy
desc = "It's a decoy!"
duration = 15
@@ -194,6 +194,6 @@
/obj/item/weapon/stock_parts/scanning_module = 1,
/obj/item/weapon/spacecash/c200 = 1,
/obj/item/weapon/airlock_electronics = 1,
/obj/item/weapon/gun/energy/kinetic_accelerator/super = 1,
/obj/item/weapon/gun/energy/kinetic_accelerator = 1,
/obj/item/pizzabox = 3,
)
+10 -5
View File
@@ -77,7 +77,7 @@
drawtype = temp
update_window(usr)
/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity)
/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity)
if(!proximity) return
if(is_type_in_list(target,validSurfaces))
var/temp = "rune"
@@ -95,17 +95,22 @@
if(!uses)
to_chat(user, "<span class='danger'>You used up your [name]!</span>")
qdel(src)
return
/obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob)
/obj/item/toy/crayon/attack(mob/M, mob/user)
var/huffable = istype(src,/obj/item/toy/crayon/spraycan)
if(M == user)
to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!")
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(!H.check_has_mouth())
to_chat(user, "<span class='warning'>You do not have a mouth!</span>")
return
playsound(loc, 'sound/items/eatfood.ogg', 50, 0)
to_chat(user, "<span class='notice'>You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!</span>")
user.nutrition += 5
if(uses)
uses -= 5
if(uses <= 0)
to_chat(user, "<span class='danger'>There is no more of [name] left!</span>")
to_chat(user, "<span class='warning'>There is no more of [name] left!</span>")
qdel(src)
else
..()
@@ -54,8 +54,8 @@
return
var/mob/living/carbon/human/H = M //mob has protective eyewear
if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
to_chat(user, "<span class='notice'>You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses"] first.</span>")
if(istype(H) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
to_chat(user, "<span class='notice'>You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask" : "glasses"] first.</span>")
return
if(M == user) //they're using it on themselves
@@ -70,12 +70,13 @@
user.visible_message("<span class='notice'>[user] directs [src] to [M]'s eyes.</span>", \
"<span class='notice'>You direct [src] to [M]'s eyes.</span>")
if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected
if(M.stat == DEAD || M.disabilities & BLIND) //mob is dead or fully blind
to_chat(user, "<span class='notice'>[M] pupils does not react to the light!</span>")
else if(XRAY in M.mutations) //mob has X-RAY vision
to_chat(user, "<span class='notice'>[M] pupils give an eerie glow!</span>")
else //they're okay!
if(istype(H)) //robots and aliens are unaffected
var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
if(M.stat == DEAD || !eyes || M.disabilities & BLIND) //mob is dead or fully blind
to_chat(user, "<span class='notice'>[M]'s pupils are unresponsive to the light!</span>")
else if((XRAY in M.mutations) || (eyes.colourblind_darkview && eyes.colourblind_darkview == eyes.get_dark_view())) //The mob's either got the X-RAY vision or has a tapetum lucidum (extreme nightvision, i.e. Vulp/Tajara with COLOURBLIND & their monkey forms).
to_chat(user, "<span class='notice'>[M]'s pupils glow eerily!</span>")
else //they're okay!
if(M.flash_eyes(visual = 1))
to_chat(user, "<span class='notice'>[M]'s pupils narrow.</span>")
else
+1 -4
View File
@@ -25,10 +25,7 @@
ui_interact(user)
/obj/item/device/guitar/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
return
if(!isliving(user) || user.stat || user.restrained() || user.lying)
if(!isliving(user) || user.incapacitated())
return
song.ui_interact(user, ui_key, ui, force_open)
+23 -18
View File
@@ -11,11 +11,16 @@
var/obj/item/device/radio/radio
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
var/list/faction = list("neutral") // The factions the pAI will inherit from the card
/obj/item/device/paicard/syndicate
name = "syndicate personal AI device"
faction = list("syndicate")
/obj/item/device/paicard/relaymove(var/mob/user, var/direction)
if(user.stat || user.stunned)
return
var/obj/item/weapon/rig/rig = src.get_rig()
var/obj/item/weapon/rig/rig = get_rig()
if(istype(rig))
rig.forced_move(direction, user)
@@ -260,7 +265,7 @@
to_chat(usr, "\red The request system is currently offline. Please wait another [cooldown_time] seconds.")
return
last_request = world.time / 10
src.looking_for_personality = 1
looking_for_personality = 1
paiController.findPAI(src, usr)
if(href_list["wipe"])
var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No")
@@ -297,33 +302,33 @@
// WIRE_TRANSMIT = 4
/obj/item/device/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
src.pai = personality
src.overlays += "pai-happy"
pai = personality
overlays += "pai-happy"
/obj/item/device/paicard/proc/removePersonality()
src.pai = null
src.overlays.Cut()
src.overlays += "pai-off"
pai = null
overlays.Cut()
overlays += "pai-off"
/obj/item/device/paicard
var/current_emotion = 1
/obj/item/device/paicard/proc/setEmotion(var/emotion)
if(pai)
src.overlays.Cut()
overlays.Cut()
switch(emotion)
if(1) src.overlays += "pai-happy"
if(2) src.overlays += "pai-cat"
if(3) src.overlays += "pai-extremely-happy"
if(4) src.overlays += "pai-face"
if(5) src.overlays += "pai-laugh"
if(6) src.overlays += "pai-off"
if(7) src.overlays += "pai-sad"
if(8) src.overlays += "pai-angry"
if(9) src.overlays += "pai-what"
if(1) overlays += "pai-happy"
if(2) overlays += "pai-cat"
if(3) overlays += "pai-extremely-happy"
if(4) overlays += "pai-face"
if(5) overlays += "pai-laugh"
if(6) overlays += "pai-off"
if(7) overlays += "pai-sad"
if(8) overlays += "pai-angry"
if(9) overlays += "pai-what"
current_emotion = emotion
/obj/item/device/paicard/proc/alertUpdate()
var/turf/T = get_turf_or_move(src.loc)
var/turf/T = get_turf_or_move(loc)
for(var/mob/M in viewers(T))
M.show_message("\blue [src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "\blue [src] bleeps electronically.", 2)
+1 -4
View File
@@ -30,10 +30,7 @@
ui_interact(user)
/obj/item/device/violin/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
return
if(!isliving(user) || user.stat || user.restrained() || user.lying)
if(!isliving(user) || user.incapacitated())
return
song.ui_interact(user, ui_key, ui, force_open)
@@ -196,25 +196,6 @@
return 1
/obj/item/borg/upgrade/hyperka
name = "mining cyborg hyper-kinetic accelerator"
desc = "A satchel of holding replacement for mining cyborg's ore satchel module."
icon_state = "cyborg_upgrade3"
require_module = 1
module_type = /obj/item/weapon/robot_module/miner
/obj/item/borg/upgrade/hyperka/action(mob/living/silicon/robot/R)
if(..())
return
for(var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
qdel(H)
R.module.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg(R.module)
R.module.rebuild()
return 1
/obj/item/borg/upgrade/syndicate
name = "illegal equipment module"
desc = "Unlocks the hidden, deadlier functions of a cyborg"
+1 -1
View File
@@ -7,7 +7,7 @@ RCD
/obj/item/weapon/rcd
name = "rapid-construction-device (RCD)"
desc = "A device used to rapidly build and deconstruct walls and floors."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
opacity = 0
density = 0
+2 -2
View File
@@ -6,8 +6,8 @@ RSF
/obj/item/weapon/rsf
name = "\improper Rapid-Service-Fabricator"
desc = "A device used to rapidly deploy service items."
icon = 'icons/obj/items.dmi'
icon_state = "rcd"
icon = 'icons/obj/tools.dmi'
icon_state = "rsf"
opacity = 0
density = 0
anchored = 0.0
+1 -1
View File
@@ -87,7 +87,7 @@
target.apply_damage(force * fisto_setting, BRUTE)
target.visible_message("<span class='danger'>[user]'s powerfist lets out a loud hiss as they punch [target.name]!</span>", \
"<span class='userdanger'>You cry out in pain as [user]'s punch flings you backwards!</span>")
new/obj/effect/kinetic_blast(target.loc)
new /obj/effect/overlay/temp/kinetic_blast(target.loc)
playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1)
playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1)
+48 -71
View File
@@ -12,47 +12,42 @@
* Revolver Conversion Kit
*/
/*
* Wrench
*/
//Wrench
/obj/item/weapon/wrench
name = "wrench"
desc = "A wrench with common uses. Can be found in your hand."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "wrench"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5.0
throwforce = 7.0
force = 5
throwforce = 7
w_class = 2
materials = list(MAT_METAL=150)
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
/*
* Screwdriver
*/
//Screwdriver
/obj/item/weapon/screwdriver
name = "screwdriver"
desc = "You can be totally screwy with this."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "screwdriver"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5.0
force = 5
w_class = 1
throwforce = 5.0
throwforce = 5
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=75)
attack_verb = list("stabbed")
hitsound = 'sound/weapons/bladeslice.ogg'
suicide_act(mob/user)
to_chat(viewers(user), pick("<span class='suicide'>[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.</span>", \
"<span class='suicide'>[user] is stabbing the [src.name] into \his heart! It looks like \he's trying to commit suicide.</span>"))
return(BRUTELOSS)
/obj/item/weapon/screwdriver/suicide_act(mob/user)
to_chat(viewers(user), pick("<span class='suicide'>[user] is stabbing the [name] into \his temple! It looks like \he's trying to commit suicide.</span>", \
"<span class='suicide'>[user] is stabbing the [name] into \his heart! It looks like \he's trying to commit suicide.</span>"))
return(BRUTELOSS)
/obj/item/weapon/screwdriver/New()
switch(pick("red","blue","purple","brown","green","cyan","yellow"))
@@ -82,7 +77,7 @@
src.pixel_y = rand(0, 16)
return
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M) || user.a_intent == I_HELP)
return ..()
if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
@@ -91,17 +86,15 @@
M = user
return eyestab(M,user)
/*
* Wirecutters
*/
//Wirecutters
/obj/item/weapon/wirecutters
name = "wirecutters"
desc = "This cuts wires."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "cutters"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 6.0
force = 6
throw_speed = 3
throw_range = 7
w_class = 2
@@ -112,51 +105,40 @@
sharp = 1
edge = 1
/obj/item/weapon/wirecutters/New(loc, var/param_color = null)
/obj/item/weapon/wirecutters/New(loc, param_color = null)
..()
if((!param_color && prob(50)) || param_color == "yellow")
icon_state = "cutters-y"
item_state = "cutters_yellow"
/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/C as mob, mob/user as mob)
if(istype(C) && C.handcuffed)
if(istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\
"You cut \the [C]'s restraints with \the [src]!",\
/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/H, mob/user)
if(istype(H) && H.handcuffed)
if(istype(H.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
usr.visible_message("\The [usr] cuts \the [H]'s restraints with \the [src]!",\
"You cut \the [H]'s restraints with \the [src]!",\
"You hear cable being cut.")
C.handcuffed = null
if(C.buckled && C.buckled.buckle_requires_restraints)
C.buckled.unbuckle_mob()
C.update_handcuffed()
H.handcuffed = null
if(H.buckled && H.buckled.buckle_requires_restraints)
H.buckled.unbuckle_mob()
H.update_handcuffed()
return
else
..()
/*
* Welding Tool
*/
//Welding Tool
/obj/item/weapon/weldingtool
name = "welding tool"
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "welder"
item_state = "welder"
flags = CONDUCT
slot_flags = SLOT_BELT
//Amount of OUCH when it's thrown
force = 3
throwforce = 5
throw_speed = 3
throw_range = 5
w_class = 2
//Cost to make in the autolathe
materials = list(MAT_METAL=70, MAT_GLASS=30)
//R&D tech level
origin_tech = "engineering=1"
//Welding tool specific stuff
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
var/max_fuel = 20 //The max amount of fuel the welder can hold
@@ -198,8 +180,8 @@
update_torch()
return
/obj/item/weapon/weldingtool/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/weapon/screwdriver))
/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params)
if(isscrewdriver(I))
flamethrower_screwdriver(I, user)
if(istype(I, /obj/item/stack/rods))
flamethrower_rods(I, user)
@@ -231,7 +213,7 @@
if(isturf(location))
location.hotspot_expose(700, 5)
/obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob)
/obj/item/weapon/weldingtool/attack(mob/M, mob/user)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
@@ -289,7 +271,7 @@
return reagents.get_reagent_amount("fuel")
//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use()
/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/living/M = null)
/obj/item/weapon/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null)
if(!welding || !check_fuel())
return 0
if(get_fuel() >= amount)
@@ -379,6 +361,7 @@
name = "Industrial Welding Tool"
desc = "A slightly larger welder with a larger tank."
icon_state = "indwelder"
icon_state = "welder"
max_fuel = 40
materials = list(MAT_METAL=70, MAT_GLASS=60)
origin_tech = "engineering=2"
@@ -402,9 +385,8 @@
/obj/item/weapon/weldingtool/hugetank
name = "Upgraded Welding Tool"
desc = "An upgraded welder based of the industrial welder."
desc = "An upgraded welder based off the industrial welder."
icon_state = "upindwelder"
item_state = "upindwelder"
max_fuel = 80
w_class = 3
materials = list(MAT_METAL=70, MAT_GLASS=120)
@@ -414,15 +396,14 @@
name = "Experimental Welding Tool"
desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
icon_state = "exwelder"
item_state = "exwelder"
max_fuel = 40
w_class = 3
materials = list(MAT_METAL=70, MAT_GLASS=120)
origin_tech = "engineering=4;plasmatech=3"
var/last_gen = 0
change_icons = 0
can_off_process = 1
light_intensity = 1
var/last_gen = 0
/obj/item/weapon/weldingtool/experimental/proc/fuel_gen()
if(!welding && !last_gen)
@@ -436,19 +417,16 @@
if(reagents.total_volume < max_fuel)
fuel_gen()
/*
* Crowbar
*/
//Crowbar
/obj/item/weapon/crowbar
name = "pocket crowbar"
desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "crowbar"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5.0
throwforce = 7.0
force = 5
throwforce = 7
item_state = "crowbar"
w_class = 2
materials = list(MAT_METAL=50)
@@ -456,7 +434,6 @@
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
/obj/item/weapon/crowbar/red
icon = 'icons/obj/items.dmi'
icon_state = "red_crowbar"
item_state = "crowbar_red"
@@ -480,14 +457,14 @@
origin_tech = "combat=2"
var/open = 0
New()
..()
update_icon()
/obj/item/weapon/conversion_kit/New()
..()
update_icon()
icon_state = "[initial(icon_state)]_[open]"
attack_self(mob/user as mob)
open = !open
to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.")
update_icon()
/obj/item/weapon/conversion_kit/update_icon()
icon_state = "[initial(icon_state)]_[open]"
/obj/item/weapon/conversion_kit/attack_self(mob/user)
open = !open
to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.")
update_icon()
+5 -9
View File
@@ -23,18 +23,14 @@
slot_flags = SLOT_BELT
force = 2
throwforce = 1
sharp = 1
edge = 1
w_class = 3
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
suicide_act(mob/user)
to_chat(viewers(user), "<span class='suicide'>[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide.</span>")
return(BRUTELOSS)
/obj/item/weapon/sord/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
/obj/item/weapon/sord/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is trying to impale themself with [src]! It might be a suicide attempt if it weren't so shitty.</span>", \
"<span class='suicide'>You try to impale yourself with [src], but it's USELESS...</span>")
return SHAME
/obj/item/weapon/claymore
name = "claymore"
@@ -3,7 +3,7 @@
/obj/structure/closet/crate
name = "crate"
desc = "A rectangular steel crate."
icon = 'icons/obj/storage.dmi'
icon = 'icons/obj/crates.dmi'
icon_state = "crate"
icon_opened = "crateopen"
icon_closed = "crate"
@@ -490,7 +490,6 @@
/obj/structure/closet/crate/large
name = "large crate"
desc = "A hefty metal crate."
icon = 'icons/obj/storage.dmi'
icon_state = "largemetal"
icon_opened = "largemetalopen"
icon_closed = "largemetal"
@@ -515,7 +514,6 @@
/obj/structure/closet/crate/secure/large
name = "large crate"
desc = "A hefty metal crate with an electronic locking system."
icon = 'icons/obj/storage.dmi'
icon_state = "largemetal"
icon_opened = "largemetalopen"
icon_closed = "largemetal"
@@ -1,8 +1,8 @@
/obj/structure/largecrate
name = "large crate"
desc = "A hefty wooden crate."
icon = 'icons/obj/storage.dmi'
icon_state = "densecrate"
icon = 'icons/obj/crates.dmi'
icon_state = "largecrate"
density = 1
var/obj/item/weapon/paper/manifest/manifest
@@ -49,7 +49,6 @@
return attack_hand(user)
/obj/structure/largecrate/mule
icon_state = "mulecrate"
/obj/structure/largecrate/lisa
icon_state = "lisacrate"
+1 -1
View File
@@ -27,7 +27,7 @@
..()
/obj/structure/curtain/proc/toggle()
opacity = !opacity
set_opacity(!opacity)
if(opacity)
icon_state = "closed"
layer = SHOWER_CLOSED_LAYER
@@ -191,7 +191,7 @@
Close()
..()
opacity = 0
set_opacity(0)
/obj/structure/mineral_door/transparent/plasma
mineralType = "plasma"
@@ -228,7 +228,7 @@
flick("[mineralType]opening",src)
sleep(10)
density = 0
opacity = 0
set_opacity(0)
state = 1
update_icon()
isSwitchingStates = 0
@@ -239,7 +239,7 @@
flick("[mineralType]closing",src)
sleep(10)
density = 1
opacity = 1
set_opacity(1)
state = 0
update_icon()
isSwitchingStates = 0
@@ -265,7 +265,7 @@
flick("[mineralType]opening",src)
sleep(10)
density = 0
opacity = 0
set_opacity(0)
state = 1
update_icon()
isSwitchingStates = 0
@@ -280,7 +280,7 @@
flick("[mineralType]closing",src)
sleep(10)
density = 1
opacity = 1
set_opacity(1)
state = 0
update_icon()
isSwitchingStates = 0
+5 -3
View File
@@ -138,10 +138,10 @@
return data
/datum/song/Topic(href, href_list)
if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || !usr.canmove || usr.restrained())
if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || usr.incapacitated())
usr << browse(null, "window=instrument")
usr.unset_machine()
return
return 1
instrumentObj.add_fingerprint(usr)
@@ -168,6 +168,8 @@
//split into lines
spawn()
lines = splittext(t, "\n")
if(lines.len == 0)
return 1
if(copytext(lines[1],1,6) == "BPM: ")
tempo = sanitize_tempo(600 / text2num(copytext(lines[1],6)))
lines.Cut(1,2)
@@ -291,7 +293,7 @@
ui_interact(user)
/obj/structure/piano/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user || !anchored)
if(!isliving(user) || user.incapacitated() || !anchored)
return
song.ui_interact(user, ui_key, ui, force_open)
+3 -4
View File
@@ -55,11 +55,10 @@
//lighting check
var/light_amount = 0
var/turf/T = get_turf(src)
var/atom/movable/lighting_overlay/LO = locate(/atom/movable/lighting_overlay) in T
if(LO)
light_amount = LO.get_clamped_lum(0.5)*10
if(T)
light_amount = T.get_lumcount(0.5) * 10
else
light_amount = 10
light_amount = 10
if(light_amount > 2)
to_chat(M, "<span class='warning'>It's too bright here to use [src.name]!</span>")
+11 -9
View File
@@ -93,7 +93,7 @@ var/ert_request_answered = 0
if(response_team_members.len > 6)
to_chat(src, "The emergency response team is already full!")
return 0
return 1
/proc/trigger_armed_response_team(var/datum/response_team/response_team_type)
@@ -106,7 +106,7 @@ var/ert_request_answered = 0
active_team.cannot_send_team()
send_emergency_team = 0
return 0
// Respawnable players get first dibs
for(var/mob/dead/observer/M in ert_candidates)
if((M in respawnable_list) && M.JoinResponseTeam())
@@ -115,7 +115,7 @@ var/ert_request_answered = 0
for(var/mob/dead/observer/M in (ert_candidates - respawnable_list))
if(M.JoinResponseTeam())
response_team_members |= M
if(!response_team_members.len)
active_team.cannot_send_team()
send_emergency_team = 0
@@ -125,14 +125,14 @@ var/ert_request_answered = 0
for(var/mob/M in response_team_members)
if(index > emergencyresponseteamspawn.len)
index = 1
var/client/C = M.client
var/mob/living/carbon/human/new_commando = C.create_response_team(emergencyresponseteamspawn[index])
new_commando.mind.key = M.key
new_commando.key = M.key
new_commando.update_icons()
index++
send_emergency_team = 0
active_team.announce_team()
return 1
@@ -170,8 +170,8 @@ var/ert_request_answered = 0
head_organ.b_hair = color2B(hair_c)
M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c))
M.s_tone = skin_tone
head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
M.real_name = "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]"
M.name = M.real_name
@@ -256,6 +256,7 @@ var/ert_request_answered = 0
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-engineer"
M.equip_to_slot_or_del(pda, slot_wear_pda)
M.job = "ERT Engineering"
if("Security")
@@ -280,7 +281,7 @@ var/ert_request_answered = 0
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-security"
M.equip_to_slot_or_del(pda, slot_wear_pda)
M.job = "ERT Security"
if("Medic")
medical_slots -= 1
@@ -302,7 +303,7 @@ var/ert_request_answered = 0
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-medical"
M.equip_to_slot_or_del(pda, slot_wear_pda)
M.job = "ERT Medical"
if("Commander")
command_slots = 0
@@ -329,6 +330,7 @@ var/ert_request_answered = 0
pda.ownjob = "Emergency Response Team Leader"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
M.equip_to_slot_or_del(pda, slot_wear_pda)
M.job = "ERT Commander"
/datum/response_team/proc/cannot_send_team()
event_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable")
+14 -17
View File
@@ -24,8 +24,6 @@
var/PathNode/PNode = null //associated PathNode in the A* algorithm
var/dynamic_lighting = 1
flags = 0
var/image/obscured //camerachunks
@@ -161,10 +159,11 @@
return src
var/old_opacity = opacity
var/old_dynamic_lighting = dynamic_lighting
var/list/old_affecting_lights = affecting_lights
var/old_affecting_lights = affecting_lights
var/old_lighting_overlay = lighting_overlay
var/old_blueprint_data = blueprint_data
var/old_obscured = obscured
var/old_corners = corners
BeforeChange()
if(air_master)
@@ -178,16 +177,19 @@
for(var/turf/space/S in range(W,1))
S.update_starlight()
lighting_overlay = old_lighting_overlay
recalc_atom_opacity()
affecting_lights = old_affecting_lights
if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting))
reconsider_lights()
if(dynamic_lighting != old_dynamic_lighting)
if(dynamic_lighting)
lighting_build_overlays()
else
lighting_clear_overlays()
if(lighting_overlays_initialised)
lighting_overlay = old_lighting_overlay
affecting_lights = old_affecting_lights
corners = old_corners
if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting))
reconsider_lights()
if(dynamic_lighting != old_dynamic_lighting)
if(dynamic_lighting)
lighting_build_overlay()
else
lighting_clear_overlay()
obscured = old_obscured
@@ -384,11 +386,6 @@
if(ticker)
cameranet.updateVisibility(src)
/turf/proc/get_lumcount() //Gets the lighting level of a given turf.
if(lighting_overlay)
return lighting_overlay.get_clamped_lum()
return 1
/turf/attackby(obj/item/C, mob/user, params)
if(can_lay_cable() && istype(C, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/coil = C
+4
View File
@@ -77,6 +77,10 @@
if(held_item)
var/damagetype = held_item.suicide_act(src)
if(damagetype)
if(damagetype & SHAME)
adjustStaminaLoss(200)
suiciding = 0
return
do_suicide(damagetype, held_item)
return
+3 -3
View File
@@ -447,7 +447,7 @@
new/obj/machinery/door/airlock(get_turf(object))
else if(istype(object,/turf) && ctrl_click && left_click)
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
WIN.set_dir(build_dir)
WIN.setDir(build_dir)
log_admin("Build Mode: [key_name(user)] built a window at ([object.x],[object.y],[object.z])")
if(ADV_BUILDMODE)
@@ -458,7 +458,7 @@
T.ChangeTurf(objholder)
else
var/obj/A = new objholder (get_turf(object))
A.set_dir(build_dir)
A.setDir(build_dir)
log_admin("Build Mode: [key_name(user)] modified [A]'s ([A.x],[A.y],[A.z]) dir to [build_dir]")
else if(right_click)
if(isobj(object))
@@ -547,7 +547,7 @@
T.ChangeTurf(objholder)
else
var/obj/A = new objholder(T)
A.set_dir(build_dir)
A.setDir(build_dir)
deselect_region()
return
+7
View File
@@ -531,6 +531,13 @@
if(ticker.mode.greyshirts.len)
dat += check_role_table("Greyshirts", ticker.mode.greyshirts)
if(ts_spiderlist.len)
var/list/spider_minds = list()
for(var/mob/living/simple_animal/hostile/poison/terror_spider/S in ts_spiderlist)
if(S.ckey)
spider_minds += S.mind
dat += check_role_table("Terror Spiders", spider_minds)
dat += "</body></html>"
usr << browse(dat, "window=roundstatus;size=400x500")
else
@@ -4,10 +4,10 @@
name = "\improper Clown Planet"
icon_state = "honk"
luminosity = 1
lighting_use_dynamic = 0
dynamic_lighting = 0
requires_power = 0
report_alerts = 0
/area/awaymission/clownplanet/miningtown
name = "\improper Clown Planet - Bananium-o-Rama"
icon_state = "away1"
-7
View File
@@ -13,13 +13,6 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
air_master.setup_allturfs(turfs)
log_debug("\tTook [stop_watch(subtimer)]s")
subtimer = start_watch()
log_debug("Initializing lighting")
for(var/turf/T in turfs)
if(T.dynamic_lighting)
T.lighting_build_overlays()
log_debug("\tTook [stop_watch(subtimer)]s")
subtimer = start_watch()
log_debug("Smoothing tiles")
for(var/turf/T in smoothTurfs)
+1 -1
View File
@@ -1,7 +1,7 @@
/area/awaymission/upperlevel
name = "Open Space"
color = "#888"
lighting_use_dynamic = 0
dynamic_lighting = 0
requires_power = 0
// Used by /turf/unsimulated/floor/upperlevel as a reference for where the other floor is
+3 -1
View File
@@ -92,4 +92,6 @@
var/datum/chatOutput/chatOutput
// Donator stuff.
var/donator_level = DONATOR_LEVEL_NONE
var/donator_level = DONATOR_LEVEL_NONE
var/var_edited = FALSE
+27 -2
View File
@@ -233,6 +233,10 @@
return 0
return 1
//Like for /atoms, but clients are their own snowflake FUCK
/client/proc/setDir(newdir)
dir = newdir
/client/proc/handle_spam_prevention(var/message, var/mute_type, var/throttle = 0)
if(throttle)
if((last_message_time + throttle > world.time) && !check_rights(R_ADMIN, 0))
@@ -404,10 +408,12 @@
if(IsGuestKey(key))
return
establish_db_connection()
if(!dbcon.IsConnected())
return
var/DBQuery/query = dbcon.NewQuery("SELECT id, datediff(Now(),firstseen) as age FROM [format_table_name("player")] WHERE ckey = '[ckey]'")
query.Execute()
var/sql_id = 0
@@ -417,6 +423,7 @@
player_age = text2num(query.item[2])
break
var/DBQuery/query_ip = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ip = '[address]'")
query_ip.Execute()
related_accounts_ip = list()
@@ -424,6 +431,7 @@
if(ckey != query_ip.item[1])
related_accounts_ip.Add("[query_ip.item[1]]")
var/DBQuery/query_cid = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE computerid = '[computer_id]'")
query_cid.Execute()
related_accounts_cid = list()
@@ -431,6 +439,7 @@
if(ckey != query_cid.item[1])
related_accounts_cid.Add("[query_cid.item[1]]")
var/admin_rank = "Player"
if(holder)
admin_rank = holder.rank
@@ -439,15 +448,18 @@
if(check_randomizer(connectiontopic))
return
//Log all the alts
if(related_accounts_cid.len)
log_access("Alts: [key_name(src)]:[jointext(related_accounts_cid, " - ")]")
var/watchreason = check_watchlist(ckey)
if(watchreason)
message_admins("<font color='red'><B>Notice: </B></font><font color='blue'>[key_name_admin(src)] is on the watchlist and has just connected - Reason: [watchreason]</font>")
send2irc(config.admin_notify_irc, "Watchlist - [key_name(src)] is on the watchlist and has just connected - Reason: [watchreason]")
//Just the standard check to see if it's actually a number
if(sql_id)
if(istext(sql_id))
@@ -463,17 +475,24 @@
if(sql_id)
//Player already identified previously, we need to just update the 'lastseen', 'ip' and 'computer_id' variables
var/DBQuery/query_update = dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastseen = Now(), ip = '[sql_ip]', computerid = '[sql_computerid]', lastadminrank = '[sql_admin_rank]' WHERE id = [sql_id]")
query_update.Execute()
if(!query_update.Execute())
var/err = query_update.ErrorMsg()
log_game("SQL ERROR during log_client_to_db (update). Error : \[[err]\]\n")
message_admins("SQL ERROR during log_client_to_db (update). Error : \[[err]\]\n")
else
//New player!! Need to insert all the stuff
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')")
query_insert.Execute()
if(!query_insert.Execute())
var/err = query_insert.ErrorMsg()
log_game("SQL ERROR during log_client_to_db (insert). Error : \[[err]\]\n")
message_admins("SQL ERROR during log_client_to_db (insert). Error : \[[err]\]\n")
//Logging player access
var/serverip = "[world.internet_address]:[world.port]"
var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `[format_table_name("connection_log")]`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[ckey]','[sql_ip]','[sql_computerid]');")
query_accesslog.Execute()
#undef TOPIC_SPAM_DELAY
#undef UPLOAD_LIMIT
#undef MIN_CLIENT_VERSION
@@ -621,3 +640,9 @@
if(lang.flags & RESTRICTED)
message += " (RESTRICTED)"
to_chat(world, "[message]")
/client/proc/colour_transition(var/list/colour_to = null, var/time = 10) //Call this with no parameters to reset to default.
animate(src, color=colour_to, time=time, easing=SINE_EASING)
/client/proc/on_varedit()
var_edited = TRUE
+10 -3
View File
@@ -283,6 +283,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "<b>Species:</b> <a href='?_src_=prefs;preference=species;task=input'>[species]</a><br>"
if(species == "Vox")
dat += "<b>N2 Tank:</b> <a href='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]</a><br>"
if(species == "Grey")
dat += "<b>Voice:</b> <a href ='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Wingdings" : "Normal"]</a><BR>"
dat += "<b>Secondary Language:</b> <a href='?_src_=prefs;preference=language;task=input'>[language]</a><br>"
dat += "<b>Blood Type:</b> <a href='?_src_=prefs;preference=b_type;task=input'>[b_type]</a><br>"
if(species in list("Human", "Drask", "Vox"))
@@ -817,6 +819,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_COLOURBLIND,"Colourblind")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute")
@@ -1333,15 +1336,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
b_skin = 0
alt_head = "None" //No alt heads on species that don't have them.
speciesprefs = 0 //My Vox tank shouldn't change how my future Grey talks.
body_accessory = null //no vulptail on humans damnit
//Reset prosthetics.
organ_data = list()
rlimb_data = list()
if("speciesprefs")//oldvox code
speciesprefs = !speciesprefs
if("speciesprefs")
speciesprefs = !speciesprefs //Starts 0, so if someone clicks the button up top there, this won't be 0 anymore. If they click it again, it'll go back to 0.
if("language")
// var/languages_available
var/list/new_languages = list("None")
@@ -2040,6 +2043,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.add_language(language)
character.real_name = real_name
character.dna.real_name = real_name
character.name = character.real_name
@@ -2168,6 +2172,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(disabilities & DISABILITY_FLAG_BLIND)
character.dna.SetSEState(BLINDBLOCK,1,1)
if(disabilities & DISABILITY_FLAG_COLOURBLIND)
character.dna.SetSEState(COLOURBLINDBLOCK,1,1)
if(disabilities & DISABILITY_FLAG_MUTE)
character.dna.SetSEState(MUTEBLOCK,1,1)
@@ -84,7 +84,8 @@
volume='[volume]',
nanoui_fancy='[nanoui_fancy]',
show_ghostitem_attack='[show_ghostitem_attack]',
lastchangelog='[lastchangelog]'
lastchangelog='[lastchangelog]',
windowflashing='[windowflashing]'
WHERE ckey='[C.ckey]'"}
)
+27 -32
View File
@@ -232,8 +232,6 @@
name = "noir sunglasses"
desc = "Somehow these seem even more out-of-date than normal sunglasses."
actions_types = list(/datum/action/item_action/noir)
var/noir_mode = 0
color_view = MATRIX_GREYSCALE
/obj/item/clothing/glasses/sunglasses/noir/attack_self()
toggle_noir()
@@ -243,36 +241,8 @@
return 1
/obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir()
var/list/difference = difflist(usr.client.color, color_view)
if(!noir_mode)
if(color_view && usr.client && (!usr.client.color || difference))
animate(usr.client, color = color_view, time = 10)
noir_mode = 1
else
if(usr.client && usr.client.color && !difference)
animate(usr.client, color = initial(usr.client.color), time = 10)
noir_mode = 0
/obj/item/clothing/glasses/sunglasses/noir/equipped(mob/user, slot)
var/list/difference = difflist(user.client.color, color_view)
if(slot == slot_glasses)
if(noir_mode)
if(color_view && user.client && (!user.client.color || difference.len))
animate(user.client, color = color_view, time = 10)
else
if(user.client && user.client.color && !difference.len)
animate(user.client, color = initial(user.client.color), time = 10)
..(user, slot)
/obj/item/clothing/glasses/sunglasses/noir/dropped(mob/living/carbon/human/user)
var/list/difference = difflist(user.client.color, color_view)
if(istype(user) && user.glasses == src)
if(user.client && user.client.color && !difference.len)
animate(user.client, color = initial(user.client.color), time = 10)
..(user)
color_view = color_view ? null : MATRIX_GREYSCALE //Toggles between null and grayscale, with null being the default option.
usr.update_client_colour()
/obj/item/clothing/glasses/sunglasses/yeah
name = "agreeable glasses"
@@ -498,3 +468,28 @@
name = "gar glasses"
icon_state = "gar"
item_state = "gar"
/obj/item/clothing/glasses/godeye
name = "eye of god"
desc = "A strange eye, said to have been torn from an omniscient creature that used to roam the wastes."
icon_state = "godeye"
item_state = "godeye"
vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
darkness_view = 8
scan_reagents = 1
flags = NODROP
invis_view = SEE_INVISIBLE_MINIMUM
/obj/item/clothing/glasses/godeye/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, src) && W != src && W.loc == user)
if(W.icon_state == "godeye")
W.icon_state = "doublegodeye"
W.item_state = "doublegodeye"
W.desc = "A pair of strange eyes, said to have been torn from an omniscient creature that used to roam the wastes. There's no real reason to have two, but that isn't stopping you."
if(iscarbon(user))
var/mob/living/carbon/C = user
C.update_inv_wear_mask()
else
to_chat(user, "<span class='notice'>The eye winks at you and vanishes into the abyss, you feel really unlucky.</span>")
qdel(src)
..()
+31 -6
View File
@@ -7,20 +7,21 @@
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
rig_restrict_helmet = 0 // ERT helmets can be taken on and off at will.
var/obj/machinery/camera/camera
var/has_camera = TRUE
strip_delay = 130
/obj/item/clothing/head/helmet/space/rig/ert/attack_self(mob/user)
if(camera)
if(camera || !has_camera)
..(user)
else
camera = new /obj/machinery/camera(src)
camera.network = list("ERT")
cameranet.removeCamera(camera)
camera.c_tag = user.name
to_chat(user, "\blue User scanned as [camera.c_tag]. Camera activated.")
to_chat(user, "<span class='notice'>User scanned as [camera.c_tag]. Camera activated.</span>")
/obj/item/clothing/head/helmet/space/rig/ert/examine(mob/user)
if(..(user, 1))
if(..(user, 1) && has_camera)
to_chat(user, "This helmet has a built-in camera. It's [camera ? "" : "in"]active.")
/obj/item/clothing/suit/space/rig/ert
@@ -101,6 +102,7 @@
desc = "A suit worn by the janitorial of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_janitor"
//Paranormal
/obj/item/clothing/head/helmet/space/rig/ert/paranormal
name = "paranormal response unit helmet"
desc = "A helmet worn by those who deal with paranormal threats for a living."
@@ -108,16 +110,39 @@
item_color = "ert_paranormal"
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
sprite_sheets = null
icon_override = 'icons/mob/clothing/paranormal_hardsuit.dmi'
actions_types = list()
has_camera = 0
/obj/item/clothing/suit/space/rig/ert/paranormal
name = "paranormal response team suit"
desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats."
icon_state = "knight_grey"
item_state = "knight_grey"
icon_state = "rig-paranormal"
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
icon_override = 'icons/mob/clothing/paranormal_hardsuit.dmi'
actions_types = list()
/obj/item/clothing/suit/space/rig/ert/paranormal/New()
..()
new /obj/item/weapon/nullrod(src)
/obj/item/clothing/head/helmet/space/rig/ert/paranormal/inquisitor
name = "inquisitor's helmet"
icon_state = "rig0-inquisitor"
item_color = "inquisitor"
/obj/item/clothing/suit/space/rig/ert/paranormal/inquisitor
name = "inquisitor's hardsuit"
icon_state = "rig-inquisitor"
/obj/item/clothing/head/helmet/space/rig/ert/paranormal/berserker
name = "champion's helmet"
desc = "Peering into the eyes of the helmet is enough to seal damnation."
icon_state = "rig0-berserker"
item_color = "berserker"
/obj/item/clothing/suit/space/rig/ert/paranormal/berserker
name = "champion's hardsuit"
desc = "Voices echo from the hardsuit, driving the user insane."
icon_state = "rig-berserker"
+12 -13
View File
@@ -40,8 +40,7 @@
if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up.
if(istype(I.loc,/obj/item/weapon/storage)) //in a container.
var/obj/item/weapon/storage/U = I.loc
user.client.screen -= I
U.contents.Remove(I)
U.remove_from_storage(I, src)
else if(user.l_hand == I) //in a hand
user.drop_l_hand()
else if(user.r_hand == I) //in a hand
@@ -59,6 +58,7 @@
I.pixel_x = 0 //then remove it so it'll stay within the evidence bag
I.pixel_y = 0
var/image/img = image("icon"=I, "layer"=FLOAT_LAYER) //take a snapshot. (necessary to stop the underlays appearing under our inventory-HUD slots ~Carn
img.plane = FLOAT_PLANE
I.pixel_x = xx //and then return it
I.pixel_y = yy
overlays += img
@@ -69,7 +69,7 @@
w_class = I.w_class
return 1
/obj/item/weapon/evidencebag/attack_self(mob/user as mob)
/obj/item/weapon/evidencebag/attack_self(mob/user)
if(contents.len)
var/obj/item/I = contents[1]
user.visible_message("<span class='notice'>[user] takes [I] out of [src].</span>", "<span class='notice'>You take [I] out of [src].</span>",\
@@ -83,17 +83,16 @@
else
to_chat(user, "[src] is empty.")
icon_state = "evidenceobj"
return
/obj/item/weapon/storage/box/evidence
name = "evidence bag box"
desc = "A box claiming to contain evidence bags."
New()
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
..()
return
/obj/item/weapon/storage/box/evidence/New()
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
..()
+10 -2
View File
@@ -101,8 +101,13 @@ var/list/event_last_fired = list()
playercount_modifier = 1
if(26 to 35)
playercount_modifier = 0.9
if(36 to 100000)
if(36 to 50)
playercount_modifier = 0.8
if(50 to 80)
playercount_modifier = 0.7
if(80 to 10000)
playercount_modifier = 0.6
playercount_modifier = playercount_modifier * delay_modifier
var/event_delay = rand(config.event_delay_lower[severity], config.event_delay_upper[severity]) * playercount_modifier
@@ -155,6 +160,7 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ion_storm, 0, list(ASSIGNMENT_AI = 50, ASSIGNMENT_CYBORG = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Borer Infestation", /datum/event/borer_infestation, 40, list(ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Immovable Rod", /datum/event/immovable_rod, 0, list(ASSIGNMENT_ENGINEER = 30), 1),
//new /datum/event_meta/ninja(EVENT_LEVEL_MODERATE, "Space Ninja", /datum/event/space_ninja, 0, list(ASSIGNMENT_SECURITY = 15), 1),
// NON-BAY EVENTS
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Mass Hallucination", /datum/event/mass_hallucination, 300),
@@ -170,7 +176,7 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravitational Anomaly", /datum/event/anomaly/anomaly_grav, 200),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Revenant", /datum/event/revenant, 150),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Swarmer Spawn", /datum/event/spawn_swarmer, 150, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/spawn_morph, 0, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/spawn_morph, 40, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Disease Outbreak", /datum/event/disease_outbreak, 0, list(ASSIGNMENT_MEDICAL = 150), 1)
)
@@ -185,6 +191,8 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1),
new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 0, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1)
)
+11 -2
View File
@@ -34,10 +34,19 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
loc = start
z_original = z
destination = end
notify_ghosts("\A [src] is inbound!",
enter_link="<a href=?src=[UID()];follow=1>(Click to follow)</a>",
source=src, action=NOTIFY_FOLLOW)
poi_list |= src
if(end && end.z==z_original)
walk_towards(src, destination, 1)
/obj/effect/immovablerod/Topic(href, href_list)
if(href_list["follow"])
var/mob/dead/observer/ghost = usr
if(istype(ghost))
ghost.ManualFollow(src)
/obj/effect/immovablerod/Destroy()
poi_list.Remove(src)
return ..()
@@ -70,4 +79,4 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
H.adjustBruteLoss(160)
if(clong.density || prob(10))
clong.ex_act(2)
return
return
+2 -2
View File
@@ -37,8 +37,8 @@
player_mind.transfer_to(S)
player_mind.assigned_role = "Slaughter Demon"
player_mind.special_role = SPECIAL_ROLE_SLAUGHTER_DEMON
message_admins("[key_of_slaughter] has been made into a Slaughter Demon by an event.")
log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.")
message_admins("[key_name_admin(S)] has been made into a Slaughter Demon by an event.")
log_game("[key_name_admin(S)] was spawned as a Slaughter Demon by an event.")
return 1
/datum/event/spawn_slaughter/start()
+3 -3
View File
@@ -428,8 +428,8 @@
if(potency != null)
mutativeness = potency / 10
if(production != null)
spread_cap *= production / 5
spread_multiplier /= production / 5
spread_cap /= production / 5
spread_multiplier *= production / 5
..()
@@ -567,4 +567,4 @@
if(isliving(A))
var/mob/living/M = A
if(("vines" in M.faction) || ("plants" in M.faction))
. = TRUE
. = TRUE
+44
View File
@@ -0,0 +1,44 @@
/datum/event/spider_terror
announceWhen = 400
var/spawncount = 1
/datum/event/spider_terror/setup()
announceWhen = rand(announceWhen, announceWhen + 50)
spawncount = 1
/datum/event/spider_infestation/announce()
command_announcement.Announce("Confirmed outbreak of level 3 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/effects/siren.ogg')
/datum/event/spider_terror/start()
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in all_vent_pumps)
if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 50)
vents += temp_vent
var/spider_type
var/infestation_type = pick(1, 2, 3, 4)
switch(infestation_type)
if(1)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/green
spawncount = pick(2,3)
if(2)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white
spawncount = 1
if(3)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/prince
spawncount = 1
if(4)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen
spawncount = 1
while(spawncount >= 1 && vents.len)
var/obj/vent = pick(vents)
var/obj/effect/spider/spiderling/terror_spiderling/S = new(vent.loc)
S.name = "evil-looking spiderling"
S.grow_as = spider_type
S.amount_grown = 75
vents -= vent
spawncount--
@@ -20,6 +20,8 @@
var/locked = 0
var/scan_id = 1
var/is_secure = 0
var/can_dry = FALSE
var/drying = FALSE
var/datum/wires/smartfridge/wires = null
/obj/machinery/smartfridge/New()
@@ -195,7 +197,7 @@
/obj/machinery/smartfridge/default_deconstruction_screwdriver(mob/user, obj/item/weapon/screwdriver/S)
. = ..(user, icon_state, icon_state, S)
overlays.Cut()
if(panel_open)
overlays += image(icon, "[initial(icon_state)]-panel")
@@ -332,6 +334,8 @@
data["shoot_inventory"] = shoot_inventory
data["locked"] = locked
data["secure"] = is_secure
data["can_dry"] = can_dry
data["drying"] = drying
var/list/items[0]
for(var/i=1 to length(item_quants))
@@ -372,6 +376,7 @@
for(var/obj/O in contents)
if(O.name == K)
O.forceMove(loc)
update_icon()
i--
if(i <= 0)
return 1
@@ -394,6 +399,7 @@
if(T.name == O)
T.forceMove(loc)
throw_item = T
update_icon()
break
break
if(!throw_item)
@@ -416,7 +422,7 @@
active_power_usage = 200
icon_on = "drying_rack_on"
icon_off = "drying_rack"
var/drying = FALSE
can_dry = TRUE
/obj/machinery/smartfridge/drying_rack/New()
..()
@@ -443,6 +449,22 @@
/obj/machinery/smartfridge/drying_rack/default_deconstruction_crowbar(obj/item/weapon/crowbar/C, ignore_panel = 1)
..()
/obj/machinery/smartfridge/drying_rack/Topic(href, href_list)
if(..())
return 1
if(href_list["dryingOn"])
drying = TRUE
use_power = 2
update_icon()
return 1
if(href_list["dryingOff"])
drying = FALSE
use_power = 1
update_icon()
return 1
return 0
/obj/machinery/smartfridge/drying_rack/power_change()
if(powered() && anchored)
stat &= ~NOPOWER
@@ -451,9 +473,10 @@
toggle_drying(TRUE)
update_icon()
/obj/machinery/smartfridge/drying_rack/load() //For updating the filled overlay
..()
update_icon()
/obj/machinery/smartfridge/drying_rack/load(obj/I, mob/user) //For updating the filled overlay
if(..())
update_icon()
return 1
/obj/machinery/smartfridge/drying_rack/update_icon()
..()
@@ -470,11 +493,11 @@
update_icon()
/obj/machinery/smartfridge/drying_rack/accept_check(obj/item/O)
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/))
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/S = O
if(S.dried_type)
return TRUE
if(istype(O,/obj/item/stack/sheet/wetleather/))
if(istype(O, /obj/item/stack/sheet/wetleather))
return TRUE
return FALSE
@@ -492,16 +515,21 @@
if(S.dried_type == S.type)//if the dried type is the same as the object's type, don't bother creating a whole new item...
S.color = "#ad7257"
S.dry = TRUE
item_quants[S.name]--
S.forceMove(get_turf(src))
else
var/dried = S.dried_type
new dried(loc)
item_quants[S.name]--
qdel(S)
nanomanager.update_uis(src)
return TRUE
for(var/obj/item/stack/sheet/wetleather/WL in contents)
var/obj/item/stack/sheet/leather/L = new(loc)
L.amount = WL.amount
item_quants[WL.name]--
qdel(WL)
nanomanager.update_uis(src)
return TRUE
return FALSE
@@ -509,21 +537,6 @@
..()
atmos_spawn_air(SPAWN_HEAT)
/obj/machinery/smartfridge/drying_rack/verb/adjust_drying()
set category = "Object"
set name = "Toggle Drying"
set src in view(1)
if(!iscarbon(usr))
to_chat(usr, "<span class='warning'>You can't do that!</span>")
return
if(usr.incapacitated())
return
toggle_drying(FALSE)
update_icon()
/************************
* Secure SmartFridges
*************************/

Some files were not shown because too many files have changed in this diff Show More